Browse Source

修正订单编号重复问题

m0_70156489 1 month ago
parent
commit
4ce538cecd
1 changed files with 154 additions and 112 deletions
  1. 154 112
      application/api/controller/WorkOrder.php

+ 154 - 112
application/api/controller/WorkOrder.php

@@ -338,26 +338,12 @@ class WorkOrder extends Api
         $param['Sys_rq'] = date('Y-m-d H:i:s');
         $param['gd_statu'] = '1-计划中';
 
-//        $prefix = substr($param['订单编号'], 0, 2);
-//        $maxOrder = \db('工单_基本资料')
-//            ->where('订单编号', 'like', "{$prefix}%")
-//            ->order('订单编号', 'desc')
-//            ->limit(1)
-//            ->value('订单编号');
-//        if ($maxOrder) {
-//            $numericPart = substr($maxOrder, 2);
-//            $newNumericPart = str_pad((int)$numericPart + 1, strlen($numericPart), '0', STR_PAD_LEFT);
-//            $param['订单编号'] = $prefix . $newNumericPart;
-//        } else {
-//            $param['订单编号'] = $param['订单编号'];
-//        }
-//        if ($maxOrder) {
-//            $numericPart = substr($maxOrder, 2);
-//            $newNumericPart = str_pad((int)$numericPart + 1, strlen($numericPart), '0', STR_PAD_LEFT);
-//            $param['订单编号'] = $prefix . $newNumericPart;
-//        } else {
-//            $param['订单编号'] = $param['订单编号'];
-//        }
+        // 验证订单编号是否已存在,冲突则按规则自动 +1 直到可用
+        if (empty($param['订单编号'])) {
+            $this->error('订单编号不能为空');
+        }
+        $param['订单编号'] = $this->resolveUniqueWorkOrderNo($param['订单编号']);
+
         $data = $param;
         unset($data['关联订单']);
         unset($data['关联面料ID']);
@@ -1588,25 +1574,7 @@ class WorkOrder extends Api
         if ($this->request->isGet() === false){
             $this->error('请求错误');
         }
-        $time =substr( date('Ym',time()),2);
-        $lastOrder = \db('工单_基本资料')
-            ->where('订单编号','like','%'.$time.'%')
-            ->order('Uniqid desc')
-            ->whereNull('Mod_rq')
-            ->find();
-        if (empty($lastOrder)){
-            $newNumber = 1;
-        }else{
-            $lastNumber = substr($lastOrder['订单编号'],6);
-            $newNumber = (int)$lastNumber + 1;
-        }
-        if ($newNumber<10){
-            $newOrder = 'DC'.$time.'00'.$newNumber;
-        }elseif ($newNumber>=10 && $newNumber<100){
-            $newOrder = 'DC'.$time.'0'.$newNumber;
-        }else{
-            $newOrder = 'DC'.$time.$newNumber;
-        }
+        $newOrder = $this->generateNextWorkOrderNo();
         $this->success('成功',$newOrder);
     }
 
@@ -3683,7 +3651,7 @@ class WorkOrder extends Api
     }
 
     /**
-        成品入仓订单列表
+    成品入仓订单列表
      */
     public function GetWfpList()
     {
@@ -3875,8 +3843,8 @@ class WorkOrder extends Api
     }
 
     /**
-    * 成品入仓子订单列表
-    */
+     * 成品入仓子订单列表
+     */
     public function GetSubOrderStats()
     {
         if (!$this->request->isGet()) {
@@ -5344,7 +5312,7 @@ class WorkOrder extends Api
         $res['msg'] = '成功';
         $res['data'] = $limitedList;
         return json($res);
-     }
+    }
     //Bom资料列表
     public function Get_BomList(){
         if (!$this->request->isGet()) {
@@ -5378,17 +5346,17 @@ class WorkOrder extends Api
             ->whereNull('a.Mod_rq')
             ->select();
         $total = Db::name('工单_bom资料')->alias('a')
-        ->whereNull('Mod_rq')
-        ->where($where)
-        ->count();
+            ->whereNull('Mod_rq')
+            ->where($where)
+            ->count();
         $res['code'] = 0;
         $res['msg'] = '成功';
         $res['count'] = $total;
         $res['data'] = $list;
         return json($res);
-     }
+    }
 
