Przeglądaj źródła

产品工艺复制优化

qiuenguang 11 miesięcy temu
rodzic
commit
ef9425af5c
1 zmienionych plików z 108 dodań i 104 usunięć
  1. 108 104
      application/api/controller/Product.php

+ 108 - 104
application/api/controller/Product.php

@@ -342,121 +342,125 @@ class Product extends Api
      * @params string to_pro
      * @params int is_copy_gy
     */
-    public function copyProductGy(){
-        if (Request::instance()->isPost() == false){
+    public function copyProductGy()
+    {
+        $request = Request::instance();
+        if (!$request->isPost()) {
             $this->error('非法请求');
         }
-        $params = Request::instance()->post();
-        if (empty($params['from_code']) || empty($params['to_code']) ){
+
+        $params = $request->post();
+        if (empty($params['from_code']) || empty($params['to_code'])) {
             $this->error('参数不能为空');
         }
-        if ($params['is_copy_gy'] == 1){
-            if (empty($params['to_pro'])){
-                $this->error('工艺方案不能为空');
-            }
-            //查出参考的工艺数据
-            $where['Gy0_cpdh'] = $params['from_code'];
-            $where['Gy0_方案'] = $params['from_pro'];
-            $gyList = db('产品_工艺资料')->where($where)->select();
-            if (empty($gyList)){
-                $this->error('参考产品无工艺资料数据');
-            }
-            $UniqID = db('产品_工艺资料')->order('UniqID desc')->value('UniqID');
-            foreach ($gyList as $key=>$value){
-                unset($gyList[$key]['UniqID']);
-                $UniqID ++;
-                $gyList[$key]['Gy0_方案'] = $params['to_pro'];
-                $gyList[$key]['Gy0_cpdh'] = $params['to_code'];
-                $gyList[$key]['UniqID'] = $UniqID;
+
+        // 定义数据处理策略
+        $strategies = [
+            'gy' => [
+                'flag' => 'is_copy_gy',
+                'table' => '产品_工艺资料',
+                'source_field' => 'Gy0_cpdh',
+                'uniq_field' => 'UniqID',
+                'extra_check' => function () use ($params) {
+                    if (empty($params['to_pro'])) {
+                        $this->error('工艺方案不能为空');
+                    }
+                },
+                'data_mapper' => function ($item, $seq) use ($params) {
+                    return [
+                        'Gy0_方案' => $params['to_pro'],
+                        'Gy0_cpdh' => $params['to_code'],
+                        'UniqID' => $seq
+                    ];
+                }
+            ],
+            'yj' => [
+                'flag' => 'is_copy_yj',
+                'table' => '产品_印件资料',
+                'source_field' => 'yj_cpdh',
+                'uniq_field' => 'UniqId',
+                'data_mapper' => function ($item, $seq) use ($params) {
+                    return [
+                        'yj_cpdh' => $params['to_code'],
+                        'UniqId' => $seq
+                    ];
+                }
+            ],
+            'yb' => [
+                'flag' => 'is_copy_yb',
+                'table' => '产品_印版资料',
+                'source_field' => 'YB_Cpdh',
+                'uniq_field' => 'UniqID',
+                'data_mapper' => function ($item, $seq) use ($params) {
+                    return [
+                        'YB_Cpdh' => $params['to_code'],
+                        'UniqID' => $seq
+                    ];
+                }
+            ]
+        ];
+
+        $processed = false;
+        foreach ($strategies as $key => $strategy) {
+            if (($params[$strategy['flag']] ?? 0) != 1) continue;
+
+            $processed = true;
+            if (isset($strategy['extra_check'])) {
+                call_user_func($strategy['extra_check']);
             }
-        }
-        if ($params['is_copy_yj'] == 1){
-            //查出参考的印件资料
-            $yjList = db('产品_印件资料')->where('yj_cpdh',$params['from_code'])->select();
-            if (empty($yjList)){
-                $this->error('参考产品无印件资料数据');
+
+            // 构建查询条件
+            $query = db($strategy['table'])->where($strategy['source_field'], $params['from_code']);
+            if ($key === 'gy') {
+                $query->where('Gy0_方案', $params['from_pro']);
             }
-            $Uniqid = db('产品_印件资料')->order('UniqId desc')->value('UniqId');
-            foreach ($yjList as $key=>$value){
-                unset($yjList[$key]['UniqId']);
-                $Uniqid ++;
-                $yjList[$key]['yj_cpdh'] = $params['to_code'];
-                $yjList[$key]['UniqId'] = $Uniqid;
+
+            $data = $query->select();
+            if (empty($data)) {
+                $this->error("参考产品无{$strategy['table']}数据");
             }
-        }
-        if ($params['is_copy_yb'] == 1){
-            $UniqId = db('产品_印版资料')->order('UniqID desc')->value('UniqID');
-            $option['YB_Cpdh'] = $params['from_code'];
-            $ybList = db('产品_印版资料')->where($option)->select();
-            if (empty($ybList)){
-                $this->error('参考产品无印版资料数据');
+
+            // 生成序列号
+            $maxId = db($strategy['table'])
+                ->order("{$strategy['uniq_field']} desc")
+                ->value($strategy['uniq_field']) ?: 0;
+
+            // 处理数据
+            $processedData = [];
+            $currentSeq = 1;
+            foreach ($data as $item) {
+                unset($item[$strategy['uniq_field']]);
+                $mapped = array_merge(
+                    $item,
+                    call_user_func($strategy['data_mapper'], $item, $maxId + $currentSeq)
+                );
+                $processedData[] = $mapped;
+                $currentSeq++;
             }
-            foreach ($ybList as $key=>$value){
-                unset($ybList[$key]['UniqID']);
-                $UniqId++;
-                $ybList[$key]['YB_Cpdh'] = $params['to_code'];
-                $ybList[$key]['UniqID'] = $UniqId;
+
+            // 事务处理
+            db()->startTrans();
+            try {
+                db($strategy['table'])
+                    ->where($strategy['source_field'], $params['to_code'])
+                    ->delete();
+
+                if (!db($strategy['table'])->insertAll($processedData)) {
+                    throw new \Exception("Insert failed");
+                }
+
+                db()->commit();
+            } catch (\Exception $e) {
+                db()->rollback();
+                $this->error("复制{$strategy['table']}数据失败: " . $e->getMessage());
             }
         }
-        if ($params['is_copy_gy'] == 1 && $params['is_copy_yb'] == 1 && $params['is_copy_yj'] == 1){
-            $gyResult = db('产品_工艺资料')->insertAll($gyList);
-            if (!$gyResult){
-                $this->error('复制产品工艺资料数据失败');
-            }
-            $yjResult = \db('产品_印件资料')->insertAll($yjList);
-            if (!$yjResult){
-                $this->error('复制产品印件资料数据失败');
-            }
-            $ybResult = db('产品_印版资料')->insertAll($ybList);
-            if (!$ybResult){
-                $this->error('复制产品印版资料数据失败');
-            }
-        }elseif ($params['is_copy_gy'] == 1 && $params['is_copy_yb'] == 1 && $params['is_copy_yj'] == 0){
-            $gyResult = db('产品_工艺资料')->insertAll($gyList);
-            if (!$gyResult){
-                $this->error('复制产品工艺资料数据失败');
-            }
-            $ybResult = db('产品_印版资料')->insertAll($ybList);
-            if (!$ybResult){
-                $this->error('复制产品印版资料数据失败');
-            }
-        }elseif ($params['is_copy_gy'] == 1 && $params['is_copy_yb'] == 0 && $params['is_copy_yj'] == 1){
-            $gyResult = db('产品_工艺资料')->insertAll($gyList);
-            if (!$gyResult){
-                $this->error('复制产品工艺资料数据失败');
-            }
-            $yjResult = \db('产品_印件资料')->insertAll($yjList);
-            if (!$yjResult){
-                $this->error('复制产品印件资料数据失败');
-            }
-        }elseif ($params['is_copy_gy'] == 1 && $params['is_copy_yb'] == 0 && $params['is_copy_yj'] == 0){
-            $gyResult = db('产品_工艺资料')->insertAll($gyList);
-            if (!$gyResult){
-                $this->error('复制产品工艺资料数据失败');
-            }
-        }elseif ($params['is_copy_gy'] == 0 && $params['is_copy_yb'] == 1 && $params['is_copy_yj'] == 1){
-            $yjResult = \db('产品_印件资料')->insertAll($yjList);
-            if (!$yjResult){
-                $this->error('复制产品印件资料数据失败');
-            }
-            $ybResult = db('产品_印版资料')->insertAll($ybList);
-            if (!$ybResult){
-                $this->error('复制产品印版资料数据失败');
-            }
-        }elseif ($params['is_copy_gy'] == 0 && $params['is_copy_yb'] == 1 && $params['is_copy_yj'] == 0){
-            $ybResult = db('产品_印版资料')->insertAll($ybList);
-            if (!$ybResult){
-                $this->error('复制产品印版资料数据失败');
-            }
-        }elseif ($params['is_copy_gy'] == 0 && $params['is_copy_yb'] == 0 && $params['is_copy_yj'] == 1) {
-            $yjResult = \db('产品_印件资料')->insertAll($yjList);
-            if (!$yjResult) {
-                $this->error('复制产品印件资料数据失败');
-            }
-        }else{
-            $this->success('工艺、印版至少选中一个');
+
+        if (!$processed) {
+            $this->error('请至少选择一个复制项目');
         }
-        $this->success('工艺复制成功');
+
+        $this->success('数据复制成功');
     }
     /**
      * 工艺方案更名