Jelajahi Sumber

全部出库优化

shish 1 bulan lalu
induk
melakukan
0449f0df35
1 mengubah file dengan 22 tambahan dan 14 penghapusan
  1. 22 14
      app-ghs/controllers/StockOutController.php

+ 22 - 14
app-ghs/controllers/StockOutController.php

@@ -144,7 +144,16 @@ class StockOutController extends BaseController
         util::complete();
     }
 
-    //全部出库 ssh 20220906
+    /**
+     * 全部出库
+     * 职责:将当前门店下所有有库存且未删除的花材一次性全部出库到指定门店
+     * 入参:GET 传参 shopId (入库门店ID), confirmIn (是否直接确认入库)
+     * 返回:JSON 格式的成功提示
+     * 副作用:扣减出库门店库存,记录出库单及明细,写入库存变动日志
+     * 关键边界:
+     *   1. 校验入库门店有效性,默认门店不允许全部出库,不能出库给自己
+     *   2. 优化:直接在数据库过滤有库存且未删除的商品,且仅查询必要字段(id, stock, ratio),返回纯数组,避免实例化大量 ActiveRecord 对象,极大节省内存和 CPU 耗时
+     */
     public function actionAllOut()
     {
         $get = Yii::$app->request->get();
@@ -168,7 +177,12 @@ class StockOutController extends BaseController
             $shopId = $this->shopId;
             $mainId = $this->mainId;
             $sjId = $shop->sjId ?? 0;
-            $list = ProductClass::getAllByCondition(['mainId' => $mainId], null, '*', null, true);
+            // 复杂分支/关键逻辑:优化查询。直接在数据库过滤 delStatus=0 且 stock>0 的商品,仅查询 id, stock, ratio 字段,且返回纯数组(不实例化对象)
+            $list = ProductClass::getAllByCondition([
+                'mainId' => $mainId,
+                'delStatus' => 0,
+                'stock>' => 0,
+            ], null, 'id, stock, ratio', null, false);
             if (empty($list)) {
                 util::fail('没有花材');
             }
@@ -177,19 +191,13 @@ class StockOutController extends BaseController
             }
             $itemInfo = [];
             foreach ($list as $item) {
-                if ($item->delStatus == 1) {
-                    continue;
-                }
-                $stock = $item->stock ?? 0;
-                $ratio = $item->ratio ?? 0;
-                if ($stock <= 0) {
-                    continue;
-                }
+                $stock = $item['stock'] ?? 0;
+                $ratio = $item['ratio'] ?? 0;
                 $bigNum = intval($stock);
-                $small = bcsub($stock, $bigNum, 2);
-                $smallNum = bcmul($small, $ratio);
-                $currentId = $item->id;
-                $itemInfo[] = ['productId' => $currentId, 'bigNum' => $bigNum, 'smallNum' => $smallNum];
+                $small = bcsub((string)$stock, (string)$bigNum, 2);
+                $smallNum = bcmul($small, (string)$ratio);
+                $currentId = $item['id'];
+                $itemInfo[] = ['productId' => $currentId, 'bigNum' => $bigNum, 'smallNum' => (float)$smallNum];
             }
             if (empty($itemInfo)) {
                 util::fail('没有库存');