Przeglądaj źródła

超节损计算规则

unknown 4 dni temu
rodzic
commit
e42a0ee3eb
1 zmienionych plików z 25 dodań i 15 usunięć
  1. 25 15
      application/api/controller/OrderSuperLoss.php

+ 25 - 15
application/api/controller/OrderSuperLoss.php

@@ -1762,14 +1762,23 @@ class OrderSuperLoss extends Api
         $list['考核'] = ($status == 1) ? '不参与考核' : '参与考核';
 
         $list['实际投料'] = $list['实际投料']*10000;
-        //目标合格率
-        $list['target_rate'] = ($list['实际投料']-$list['计划损耗'])/$list['实际投料']*100;
-        $list['target_rate'] = number_format($list['target_rate'],2);
-        $list['target_rate'] = $list['target_rate'].'%';
-        //实际合格率
-        $list['real_rate'] = $list['warehousing_num']/($list['实际投料'])*100;
-        $list['real_rate'] = number_format($list['real_rate'],2);
-        $list['real_rate'] = $list['real_rate'].'%';
+        $feedQty = floatval($list['实际投料']);
+        $gxhValues = $this->getSuperLossProcessGxhList($param['order'], $param['yjno']);
+        $targetRateVal = $this->calcSuperLossTargetQualificationRate(
+            $param['order'],
+            $param['yjno'],
+            $gxhValues
+        );
+        $realRateVal = $feedQty > 0 ? (floatval($list['warehousing_num']) / $feedQty * 100) : 0.0;
+        $rewardMultiplier = $this->resolveSuperLossRewardMultiplier(
+            $targetRateVal,
+            $realRateVal,
+            floatval($list['材料废'] ?? 0),
+            $feedQty
+        );
+        $list['reward_rate'] = (string)$rewardMultiplier;
+        $list['target_rate'] = number_format($targetRateVal, 2) . '%';
+        $list['real_rate'] = number_format($realRateVal, 2) . '%';
 
         //查询工序数据(字段名与历史 ProcessLoss 一致)
         $gy_field = '  
@@ -1808,10 +1817,11 @@ class OrderSuperLoss extends Api
             if ($this->isSuperLossRewardExcluded((string)$value['Gy0_gxmc'])) {
                 $gy_data[$key]['工序超节损金额'] = 0;
             } else {
-                $gy_data[$key]['工序超节损金额'] = round(
-                    $gy_data[$key]['loss'] * floatval($value['超节损承担比例']) * $moneyRate,
-                    4
-                );
+                $processReward = $gy_data[$key]['loss'] * floatval($value['超节损承担比例']) * $moneyRate;
+                if ($rewardMultiplier > 1 && $processReward != 0.0) {
+                    $processReward *= $rewardMultiplier;
+                }
+                $gy_data[$key]['工序超节损金额'] = round($processReward, 4);
             }
             $denom = (float)$value['Gy0_计划接货数'];
             if ($denom <= 0) {
@@ -2544,7 +2554,7 @@ class OrderSuperLoss extends Api
         $strFields = [
             'Gd_gdbh', 'yjno', 'ls', '成品代号', '成品名称', '计量单位', 'warehousing_date',
             'warehousing_num', '计划损耗', '废品合计', 'intangible_loss', '材料废', '零头处理',
-            '外发废', 'zcfp', '班组分摊质检废品', '订单数量', '销售订单号', 'target_rate', 'real_rate', '考核',
+            '外发废', 'zcfp', '班组分摊质检废品', '订单数量', '销售订单号', 'target_rate', 'real_rate', 'reward_rate', '考核',
         ];
         foreach ($strFields as $f) {
             if (array_key_exists($f, $list)) {
@@ -2999,7 +3009,7 @@ class OrderSuperLoss extends Api
     }
 
     /**
-     * 材料费(张数)未超投料 1.5% 时,按目标/实际合格率偏差确定节损金额倍率(边界向下归档)
+     * 材料废(张)占投料超过 1.5% 时,再按目标/实际合格率偏差确定节损金额倍率(边界向下归档)。
      */
     private function resolveSuperLossRewardMultiplier(
         float $targetRate,
@@ -3010,7 +3020,7 @@ class OrderSuperLoss extends Api
         if ($feedQty <= 0) {
             return 1.0;
         }
-        if (($materialWaste / $feedQty) > 0.015) {
+        if (($materialWaste / $feedQty) <= 0.015) {
             return 1.0;
         }