Jelajahi Sumber

平均成本算法优化

shish 9 bulan lalu
induk
melakukan
6acc57f63e

+ 19 - 16
biz-ghs/order/classes/CheckOrderClass.php

@@ -350,33 +350,36 @@ class CheckOrderClass extends BaseClass
                     }
                     $productData = ProductClass::getById($productId, true);
 
+                    //涉及平均成本计算的,多处要修改,搜索关键词 calc_av_cost
                     if (isset($params['motherId']) && $params['motherId'] > 0) {
-                        $changeNum = bcsub($productData->stock,$v['itemNum'],2);
+                        $changeNum = bcsub($productData->stock, $v['itemNum'], 2);
                         $changeNum = abs($changeNum);
                         $changeCost = bcmul($unitCost, $changeNum, 2);
-                        $totalCost = $productData->totalCost ?? 0;
-                        $totalStock = $productData->totalStock ?? 0;
+                        $remainStock = $productData->stock ?? 0;
+                        $remainCost = bcmul($remainStock, $unitCost, 2);
                         if ($productId == $params['motherId']) {
-                            $totalCost = bcsub($totalCost, $changeCost, 2);
-                            $totalStock = bcsub($totalStock, $changeNum, 2);
+                            $remainCost = bcsub($remainCost, $changeCost, 2);
+                            $remainCost = $remainCost > 0 ? $remainCost : 0;
+                            $remainStock = bcsub($remainStock, $changeNum, 2);
+                            $remainStock = $remainStock > 0 ? $remainStock : 0;
                             $avCost = $unitCost;
                             $productData->avCost = $avCost;
-                            $productData->totalCost = $totalCost;
-                            $productData->totalStock = $totalStock;
+                            $productData->totalCost = $remainCost;
+                            $productData->totalStock = $remainStock;
                             $productData->save();
                         } else {
-                            $totalCost = bcadd($changeCost, $totalCost, 2);
-                            $totalStock = bcadd($changeNum, $totalStock, 2);
-                            if($totalStock>0){
-                                $avCost = bcdiv($totalCost, $totalStock, 2);
-                            }else{
+                            $remainStock = bcadd($changeNum, $remainStock, 2);
+                            $remainCost = bcadd($changeCost, $remainCost, 2);
+                            if ($remainStock > 0) {
+                                $avCost = bcdiv($remainCost, $remainStock, 2);
+                            } else {
                                 $avCost = 0;
-                                $totalStock = 0;
-								$totalCost = 0;
+                                $remainStock = 0;
+                                $remainCost = 0;
                             }
                             $productData->avCost = $avCost;
-                            $productData->totalCost = $totalCost;
-                            $productData->totalStock = $totalStock;
+                            $productData->totalCost = $remainCost;
+                            $productData->totalStock = $remainStock;
                             $productData->save();
                         }
                     }

+ 44 - 28
biz-ghs/product/classes/ProductClass.php

@@ -907,28 +907,36 @@ class ProductClass extends BaseClass
             util::fail("花材不存在");
         }
 
-        $lastCost = 0;
-        $lastStock = 0;
+        $newItemCost = 0;
+        $newItemStock = 0;
         $avCost = 0;
         $changeCost = 0;
         $unitCost = 0;
