add
zongzhibin
2024-11-24 59575fe77af455478e81dff65e2e5e6979fdf7f6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
using System;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using Admin.NET.Application.Entity;
 
namespace Admin.NET.Application
{
    /// <summary>
    /// 单据号生成帮助类
    /// </summary>
    public class SerialUtilOrder
    {
        private readonly static object _lockTest = new();
        private readonly static object _lockPublic = new();
 
 
 
        /// <summary>
        /// 生成编号/单据号-ly
        /// </summary>
        /// <param name="SerialType"></param>
        /// <param name="_repRuleDetailRep"></param>
        /// <param name="_repSNRep"></param>
        /// <param name="BusinessType"></param>
        /// <param name="OrderNo"></param>
        /// <returns></returns>
        public static async Task<string> GetSerialOrder(OrderTypeEnum SerialType,
            SqlSugarRepository<WmsConfigNoRule> _repRuleDetailRep, 
            SqlSugarRepository<WmsConfigSerialSN> _repSNRep,
            int BusinessType, string OrderNo)
        {
            string _result = string.Empty;
 
         //   _result = GetSerialDetailsOrder(SerialType, _repRuleDetailRep, _repSNRep, BusinessType, OrderNo).Result;
 
 
            switch (SerialType)
            {
                case (OrderTypeEnum)SerialTypeEnum.测试编号:
                    lock (_lockTest)
                    {
                        _result = GetSerialDetailsOrder(SerialType, _repRuleDetailRep, _repSNRep, BusinessType, OrderNo).Result;
                        break;
                    };
 
                default:
                    lock (_lockPublic)
                    {//为了避免多线程出现编号一致的情况,加上锁,此处为公共锁,只用于不频繁生成编号的,若需要频繁生成,请参考上面Test设置单独锁
                        _result = GetSerialDetailsOrder(SerialType, _repRuleDetailRep, _repSNRep, BusinessType, OrderNo).Result;
                        break;
                    }
            }
 
            await Task.CompletedTask;
            return _result;
        }
        /// <summary>
        /// 生成编号/单据号 -ly
        /// </summary>
        /// <param name="SerialType"></param>
        /// <param name="_repRuleDetailRep"></param>
        /// <param name="_repSNRep"></param>
        /// <param name="BusinessType"></param>
        /// <param name="OrderNo"></param>
        /// <returns></returns>
        private static async Task<string> GetSerialDetailsOrder(OrderTypeEnum SerialType,
            SqlSugarRepository<WmsConfigNoRule> _repRuleDetailRep, 
            SqlSugarRepository<WmsConfigSerialSN> _repSNRep, int BusinessType, string OrderNo)
        {
            //NoRule var lst =await _repRuleDetailRep.AsQueryable().Where(u => u.OrderType == (int)SerialType).OrderBy(x => x.ItemNo).ToListAsync();
            //var lst = await _repRuleDetailRep.AsQueryable().Where(u => u.OrderType == SerialType && u.BusinessType == BusinessType).ToListAsync();
 
            var orderCode = "";
 
            var lst = await _repRuleDetailRep
          .GetFirstAsync(u => u.OrderType == SerialType && u.BusinessType == BusinessType && u.IsDisabled == false && u.IsDisabled == false);
 
            if (lst!=null)
            {
                List<string> values = new List<string>();
 
                // 正则表达式匹配花括号内的内容
                string pattern = @"\{(.+?)\}";
                MatchCollection matches = Regex.Matches(lst.NoRule, pattern);
 
                foreach (Match match in matches)
                {
                    if (match.Success)
                    {
                        string value = match.Groups[1].Value; // 提取花括号内的值
                        values.Add(value);
                    }
                }
                var dateStr = "";
 
                if (values.Contains("yyyy"))
                {
 
                    dateStr += values[values.IndexOf("yyyy")];
                }
                if (values.Contains("MM"))
                {
 
                    dateStr += values[values.IndexOf("MM")];
                }
 
                if (values.Contains("dd"))
                {
 
                    dateStr += values[values.IndexOf("dd")];
                }
                // 获取当前时间
                DateTime currentTime = DateTime.Now;
 
                // 格式化为年月日字符串
                string formattedDate = currentTime.ToString(dateStr);
                //获取规则最后的自增序列
                var serialNo = "";
                //根据不同输入的单据类别查询最近一条单号
                //如果单据在当前这个年月日下创建过了就从这个单据后面自增
                if (OrderNo == null)
                {
                    serialNo = lst.SerialNoStepSize.ToString("D" + lst.SerialNoLength);
                    orderCode = values[0] + BusinessType.ToString() + formattedDate + serialNo;
                }
                else if (OrderNo.Contains(formattedDate))
                {
                    serialNo = OrderNo.Substring(OrderNo.Length - lst.SerialNoLength);
                    int serialNoNum = int.Parse(serialNo);
                    serialNoNum += lst.SerialNoStepSize;
                    serialNo = serialNoNum.ToString().PadLeft(lst.SerialNoLength, '0');
                    //拼接
                    orderCode = values[0] + BusinessType.ToString() + formattedDate + serialNo;
                }
                //如果今天没有创建单据那就从最小的开始新增一条
                else
                {
                    serialNo = lst.SerialNoStepSize.ToString("D" + lst.SerialNoLength);
                    orderCode = values[0] + BusinessType.ToString() + formattedDate + serialNo;
                }
 
            }
 
            //var ruleArr = lst.NoRule.Replace(',', ',').Split(',').ToList();
 
            //string[] strs = new string[ruleArr.Count];
            //WmsConfigSerialSN sl = new WmsConfigSerialSN();
            //for (int i = 0; i < ruleArr.Count; i++)
            //{
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.UD.ToString())
            //    {
            //        strs[i] = lst[i].UserDefine ?? string.Empty;//如果数据源是自定义,则取自定义字段
            //    }
 
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.BT.ToString())
            //    {
            //        strs[i] = lst[i].UserDefine ?? string.Empty;//如果数据源是自定义,则取自定义字段
            //    }
 
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.Y4.ToString())
            //    {
            //        strs[i] = DateTime.Now.Year.ToString();
            //    }
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.Y2.ToString())
            //    {
            //        strs[i] = DateTime.Now.Year.ToString().Substring(2, 2);
            //    }
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.M2.ToString())
            //    {
            //        strs[i] = DateTime.Now.Month.ToString("00");
            //    }
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.D2.ToString())
            //    {
            //        strs[i] = DateTime.Now.Day.ToString("00");
 
            //    }
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.W2.ToString())
            //    {
            //        GregorianCalendar gc = new GregorianCalendar();
            //        int week = gc.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
            //        strs[i] = "W" + week.ToString();
 
            //    }
            //    if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.SN.ToString())
            //    {
            //        int cout = lst[i].SerialLength;
            //        string c = string.Empty;
            //        for (int j = 0; j < cout; j++)
            //        {
            //            c += "0";
            //        }
            //        try
            //        {
            //            if (lst[i].GetData.HasValue && lst[i].GetData == 1)
            //            {
            //                var sn =await _repSNRep.AsQueryable().Where(x => x.SerialType == lst[i].SerialType && x.CurrentDate == DateTime.Now.Date)
            //                                .OrderByDescending(x => x.Sn).FirstAsync();
            //                if (sn == null)
            //                {
            //                    sl.Sn = 1;
            //                }
            //                else
            //                {
            //                    sl.Sn = sn.Sn + 1;
            //                }
 
            //            }
            //            else
            //            {
 
            //                var sn =await _repSNRep.AsQueryable().Where(x => x.SerialType == lst[i].SerialType).OrderByDescending(x => x.Sn).FirstAsync();
            //                sl.Sn = sn.Sn + 1;
            //            }
 
            //            strs[i] = sl.Sn.ToString(c);
            //        }
            //        catch (Exception ex)
            //        {
            //            throw ex;
            //        }
            //        sl.CurrentDate = DateTime.Now.Date;
            //        sl.SerialType = lst[i].SerialType;
            //    }
            //}
 
            //StringBuilder WmsConfigSerialSN = new StringBuilder();
            //foreach (var item in strs)
            //{
            //    WmsConfigSerialSN.Append(item.ToString());
            //}
            ////await _repSNRep.InsertAsync(sl);
            //if (string.IsNullOrEmpty(WmsConfigSerialSN.ToString()))
            //{
            //    throw Oops.Oh("生成的编号为空");
            //}
            // return WmsConfigSerialSN.ToString();
            return orderCode;
        }
    }
}