diff --git a/application/admin/controller/Order.php b/application/admin/controller/Order.php index e8a1bde..a030bc7 100644 --- a/application/admin/controller/Order.php +++ b/application/admin/controller/Order.php @@ -471,15 +471,7 @@ class Order extends Backend function generateOrderNumber($prefix = '') { - // 获取当前时间戳(精确到毫秒) - $timestamp = microtime(true); - $date = date('YmdHis', (int)$timestamp); // 格式:YYYYMMDDHHMMSS -// $randomNum = strtoupper(substr(md5($timestamp), 0, 4)); // 从时间戳生成一个随机字符串,取前四个字符 - $code = str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT); - // 组合生成的订单编号 - $orderNumber = $prefix . $date . $code; - // 取 MD5 前10位 - return substr(md5($orderNumber), 0, 10); + return \app\admin\model\Order::generateOrderNo(); } use AmapTrait; diff --git a/application/admin/model/Order.php b/application/admin/model/Order.php index 6218187..1036f48 100644 --- a/application/admin/model/Order.php +++ b/application/admin/model/Order.php @@ -3,6 +3,8 @@ namespace app\admin\model; use app\admin\library\Auth; +use app\common\services\RedisService; +use think\Cache; use think\Model; use traits\model\SoftDelete; @@ -279,4 +281,25 @@ class Order extends Model return $this->belongsTo(Worker::class,'worker_id',); } + /** + * 生成唯一订单号:8位纯数字(如25063001) + * 格式:yyMMdd + 当天自增序号 + */ + public static function generateOrderNo() + { + $date = date('ymd'); // 6 位日期 + $key = 'order_inc:' . date('Ymd'); + + $redis = new RedisService(0); + $inc = $redis->incrWithExpire($key); + + if ($inc > 9999) { + throw new \Exception('订单号已满'); + } + + $suffix = str_pad($inc, 4, '0', STR_PAD_LEFT); // 可改为 4 位更安全 + return $date . $suffix; // 最终结果:如 2506300001 + } + + } diff --git a/application/common/services/RedisService.php b/application/common/services/RedisService.php new file mode 100644 index 0000000..f1a1840 --- /dev/null +++ b/application/common/services/RedisService.php @@ -0,0 +1,28 @@ +redis = Cache::store('redis')->handler(); + $this->redis->select($db); + } + + public function incrWithExpire(string $key, int $expireSeconds = 86400) + { + $val = $this->redis->incr($key); + if ($val === 1) { + $this->redis->expire($key, $expireSeconds); + } + return $val; + } +} \ No newline at end of file