using DocumentFormat.OpenXml.Wordprocessing; using SqlSugar; namespace OpenAuth.App.workflow; /// /// 业务编号生成器 /// 格式:YYYYMM + 4位序列号 (如:2024120001) /// public class BusinessNoGenerator { private readonly ISqlSugarClient _sqlSugar; private static readonly object _lockObject = new object(); public BusinessNoGenerator(ISqlSugarClient sqlSugar) { _sqlSugar = sqlSugar; } /// /// 生成业务编号 /// /// 业务前缀(可选) /// 业务编号 public string GenerateBusinessNo(string prefix = "",int step =1) { lock (_lockObject) { var currentDate = DateTime.Now; var yearMonth = currentDate.ToString("yyyyMM"); // 查询当天最大序列号 var todayPrefix = $"{prefix}{yearMonth}"; var maxSequence = _sqlSugar.Queryable() .Where(s => s.DatePrefix == todayPrefix) .OrderByDescending(s => s.SequenceNumber) .Select(s => s.SequenceNumber) .First(); // 计算新的序列号 var newSequence = maxSequence + step; // 更新序列号记录 var sequenceRecord = new BusinessNoSequence { DatePrefix = todayPrefix, SequenceNumber = newSequence, LastUpdateTime = DateTime.Now }; // 如果记录不存在则插入,否则更新 var existingRecord = _sqlSugar.Queryable() .Where(s => s.DatePrefix == todayPrefix) .First(); if (existingRecord == null) { _sqlSugar.Insertable(sequenceRecord).ExecuteCommand(); } else { _sqlSugar.Updateable() .SetColumns(s => new BusinessNoSequence { SequenceNumber = newSequence, LastUpdateTime = DateTime.Now }) .Where(s => s.DatePrefix == todayPrefix) .ExecuteCommand(); } // 格式化返回业务编号 return $"{todayPrefix}{newSequence:D4}"; } } /// /// 批量生成业务编号 /// /// 生成数量 /// 业务前缀 /// 业务编号列表 public List GenerateBatchBusinessNo(int count, string prefix = "") { var businessNos = new List(); lock (_lockObject) { for (int i = 0; i < count; i++) { businessNos.Add(GenerateBusinessNo(prefix)); } } return businessNos; } } /// /// 业务编号序列记录表 /// [SugarTable("zy_business_no_sequence")] public class BusinessNoSequence { /// /// 日期前缀 (YYYYMM格式) /// [SugarColumn(ColumnName = "dateprefix")] public string DatePrefix { get; set; } /// /// 当前序列号 /// [SugarColumn(ColumnName = "sequencenumber")] public int SequenceNumber { get; set; } /// /// 最后更新时间 /// [SugarColumn(ColumnName = "lastupdatetime")] public DateTime LastUpdateTime { get; set; } }