You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:57:03