Răsfoiți Sursa

花店从某批发商下单,如果自有的花材库与某批发商有出入,不能把采购的花材直接入库,解决方案下:
先正常入库,然后把本次入库的花材数量“冲销”掉,即保持原有的各花材的库存

按如上处理后,售后流程也要做如下处理:
在处理售后的事务中,先把某次售后的花材数量补回(补加的原因是:由于加了上面的"冲销"处理),然后接着处理后续事务

shizhongqi 1 an în urmă
părinte
comite
d23d056d5d

+ 0 - 2
app-ghs/controllers/RefundController.php

@@ -10,11 +10,9 @@ use bizHd\cg\classes\CgRefundClass;
 use bizHd\cg\classes\CgRefundItemClass;
 use bizHd\notice\classes\NoticeClass;
 use bizHd\purchase\classes\PurchaseClass;
-use bizHd\purchase\classes\PurchaseClearClass;
 use common\components\dateUtil;
 use common\components\dict;
 use common\components\imgUtil;
-use common\components\stringUtil;
 use Yii;
 use bizGhs\order\classes\RefundOrderClass;
 use common\components\util;

+ 14 - 3
app-hd/controllers/ProductController.php

@@ -10,13 +10,13 @@ use bizGhs\item\classes\ItemClassClass;
 use bizGhs\product\classes\ProductClass;
 use bizGhs\product\services\ProductService;
 use bizHd\admin\classes\ShopAdminClass;
-use bizHd\item\classes\ItemClass;
 use bizHd\purchase\classes\PurchaseClass;
-use common\components\noticeUtil;
+use bizHd\purchase\classes\PurchaseItemClass;
 use common\components\printUtil;
 use common\components\stringUtil;
 use common\components\util;
 use Yii;