-     //查询订单进度情况
+    //查询订单进度情况
     public function GetOrderprogress(){
         if (!$this->request->isGet()) {
             $this->error('请求方式错误');
@@ -5537,7 +5505,7 @@ class WorkOrder extends Api
     }
 
 
-        //video_691c078dbb648190a17625bbef815ce50cbc1621ce1702d7
+    //video_691c078dbb648190a17625bbef815ce50cbc1621ce1702d7
     public function video()
     {
         $params = $this->request->param();
@@ -5658,84 +5626,84 @@ class WorkOrder extends Api
         }
     }
 
-     /**
+    /**
      * 获取视频内容
      * 下载已完成的视频内容
      */
     public function videoContent(){
-            // 从请求参数获取video_id,如果没有则使用默认值
-            $video_id = input('get.video_id');
-            $apiKey = 'sk-sWW1GFlnjbrDRb1DkMEzePIxgdvLK6cZt0Qg93yDMVP2z1yN';
+        // 从请求参数获取video_id,如果没有则使用默认值
+        $video_id = input('get.video_id');
+        $apiKey = 'sk-sWW1GFlnjbrDRb1DkMEzePIxgdvLK6cZt0Qg93yDMVP2z1yN';
 
-            // 1. 先检查视频状态
-            $statusUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id;
-            $statusData = $this->fetchVideoStatus($statusUrl, $apiKey);
+        // 1. 先检查视频状态
+        $statusUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id;
+        $statusData = $this->fetchVideoStatus($statusUrl, $apiKey);
 
-            // 检查视频状态
-            if ($statusData['status'] !== 'completed') {
-                return json([
-                    'code' => 202,
-                    'msg' => '视频尚未生成完成',
-                    'data' => [
-                        'video_id' => $video_id,
-                        'status' => $statusData['status'],
-                        'progress' => $statusData['progress'],
-                        'created_at' => $statusData['created_at'],
-                        'message' => '请稍后再试,视频仍在' . ($statusData['status'] === 'queued' ? '排队中' : '处理中')
-                    ]
-                ]);
-            }
+        // 检查视频状态
+        if ($statusData['status'] !== 'completed') {
+            return json([
+                'code' => 202,
+                'msg' => '视频尚未生成完成',
+                'data' => [
+                    'video_id' => $video_id,
+                    'status' => $statusData['status'],
+                    'progress' => $statusData['progress'],
+                    'created_at' => $statusData['created_at'],
+                    'message' => '请稍后再试,视频仍在' . ($statusData['status'] === 'queued' ? '排队中' : '处理中')
+                ]
+            ]);
+        }
 
-            // 2. 视频生成完成,准备下载
-            $apiUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id . '/content';
+        // 2. 视频生成完成,准备下载
+        $apiUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id . '/content';
 
-            // 获取可选的variant参数
-            $variant = input('get.variant', '');
-            if (!empty($variant)) {
-                $apiUrl .= '?variant=' . urlencode($variant);
-            }
+        // 获取可选的variant参数
+        $variant = input('get.variant', '');
+        if (!empty($variant)) {
+            $apiUrl .= '?variant=' . urlencode($variant);
+        }
 
-            // 创建保存目录
-            $saveDir = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'videos' . DS . date('Ymd');
-            if (!is_dir($saveDir)) {
-                mkdir($saveDir, 0755, true);
-            }
+        // 创建保存目录
+        $saveDir = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'videos' . DS . date('Ymd');
+        if (!is_dir($saveDir)) {
+            mkdir($saveDir, 0755, true);
+        }
 
-            // 生成唯一文件名
-            $filename = $video_id . '.mp4';
-            $localPath = DS . 'uploads' . DS . 'videos' . DS . date('Ymd') . DS . $filename;
-            $fullPath = $saveDir . DS . $filename;
+        // 生成唯一文件名
+        $filename = $video_id . '.mp4';
+        $localPath = DS . 'uploads' . DS . 'videos' . DS . date('Ymd') . DS . $filename;
+        $fullPath = $saveDir . DS . $filename;
 
-            // 3. 下载视频
-            $videoData = $this->downloadVideo($apiUrl, $apiKey);
+        // 3. 下载视频
+        $videoData = $this->downloadVideo($apiUrl, $apiKey);
 
-            // 4. 保存视频文件
-            if (file_put_contents($fullPath, $videoData) === false) {
-                throw new Exception('视频保存失败');
-            }
+        // 4. 保存视频文件
+        if (file_put_contents($fullPath, $videoData) === false) {
+            throw new Exception('视频保存失败');
+        }
 
-            // 确保路径使用正斜杠,并只保存相对路径部分
-            $localPath = str_replace('\\', '/', $localPath);
-            // 移除开头的斜杠,确保路径格式为uploads/videos/...
-            $savePath = ltrim($localPath, '/');
+        // 确保路径使用正斜杠,并只保存相对路径部分
+        $localPath = str_replace('\\', '/', $localPath);
+        // 移除开头的斜杠,确保路径格式为uploads/videos/...
+        $savePath = ltrim($localPath, '/');
 
-            // 将正确格式的文件路径存入数据库
-            Db::name('video')->where('video_id', $video_id)->update([
-                'web_url' => $savePath
-            ]);
+        // 将正确格式的文件路径存入数据库
+        Db::name('video')->where('video_id', $video_id)->update([
+            'web_url' => $savePath
+        ]);
 
-            // 返回成功响应
-            return json([
-                'code' => 0,
-                'msg' => '视频下载成功',
-                'data' => [
-                    'video_id' => $video_id,
-                    'local_path' => $localPath,
-                    'web_url' => $savePath,
-                    'file_size' => filesize($fullPath)
-                ]
-            ]);
-        }
+        // 返回成功响应
+        return json([
+            'code' => 0,
+            'msg' => '视频下载成功',
+            'data' => [
+                'video_id' => $video_id,
+                'local_path' => $localPath,
+                'web_url' => $savePath,
+                'file_size' => filesize($fullPath)
+            ]
+        ]);
+    }
 
 
     /**
@@ -5921,4 +5889,78 @@ class WorkOrder extends Api
         $this->success('修改成功');
     }
 
+    /**
+     * 订单编号是否已存在(未删除)
+     */
+    private function isWorkOrderNoExists($orderNo)
+    {
+        return (bool)\db('工单_基本资料')
+            ->where('订单编号', $orderNo)
+            ->whereNull('Mod_rq')
+            ->value('Uniqid');
+    }
+
+    /**
+     * 按 DC + 年月 + 序号 规则格式化订单编号
+     */
+    private function formatWorkOrderNo($prefix, $newNumber)
+    {
+        if ($newNumber < 10) {
+            return $prefix . '00' . $newNumber;
+        }
+        if ($newNumber >= 10 && $newNumber < 100) {
+            return $prefix . '0' . $newNumber;
+        }
+        return $prefix . $newNumber;
+    }
+
+    /**
+     * 生成下一个可用订单编号(与 getWorkOrder 规则一致)
+     */
+    private function generateNextWorkOrderNo()
+    {
+        $time = substr(date('Ym'), 2);
+        $prefix = 'DC' . $time;
+        $lastOrder = \db('工单_基本资料')
+            ->where('订单编号', 'like', '%' . $time . '%')
+            ->whereNull('Mod_rq')
+            ->order('Uniqid desc')
+            ->find();
+
+        $newNumber = empty($lastOrder) ? 1 : ((int)substr($lastOrder['订单编号'], 6) + 1);
+        $orderNo = $this->formatWorkOrderNo($prefix, $newNumber);
+        while ($this->isWorkOrderNoExists($orderNo)) {
+            $newNumber++;
+            $orderNo = $this->formatWorkOrderNo($prefix, $newNumber);
+        }
+        return $orderNo;
+    }
+
+    /**
+     * 提交前确保订单编号唯一:不存在则原样使用,存在则递增直到可用
+     */
+    private function resolveUniqueWorkOrderNo($orderNo)
+    {
+        $orderNo = trim($orderNo);
+        if ($orderNo === '') {
+            return $this->generateNextWorkOrderNo();
+        }
+        if (!$this->isWorkOrderNoExists($orderNo)) {
+            return $orderNo;
+        }
+
+        $prefix = substr($orderNo, 0, 6);
+        $numericPart = (int)substr($orderNo, 6);
+        if ($prefix === '' || $numericPart <= 0) {
+            return $this->generateNextWorkOrderNo();
+        }
+
+        do {
+            $numericPart++;
+            $orderNo = $this->formatWorkOrderNo($prefix, $numericPart);
+        } while ($this->isWorkOrderNoExists($orderNo));
+
+        return $orderNo;
+    }
+
 }