DeductionJob.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace addons\CloudStock\common\logic\deduction;
  3. use addons\CloudStock\common\events\order\CloudStockChangeEvent;
  4. use addons\CloudStock\common\logic\gift_bag\GiftBagLogic;
  5. use addons\CloudStock\common\models\CloudStockAgent;
  6. use addons\CloudStock\common\models\CloudStockBuyingOrder;
  7. use addons\CloudStock\common\models\CloudStockFillOrder;
  8. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  9. use addons\CloudStock\common\models\CloudStockPushDelayLog;
  10. use common\enums\RabbitMqEnum;
  11. use common\enums\RedisKeyEnum;
  12. use common\enums\StatusEnum;
  13. use common\helpers\LockHelper;
  14. use common\models\order\Order;
  15. use common\models\user\User;
  16. class DeductionJob
  17. {
  18. public function handleSync($data)
  19. {
  20. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, $data, self::class, 'handleQueue');
  21. }
  22. public function handleQueue($data){
  23. var_dump('执行限时补货补货');
  24. $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_CLOUD_STOCK_DELAY, $data['mall_id'] . ':' . $data['agent_user_id'] . ':' . $data['goods_id']);
  25. $identification = uniqid();
  26. try {
  27. if(!isset($data['is_lock'])||!empty($data['is_lock'])){
  28. if (!LockHelper::lock($lock_key, $identification, 5, 10)) {
  29. var_dump('加锁失败');
  30. return true;
  31. }
  32. }
  33. $model = CloudStockPushDelayLog::findOne([
  34. 'mall_id' => $data['mall_id'],
  35. 'stock_log_id' => $data['stock_log_id'],
  36. 'agent_user_id' => $data['agent_user_id'],
  37. 'status'=>StatusEnum::ENABLED
  38. ]);
  39. if (empty($model)) return true;
  40. // 根据需求。如果当前订单已经申请售后,并且订单已经售后完成,则不在进行补货
  41. if ($data['order_type'] == 'buying') {
  42. $order = CloudStockBuyingOrder::findOne(['id' => $data['order_id']]);
  43. $mainOrder = Order::findOne(['id' => $order['order_id']]);
  44. if (!empty($mainOrder) && $mainOrder['is_feedback'] == 2) return true;
  45. }
  46. $user_parent_agent = CloudStockAgent::findOne(['user_id' => $data['agent_user_id'], 'mall_id' => $data['mall_id'], 'status' => StatusEnum::ENABLED]);
  47. $order_no = '';
  48. $store_id = 0;
  49. switch ($data['order_type']) {
  50. case 'buying':
  51. $order = CloudStockBuyingOrder::findOne(['id' => $data['order_id']]);
  52. $class = BuyDeductionLogic::class;
  53. $main_order = Order::findOne(['id' => $order['order_id']]);
  54. $order_no = $main_order['order_no'];
  55. $store_id = $main_order['store_id'];
  56. break;
  57. case 'fill':
  58. $order = CloudStockFillOrder::findOne(['id' => $data['order_id']]);
  59. $class = FillDeductionLogic::class;
  60. $order_no = $order['order_no'];
  61. break;
  62. default:
  63. }
  64. if (!empty($class) && !empty($order)) {
  65. $user = User::findOne(['id' => $data['user_id']]);
  66. $stock_log = CloudStockGoodsStockLog::findOne(['id' => $data['stock_log_id']]);
  67. $not_yet_num = $model['not_yet_num'];
  68. if ($not_yet_num > 0) {
  69. $deduction_logic = new $class($user, $user_parent_agent, $stock_log, $order, $not_yet_num, $data['time_limit_fill_user_ids'], 1);
  70. $deduction_logic->order_type = $data['order_type'];
  71. $deduction_logic->order_no = $order_no;
  72. $deduction_logic->store_id = $store_id;
  73. $deduction_logic->deduct();
  74. $model->not_yet_num-=$not_yet_num;
  75. if($model->not_yet_num<=0) $model->not_yet_num = 0;
  76. if (!empty($obj->event_arr)) {
  77. foreach ($obj->event_arr as $event_data) {
  78. $event = new CloudStockChangeEvent($event_data['mall_id']);
  79. \Yii::$app->services->events->dispatch($event, $event_data, $event->listeners);
  80. }
  81. }
  82. }
  83. }
  84. $model->status = StatusEnum::DELETE;
  85. $model->save();
  86. LockHelper::uLock($lock_key, $identification);
  87. return true;
  88. } catch (\Exception $e) {
  89. var_dump($e->getMessage() . $e->getFile() . $e->getLine());
  90. LockHelper::uLock($lock_key, $identification);
  91. return true;
  92. }
  93. }
  94. public function handleTest($data)
  95. {
  96. var_dump('测试延时队列情况');
  97. var_dump($data);
  98. }
  99. public function delayDeductionStock($data)
  100. {
  101. try {
  102. $mall_id = $data['mall_id'];
  103. $order_id = $data['order_id'];
  104. $give_arr = $data['give_arr'];
  105. $payment_for_goods = $data['payment_for_goods'];
  106. $buy_user_id = $data['buy_user_id'];
  107. $level = $data['level'];
  108. $stock_log_arr = $data['stock_log_arr'];
  109. $sub_user_id = GiftBagLogic::checkDeductionStockNoDelay($mall_id, $buy_user_id, $level, $give_arr);
  110. GiftBagLogic::deductionStock($mall_id, $sub_user_id, $order_id, $give_arr, $payment_for_goods, $stock_log_arr);
  111. } catch (\Exception $e) {
  112. var_dump('delayDeductionStock:' . $e->getMessage() . $e->getFile() . $e->getLine());
  113. }
  114. }
  115. public function test()
  116. {
  117. var_dump('测试延时队列执行情况' . date('Y-m-d H:i:s', time()));
  118. }
  119. }