+use yii\helpers\ArrayHelper;
 
 class ProductController extends BaseController
 {
@@ -400,7 +400,6 @@ class ProductController extends BaseController
         $connection = Yii::$app->db;
         $transaction = $connection->beginTransaction();
         try {
-
             if ($doType == 0 || $doType == 1) {
                 $cg = PurchaseClass::getLockById($targetId);
                 if (!empty($cg)) {
@@ -416,7 +415,19 @@ class ProductController extends BaseController
                     }
                     //确认收货并入库
                     if ($cg->status == PurchaseClass::STATUS_SENDING) {
+                        //$productIds 是本次入库涉及的花材ID数组
+                        $orderSn = $cg->orderSn;
+                        $purchaseItems = PurchaseItemClass::getAllByCondition(['orderSn' => $orderSn], null, "productId");
+                        $productIds = ArrayHelper::getColumn($purchaseItems, 'productId');
+                        $oldStocks = [];
+                        foreach ($productIds as $productId) {
+                            $product = ProductClass::getById($productId, true);
+                            $oldStocks[$productId] = $product;
+                        }
+
                         PurchaseClass::takeToPutIn($cg);
+                        // “冲销”本次入库的数量
+                        PurchaseClass::rollbackProductStock($oldStocks, $shop, $adminId, $this->mainId, $this->shopAdmin->name);
                         if ($doType == 1) {
                             $transaction->commit();
                             util::complete('入库成功');

+ 0 - 1
biz-ghs/order/classes/CheckOrderClass.php

@@ -289,7 +289,6 @@ class CheckOrderClass extends BaseClass
             }
         }
 
-
         if ($draft) {
             //保存草稿
             $data['status'] = self::STATUS_DRAFT;

+ 1 - 0
biz-ghs/order/services/RefundOrderService.php

@@ -106,6 +106,7 @@ class RefundOrderService extends BaseService
         if (empty($order)) {
             util::fail('没有订单信息哦');
         }
+
         RefundOrderClass::passRefund($refund, $order);
         $cgRefundId = $refund->cgRefundId ?? 0;
         $cgRefund = CgRefundClass::getById($cgRefundId, true);

+ 36 - 1
biz-hd/cg/classes/CgRefundClass.php

@@ -101,7 +101,6 @@ class CgRefundClass extends BaseClass
         $cgRefund->status = 1;
         $cgRefund->save();
 
-        $cgId = $cg->id ?? 0;
         $orderSn = $cg->orderSn ?? '';
         $mainId = $cg->mainId ?? 0;
         $shopId = $cg->shopId ?? 0;
@@ -126,6 +125,42 @@ class CgRefundClass extends BaseClass
         if (empty($main)) {
             util::fail('没有main信息7');
         }
+
+        // 处理退货退款前,把库存先补回。(本次哪些花材要退多少,就补回多少)
+        if ($refundType == CgRefundClass::REFUND_TYPE_MONEY_GOOD) {
+            $field = 'id, cgItemId, itemNum, xhNum';
+            $refundItemList = CgRefundItemClass::getAllByCondition(['orderSn' => $refundSn], null, $field, null, true);
+            if (empty($refundItemList)) {
+                util::fail('没有找到售后订单的花材哦');
+            }
+            $refundList = [];
+            foreach ($refundItemList as $val) {
+                $cgItemId = $val->cgItemId;
+                if (empty($cgItemId)) {
+                    util::fail('旧订单无法售后,请联系管理员哦');
+                }
+                $refundList[$cgItemId] = $val;
+            }
+            $field = 'id, xhNum, productId';
+            $cgItemList = PurchaseItemClass::getAllByCondition(['orderSn' => $cg->orderSn], null, $field, null, true);
+            if (empty($cgItemList)) {
+                util::fail('采购单花材错误');
+            }
+
+            $itemDatas = [];
+            foreach ($cgItemList as $cgItem) {
+                if (isset($refundList[$cgItem->id])) {
+                    $refund = $refundList[$cgItem->id];
+                    $product = ProductClass::getById($cgItem->productId, true);
+                    $itemDatas[$cgItem->productId] = ['product' => $product, 'addNum' => $refund->itemNum]; // TODO 使用 itemNum 合适,还是 xhNum ?
+                }
+            }
+            $cgShop = $shop;//采购门店
+            $adminId = $cgShop->adminId;
+            // 补回本次退货的花材数量
+            PurchaseClass::increaseProductStock($itemDatas, $cgShop, $adminId, $cg->mainId, 'system');
+        }
+
         if ($refundType == CgRefundClass::REFUND_TYPE_MONEY_GOOD) {
             $refundItemList = CgRefundItemClass::getAllByCondition(['orderSn' => $refundSn], null, '*', null, true);
             if (empty($refundItemList)) {

+ 0 - 1
biz-hd/cg/services/CgRefundService.php

@@ -244,7 +244,6 @@ class CgRefundService extends BaseService
         }
 
         return $cgRefund;
-
     }
 
 }

+ 65 - 0
biz-hd/purchase/classes/PurchaseClass.php

@@ -275,6 +275,71 @@ class PurchaseClass extends BaseClass
         $cg->save();
     }
 
+    // 库存回滚为入库前的状态
+    public static function rollbackProductStock($oldStocks, $shop, $adminId, $mainId, $staffName)
+    {
+        $itemInfo = [];
+        foreach ($oldStocks as $productId => $product) {
+            $ratio = $product->ratio;
+            $formNum = ProductClass::formatStock($product->stock, $ratio); //花材的库存转换
+            $itemInfo[] = [
+                'productId' => $productId,
+                'itemNum'   => $product->stock, // 回滚为入库前的库存
+                'itemId'    => $product->itemId,
+                'bigNum'    => $formNum['bigNum'],
+                'smallNum'  => $formNum['smallNum'],
+                'price'     => $product->price,
+            ];
+        }
+
+        $data = [
+            'sjId' => $shop->sjId,
+            'shopId' => $shop->id,
+            'adminId' => $adminId,
+            'mainId' => $mainId,
+            'staffName' => $staffName,
+            'itemInfo' => $itemInfo,
+            'pdType' => 'rollbackStock',
+            'remark' => '库存冲销',
+        ];
+
+        \bizGhs\order\classes\CheckOrderClass::opOrder($data, false, false, false);
+    }
+
+    // 指定花材新增库存
+    public static function increaseProductStock($itemDatas, $shop, $adminId, $mainId, $staffName)
+    {
+        $itemInfo = [];
+        foreach ($itemDatas as $productId => $arr) {
+            $addNum = $arr['addNum']; //新增的数值
+            $product = $arr['product'];
+            $ratio = $product->ratio;
+            $newStock = bcadd($product->stock, $addNum);
+            $formNum = ProductClass::formatStock($newStock, $ratio); //花材的库存转换
+            $itemInfo[] = [
+                'productId' => $productId,
+                'itemNum'   => $newStock, // 新库存数
+                'itemId'    => $product->itemId,
+                'bigNum'    => $formNum['bigNum'],
+                'smallNum'  => $formNum['smallNum'],
+                'price'     => $product->price,
+            ];
+        }
+
+        $data = [
+            'sjId' => $shop->sjId,
+            'shopId' => $shop->id,
+            'adminId' => $adminId,
+            'mainId' => $mainId,
+            'staffName' => $staffName,
+            'itemInfo' => $itemInfo,
+            'pdType' => 'rollbackStock',
+            'remark' => '支持售后的库存回补',
+        ];
+
+        \bizGhs\order\classes\CheckOrderClass::opOrder($data, false, false, false);
+    }
+
     public static function notSameCity($shop, $ghsShop)
     {
         return true;