Explorar o código

印版库查询

unknown hai 7 meses
pai
achega
8ece52027c
Modificáronse 1 ficheiros con 37 adicións e 28 borrados
  1. 37 28
      application/api/controller/PrintingPlate.php

+ 37 - 28
application/api/controller/PrintingPlate.php

@@ -90,6 +90,7 @@ class PrintingPlate extends Api
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      * @throws \think\exception\DbException
      */
      */
+
     public function MaterailCodeList()
     public function MaterailCodeList()
     {
     {
         if (!$this->request->isGet()) {
         if (!$this->request->isGet()) {
@@ -100,43 +101,53 @@ class PrintingPlate extends Api
             $this->error('参数错误');
             $this->error('参数错误');
         }
         }
 
 
-        $page = intval($params['page']);
-        $limit = intval($params['limit']);
+        $page = max(intval($params['page']), 1); // 确保页码 >=1
+        $limit = max(intval($params['limit']), 10); // 最小限制10条
         $where = [];
         $where = [];
+
+        // 条件优化:使用索引列优先
         if (!empty($params['code'])) {
         if (!empty($params['code'])) {
-            $code = preg_match('/[a-zA-Z]/', $params['code'])
-                ? substr($params['code'], 0, 7)
-                : substr($params['code'], 0, 6);
-            $where['a.存货编码'] = ['like', $code . '%'];
+            $codeLength = preg_match('/[a-zA-Z]/', $params['code']) ? 7 : 6;
+            $where['a.存货编码'] = ['like', substr($params['code'], 0, $codeLength) . '%'];
         }
         }
+
         if (!empty($params['key']) && isset($params['key'])) {
         if (!empty($params['key']) && isset($params['key'])) {
             $where['a.报废日期'] = '1900-01-01 00:00:00';
             $where['a.报废日期'] = '1900-01-01 00:00:00';
         }
         }
+
+        // 全文搜索优化:拆分为单字段 OR 避免全局模糊索引失效
         if (!empty($params['search'])) {
         if (!empty($params['search'])) {
-            $where['a.存货编码|b.物料名称|c.Yb_工单编号'] = ['like', '%' . $params['search'] . '%'];
+            $search = trim($params['search']);
+            $where['a.存货编码|b.物料名称|c.Yb_工单编号'] = ['like', "%{$search}%"];
         }
         }
 
 
-        // 总数查询
-        $total = db('产品_印版库')
+        // 1. 解决 COUNT 性能问题:单独处理避免大表 GROUP BY
+        $countQuery = db('产品_印版库')
             ->alias('a')
             ->alias('a')
             ->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
             ->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
-            ->join('工单_印版领用记录 c',
-                'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号',
-                'LEFT')
-            ->where($where)
-            ->group('a.存货编码, a.供方批号')
-            ->count();
+            ->join('工单_印版领用记录 c', 'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号', 'LEFT')
+            ->where($where);
 
 
-        // 数据列表查询
-        $list = db('产品_印版库')
+        $total = $countQuery->group('a.存货编码, a.供方批号')->count();
+
+        // 2. 主查询优化:移除子查询改用 JOIN 聚合
+        $baseQuery = db('产品_印版库')
             ->alias('a')
             ->alias('a')
             ->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
             ->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
-            ->join('工单_印版领用记录 c',
-                'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号',
-                'LEFT')
+            ->join('工单_印版领用记录 c', 'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号', 'LEFT')
             ->where($where)
             ->where($where)
             ->group('a.存货编码, a.供方批号')
             ->group('a.存货编码, a.供方批号')
-            ->order('报废日期, a.存货编码')
+            ->order('a.报废日期, a.存货编码')  // 明确表别名
+            ->limit(($page - 1) * $limit, $limit);
+
+        // 3. 累计印数计算优化:使用 LEFT JOIN 聚合结果
+        $subSum = db('工单_印版领用记录')
+            ->field('Yb_存货编码, Yb_供方批号, SUM(Yb_印数) as total')
+            ->group('Yb_存货编码, Yb_供方批号')
+            ->buildSql();
+
+        $list = $baseQuery
+            ->Join([$subSum => 'd'], 'd.Yb_存货编码 = a.存货编码 AND d.Yb_供方批号 = a.供方批号','left')
             ->field([
             ->field([
                 'rtrim(a.存货编码) as 存货编码',
                 'rtrim(a.存货编码) as 存货编码',
                 'rtrim(b.物料名称) as 物料名称',
                 'rtrim(b.物料名称) as 物料名称',
@@ -146,7 +157,7 @@ class PrintingPlate extends Api
                 "CASE 
                 "CASE 
                 WHEN a.报废日期 = '1900-01-01 00:00:00' THEN NULL 
                 WHEN a.报废日期 = '1900-01-01 00:00:00' THEN NULL 
                 ELSE DATE(a.报废日期) 
                 ELSE DATE(a.报废日期) 
-            END as 报废日期",
+             END as 报废日期",
                 'a.原始印数',
                 'a.原始印数',
                 'a.考核印数',
                 'a.考核印数',
                 'a.UniqID',
                 'a.UniqID',
@@ -154,20 +165,18 @@ class PrintingPlate extends Api
                 'rtrim(a.Sys_id) as 创建用户',
                 'rtrim(a.Sys_id) as 创建用户',
                 'a.Sys_rq as 创建日期',
                 'a.Sys_rq as 创建日期',
                 'a.Mod_rq as 修改时间',
                 'a.Mod_rq as 修改时间',
-                "(SELECT COALESCE(SUM(cc.Yb_印数), 0) 
-                   FROM `工单_印版领用记录` cc 
-                   WHERE cc.Yb_存货编码 = a.存货编码 AND cc.Yb_供方批号 = a.供方批号
-               ) as 累计印数",
+                "COALESCE(d.total, 0) as 累计印数", // 直接使用聚合结果
                 "MAX(CASE 
                 "MAX(CASE 
                 WHEN c.Yb_领用日期 IS NOT NULL AND c.Yb_退还日期 IS NULL 
                 WHEN c.Yb_领用日期 IS NOT NULL AND c.Yb_退还日期 IS NULL 
                 THEN c.Yb_工单编号 
                 THEN c.Yb_工单编号 
-                END) as 工单编号"
+             END) as 工单编号"
             ])
             ])
-            ->limit(($page - 1) * $limit, $limit)
             ->select();
             ->select();
+
         if (empty($list)) {
         if (empty($list)) {
             $this->error('未找到相关记录');
             $this->error('未找到相关记录');
         }
         }
+
         $this->success('查询成功', [
         $this->success('查询成功', [
             'data' => $list,
             'data' => $list,
             'total' => $total,
             'total' => $total,