namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Numbering; /// /// 业务单号取号 provider 抽象(跨实例强唯一由具体 provider 保证;替换 read-MAX-then-write)。 /// 生产实现复用 NumberRuleService(NbrControl 规则行 FOR UPDATE + NbrDayInfo 计数器)。 /// 单元/并发测试用 InMemory 实现。禁止任何实现走 SELECT MAX()+1。 /// public interface IBusinessNumberProvider { /// 取一批业务单号(同一批号连续、跨批唯一)。生产实现应在既有事务内调用。 Task> NextBatchAsync(string ruleCode, string domain, int count, string operatorNo); } /// 业务单号规则(供 InMemory provider 格式化用;生产规则来自 NbrControl 行)。 public sealed class BusinessNumberRule { public string RuleCode { get; set; } public string Prefix1 { get; set; } public string Prefix2 { get; set; } public string Prefix3 { get; set; } /// 日期段类型,如 "YYYYMMDD";配合 IsDateType。 public string DateType { get; set; } public bool IsDateType { get; set; } public int? MaxValue { get; set; } public int IniValue { get; set; } = 1; } /// 「取号 → 消费(DB UNIQUE 兜底 duplicate-key 有限重试)」的结果。 public sealed class BusinessNumberConsumeResult { public bool Success { get; set; } public string Number { get; set; } /// 实际尝试次数(≥1,≤ maxRetry)。 public int Attempts { get; set; } }