From 7d866b851385e28552c03e4ae24140d2f4dcdac3 Mon Sep 17 00:00:00 2001 From: hant Date: Mon, 30 Jun 2025 20:54:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/controller/Order.php | 10 +--------- application/admin/model/Order.php | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 9 deletions(-) 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..ec0076f 100644 --- a/application/admin/model/Order.php +++ b/application/admin/model/Order.php @@ -3,6 +3,7 @@ namespace app\admin\model; use app\admin\library\Auth; +use think\Cache; use think\Model; use traits\model\SoftDelete; @@ -279,4 +280,28 @@ 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'); + + $inc = Cache::store('redis')->inc($key); // 自增 + + // 设置 key 过期(防止 key 永久存在) + $handler = Cache::store('redis')->handler(); + $handler->expire($key, 86400); // 设置 1 天过期 + + if ($inc > 9999) { + throw new \Exception('订单号已满'); + } + + $suffix = str_pad($inc, 4, '0', STR_PAD_LEFT); // 可改为 4 位更安全 + return $date . $suffix; // 最终结果:如 2506300001 + } + + } From 28633df9cdac5108c9befdca3588014028a8b6df Mon Sep 17 00:00:00 2001 From: hant Date: Mon, 30 Jun 2025 22:38:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/model/Order.php | 8 +++--- application/common/services/RedisService.php | 28 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 application/common/services/RedisService.php diff --git a/application/admin/model/Order.php b/application/admin/model/Order.php index ec0076f..1036f48 100644 --- a/application/admin/model/Order.php +++ b/application/admin/model/Order.php @@ -3,6 +3,7 @@ namespace app\admin\model; use app\admin\library\Auth; +use app\common\services\RedisService; use think\Cache; use think\Model; use traits\model\SoftDelete; @@ -289,11 +290,8 @@ class Order extends Model $date = date('ymd'); // 6 位日期 $key = 'order_inc:' . date('Ymd'); - $inc = Cache::store('redis')->inc($key); // 自增 - - // 设置 key 过期(防止 key 永久存在) - $handler = Cache::store('redis')->handler(); - $handler->expire($key, 86400); // 设置 1 天过期 + $redis = new RedisService(0); + $inc = $redis->incrWithExpire($key); if ($inc > 9999) { throw new \Exception('订单号已满'); 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