C#如何按自定义周期递增含年月段的发票编号
发票编号递增功能实现方案
你需要先补充几个类成员存储规则配置和计数,再按规则拼接后四位即可,完整实现如下:
第一步:添加必要的私有成员
// 自定义起始日期,可根据你的业务需求修改初始值 private DateTime _startDate = new DateTime(2021, 8, 1); // 已生成发票的周期计数,初始值为0,必须持久化存储到数据库/配置文件,避免程序重启重置 private int _invoiceCycleCount = 0; // 多线程锁,避免并发场景下计数重复 private readonly object _cycleLock = new object();
第二步:补充InvoiceNumber属性逻辑
string AA { get { return this.IdentifierA.Substring(0, 2); } set { SetAndNotify(ref this.AA, value); } } string BB { get { return this.IdentifierB.Substring(0, 4); } set { SetAndNotify(ref this.BB, value); } } string InvoiceNumber { get { lock(_cycleLock) { // 按当前周期计数计算对应的日期 var currentCycleDate = _startDate.AddMonths(_invoiceCycleCount); // 格式化为MMYY格式,自动补前导零、取年份后两位 string dateSuffix = currentCycleDate.ToString("MMyy"); return String.Concat(AA, BB, dateSuffix).ToUpper(); } } set { SetAndNotify(ref this.InvoiceNumber, value); } }
第三步:周期递增触发逻辑
每次新建一张发票、需要生成下一个编号时,主动触发计数自增即可:
// 仅在需要生成下一张发票的编号前执行,不要放到InvoiceNumber的get方法中 lock(_cycleLock) { _invoiceCycleCount++; // 此处同步将最新的_invoiceCycleCount持久化到存储介质 }
注意事项
- 如果你的递增周期不是自然月,只需将
AddMonths(1)的参数修改为对应月数即可,比如季度递增就改为AddMonths(3) - 生产环境务必将
_invoiceCycleCount持久化存储,不能仅存在内存中,否则程序重启后计数重置会出现编号重复 - 若需要支持调整起始日期,可将
_startDate改为可配置的公共属性,同时配套调整计数的偏移量即可
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

