liuhairui il y a 1 mois
Parent
commit
89a26dd200
1 fichiers modifiés avec 64 ajouts et 10 suppressions
  1. 64 10
      application/api/controller/WorkOrderSpotCheck.php

+ 64 - 10
application/api/controller/WorkOrderSpotCheck.php

@@ -2869,19 +2869,73 @@ class WorkOrderSpotCheck extends Api{
         if (empty($param)){
             $this->error('参数错误');
         }
-        $list = \db('工单_基本资料')
+
+        //优化前:循环里查数据库 → 有 1000 个订单就查 1000 次,会出现卡死
+        // $list = \db('工单_基本资料')->alias('a')
+//            ->field('
+//            a.订单编号,
+//            a.生产款号,
+//            a.客户编号,
+//            a.款式,
+//            a.订单数量,
+//            a.落货日期,
+//            a.接单日期,
+//            a.Sys_id as 创建人员,
+//            a.Sys_rq as 创建时间,
+//            b.BOM_颜色 as 颜色,
+//            b.BOM_物料编码 as 物料编码,
+//            b.BOM_物料名称 as 物料名称,
+//            GROUP_CONCAT(DISTINCT c.订单编号 SEPARATOR ",") AS 关联订单,
+//            c.关联编号')
+//            ->group('物料编码')
+//            ->join('工单_面料资料 b','a.订单编号 = b.BOM_工单编号')
+//            ->join('工单关联表 c','a.订单编号 = c.订单编号 AND b.BOM_物料编码 = c.物料编号')
+//            ->where('a.生产款号|a.订单编号|b.BOM_物料编码','like','%'.$param['search'].'%')
+//            ->where('a.Mod_rq',null)
+//            ->where('b.Mod_rq',null)
+//            ->where('c.Mod_rq',null)
+//            ->order('a.订单编号 desc')
+//            ->select();
+
+        //优化后:只执行 1 次查询,替代 N 次循环
+        $list = Db::name('工单_基本资料')
             ->alias('a')
-            ->join('工单_面料资料 b','a.订单编号 = b.BOM_工单编号')
-            ->join('工单关联表 c','a.订单编号 = c.订单编号 AND b.BOM_物料编码 = c.物料编号')
-            ->where('a.生产款号|a.订单编号|b.BOM_物料编码','like','%'.$param['search'].'%')
-            ->where('a.Mod_rq',null)
-            ->where('b.Mod_rq',null)
-            ->where('c.Mod_rq',null)
-            ->field('a.订单编号,a.生产款号,a.客户编号,a.款式,a.订单数量,a.落货日期,a.接单日期,a.Sys_id as 创建人员,
-            a.Sys_rq as 创建时间,b.BOM_颜色 as 颜色,b.BOM_物料编码 as 物料编码,b.BOM_物料名称 as 物料名称,GROUP_CONCAT(DISTINCT c.订单编号 SEPARATOR ",") AS 关联订单,c.关联编号')
-            ->group('物料编码')
+            // 关联面料表
+            ->join('工单_面料资料 b', 'a.订单编号 = b.BOM_工单编号')
+            // 关联工单附表
+            ->join('工单关联表 c', 'a.订单编号 = c.订单编号 AND b.BOM_物料编码 = c.物料编号')
+            // 搜索条件
+            ->where(function ($query) use ($param) {
+                $query->where('a.生产款号', 'like', '%' . $param['search'] . '%')
+                    ->whereOr('a.订单编号', 'like', '%' . $param['search'] . '%')
+                    ->whereOr('b.BOM_物料编码', 'like', '%' . $param['search'] . '%');
+            })
+            // 未删除数据
+            ->where('a.Mod_rq', null)
+            ->where('b.Mod_rq', null)
+            ->where('c.Mod_rq', null)
+            // 查询字段
+            ->field([
+                'a.订单编号',
+                'a.生产款号',
+                'a.客户编号',
+                'a.款式',
+                'a.订单数量',
+                'a.落货日期',
+                'a.接单日期',
+                'a.Sys_id as 创建人员',
+                'a.Sys_rq as 创建时间',
+                'b.BOM_颜色 as 颜色',
+                'b.BOM_物料编码 as 物料编码',
+                'b.BOM_物料名称 as 物料名称',
+                // 合并关联订单
+                'GROUP_CONCAT(DISTINCT c.订单编号 SEPARATOR ",") as 关联订单',
+                'GROUP_CONCAT(DISTINCT c.关联编号 SEPARATOR ",") as 关联编号'
+            ])
+            ->group('a.订单编号,b.BOM_物料编码')
             ->order('a.订单编号 desc')
             ->select();
+
         if (empty($list)){
             $res =  \db('工单_基本资料')->alias('a')
                 ->join('工单_印件资料 b','a.订单编号 = b.订单编号')