+        //涉及平均成本计算的,多处要修改,搜索关键词 calc_av_cost
         if (!empty($params['cost']) && $params['cost'] > 0) {
+
+            //原库存和原成本,也叫剩余库存和剩余成本
+            $oldItemStock = $productData->stock ?? 0;
+            $oldAvCost = $productData->avCost ?? 0;
+            $oldItemCost = bcmul($oldItemStock, $oldAvCost, 2);
+
+            //变动库存和成本
             $unitCost = $params['cost'];
             $changeCost = bcmul($params['cost'], $itemNum, 2);
-            $totalCost = $productData->totalCost ?? 0;
-            $lastCost = bcadd($changeCost, $totalCost, 2);
-            $totalStock = $productData->totalStock ?? 0;
-            $lastStock = bcadd($itemNum, $totalStock, 2);
-            if($lastStock>0){
-                $avCost = bcdiv($lastCost, $lastStock, 2);
-            }else{
-                $avCost = 0;
-                $lastStock = 0;
-				$lastCost = 0;
+
+            //新库存和新成本
+            $newItemCost = bcadd($changeCost, $oldItemCost, 2);
+            $newItemStock = bcadd($itemNum, $oldItemStock, 2);
+
+            if ($newItemStock > 0) {
+                $avCost = bcdiv($newItemCost, $newItemStock, 2);
+            } else {
+                $newItemStock = 0;
+                $newItemCost = 0;
             }
             $productData->avCost = $avCost;
-            $productData->totalCost = $lastCost;
-            $productData->totalStock = $lastStock;
+            $productData->totalCost = $newItemCost;
+            $productData->totalStock = $newItemStock;
             $productData->save();
         }
 
@@ -945,7 +953,7 @@ class ProductClass extends BaseClass
         }
         util::unlock($key);
         return ['oldStock' => $productData['stock'], 'newStock' => $newStock, 'itemNum' => $itemNum,
-            'avCost' => $avCost, 'totalCost' => $lastCost, 'totalStock' => $lastStock, 'changeCost' => $changeCost, 'unitCost' => $unitCost];
+            'avCost' => $avCost, 'totalCost' => $newItemCost, 'totalStock' => $newItemStock, 'changeCost' => $changeCost, 'unitCost' => $unitCost];
     }
 
     //减库存,允许负库存,负数数量(盘点时)
@@ -973,25 +981,33 @@ class ProductClass extends BaseClass
         $itemNum = self::mergeItemNum($itemNumBundle, $itemNumPiece, $ratio);
 
         $avCost = 0;
-        $lastStock = 0;
-        $lastCost = 0;
+        $newItemStock = 0;
+        $newItemCost = 0;
         $changeCost = 0;
         $unitCost = 0;
         if (!empty($params['cost']) && $params['cost'] > 0) {
+            //变成库存和变成成本
             $unitCost = $params['cost'];
             $changeCost = bcmul($params['cost'], $itemNum, 2);
-            $lastCost = bcsub($productData->totalCost, $changeCost, 2);
-            $lastStock = bcsub($productData->totalStock, $itemNum, 2);
-            if($lastStock>0){
-                $avCost = bcdiv($lastCost, $lastStock, 2);
-            }else{
-                $avCost = 0;
-                $lastStock = 0;
-				$lastCost=0;
+
+            //原库存和原成本,也叫剩余库存和剩余成本
+            $oldItemStock = $productData->stock;
+            $oldAvCost = $productData->avCost ?? 0;
+            $oldItemCost = bcmul($oldItemStock, $oldAvCost, 2);
+
+            //新库存和新成本
+            $newItemCost = bcsub($oldItemCost, $changeCost, 2);
+            $newItemStock = bcsub($oldItemStock, $itemNum, 2);
+
+            if ($newItemStock > 0) {
+                $avCost = bcdiv($newItemCost, $newItemStock, 2);
+            } else {
+                $newItemStock = 0;
+                $newItemCost = 0;
             }
             $productData->avCost = $avCost;
-            $productData->totalCost = $lastCost;
-            $productData->totalStock = $lastStock;
+            $productData->totalCost = $newItemCost;
+            $productData->totalStock = $newItemStock;
             $productData->save();
         }
 
@@ -1019,7 +1035,7 @@ class ProductClass extends BaseClass
 
         util::unlock($key);
         return ['oldStock' => $productData['stock'], 'newStock' => $newStock, 'itemNum' => $itemNum,
-            'avCost' => $avCost, 'totalCost' => $lastCost, 'totalStock' => $lastStock, 'changeCost' => $changeCost, 'unitCost' => $unitCost];
+            'avCost' => $avCost, 'totalCost' => $newItemCost, 'totalStock' => $newItemStock, 'changeCost' => $changeCost, 'unitCost' => $unitCost];
     }