Przeglądaj źródła

超节损计算优化

unknown 5 dni temu
rodzic
commit
fac5815df0
1 zmienionych plików z 48 dodań i 19 usunięć
  1. 48 19
      application/api/controller/OrderSuperLoss.php

+ 48 - 19
application/api/controller/OrderSuperLoss.php

@@ -198,14 +198,15 @@ class OrderSuperLoss extends Api
         if (empty($gxh_values)) {
             $this->error('未查询到报工工序');
         }
+        $sczlProcessSub = $this->buildSczlProcessAggSubSql();
         $gy_data =db('工单_工艺资料')
             ->alias('a')
             ->field([
                 'a.Gy0_yjno', 'a.Gy0_gxh', 'RTRIM(a.Gy0_gxmc) as Gy0_gxmc','RTRIM(a.Add_gxmc) as Add_gxmc','a.Gy0_ks', 'a.Gy0_ls', 'a.Gy0_计划接货数*a.Gy0_ls as Gy0_计划接货数',
-                'a.Gy0_计划损耗', 'a.无形损承担比例','a.超节损承担比例','SUM(b.sczl_zcfp) as total_fp','SUM(b.sczl_cl) as total_cl','SUM(c.sczl_cl) as cl','SUM(c.sczl_fp) as fp',
+                'a.Gy0_计划损耗', 'a.无形损承担比例','a.超节损承担比例','SUM(b.sczl_zcfp) as total_fp','SUM(b.sczl_cl) as total_cl','SUM(c.cl) as cl','SUM(c.fp) as fp',
             ])
             ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh','left')
