*/ private const NUMBER_SOURCES = [ 'PO' => ['purchase_order', 'purchase_no'], 'SO' => ['store_order', 'order_no'], 'ZD' => ['bill', 'bill_no'], 'ZF' => ['payment', 'payment_no'], ]; /** * 生成业务单号 * * @param string $prefix 业务前缀:PO 采购单 / SO 订货单 / ZD 账单 / ZF 支付 * @return string 如 PO202607230001 */ public function make(string $prefix): string { $prefix = strtoupper($prefix); $source = self::NUMBER_SOURCES[$prefix] ?? throw new InvalidArgumentException('不支持的单号前缀:' . $prefix); [$table, $column] = $source; $datePrefix = $prefix . now()->format('Ymd'); $maxNo = DB::table($table) ->where($column, 'like', $datePrefix . '%') ->lockForUpdate() ->max($column); $sequence = 1; if (is_string($maxNo) && $maxNo !== '') { $sequence = ((int) substr($maxNo, strlen($datePrefix))) + 1; } return $datePrefix . str_pad((string) $sequence, 4, '0', STR_PAD_LEFT); } }