Kaynağa Gözat

工单生产批次信息查询

unknown 3 ay önce
ebeveyn
işleme
0f12070cbf
1 değiştirilmiş dosya ile 245 ekleme ve 0 silme
  1. 245 0
      application/api/controller/ProductionLot.php

+ 245 - 0
application/api/controller/ProductionLot.php

@@ -217,6 +217,251 @@ class ProductionLot extends Api
             $list[$key]['用户'] = '';
         }
         $this->success('成功',$list);
+    }
+
+
+    /**
+     * 物料批次信息
+     * @return void
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public function MaterialsBatch()
+    {
+        // 1. 简化请求方法验证
+        if (!$this->request->isGet()) {
+            $this->error('请求错误');
+        }
+
+        // 2. 集中参数验证
+        $requiredParams = ['gdbh', 'yjno', 'num'];
+        $param = $this->request->param();
+        $missingParams = [];
+
+        foreach ($requiredParams as $requiredParam) {
+            if (!isset($param[$requiredParam]) || empty($param[$requiredParam])) {
+                $missingParams[] = $requiredParam;
+            }
+        }
+
+        if (!empty($missingParams)) {
+            $this->error('参数错误,缺少:' . implode(', ', $missingParams));
+        }
+
+        // 3. 使用常量或配置定义静态数据
+        $department = [
+            'Y200' => ['裁切','滚切','胶印','上光','切废'],
+            'Y201' => ['丝印','喷码','覆膜'],
+            'Y202' => ['卷凹','单凹','圆烫','圆切','复卷','分条','配卷','拼板','机检(圆切)','手检(圆切)','包装(圆切)'],
+            'Y203' => ['烫金','烫金+凹凸(压纹)','模切','模切+凹凸(压纹)','凹凸(压纹)','拆片','覆膜','对裱'],
+            'Y204' => ['手检','次品检','机检(初检)','二次机检','核检','抽检','包装'],
+            '200'  => ['裁切','滚切','胶印','上光','切废'],
+            '201'  => ['丝印','喷码','覆膜'],
+            '202'  => ['卷凹','单凹','圆烫','圆切','复卷','分条','配卷','拼板','机检(圆切)','手检(圆切)','包装(圆切)'],
+            '203'  => ['烫金','烫金+凹凸(压纹)','模切','模切+凹凸(压纹)','凹凸(压纹)','拆片','覆膜','对裱'],
+            '204'  => ['手检','次品检','机检(初检)','二次机检','核检','抽检','包装'],
+        ];
+
+        $validWarehouseCodes = ['101','Y101','200','201','202','203','204','Y200','Y201','Y202','Y203','Y204'];
+
+        // 4. 优化数据库查询,使用链式操作提高可读性
+        $list = db('物料_收发记录')
+            ->alias('a')
+            ->join('物料_存货编码 b', 'a.st_wlbh = b.物料代码')
+            ->field([
+                'a.st_wlbh as 物料编号',
+                'a.供方批次',
+                'a.仓库编号',
+                'rtrim(b.物料名称) as 物料名称'
+            ])
+            ->where('a.st_gdbh', $param['gdbh'])
+            ->where('a.cpdh', $param['cpdh'] ?? '') // 使用空值合并运算符
+            ->whereNotNull('a.供方批次')
+            ->group('a.st_wlbh')
+            ->select();
+
+        if (empty($list)) {
+            $this->error('未找到物料资料');
+        }
+
+        // 5. 提前查询工序数据,避免在循环中重复处理
+        $process = db('设备_产量计酬')
+            ->alias('a')
+            ->join('工单_工艺资料 b', 'a.sczl_gdbh = b.Gy0_gdbh AND a.sczl_yjno = b.Gy0_yjno AND a.sczl_gxh = b.Gy0_gxh')
+            ->where([
+                'a.sczl_gdbh' => $param['gdbh'],
+                'a.sczl_yjno' => $param['yjno']
+            ])
+            ->field([
+                'a.sczl_gxh as 工序号',
+                'b.Gy0_gxmc',
+                'a.sczl_gxmc as 工序名称'
+            ])
+            ->group('a.sczl_gxh')
+            ->select();
+
+        // 6. 重构数据处理逻辑
+        $data = [];
+        $processMap = []; // 缓存工序数据
+
+        // 如果需要按工序名称快速查找,可以先建立映射
+        foreach ($process as $proc) {
+            $processMap[$proc['Gy0_gxmc']] = $proc['工序名称'];
+        }
+
+        foreach ($list as $item) {
+            $warehouseCode = $item['仓库编号'];
+            $baseData = [
+                '流程单号' => $param['num'],
+                '物料编号' => $item['物料编号'],
+                '物料名称' => $item['物料名称'],
+                '供方批次' => $item['供方批次']
+            ];
+
+
+
+            // 7. 优化条件判断逻辑
+            if (in_array($warehouseCode, $validWarehouseCodes, true)) {
+                if ($warehouseCode === '101' || $warehouseCode === 'Y101') {
+                    // 如果是101或Y101仓库,添加第一个工序名称
+                    if (!empty($process[0])) {
+                        $baseData['工序名称'] = $process[0]['工序名称'];
+                    }
+                } else {
+                    // 其他仓库的处理逻辑
+                    if (isset($department[$warehouseCode])) {
+                        $relatedProcesses = $department[$warehouseCode];
+
+                        foreach ($relatedProcesses as $processName) {
+                            if (isset($processMap[$processName])) {
+                                $baseData['工序名称'] = $processMap[$processName];
+                            }
+                        }
+                    }
+                }
+            }
+            $data[] = $baseData;
+        }
+        $this->success('成功',$data);
+    }
+
+    /**
+     * 印版记录
+     * @return void
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public function PrintingPlateList()
+    {
+        // 1. 请求方法验证
+        if (!$this->request->isGet()) {
+            $this->error('请求错误');
+        }
+
+        // 2. 参数验证与提取
+        $param = $this->request->param();
+        $requiredParams = ['gdbh', 'yjno'];
+
+        foreach ($requiredParams as $requiredParam) {
+            if (empty($param[$requiredParam])) {
+                $this->error("参数错误,缺少:{$requiredParam}");
+            }
+        }
+
+        $gdbh = $param['gdbh'];
+        $yjno = $param['yjno'];
+
+        // 3. 主查询 - 获取印版领用记录
+        $list = db('工单_印版领用记录')
+            ->alias('a')
+            ->join('物料_存货编码 b', 'a.Yb_存货编码 = b.物料代码')
+            ->where([
+                'a.Yb_工单编号' => $gdbh,
+                'a.Yb_印件号' => $yjno,
+                'a.Yb_领用机台' => ['<>', '']
+            ])
+            ->field([
+                'a.Yb_存货编码 as 存货编码',
+                'a.Yb_供方批号 as 供方批号',
+                'a.Yb_领用机台 as 领用机台',
+                'TRIM(b.物料名称) as 物料名称', // 使用TRIM替代rtrim
+                'a.Sys_id as 用户'
+            ])
+            ->group('a.Yb_存货编码, a.Yb_供方批号') // 明确指定表字段
+            ->order('a.Yb_存货编码')
+            ->select();
+
+        if (empty($list)) {
+            $this->error('未找到印版数据');
+        }
+
+        // 4. 收集所有机台号,准备批量查询
+        $machineCodes = array_column($list, '领用机台');
+        $machineCodes = array_unique(array_filter($machineCodes)); // 去重并过滤空值
+
+        // 5. 批量查询产量计酬数据 - 解决N+1查询问题
+        $processMap = [];
+        if (!empty($machineCodes)) {
+            $processList = db('设备_产量计酬')
+                ->where([
+                    'sczl_gdbh' => $gdbh,
+                    'sczl_yjno' => $yjno,
+                    'sczl_jtbh' => ['IN', $machineCodes]
+                ])
+                ->field([
+                    'sczl_jtbh as 机台编号',
+                    'sczl_gxmc as 工序名称',
+                    'sczl_num as 流程单号'
+                ])
+                ->order('sczl_num, sczl_jtbh')
+                ->select();
+
+            // 按机台编号分组,建立映射
+            foreach ($processList as $process) {
+                $machineCode = $process['机台编号'];
+                if (!isset($processMap[$machineCode])) {
+                    $processMap[$machineCode] = [];
+                }
+                $processMap[$machineCode][] = [
+                    '工序名称' => $process['工序名称'],
+                    '流程单号' => $process['流程单号']
+                ];
+            }
+        }
+
+        // 6. 数据组装
+        $data = [];
+        foreach ($list as $item) {
+            $machineCode = $item['领用机台'];
+            $baseData = [
+                '存货编码' => $item['存货编码'],
+                '供方批号' => $item['供方批号'],
+                '领用机台' => $machineCode,
+                '物料名称' => $item['物料名称'],
+                '用户' => $item['用户']
+            ];
+
+            // 如果该机台有对应的工序数据
+            if (isset($processMap[$machineCode]) && !empty($processMap[$machineCode])) {
+                foreach ($processMap[$machineCode] as $process) {
+                    $data[] = array_merge($baseData, $process);
+                }
+            } else {
+                // 如果机台没有对应工序,至少返回基础信息
+                $data[] = array_merge($baseData, [
+                    '工序名称' => '',
+                    '流程单号' => ''
+                ]);
+            }
+        }
+
+        // 7. 按流程单号排序(如果需要的话)
+        usort($data, function($a, $b) {
+            return strcmp($a['流程单号'] ?? '', $b['流程单号'] ?? '');
+        });
 
+        $this->success('成功', $data);
     }
 }