FillOrderLogic.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?php
  2. namespace addons\CloudStock\common\logic\order;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\events\order\CloudStockChangeEvent;
  5. use addons\CloudStock\common\events\order\CloudStockChangeSyncEvent;
  6. use addons\CloudStock\common\logic\deduction\DeductionJob;
  7. use addons\CloudStock\common\logic\deduction\FillDeductionLogic;
  8. use addons\CloudStock\common\logic\reward\FillRewardLogic;
  9. use addons\CloudStock\common\logic\reward\PoolReward;
  10. use addons\CloudStock\common\models\CloudStockAgent;
  11. use addons\CloudStock\common\models\CloudStockAgentGoods;
  12. use addons\CloudStock\common\models\CloudStockBuyingOrder;
  13. use addons\CloudStock\common\models\CloudStockGoods;
  14. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  15. use addons\CloudStock\common\models\CloudStockLevel;
  16. use addons\CloudStock\common\models\CloudStockPushDelayLog;
  17. use addons\Distribution\common\enums\ComputingEnum;
  18. use addons\Distribution\common\enums\DistributionEnum;
  19. use addons\Distribution\common\logic\reward\DistributionReward;
  20. use addons\Distribution\common\models\Distribution;
  21. use common\enums\AddonsEnum;
  22. use common\enums\RedisKeyEnum;
  23. use common\enums\StatusEnum;
  24. use common\helpers\FormatHelper;
  25. use common\helpers\LockHelper;
  26. use common\models\goods\Goods;
  27. use common\models\mall\MallAddons;
  28. use common\models\order\OrderDetail;
  29. use common\models\user\User;
  30. use common\models\user\UserPartitionRelationship;
  31. class FillOrderLogic
  32. {
  33. public $changes_type = CloudStockEnum::STOCK_CHANGE_TYPE100;
  34. public $fill_insert_wallet = [];
  35. public function handle($fill_order)
  36. {
  37. if (empty($fill_order)){
  38. return false;
  39. }
  40. if (empty($fill_order['is_pay'])) {
  41. return false;
  42. }
  43. $order_id = $fill_order['id'];
  44. $mall_id = $fill_order['mall_id'];
  45. $goods_id = $fill_order['goods_id'];
  46. $num = $fill_order['num'];
  47. $user_id = $fill_order['user_id'];
  48. $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_CLOUD_STOCK_DELAY,$mall_id.':'.$user_id.':'.$goods_id);
  49. $identification = uniqid();
  50. $t = \Yii::$app->db->beginTransaction();
  51. try {
  52. //库存变化记录
  53. $params = [
  54. 'mall_id' => $mall_id,
  55. 'goods_id' => $goods_id,
  56. 'user_id' => 0,
  57. 'changes_dir' => CloudStockEnum::STOCK_CHANGE_SUB,
  58. 'order_id' => $order_id,
  59. 'num' => $num,
  60. 'order_type' => CloudStockEnum::STOCK_ORDER_TYPE_REPLENISH,
  61. 'changes_type' => CloudStockEnum::STOCK_CHANGE_TYPE202,
  62. ];
  63. $stock_log = CloudStockGoodsStockLog::setData($mall_id,$params);
  64. if (!$stock_log) throw new \Exception(CloudStockGoodsStockLog::getStaticError());
  65. $agent = CloudStockAgent::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  66. $user = User::findOne(['id' => $user_id]);
  67. if (empty($user) || empty($agent)) throw new \Exception('代理商不存在');
  68. $user_parent_agent = CloudStockAgent::getUserParentAgent($user_id, $agent['level']);
  69. $changes_type = $this->changes_type;
  70. if(strpos($fill_order['order_no'],'CSFL')!==false){
  71. $changes_type = CloudStockEnum::STOCK_CHANGE_TYPE105;
  72. }
  73. //生成代理商商品库存
  74. $params = [
  75. 'mall_id' => $mall_id,
  76. 'user_id' => $user_id,
  77. 'goods_id' => $goods_id,
  78. 'num' => $num,
  79. 'order_id' => $fill_order['id'],
  80. 'changes_type' => $changes_type,
  81. 'changes_dir' => CloudStockEnum::STOCK_CHANGE_ADD,
  82. 'order_type' => CloudStockEnum::STOCK_ORDER_TYPE_REPLENISH,
  83. ];
  84. $increase_detail = null;
  85. $res = CloudStockAgentGoods::addData($params, $increase_detail);
  86. if (!$res) throw new \Exception(CloudStockAgentGoods::getStaticError());
  87. CloudStockAgent::fixStock($mall_id,$user_id);
  88. //库存递归扣减逻辑
  89. $obj = new FillDeductionLogic($user, $user_parent_agent, $stock_log, $fill_order, $fill_order['num']);
  90. $obj->order_type = 'fill';
  91. $obj->order_no = $fill_order['order_no'];
  92. $obj->user_agent_level = $agent['level'];
  93. if (!$obj->deduct()) throw new \Exception('库存递归扣减异常');
  94. !empty($obj->fill_insert_wallet) && ($this->fill_insert_wallet = $obj->fill_insert_wallet);
  95. //同步分销奖励
  96. self::distributionReward($user_id, $mall_id, $fill_order);
  97. $t->commit();
  98. if (LockHelper::lock($lock_key, $identification, 5, 10)){
  99. (new CloudStockPushDelayLog())->updateDelayLog($mall_id,$goods_id,$user_id,$num);
  100. }
  101. //触发库存变动事件
  102. if (isset($increase_detail)) {
  103. $event = new CloudStockChangeSyncEvent($increase_detail['mall_id']);
  104. $event_data = [
  105. 'id' => $increase_detail->id,
  106. 'type' => CloudStockEnum::STOCK_CHANGE_ADD,
  107. 'mall_id' => $increase_detail['mall_id'],
  108. ];
  109. \Yii::$app->services->events->dispatch($event, $event_data, $event->listeners);
  110. }
  111. if (!empty($obj->event_arr)) {
  112. foreach ($obj->event_arr as $event_data) {
  113. $event = new CloudStockChangeSyncEvent($event_data['mall_id']);
  114. \Yii::$app->services->events->dispatch($event, $event_data, $event->listeners);
  115. }
  116. }
  117. return true;
  118. } catch (\Exception $e) {
  119. LockHelper::uLock($lock_key, $identification);
  120. $t->rollBack();
  121. $exception = FormatHelper::exception($e, $e->getMessage());
  122. echo $exception;
  123. \Yii::error($exception);
  124. return false;
  125. }
  126. }
  127. /**
  128. * @desc:同步分销奖励
  129. * @Author: hua
  130. * @Date: 2022/3/3
  131. * @Time: 12:03
  132. * @Copyright: copyright (c) 2021 广东七件事集团
  133. * @param $user_id
  134. * @param $mall_id
  135. * @param $fill_order
  136. * @return bool|void
  137. */
  138. public static function distributionReward($user_id, $mall_id, $fill_order)
  139. {
  140. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  141. if (empty($configs['is_sync_distribution_level'])) return true;
  142. if (MallAddons::isInstall($mall_id, DistributionEnum::ADDONS_NAME) == 0) return true;
  143. $setting = \Yii::$app->services->setting->addons->get($mall_id, DistributionEnum::ADDONS_NAME, 'basic');
  144. if (empty($setting['level'])) return;
  145. $distribution_list = Distribution::getDistributionList($setting['is_self_buy'], $mall_id, $user_id);
  146. $goods = Goods::findOne(['id' => $fill_order['goods_id']]);
  147. $order_detail = [
  148. 'id' => $fill_order['id'],
  149. 'goods_id' => $fill_order['goods_id'],
  150. 'order_id' => $fill_order['id'],
  151. 'order_no' => $fill_order['order_no'],
  152. 'goods_name' => $goods['goods_name']??"",
  153. 'num' => $fill_order['num'],
  154. 'goods_price' =>$fill_order['pay_money'],
  155. 'original_goods_price' => bcmul($goods['price'],$fill_order['num'],2),
  156. 'cost_price' => $goods['cost_price'] * $fill_order['num'],
  157. ];
  158. $setting['compute_type'] = ComputingEnum::ORDER_PAY;
  159. $agent_reward_obj = new DistributionReward($mall_id, $user_id, $setting, $distribution_list, $order_detail);
  160. $agent_reward_obj->extension = ['source_table' => 'cloud_stock_agent_order', 'source_table_id' =>$fill_order['id'], 'from_type' =>'Distribution'];
  161. $agent_reward_obj->addFrozenCommission();
  162. }
  163. //业绩奖励
  164. public function performanceReward(){}
  165. }