Main.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2024 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\common\service\goods\source;
  13. use app\common\model\Goods as GoodsModel;
  14. use app\common\model\GoodsSku as GoodsSkuModel;
  15. use app\common\enum\goods\DeductStockType as DeductStockTypeEnum;
  16. /**
  17. * 商品来源-普通商品扩展类
  18. * Class Main
  19. * @package app\common\service\stock
  20. */
  21. class Main extends Basics
  22. {
  23. /**
  24. * 更新商品库存 (针对下单减库存的商品)
  25. * @param $goodsList
  26. * @return bool
  27. */
  28. public function updateGoodsStock($goodsList): bool
  29. {
  30. $goodsData = [];
  31. $goodsSkuData = [];
  32. foreach ($goodsList as $goods) {
  33. // 是否减库存 (下单减库存)
  34. $isUpdateStockNum = $goods['deduct_stock_type'] == DeductStockTypeEnum::CREATE;
  35. // 商品的数据
  36. $isUpdateStockNum && $goodsData[] = [
  37. 'where' => ['goods_id' => $goods['goods_id']],
  38. 'data' => [
  39. // 递减商品总库存
  40. 'stock_total' => ['dec', $goods['total_num']]
  41. ]
  42. ];
  43. // 商品SKU数据
  44. $isUpdateStockNum && $goodsSkuData[] = [
  45. 'data' => ['stock_num' => ['dec', $goods['total_num']]],
  46. 'where' => [
  47. 'goods_id' => $goods['goods_id'],
  48. 'goods_sku_id' => $goods['goods_sku_id'],
  49. ],
  50. ];
  51. }
  52. // 更新商品总库存
  53. !empty($goodsData) && $this->updateGoods($goodsData);
  54. // 更新商品sku库存
  55. !empty($goodsSkuData) && $this->updateGoodsSku($goodsSkuData);
  56. return true;
  57. }
  58. /**
  59. * 更新商品库存销量(订单付款后)
  60. * @param $goodsList
  61. * @return bool
  62. */
  63. public function updateStockSales($goodsList): bool
  64. {
  65. $goodsData = [];
  66. $goodsSkuData = [];
  67. foreach ($goodsList as $goods) {
  68. // 是否减库存 (付款减库存)
  69. $isUpdateStockNum = $goods['deduct_stock_type'] == DeductStockTypeEnum::PAYMENT;
  70. // 商品的数据
  71. $goodsDataItm = [
  72. 'where' => ['goods_id' => $goods['goods_id']],
  73. 'data' => [
  74. // 累计商品实际销量
  75. 'sales_actual' => ['inc', $goods['total_num']]
  76. ]
  77. ];
  78. // 递减商品总库存
  79. $isUpdateStockNum && $goodsDataItm['data']['stock_total'] = ['dec', $goods['total_num']];
  80. $goodsData[] = $goodsDataItm;
  81. // 付款减库存
  82. $isUpdateStockNum && $goodsSkuData[] = [
  83. 'where' => [
  84. 'goods_id' => $goods['goods_id'],
  85. 'goods_sku_id' => $goods['goods_sku_id'],
  86. ],
  87. 'data' => ['stock_num' => ['dec', $goods['total_num']]],
  88. ];
  89. }
  90. // 更新商品信息
  91. !empty($goodsData) && $this->updateGoods($goodsData);
  92. // 更新商品sku信息
  93. !empty($goodsSkuData) && $this->updateGoodsSku($goodsSkuData);
  94. return true;
  95. }
  96. /**
  97. * 回退商品库存事件 (用于取消订单时调用)
  98. * @param mixed $goodsList 订单商品列表
  99. * @param bool $isPayOrder 是否为已支付订单
  100. * @return array|false
  101. * @throws \Exception
  102. */
  103. public function backGoodsStock($goodsList, bool $isPayOrder = false)
  104. {
  105. $goodsData = [];
  106. $goodsSkuData = [];
  107. foreach ($goodsList as $goods) {
  108. // 更新条件: 订单已经支付或者订单商品为 "下单减库存"
  109. if ($isPayOrder || $goods['deduct_stock_type'] == DeductStockTypeEnum::CREATE) {
  110. $goodsData[] = [
  111. 'where' => ['goods_id' => $goods['goods_id']],
  112. 'data' => ['stock_total' => ['inc', $goods['total_num']]]
  113. ];
  114. $goodsSkuData[] = [
  115. 'where' => [
  116. 'goods_id' => $goods['goods_id'],
  117. 'goods_sku_id' => $goods['goods_sku_id'],
  118. ],
  119. 'data' => ['stock_num' => ['inc', $goods['total_num']]]
  120. ];
  121. }
  122. }
  123. // 更新商品总库存
  124. !empty($goodsData) && $this->updateGoods($goodsData);
  125. // 更新商品sku库存
  126. !empty($goodsSkuData) && $this->updateGoodsSku($goodsSkuData);
  127. return true;
  128. }
  129. /**
  130. * 更新商品信息
  131. * @param array $data
  132. * @return array|false
  133. */
  134. private function updateGoods(array $data)
  135. {
  136. return (new GoodsModel)->updateAll($data);
  137. }
  138. /**
  139. * 更新商品sku信息
  140. * @param array $data
  141. * @return array|false
  142. */
  143. private function updateGoodsSku(array $data)
  144. {
  145. return (new GoodsSkuModel)->updateAll($data);
  146. }
  147. }