cqp 2 месяцев назад
Родитель
Сommit
af84cb7e50
2 измененных файлов с 27 добавлено и 11 удалено
  1. 17 10
      app/Service/RDService.php
  2. 10 1
      app/Service/RdGenerateDeviceService.php

+ 17 - 10
app/Service/RDService.php

@@ -63,7 +63,7 @@ class RDService extends Service
             DB::beginTransaction();
 
             $model = new RD();
-            $model->order_number = $this->generateOrderNumber($data['type']);
+            $model->order_number = $this->generateOrderNumber($data['type'],$data['item_id']);
             $model->type = $data['type'] ?? 0;
             $model->item_id = $data['item_id'] ?? 0;
             $model->order_time = $data['order_time'] ?? 0;
@@ -324,18 +324,25 @@ class RDService extends Service
         return $data;
     }
 
-    public function generateOrderNumber($type)
+    public function generateOrderNumber($type, $itemId = 0)
     {
-        if($type == 1){
-            $dayPrefix = date('Ymd', time()); // 例如 20251216
-            // 随机后缀 + uniqid 保证唯一
-            $orderNumber = 'RD' . $dayPrefix . mt_rand(1000, 9999) . substr(uniqid(), -3);
-        }else{
-            // --- 修改订单号生成逻辑,增加设备ID前缀和更长的随机串 ---
-            $orderNumber = 'RD' . time() . 'D' . rand(1,5) . 'S' . uniqid();
+        $dateStr = date('Ymd');
+
+        if ($type == 1) {
+            // --- 方案:日期 + (项目ID或默认值) + 微秒哈希 ---
+            // substr(uniqid(), 7, 5) 提取的是微秒级变化的随机串,比 md5 更短且在单机并发下极难重复
+            $orderNumber = sprintf("RD%s%d%s",
+                $dateStr,
+                $itemId ?: 0,
+                substr(uniqid(), 8, 5)
+            );
+        } else {
+            // --- 方案:日期 + 随机序列 ---
+            // 使用 dechex(mt_rand()) 将随机数转为 16 进制,进一步缩短长度
+            $orderNumber = 'RD' . $dateStr . dechex(mt_rand(100000, 999999)) . substr(uniqid(), -4);
         }
 
-        return $orderNumber;
+        return strtoupper($orderNumber); // 统一转大写,看起来更专业
 
         $yyyymm = date('Ym');
 

+ 10 - 1
app/Service/RdGenerateDeviceService.php

@@ -118,7 +118,16 @@ class RdGenerateDeviceService extends Service
 
             foreach ($projectGroups as $itemId => $timeBlocks) {
                 foreach ($timeBlocks as $timeKey => $data) {
-                    $orderNumber = 'RD' . $day . 'P' . $itemId . 'S' . $sequence . uniqid();
+                    // ... 循环内部 ...
+                    $dateStr = date('Ymd', $day);
+                    // 结合项目ID、循环序列和4位随机字符,兼顾了短小和唯一性
+                    $orderNumber = sprintf("RD%s%d%s%s",
+                        $dateStr,
+                        $itemId,
+                        dechex($sequence),
+                        substr(md5(mt_rand()), 0, 4)
+                    );
+//                    $orderNumber = 'RD' . $day . 'P' . $itemId . 'S' . $sequence . uniqid();
                     $crtTime = $baseCrtTime + ($sequence * 10) + mt_rand(0, 5);
 
                     $pendingRds[] = [