FillOrderLogic.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace addons\CloudStockTwo\common\logic\order;
  3. use addons\CloudStockTwo\common\enums\CloudStockTwoEnum;
  4. use addons\CloudStockTwo\common\logic\deduction\FillDeductionLogic;
  5. use addons\CloudStockTwo\common\logic\reward\FillRewardLogic;
  6. use addons\CloudStockTwo\common\models\CloudStockTwoAgent;
  7. use addons\CloudStockTwo\common\models\CloudStockTwoAgentGoods;
  8. use addons\CloudStockTwo\common\models\CloudStockTwoBuyingOrder;
  9. use addons\CloudStockTwo\common\models\CloudStockTwoGoods;
  10. use addons\CloudStockTwo\common\models\CloudStockTwoGoodsStockLog;
  11. use addons\CloudStockTwo\common\models\CloudStockTwoLevel;
  12. use addons\Distribution\common\enums\ComputingEnum;
  13. use addons\Distribution\common\enums\DistributionEnum;
  14. use addons\Distribution\common\logic\reward\DistributionReward;
  15. use addons\Distribution\common\models\Distribution;
  16. use common\enums\AddonsEnum;
  17. use common\enums\StatusEnum;
  18. use common\helpers\FormatHelper;
  19. use common\models\goods\Goods;
  20. use common\models\mall\MallAddons;
  21. use common\models\order\OrderDetail;
  22. use common\models\user\User;
  23. use common\models\user\UserPartitionRelationship;
  24. use addons\CloudStockTwo\common\logic\reward\AgentReward;
  25. class FillOrderLogic
  26. {
  27. public function handle($fill_order)
  28. {
  29. $t = \Yii::$app->db->beginTransaction();
  30. try {
  31. if (empty($fill_order)) throw new \Exception('补货单不存在');
  32. if (empty($fill_order['is_pay'])) throw new \Exception('补货单未支付');
  33. $order_id = $fill_order['id'];
  34. $mall_id = $fill_order['mall_id'];
  35. $goods_id = $fill_order['goods_id'];
  36. $num = $fill_order['num'];
  37. $user_id = $fill_order['user_id'];
  38. //库存变化记录
  39. $params = [
  40. 'mall_id' => $mall_id,
  41. 'goods_id' => $goods_id,
  42. 'user_id' => 0,
  43. 'changes_dir' => CloudStockTwoEnum::STOCK_CHANGE_SUB,
  44. 'order_id' => $order_id,
  45. 'num' => $num,
  46. 'order_type' => CloudStockTwoEnum::STOCK_ORDER_TYPE_REPLENISH,
  47. 'changes_type' => CloudStockTwoEnum::STOCK_CHANGE_TYPE202,
  48. ];
  49. $stock_log = CloudStockTwoGoodsStockLog::setData($mall_id,$params);
  50. if (!$stock_log) throw new \Exception(CloudStockTwoGoodsStockLog::getStaticError());
  51. $agent = CloudStockTwoAgent::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  52. $user = User::findOne(['id' => $user_id]);
  53. if (empty($user) || empty($agent)) throw new \Exception('代理商不存在');
  54. //组装奖励数据
  55. $basic_conf = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'agent');
  56. $parent_agent_list = CloudStockTwoAgent::getUserParentAgentList($user_id,true);
  57. $reward_list = [];
  58. $wait_deduct_equal_money = 0;
  59. if (!empty($basic_conf['is_enable'])){
  60. $rewardObj = new AgentReward($mall_id,$user_id,$parent_agent_list,$stock_log,$basic_conf);
  61. $reward_list = $rewardObj->sendReward();
  62. $wait_deduct_equal_money = $rewardObj->wait_deduct_equal_money;
  63. }
  64. $user_parent_agent = CloudStockTwoAgent::getUserParentAgent($user_id, $agent['level']);
  65. //库存递归扣减逻辑
  66. $obj = new FillDeductionLogic($user, $user_parent_agent, $stock_log, $fill_order, $fill_order['num'],$reward_list,$parent_agent_list,$wait_deduct_equal_money,'fill');
  67. $obj->order_type = 'fill';
  68. if (!$obj->deduct()) throw new \Exception('库存递归扣减异常');
  69. $fill_order->reward_list = json_encode($reward_list);
  70. $fill_order->save();
  71. $params = [
  72. 'mall_id' => $mall_id,
  73. 'user_id' => $user_id,
  74. 'goods_id' => $goods_id,
  75. 'num' => $num,
  76. 'order_id' => $fill_order['id'],
  77. 'changes_type' => CloudStockTwoEnum::STOCK_CHANGE_TYPE100,
  78. 'changes_dir' => CloudStockTwoEnum::STOCK_CHANGE_ADD,
  79. 'order_type' => CloudStockTwoEnum::STOCK_ORDER_TYPE_REPLENISH,
  80. ];
  81. //生成代理商商品库存
  82. $res = CloudStockTwoAgentGoods::addData($params);
  83. if (!$res) throw new \Exception(CloudStockTwoAgentGoods::getStaticError());
  84. //补货奖励
  85. // $level = CloudStockTwoLevel::findOne(['mall_id' => $mall_id, 'level' => $agent->level, 'status' => StatusEnum::ENABLED]);
  86. // if (!empty($level['is_fill'])) {
  87. // //补货奖发放
  88. // $stock_goods = CloudStockTwoGoods::findOne(['mall_id' => $mall_id, 'goods_id' => $goods_id]);
  89. // $fill_reward_logic = new FillRewardLogic($agent, $stock_goods, 0, $order_id, $num, 0,
  90. // CloudStockTwoEnum::CHANGE_TYPE_INCREASE_FILL_EXTRA_BONUS,
  91. // '补货奖发放',
  92. // 0
  93. // );
  94. // $fill_reward_logic->addRewardLog();
  95. // }
  96. //同步分销奖励
  97. self::distributionReward($user_id, $mall_id, $fill_order);
  98. $t->commit();
  99. return true;
  100. } catch (\Exception $e) {
  101. $t->rollBack();
  102. $exception = FormatHelper::exception($e, $e->getMessage());
  103. //echo $exception;
  104. \Yii::error($exception);
  105. return false;
  106. }
  107. }
  108. /**
  109. * @desc:同步分销奖励
  110. * @Author: hua
  111. * @Date: 2022/3/3
  112. * @Time: 12:03
  113. * @Copyright: copyright (c) 2021 广东七件事集团
  114. * @param $user_id
  115. * @param $mall_id
  116. * @param $fill_order
  117. * @return bool|void
  118. */
  119. public static function distributionReward($user_id, $mall_id, $fill_order)
  120. {
  121. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'basic');
  122. if (empty($configs['is_sync_distribution_level'])) return true;
  123. if (MallAddons::isInstall($mall_id, DistributionEnum::ADDONS_NAME) == 0) return true;
  124. $setting = \Yii::$app->services->setting->addons->get($mall_id, DistributionEnum::ADDONS_NAME, 'basic');
  125. if (empty($setting['level'])) return;
  126. $distribution_list = Distribution::getDistributionList($setting['is_self_buy'], $mall_id, $user_id);
  127. $goods = Goods::findOne(['id' => $fill_order['goods_id']]);
  128. $order_detail = [
  129. 'id' => $fill_order['id'],
  130. 'goods_id' => $fill_order['goods_id'],
  131. 'order_id' => $fill_order['id'],
  132. 'order_no' => $fill_order['order_no'],
  133. 'goods_name' => $goods['goods_name']??"",
  134. 'num' => $fill_order['num'],
  135. 'goods_price' =>$fill_order['pay_money'],
  136. 'original_goods_price' => bcmul($goods['price'],$fill_order['num'],2),
  137. 'cost_price' => $goods['cost_price'] * $fill_order['num'],
  138. ];
  139. $setting['compute_type'] = ComputingEnum::ORDER_PAY;
  140. $agent_reward_obj = new DistributionReward($mall_id, $user_id, $setting, $distribution_list, $order_detail);
  141. $agent_reward_obj->addFrozenCommission();
  142. }
  143. //业绩奖励
  144. public function performanceReward(){}
  145. }