From a1648b061c40fa80eca3ab5dc9038421fc595739 Mon Sep 17 00:00:00 2001
From: heshupeng <hsp@bronet.cn>
Date: Sat, 30 Jan 2021 18:56:45 +0800
Subject: [PATCH] 供货商库存优化

---
 addons/shopro/listener/order/Payed.php              |  1 +
 application/admin/controller/dealer/Dealer.php      | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 application/admin/controller/dealer/DealerStock.php |  2 +-
 public/assets/js/backend/dealer/dealer.js           |  2 +-
 4 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/addons/shopro/listener/order/Payed.php b/addons/shopro/listener/order/Payed.php
index b9801f4..b7cd518 100644
--- a/addons/shopro/listener/order/Payed.php
+++ b/addons/shopro/listener/order/Payed.php
@@ -36,6 +36,7 @@ class Payed
                 ->where('a.goods_id',$item['goods_id'])
                 ->where('a.sku_price_id',$item['goods_sku_price_id'])
                 ->where('a.stock','>',0)
+                ->where('a.deletetime',null)
                 ->orderRaw('rand()')
                 ->field('a.id,a.dealer_id')
                 ->limit(1)
diff --git a/application/admin/controller/dealer/Dealer.php b/application/admin/controller/dealer/Dealer.php
index d2645a2..8d5b642 100644
--- a/application/admin/controller/dealer/Dealer.php
+++ b/application/admin/controller/dealer/Dealer.php
@@ -304,10 +304,57 @@ class Dealer extends Backend
      */
     public function goods()
     {
+        $dealer_id = $this->request->param('dealer_id');
+        //当前是否为关联查询
+        $this->relationSearch = false;
+        //设置过滤方法
+        $this->request->filter(['strip_tags', 'trim']);
         if($this->request->isAjax()){
-            (new \app\admin\controller\shopro\goods\Goods)->index();
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+
+            $goods_model = new \app\admin\model\shopro\goods\Goods;
+
+            $where = [];
+            // 经销商
+            $goods_ids = [];
+            if(isset($dealer_id) && $dealer_id != 0) {
+                $goods_ids = \app\admin\model\dealer\DealerStock::alias('a')
+                    ->join('shopro_goods_sku_price b','a.sku_price_id = b.id')
+                    ->where('dealer_id',$dealer_id)
+                    ->column('a.goods_id');
+            }
+
+            if ($goods_ids) {
+                $where['id'] = ['in',$goods_ids];
+                // 删除无用的供货商库存
+                \app\admin\model\dealer\DealerStock::where('goods_id','not in',$goods_ids)
+                    ->where('dealer_id',$dealer_id)
+                    ->delete();
+            }
+
+            $total = $goods_model->where($where)->count();
+
+            $subsql = \app\admin\model\shopro\goods\SkuPrice::where('status', 'up')->field('sum(stock) as stock, goods_id')->group('goods_id')->buildSql();
+            $goodsTableName = $goods_model->getQuery()->getTable();
+            // 关联规格表,获取总库存
+            $list = $goods_model->join([$subsql => 'w'], $goodsTableName . '.id = w.goods_id', 'left');
+
+            // 关联查询当前商品的活动,一个商品可能存在多条活动记录,关联条件 只有 find_in_set 会存在一个商品出现多次,所以使用 group
+            $actSubSql = \app\admin\model\shopro\activity\Activity::field('type as activity_type, id as activity_id, goods_ids')->buildSql();
+            $list = $list->join([$actSubSql => 'act'], "find_in_set(" . $goodsTableName . ".id, goods_ids)", 'left')->group('id');
+
+            $list = $list->orderRaw($sort . ' ' . $order)
+                ->where($where)
+                ->limit($offset, $limit)
+                ->select();
+
+            foreach ($list as $row) {
+                $row->visible(['id', 'type', 'activity_id', 'activity_type', 'app_type', 'title', 'status', 'weigh', 'category_ids', 'image', 'price', 'likes', 'views', 'sales', 'stock', 'show_sales', 'dispatch_type', 'updatetime']);
+            }
+            $list = collection($list)->toArray();
+            return json(["total" => $total, "rows" => $list]);
         }
-        $this->assignconfig('dealer_id', $this->request->param('dealer_id'));
+        $this->assignconfig('dealer_id', $dealer_id);
         return $this->view->fetch();
     }
 
@@ -379,7 +426,7 @@ class Dealer extends Backend
 
             // 更新规格库存
             foreach ($list as $v) {
-                $sum_stock = $act->where('sku_price_id',$v['sku_price_id'])->sum('stock');
+                $sum_stock = $act->where('sku_price_id',$v['sku_price_id'])->where('deletetime',null)->sum('stock');
                 \app\admin\model\shopro\goods\SkuPrice::where('id',$v['sku_price_id'])->update(['stock'=>$sum_stock]);
             }
             Db::commit();
diff --git a/application/admin/controller/dealer/DealerStock.php b/application/admin/controller/dealer/DealerStock.php
index 9e69e0d..04c8a98 100644
--- a/application/admin/controller/dealer/DealerStock.php
+++ b/application/admin/controller/dealer/DealerStock.php
@@ -114,7 +114,7 @@ class DealerStock extends Backend
                     }
                     $result = $this->model->allowField(true)->save($params);
                     // 更新规格库存
-                    $skuPrice->stock = $this->model->where('sku_price_id',$skuPrice['id'])->sum('stock');
+                    $skuPrice->stock = $this->model->where('sku_price_id',$skuPrice['id'])->where('deletetime',null)->sum('stock');
                     $skuPrice->save();
                     Db::commit();
                 } catch (ValidateException $e) {
diff --git a/public/assets/js/backend/dealer/dealer.js b/public/assets/js/backend/dealer/dealer.js
index 3b72828..f8c3a2c 100644
--- a/public/assets/js/backend/dealer/dealer.js
+++ b/public/assets/js/backend/dealer/dealer.js
@@ -167,7 +167,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             // 初始化表格参数配置
             Table.api.init({
                 extend: {
-                    index_url: 'shopro/goods/goods/index' + location.search,
+                    index_url: 'dealer/dealer/goods' + location.search,
                     dragsort_url: '',
                     table: 'shopro_goods',
                 }
--
libgit2 0.24.0