ソースを参照

超节损计算优化

unknown 4 日 前
親
コミット
c8fd1db57c
1 ファイル変更、57 行追加、12 行削除
  1. 57 12
      application/api/controller/OrderSuperLoss.php

+ 57 - 12
application/api/controller/OrderSuperLoss.php

@@ -327,17 +327,21 @@ class OrderSuperLoss extends Api
                     for ($i = 1; $i <= 13; $i++) {
                         $gxmcKey = "fp_gxmc" . $i;
                         $slKey = "fp_sl" . $i;
-                        if (substr($entry[$gxmcKey],0,2) == $item['Gy0_gxh']){
+                        if (substr($entry[$gxmcKey], 0, 2) == $item['Gy0_gxh']
+                            && !$this->isMachineInspectionProcess((string)$item['Gy0_gxmc'])) {
                             $gy_data[$k]['waste_quality'] += $entry[$slKey];
-                        }elseif (strpos($item['Gy0_gxmc'],'机检') !== false){
-                            $gy_data[$k]['waste_quality'] =  $data['机检废品'];
                         }
                     }
                 }
                 //报废合计
-                $gy_data[$k]['total_waste'] = $gy_data[$k]['waste_quality'] + $gy_data[$k]['intangible_loss'] +  $gy_data[$k]['total_fp'];
+                $gy_data[$k]['total_waste'] = $gy_data[$k]['waste_quality'] + $gy_data[$k]['intangible_loss'] + $gy_data[$k]['total_fp'];
                 //工序节损数
-                $gy_data[$k]['loss'] = $item['Gy0_计划损耗']*$item['Gy0_ls']*$item['Gy0_ks'] - $gy_data[$k]['total_waste'];
+                $gy_data[$k]['loss'] = $item['Gy0_计划损耗'] * $item['Gy0_ls'] * $item['Gy0_ks'] - $gy_data[$k]['total_waste'];
+                $this->applyMachineInspectionProcessLossRules(
+                    (string)$item['Gy0_gxmc'],
+                    (int)$gy_data[$k]['Gy0_计划损耗'],
+                    $gy_data[$k]
+                );
                 //占投料报废率
                 $gy_data[$k]['loss_rate'] = number_format($gy_data[$k]['loss'] / $item['Gy0_计划接货数'],4) * 100 .'%';
                 //工序目标报废率
@@ -358,10 +362,7 @@ class OrderSuperLoss extends Api
                 }else{
                     $moneyRate = 0.09;
                 }
-                if (strpos($item['Gy0_gxmc'], '机检') !== false) {
-                    $gy_data[$k]['工序超节损金额'] = '0.000000';
-                    $gy_data[$k]['waste_quality'] = $data['机检废品'];
-                } elseif ($this->isSuperLossRewardExcluded((string)$item['Gy0_gxmc'])) {
+                if ($this->isSuperLossRewardExcluded((string)$item['Gy0_gxmc'])) {
                     $gy_data[$k]['工序超节损金额'] = '0.000000';
                 } else {
                     $gy_data[$k]['工序超节损金额'] = number_format($gy_data[$k]['loss'] * $item['超节损承担比例'] * $moneyRate, 4);
@@ -1309,6 +1310,12 @@ class OrderSuperLoss extends Api
                 $plan_total,
                 floatval($data['intangible_loss'])
             );
+            if ($this->isMachineInspectionProcess((string)$gy_data[$kk]['sczl_gxmc'])) {
+                $gy_data[$kk]['质检废'] = 0;
+                $gy_data[$kk]['zjfp'] = 0;
+                $gy_data[$kk]['sczl_zcfp'] = 0;
+                $gy_data[$kk]['无形损分摊'] = 0;
+            }
             //班组成员
             for ($j = 1; $j <= 10; $j++) {
                 $bhKey = "sczl_bh" . $j;
@@ -1388,8 +1395,12 @@ class OrderSuperLoss extends Api
         $data['reward_rate'] = (string)$rewardMultiplier;
         $total['reward'] = 0;
         foreach ($processGxSummary as $summary) {
-            $totalWaste = $summary['zcfp'] + $summary['zj'] + $summary['intangible'];
-            $processCjsSl = $summary['plan_loss'] - $totalWaste;
+            if ($this->isMachineInspectionProcess((string)$summary['gxmc'])) {
+                $processCjsSl = $summary['plan_loss'];
+            } else {
+                $totalWaste = $summary['zcfp'] + $summary['zj'] + $summary['intangible'];
+                $processCjsSl = $summary['plan_loss'] - $totalWaste;
+            }
             if ($this->isSuperLossRewardExcluded((string)$summary['gxmc'])) {
                 $processCjsJe = 0.0;
             } else {
@@ -1781,6 +1792,11 @@ class OrderSuperLoss extends Api
             $gy_data[$key]['total_waste'] = $value['Gy0_无形损'] + $value['total_fp'] + $value['waste_quality'];
             //工序节损数 = 工序计划损耗 - 报废合计
             $gy_data[$key]['loss'] = (int)$value['Gy0_计划损耗'] - (int)$gy_data[$key]['total_waste'];
+            $this->applyMachineInspectionProcessLossRules(
+                (string)$value['Gy0_gxmc'],
+                (int)$value['Gy0_计划损耗'],
+                $gy_data[$key]
+            );
             if ($this->isSuperLossRewardExcluded((string)$value['Gy0_gxmc'])) {
                 $gy_data[$key]['工序超节损金额'] = 0;
             } else {
@@ -2305,7 +2321,36 @@ class OrderSuperLoss extends Api
         return strpos($gxName, '机检') !== false || strpos($gxName, '外发') !== false;
     }
 
-    /** 机检、外发:不计超节损金额(仍计制程废、工序节损数) */
+    private function isMachineInspectionProcess(string $gxName): bool
+    {
+        return strpos($gxName, '机检') !== false;
+    }
+
+    /**
+     * 机检:参与工序节损数(= 工序计划损耗),本行制程/质检/无形损不参与扣减;金额不计
+     */
+    private function applyMachineInspectionProcessLossRules(string $gxName, int $planLoss, array &$row): void
+    {
+        if (!$this->isMachineInspectionProcess($gxName)) {
+            return;
+        }
+        if (array_key_exists('total_fp', $row)) {
+            $row['total_fp'] = 0;
+        }
+        if (array_key_exists('waste_quality', $row)) {
+            $row['waste_quality'] = 0;
+        }
+        if (array_key_exists('Gy0_无形损', $row)) {
+            $row['Gy0_无形损'] = 0;
+        }
+        if (array_key_exists('intangible_loss', $row)) {
+            $row['intangible_loss'] = 0;
+        }
+        $row['total_waste'] = 0;
+        $row['loss'] = $planLoss;
+    }
+
+    /** 机检、外发:不计超节损金额(机检仍计节损数;外发计节损数含制程废) */
     private function isSuperLossRewardExcluded(string $gxName): bool
     {
         return $this->isSuperLossIntangibleExcluded($gxName);