using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.FriendlyException; using System.Globalization; using System.Text; using Admin.NET.Core; namespace Admin.NET.Application { /// /// 单据号生成帮助类 /// public class SerialUtil { private readonly static object _lockTest = new(); private readonly static object _lockPublic = new(); /// /// 生成编号/单据号 /// /// /// public static async Task GetSerial(EnumSerialType SerialType) { switch (SerialType) { case EnumSerialType.测试编号: lock (_lockTest) { return GetSerialDetails(SerialType).Result; }; default: lock (_lockPublic) {//为了避免多线程出现编号一致的情况,加上锁,此处为公共锁,只用于不频繁生成编号的,若需要频繁生成,请参考上面Test设置单独锁 return GetSerialDetails(SerialType).Result; } } } /// /// 生成编号/单据号 /// /// /// private static async Task GetSerialDetails(EnumSerialType SerialType) { // 泛型仓储 var repositoryBaseSerialRuleDetail = Db.GetRepository(); var repositoryBaseSerialSN = Db.GetRepository(); var lst = repositoryBaseSerialRuleDetail.Where(x => x.SerialType == (int)SerialType) .OrderBy(x => x.ItemNo).ToList(); string[] strs = new string[lst.Count]; BaseSerialSN sl = new BaseSerialSN(); for (int i = 0; i < lst.Count; i++) { if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.UD.ToString()) { strs[i] = lst[i].UserDefine ?? string.Empty;//如果数据源是自定义,则取自定义字段 } if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.Y4.ToString()) { strs[i] = DateTime.Now.Year.ToString(); } if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.Y2.ToString()) { strs[i] = DateTime.Now.Year.ToString().Substring(2, 2); } if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.M2.ToString()) { strs[i] = DateTime.Now.Month.ToString("00"); } if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.D2.ToString()) { strs[i] = DateTime.Now.Day.ToString("00"); } if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.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() == EnumSerialSourceType.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 = repositoryBaseSerialSN.Where(x => x.SerialType == lst[i].SerialType && x.CurrentDate == DateTime.Now.Date) .OrderByDescending(x => x.Sn).First(); sl.Sn = sn.Sn + 1; } else { var sn = repositoryBaseSerialSN.Where(x => x.SerialType == lst[i].SerialType) .OrderByDescending(x => x.Sn).First(); sl.Sn = sn.Sn + 1; } strs[i] = sl.Sn.ToString(c); } catch (Exception ex) { strs[i] = 1.ToString(c); sl.Sn = 1; } sl.CurrentDate = DateTime.Now.Date; sl.SerialType = lst[i].SerialType; } } StringBuilder BaseSerialSN = new StringBuilder(); foreach (var item in strs) { BaseSerialSN.Append(item.ToString()); } await sl.InsertAsync(); //await repositoryBaseSerialSN.Add(sl); //edm.SaveChanges(); if (string.IsNullOrEmpty(BaseSerialSN.ToString())) { throw Oops.Oh("生成的编号为空"); } return BaseSerialSN.ToString(); } } }