Laravel实现发票编号每年1月1日自动重置序号功能求助
Laravel 年度重置的发票自动编号实现
你的现有代码存在两个核心问题:
- 未按年份筛选最新发票,跨年时会沿用去年的编号继续递增,无法重置为1
- 正则提取编号逻辑错误,会把日期部分的数字也包含进去,导致编号计算完全错误
以下是修正后的实现代码:
function noinvoice() { $currentYear = date('Y'); $currentMonth = date('m'); // 仅查询当前年份的最新发票 $latest = Pengiriman::whereYear('created_at', $currentYear) ->latest() ->first(); if (!$latest) { return "1/{$currentMonth}/{$currentYear}"; } // 提取发票编号中的前缀数字(xx部分) preg_match('/^(\d+)\//', $latest->noinvoice, $matches); $lastNumber = isset($matches[1]) ? (int)$matches[1] : 0; return sprintf("%d/%s/%s", $lastNumber + 1, $currentMonth, $currentYear); }
关键逻辑说明:
- 按年份筛选:通过
whereYear('created_at', $currentYear)确保只获取当前年度的发票,跨年时自然会因为没有当年数据而重置为1 - 正确提取编号前缀:使用
preg_match匹配编号开头的数字部分,避免把日期的数字混入计算 - 格式化输出:用
sprintf保证格式统一,避免字符串拼接的冗余
如果你的发票编号不是基于created_at字段判断年份,而是直接取编号中的年份部分,可以调整查询逻辑为:
$latest = Pengiriman::where('noinvoice', 'like', "%/{$currentYear}") ->latest() ->first();
内容的提问来源于stack exchange,提问作者Arya Rizky Sandi
相关产品推荐
相关产品推荐

