OrderLogic.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. namespace addons\Seckill\common\logic\order;
  3. use addons\Seckill\common\models\SeckillActivityOrder;
  4. use addons\Seckill\common\models\SeckillActivityUser;
  5. use common\enums\AddonsEnum;
  6. use common\enums\RedisKeyEnum;
  7. use common\enums\StatusEnum;
  8. use common\logic\order\BaseOrderForm;
  9. use common\traits\ErrorTrait;
  10. use Yii;
  11. use Exception;
  12. use addons\Seckill\common\models\SeckillActivity;
  13. use addons\Seckill\common\logic\ActivityLogic;
  14. class OrderLogic
  15. {
  16. use ErrorTrait;
  17. /**
  18. * 生成订单前置检测
  19. *
  20. * @param BaseOrderForm $form 商城订单数据
  21. * @return void
  22. */
  23. public static function createBeforeCheck($form)
  24. {
  25. try{
  26. //检测活动库存
  27. $activity_id = $form['activity']['id'] ?? 0;
  28. if(!ActivityLogic::decrStock($activity_id)){
  29. throw new Exception('商品已售罄');
  30. }
  31. // 订单加上插件标识
  32. $group_order_goods = $form->group_order_goods;
  33. foreach ($group_order_goods as $k => &$v) {
  34. if ($v['mch_order_info']) {
  35. // 标识
  36. $v['mch_order_info']['order_source'] = AddonsEnum::ADDONS_NAME_SECKILL;
  37. $v['mch_order_info']['extra_info'] = 'seckill_activity_'.$activity_id;
  38. $v['mch_order_info']['marketing_type'] = AddonsEnum::ADDONS_NAME_SECKILL;
  39. }
  40. }
  41. $form->group_order_goods = $group_order_goods;
  42. return $form;
  43. }catch(Exception $e){
  44. self::setStaticError($e->getMessage());
  45. return false;
  46. }
  47. }
  48. /**
  49. * 生成订单后操作
  50. *
  51. * @param int $activity_id
  52. * @param int $order_id
  53. * @return void
  54. */
  55. public static function createAfterHandle($order_id,$activity_id,$mall_id, $user_id = null)
  56. {
  57. try {
  58. //修改DB活动库存,销量
  59. SeckillActivity::updateAllCounters(['sale_nums' => 1],"id=" . $activity_id);
  60. //活动订单表
  61. SeckillActivityOrder::setData($mall_id,['activity_id' => $activity_id,'order_id' => $order_id]);
  62. // 用户活动订单表
  63. SeckillActivityUser::setData($mall_id, ['activity_id' => $activity_id, 'order_id' => $order_id, 'user_id' => $user_id]);
  64. } catch (Exception $e) {
  65. self::setStaticError($e->getMessage());
  66. return false;
  67. }
  68. }
  69. /**
  70. * 超时关闭秒杀订单
  71. * @param $order_id
  72. * @return bool
  73. */
  74. public static function closeOrder($order_id)
  75. {
  76. //释放库存
  77. $seckill_order = SeckillActivityOrder::findOne(['order_id' => $order_id]);
  78. if($seckill_order && !$seckill_order->is_close){
  79. //修改活动已售数量
  80. SeckillActivity::updateAllCounters(['sale_nums' => -1],"id=" . $seckill_order->activity_id);
  81. ActivityLogic::incrStock($seckill_order->activity_id);
  82. $seckill_order->is_close = 1;
  83. $seckill_order->save();
  84. }
  85. // 释放用户活动订单记录
  86. $seckilUser = SeckillActivityUser::findOne(['order_id' => $order_id]);
  87. if ($seckilUser && $seckilUser->status != StatusEnum::DELETE) {
  88. $seckilUser->status = StatusEnum::DELETE;
  89. $seckilUser->save();
  90. }
  91. return true;
  92. }
  93. /**
  94. * 检测当前应用场景是否需要实名认证
  95. * @param $params
  96. * @return bool|void
  97. */
  98. public function checkSeckillOrder($params)
  99. {
  100. if (!isset($params['order'])) return [];
  101. if (!isset($params['action'])) return [];
  102. $order = $params['order'];
  103. $action = $params['action'] ?? 'close';
  104. $result = true;
  105. if($action == 'close' && $order->order_source == AddonsEnum::ADDONS_NAME_SECKILL){
  106. $result = false; //返回false ,主商城自动关闭订单 才会忽略
  107. }
  108. return [AddonsEnum::ADDONS_NAME_SECKILL => [$action => $result]];
  109. }
  110. }