BuyOrderLogic.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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\logic\deduction\BuyDeductionLogic;
  6. use addons\CloudStock\common\models\CloudStockAgent;
  7. use addons\CloudStock\common\models\CloudStockBuyingOrder;
  8. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  9. use common\enums\AddonsEnum;
  10. use common\enums\StatusEnum;
  11. use common\helpers\FormatHelper;
  12. use common\models\common\CapitalLog;
  13. use common\models\order\Order;
  14. use common\models\user\User;
  15. class BuyOrderLogic
  16. {
  17. public $payment_type = 0;
  18. public $fill_insert_wallet = [];
  19. public $payment_insert_wallet = [];
  20. public $upgrade_bag_goods_id_arr = [];
  21. public function handle($order_detail,$commission = 0)
  22. {
  23. $t = \Yii::$app->db->beginTransaction();
  24. try {
  25. $user_id = $order_detail->user_id;
  26. $mall_id = $order_detail->mall_id;
  27. $order_detail['num'] = (int)$order_detail['num'];
  28. //创建会员买货订单
  29. $params = [
  30. 'mall_id' => $mall_id,
  31. 'user_id' => $user_id,
  32. 'after_distribution_price' => $this->getAfterPrice($order_detail,$commission),
  33. 'order_id' => $order_detail['order_id'],
  34. 'order_detail_id' => $order_detail['id'],
  35. 'goods_id' => $order_detail['goods_id'],
  36. 'num' => $order_detail['num'],
  37. 'payment_type' => $this->payment_type,
  38. ];
  39. $buying_order = CloudStockBuyingOrder::setData($params);
  40. if ($buying_order == false) throw new \Exception(CloudStockBuyingOrder::getStaticError());
  41. //库存变化记录
  42. $params = [
  43. 'mall_id' => $mall_id,
  44. 'goods_id' => $order_detail['goods_id'],
  45. 'user_id' => $order_detail['user_id'],
  46. 'changes_dir' => CloudStockEnum::STOCK_CHANGE_SUB,
  47. 'order_id' => $buying_order['id'],
  48. 'num' => $order_detail['num'],
  49. 'order_type' => CloudStockEnum::STOCK_ORDER_TYPE_USER,
  50. 'changes_type' => CloudStockEnum::STOCK_CHANGE_TYPE200,
  51. ];
  52. $stock_log = CloudStockGoodsStockLog::setData($mall_id,$params);
  53. if (!$stock_log) throw new \Exception(CloudStockGoodsStockLog::getStaticError());
  54. $user = User::findOne(['id' => $user_id]);
  55. $agent = CloudStockAgent::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  56. if (empty($user)) throw new \Exception(CloudStockAgent::getStaticError());
  57. $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  58. //升级礼包升级商品扣货逻辑
  59. if(!empty($configs['upgrade_bag_product_deduction']) && in_array($order_detail['goods_id'],$this->upgrade_bag_goods_id_arr)){
  60. //扣除关系链中大于等于指定等级的代理库存
  61. $upgrade_bag_product_deduction_level = $configs['upgrade_bag_product_deduction_level'];
  62. $user_parent_agent = CloudStockAgent::getUserParentAgent($user_id, $upgrade_bag_product_deduction_level, 1);
  63. }else{
  64. //扣除关系链中大于自身等级的代理库存
  65. $user_parent_agent = CloudStockAgent::getUserParentAgent($user_id, $agent['level'] ?? 0);
  66. }
  67. //库存递归扣减逻辑
  68. $obj = new BuyDeductionLogic($user, $user_parent_agent, $stock_log, $buying_order, $buying_order->num);
  69. $obj->order_type = 'buying';
  70. $main_order = Order::findOne(['id' => $order_detail['order_id']]);
  71. $obj->order_no = $main_order['order_no'];
  72. $obj->store_id = $main_order['store_id'];
  73. $obj->user_agent_level = 0;
  74. if (!$obj->deduct()) throw new \Exception('库存递归扣减逻辑异常');
  75. !empty($obj->fill_insert_wallet) && ($this->fill_insert_wallet = $obj->fill_insert_wallet);
  76. !empty($obj->payment_insert_wallet) && ($this->payment_insert_wallet = $obj->payment_insert_wallet);
  77. $t->commit();
  78. if (!empty($obj->event_arr)) {
  79. foreach ($obj->event_arr as $event_data) {
  80. $event = new CloudStockChangeEvent($event_data['mall_id']);
  81. \Yii::$app->services->events->dispatch($event, $event_data, $event->listeners);
  82. }
  83. }
  84. return true;
  85. } catch (\Exception $e) {
  86. $t->rollBack();
  87. $exception = FormatHelper::exception($e, $e->getMessage());
  88. echo $e->getMessage() . $e->getFile() . $e->getLine();
  89. \Yii::error($exception);
  90. }
  91. }
  92. protected function getAfterPrice($order_detail,$commission){
  93. $configs = \Yii::$app->services->setting->addons->get($order_detail['mall_id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  94. // $res = $order_detail['goods_price'];
  95. // if(!empty($is_deduction_commission))$res = $order_detail['goods_price']-$commission;
  96. if ($configs['is_buy_type'] == 1 && $configs['buy_type'] == 2) { //启用会员买货扣除库存方式并且选择成本价时
  97. $res = $order_detail['cost_price']-$commission;
  98. } else {
  99. $res = $order_detail['goods_price']-$commission;
  100. }
  101. if($res<0) return 0;
  102. return $res;
  103. }
  104. }