-            ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh','left')
+            ->join([$sczlProcessSub => 'c'], 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
             ->where([
                 'a.Gy0_gdbh' => $order,
                 'a.Gy0_yjno' => $params['yjno'],
@@ -418,6 +419,7 @@ class OrderSuperLoss extends Api
                 ->group('b.sczl_gxh')
                 ->order('a.Gy0_gxh')
                 ->select();
+            $sczlTeamSub = $this->buildSczlTeamAggSubSql();
             //按班组分的产量数据
             $gy_data =db('工单_工艺资料')
                 ->alias('a')
@@ -426,18 +428,18 @@ class OrderSuperLoss extends Api
                     'SUM(b.sczl_zcfp) as sczl_zcfp', 'SUM(b.sczl_cl) as total_cl',
                     'b.sczl_bh1', 'b.sczl_bh2', 'b.sczl_bh3', 'b.sczl_bh4', 'b.sczl_bh5', 'b.sczl_bh6',
                     'b.sczl_bh7', 'b.sczl_bh8', 'b.sczl_bh9', 'b.sczl_bh10',
-                    'rtrim(c.sczl_gxmc) as gxmc', 'SUM(c.sczl_cl) as cl', 'SUM(c.sczl_fp) as fp', 'c.sczl_bh1 as sczl_bh'
+                    'c.gxmc', 'c.cl', 'c.fp', 'c.sczl_bh1 as sczl_bh'
                 ])
                 ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh','left')
-                ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh','left')
+                ->join([$sczlTeamSub => 'c'], 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh AND IFNULL(b.sczl_bh1,\'\') = IFNULL(c.sczl_bh1,\'\')', 'left')
                 ->where([
                     'a.Gy0_gdbh' => $order,
                     'a.Gy0_yjno' => $params['yjno'],
                     'a.Gy0_gxh' => ['in', $gxh_values],
-                    'b.sczl_cl|c.sczl_cl' => ['>', 0]
+                    'b.sczl_cl|c.cl' => ['>', 0]
                 ])
                 ->group('b.sczl_gxh, b.sczl_bh1, CASE WHEN b.sczl_bh2 = "000000" THEN "" ELSE b.sczl_bh2 END, b.sczl_bh3, 
-                         b.sczl_bh4, b.sczl_bh5, b.sczl_bh6, b.sczl_bh7, b.sczl_bh8, b.sczl_bh9, c.sczl_bh1')
+                         b.sczl_bh4, b.sczl_bh5, b.sczl_bh6, b.sczl_bh7, b.sczl_bh8, b.sczl_bh9')
                 ->order('a.Gy0_gxh asc, b.开工时间 asc, c.sczl_rq desc')
                 ->select();
             foreach ($gy_data as $key=>$value){
@@ -1172,11 +1174,12 @@ class OrderSuperLoss extends Api
         $total['waste_quality'] = 0;
         $total['waste_intangible'] = 0;
         $total['reward'] = 0; //超节损奖励数组
+        $sczlProcessSubForCl = $this->buildSczlProcessAggSubSql();
         //工单产量数据详情查询
         $total_cl_data = \db('工单_工艺资料')->alias('a')
-            ->field(['a.Gy0_yjno', 'a.Gy0_gxh', 'rtrim(a.Gy0_gxmc) as gxmc', 'a.Gy0_ls', 'SUM(b.sczl_cl) as total_cl', 'SUM(c.sczl_cl) as cl','rtrim(a.印刷方式) as 印刷方式','rtrim(a.版距) as 版距'])
+            ->field(['a.Gy0_yjno', 'a.Gy0_gxh', 'rtrim(a.Gy0_gxmc) as gxmc', 'a.Gy0_ls', 'SUM(b.sczl_cl) as total_cl', 'MAX(c.cl) as cl','rtrim(a.印刷方式) as 印刷方式','rtrim(a.版距) as 版距'])
             ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh', 'left')
-            ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
+            ->join([$sczlProcessSubForCl => 'c'], 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
             ->where([
                 'a.Gy0_gdbh' => $workOrderData['jjcp_gdbh'],
                 'a.Gy0_yjno' => $workOrderData['jjcp_yjno'],
@@ -1185,6 +1188,7 @@ class OrderSuperLoss extends Api
             ->group('a.Gy0_gxh')
             ->order('a.Gy0_gxh')
             ->select();
+        $sczlTeamSub = $this->buildSczlTeamAggSubSql();
         //按班组分的产量数据
         $gy_data = db('工单_工艺资料')
             ->alias('a')
@@ -1195,14 +1199,14 @@ class OrderSuperLoss extends Api
                 'b.sczl_bh7', 'b.sczl_bh8', 'b.sczl_bh9', 'b.sczl_bh10', 'GROUP_CONCAT(DISTINCT b.sczl_num SEPARATOR ",") AS 流程单',
                 'b.sczl_bzdh', 'b.sczl_rate1', 'b.sczl_rate2', 'b.sczl_rate3', 'b.sczl_rate4', 'b.sczl_rate5',
                 'b.sczl_rate6', 'b.sczl_rate7', 'b.sczl_rate8', 'b.sczl_rate9', 'b.sczl_rate10',
-                'rtrim(c.sczl_gxmc) as gxmc', 'SUM(c.sczl_cl) as cl', 'SUM(c.sczl_fp) as fp', 'c.sczl_bh1 as sczl_bh',
-                'd.使用部门 as 使用部门', 'c.sczl_bzdh as bzdh', 'b.sczl_jtbh', 'a.损耗系数', 'a.Gy0_ms', 'a.Gy0_Rate0',
+                'c.gxmc', 'c.cl', 'c.fp', 'c.sczl_bh1 as sczl_bh',
+                'd.使用部门 as 使用部门', 'c.bzdh', 'b.sczl_jtbh', 'a.损耗系数', 'a.Gy0_ms', 'a.Gy0_Rate0',
                 'a.Gy0_Rate1', 'a.无形损承担比例', 'a.Gy0_计划接货数*a.Gy0_ls*a.Gy0_ks as 计划产量', 'e.Gd_客户代号', 'e.Gd_客户名称',
                 'e.Gd_cpdh', 'e.Gd_cpmc', 'e.销售订单号', 'e.投料大箱', 'e.订单数量', 'e.计量单位', 'rtrim(a.Gy0_SITE) as Gy0_SITE',
                 'rtrim(a.印刷方式) as 印刷方式','rtrim(a.版距) as 版距'
             ])
             ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh', 'left')
-            ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
+            ->join([$sczlTeamSub => 'c'], 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh AND IFNULL(b.sczl_bh1,\'\') = IFNULL(c.sczl_bh1,\'\')', 'left')
             ->join('设备_基本资料 d', 'd.设备编号 = b.sczl_jtbh', 'left')
             ->join('工单_基本资料 e', 'a.Gy0_gdbh = e.Gd_gdbh AND a.Gy0_yjno = e.行号')
             ->where([
@@ -1211,7 +1215,7 @@ class OrderSuperLoss extends Api
                 'a.Gy0_gxh' => ['in', $gxh_values],
             ])
             ->group('a.Gy0_gxh,b.sczl_jtbh,b.sczl_bh1, CASE WHEN b.sczl_bh2 = "000000" THEN "" ELSE b.sczl_bh2 END, b.sczl_bh3,
-                         b.sczl_bh4, b.sczl_bh5, b.sczl_bh6, b.sczl_bh7, b.sczl_bh8, b.sczl_bh9, c.sczl_bh1')
+                         b.sczl_bh4, b.sczl_bh5, b.sczl_bh6, b.sczl_bh7, b.sczl_bh8, b.sczl_bh9')
             ->order('a.Gy0_gxh asc, b.开工时间 asc, c.sczl_rq desc')
             ->select();
         $gy_data = $this->appendMissingSuperLossProcessRows(
@@ -2247,12 +2251,36 @@ class OrderSuperLoss extends Api
     }
 
     /**
-     * 修改工单类型
-     * @return void
-     * @throws Exception
-     * @throws \think\db\exception\BindParamException
-     * @throws \think\exception\PDOException
+     * db_sczl 按工序聚合,避免与产量计酬 JOIN 时 SUM 被放大
      */
+    private function buildSczlProcessAggSubSql(): string
+    {
+        return db('db_sczl')
+            ->field('sczl_gdbh, sczl_yjno, sczl_gxh, SUM(sczl_cl) as cl, SUM(sczl_fp) as fp')
+            ->group('sczl_gdbh, sczl_yjno, sczl_gxh')
+            ->buildSql();
+    }
+
+    /**
+     * db_sczl 按工序+班组聚合(与产量计酬 sczl_bh1 对齐)
+     */
+    private function buildSczlTeamAggSubSql(): string
+    {
+        return db('db_sczl')
+            ->field([
+                'sczl_gdbh',
+                'sczl_yjno',
+                'sczl_gxh',
+                'sczl_bh1',
+                'SUM(sczl_cl) as cl',
+                'SUM(sczl_fp) as fp',
+                'MAX(rtrim(sczl_gxmc)) as gxmc',
+                'MAX(sczl_bzdh) as bzdh',
+            ])
+            ->group('sczl_gdbh, sczl_yjno, sczl_gxh, sczl_bh1')
+            ->buildSql();
+    }
+
     /**
      * 进入超节损的工序号(产量计酬 + 拆片报工),与 getOrderSuperLossCount 一致
      */
@@ -2366,20 +2394,21 @@ class OrderSuperLoss extends Api
             return $gyData;
         }
 
+        $sczlProcessSub = $this->buildSczlProcessAggSubSql();
         $processRows = db('工单_工艺资料')
             ->alias('a')
             ->field([
                 'a.Gy0_gdbh', 'a.Gy0_yjno', 'a.Gy0_gxh', 'a.Gy0_ls', 'a.Gy0_ks', 'a.Gy0_计划损耗', 'a.超节损承担比例',
                 'CONCAT(`a`.`Gy0_gxmc`, "【", a.Add_gxmc,"】") AS sczl_gxmc',
                 'SUM(b.sczl_zcfp) as sczl_zcfp', 'SUM(b.sczl_cl) as total_cl',
-                'SUM(c.sczl_cl) as cl', 'SUM(c.sczl_fp) as fp',
+                'c.cl', 'c.fp',
                 'a.无形损承担比例', 'a.Gy0_Rate0', 'a.Gy0_Rate1', 'a.损耗系数', 'a.Gy0_ms',
                 'a.Gy0_计划接货数*a.Gy0_ls*a.Gy0_ks as 计划产量',
                 'rtrim(a.Gy0_SITE) as Gy0_SITE', 'rtrim(a.印刷方式) as 印刷方式', 'rtrim(a.版距) as 版距',
                 'e.Gd_客户代号', 'e.Gd_客户名称', 'e.Gd_cpdh', 'e.Gd_cpmc', 'e.销售订单号', 'e.投料大箱', 'e.订单数量', 'e.计量单位',
             ])
             ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh', 'left')
-            ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
+            ->join([$sczlProcessSub => 'c'], 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
             ->join('工单_基本资料 e', 'a.Gy0_gdbh = e.Gd_gdbh AND a.Gy0_yjno = e.行号', 'left')
             ->where(['a.Gy0_gdbh' => $gdbh, 'a.Gy0_yjno' => $yjno, 'a.Gy0_gxh' => ['in', $missing]])
             ->group('a.Gy0_gxh')