BuyOrderLogic.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace addons\CloudStockTwo\common\logic\order;
  3. use addons\CloudStockTwo\common\enums\CloudStockTwoEnum;
  4. use addons\CloudStockTwo\common\logic\deduction\BuyDeductionLogic;
  5. use addons\CloudStockTwo\common\models\CloudStockTwoAgent;
  6. use addons\CloudStockTwo\common\models\CloudStockTwoBuyingOrder;
  7. use addons\CloudStockTwo\common\models\CloudStockTwoGoodsStockLog;
  8. use common\enums\AddonsEnum;
  9. use common\enums\StatusEnum;
  10. use common\helpers\FormatHelper;
  11. use common\models\common\CapitalLog;
  12. use common\models\user\User;
  13. use common\models\user\UserPartitionRelationship;
  14. use addons\CloudStockTwo\common\logic\reward\AgentReward;
  15. class BuyOrderLogic
  16. {
  17. public function handle($order_detail,$commission = 0,$reward_unit_price = 0)
  18. {
  19. $t = \Yii::$app->db->beginTransaction();
  20. try {
  21. $user_id = $order_detail->user_id;
  22. $mall_id = $order_detail->mall_id;
  23. //创建会员买货订单
  24. $params = [
  25. 'mall_id' => $mall_id,
  26. 'user_id' => $user_id,
  27. 'after_distribution_price' => $this->getAfterPrice($order_detail,$commission),
  28. 'order_id' => $order_detail['order_id'],
  29. 'order_detail_id' => $order_detail['id'],
  30. 'goods_id' => $order_detail['goods_id'],
  31. 'num' => $order_detail['num'],
  32. 'reward_unit_price' => $reward_unit_price,
  33. ];
  34. $buying_order = CloudStockTwoBuyingOrder::setData($params);
  35. if ($buying_order == false) throw new \Exception(CloudStockTwoBuyingOrder::getStaticError());
  36. //库存变化记录
  37. $params = [
  38. 'mall_id' => $mall_id,
  39. 'goods_id' => $order_detail['goods_id'],
  40. 'user_id' => $order_detail['user_id'],
  41. 'changes_dir' => CloudStockTwoEnum::STOCK_CHANGE_SUB,
  42. 'order_id' => $buying_order['id'],
  43. 'num' => $order_detail['num'],
  44. 'order_type' => CloudStockTwoEnum::STOCK_ORDER_TYPE_USER,
  45. 'changes_type' => CloudStockTwoEnum::STOCK_CHANGE_TYPE200,
  46. ];
  47. $stock_log = CloudStockTwoGoodsStockLog::setData($mall_id,$params);
  48. if (!$stock_log) throw new \Exception(CloudStockTwoGoodsStockLog::getStaticError());
  49. $user = User::findOne(['id' => $user_id]);
  50. $agent = CloudStockTwoAgent::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  51. if (empty($user)) throw new \Exception(CloudStockTwoAgent::getStaticError());
  52. //组装奖励数据
  53. $basic_conf = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'agent');
  54. $parent_agent_list = CloudStockTwoAgent::getUserParentAgentList($user_id,true);
  55. $reward_list = [];
  56. $wait_deduct_equal_money = 0;
  57. if (!empty($basic_conf['is_enable'])){
  58. $rewardObj = new AgentReward($mall_id,$user_id,$parent_agent_list,$stock_log,$basic_conf);
  59. $reward_list = $rewardObj->sendReward();
  60. $wait_deduct_equal_money = $rewardObj->wait_deduct_equal_money;
  61. }
  62. $user_parent_agent = CloudStockTwoAgent::getUserParentAgent($user_id, $agent['level'] ?? 0);
  63. //库存递归扣减逻辑
  64. $obj = new BuyDeductionLogic($user, $user_parent_agent, $stock_log, $buying_order, $buying_order->num,$reward_list,$parent_agent_list,$wait_deduct_equal_money,'buying');
  65. $obj->order_type = 'buying';
  66. if (!$obj->deduct()) throw new \Exception('库存递归扣减逻辑异常');
  67. $buying_order->reward_list = json_encode($reward_list);
  68. $buying_order->save();
  69. $t->commit();
  70. return true;
  71. } catch (\Exception $e) {
  72. $t->rollBack();
  73. $exception = FormatHelper::exception($e, $e->getMessage());
  74. echo $exception;
  75. \Yii::error($exception);
  76. }
  77. }
  78. protected function getAfterPrice($order_detail,$commission){
  79. $is_deduction_commission = \Yii::$app->services->setting->addons->get($order_detail['mall_id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'basic.is_deduction_commission');
  80. $res = $order_detail['goods_price'];
  81. if(!empty($is_deduction_commission))$res = $order_detail['goods_price']-$commission;
  82. if($res<0) return 0;
  83. return $res;
  84. }
  85. }