| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <?php
- namespace addons\Seckill\common\logic\order;
- use addons\Seckill\common\models\SeckillActivityOrder;
- use addons\Seckill\common\models\SeckillActivityUser;
- use common\enums\AddonsEnum;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\logic\order\BaseOrderForm;
- use common\traits\ErrorTrait;
- use Yii;
- use Exception;
- use addons\Seckill\common\models\SeckillActivity;
- use addons\Seckill\common\logic\ActivityLogic;
- class OrderLogic
- {
- use ErrorTrait;
- /**
- * 生成订单前置检测
- *
- * @param BaseOrderForm $form 商城订单数据
- * @return void
- */
- public static function createBeforeCheck($form)
- {
- try{
- //检测活动库存
- $activity_id = $form['activity']['id'] ?? 0;
- if(!ActivityLogic::decrStock($activity_id)){
- throw new Exception('商品已售罄');
- }
- // 订单加上插件标识
- $group_order_goods = $form->group_order_goods;
- foreach ($group_order_goods as $k => &$v) {
- if ($v['mch_order_info']) {
- // 标识
- $v['mch_order_info']['order_source'] = AddonsEnum::ADDONS_NAME_SECKILL;
- $v['mch_order_info']['extra_info'] = 'seckill_activity_'.$activity_id;
- $v['mch_order_info']['marketing_type'] = AddonsEnum::ADDONS_NAME_SECKILL;
- }
- }
- $form->group_order_goods = $group_order_goods;
- return $form;
- }catch(Exception $e){
- self::setStaticError($e->getMessage());
- return false;
- }
- }
- /**
- * 生成订单后操作
- *
- * @param int $activity_id
- * @param int $order_id
- * @return void
- */
- public static function createAfterHandle($order_id,$activity_id,$mall_id, $user_id = null)
- {
- try {
- //修改DB活动库存,销量
- SeckillActivity::updateAllCounters(['sale_nums' => 1],"id=" . $activity_id);
- //活动订单表
- SeckillActivityOrder::setData($mall_id,['activity_id' => $activity_id,'order_id' => $order_id]);
- // 用户活动订单表
- SeckillActivityUser::setData($mall_id, ['activity_id' => $activity_id, 'order_id' => $order_id, 'user_id' => $user_id]);
- } catch (Exception $e) {
- self::setStaticError($e->getMessage());
- return false;
- }
- }
- /**
- * 超时关闭秒杀订单
- * @param $order_id
- * @return bool
- */
- public static function closeOrder($order_id)
- {
- //释放库存
- $seckill_order = SeckillActivityOrder::findOne(['order_id' => $order_id]);
- if($seckill_order && !$seckill_order->is_close){
- //修改活动已售数量
- SeckillActivity::updateAllCounters(['sale_nums' => -1],"id=" . $seckill_order->activity_id);
- ActivityLogic::incrStock($seckill_order->activity_id);
- $seckill_order->is_close = 1;
- $seckill_order->save();
- }
- // 释放用户活动订单记录
- $seckilUser = SeckillActivityUser::findOne(['order_id' => $order_id]);
- if ($seckilUser && $seckilUser->status != StatusEnum::DELETE) {
- $seckilUser->status = StatusEnum::DELETE;
- $seckilUser->save();
- }
- return true;
- }
- /**
- * 检测当前应用场景是否需要实名认证
- * @param $params
- * @return bool|void
- */
- public function checkSeckillOrder($params)
- {
- if (!isset($params['order'])) return [];
- if (!isset($params['action'])) return [];
- $order = $params['order'];
- $action = $params['action'] ?? 'close';
- $result = true;
- if($action == 'close' && $order->order_source == AddonsEnum::ADDONS_NAME_SECKILL){
- $result = false; //返回false ,主商城自动关闭订单 才会忽略
- }
- return [AddonsEnum::ADDONS_NAME_SECKILL => [$action => $result]];
- }
- }
|