using System; using System.Globalization; using System.Text; using System.Text.RegularExpressions; using Admin.NET.Application.Entity; namespace Admin.NET.Application { /// /// 单据号生成帮助类 /// public class SerialUtilOrder { private readonly static object _lockTest = new(); private readonly static object _lockPublic = new(); /// /// 生成编号/单据号-ly /// /// /// /// /// /// /// public static async Task GetSerialOrder(OrderTypeEnum SerialType, SqlSugarRepository _repRuleDetailRep, SqlSugarRepository _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; } /// /// 生成编号/单据号 -ly /// /// /// /// /// /// /// private static async Task GetSerialDetailsOrder(OrderTypeEnum SerialType, SqlSugarRepository _repRuleDetailRep, SqlSugarRepository _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 values = new List(); // 正则表达式匹配花括号内的内容 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; } } }