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; }
}