162 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| 
 | |
| namespace app\common\command;
 | |
| 
 | |
| 
 | |
| use app\common\enum\OrderEnum;
 | |
| use app\common\enum\OrderLogEnum;
 | |
| use app\common\enum\TeamEnum;
 | |
| use app\common\logic\OrderRefundLogic;
 | |
| use app\common\model\order\Order;
 | |
| use app\common\model\team\TeamActivity;
 | |
| use app\common\model\team\TeamFound;
 | |
| use app\common\model\team\TeamJoin;
 | |
| use app\common\server\ConfigServer;
 | |
| use Exception;
 | |
| use think\console\Command;
 | |
| use think\console\Input;
 | |
| use think\console\Output;
 | |
| use think\facade\Db;
 | |
| use think\facade\Log;
 | |
| 
 | |
| class TeamEnd extends Command
 | |
| {
 | |
|     protected function configure()
 | |
|     {
 | |
|         $this->setName('team_end')
 | |
|             ->setDescription('结束已超时的拼团');
 | |
|     }
 | |
| 
 | |
|     protected function execute(Input $input, Output $output)
 | |
|     {
 | |
|         try {
 | |
|             $time = time();
 | |
|             $automatic = ConfigServer::get('team', 'automatic', 0);
 | |
| 
 | |
|             // 获取并关闭已结束的活动
 | |
|             $team_ids = (new TeamActivity())->where([['activity_end_time', '<=', $time]])->column('id');
 | |
|             (new TeamActivity())->whereIn('id', $team_ids)->update(['status'=>0, 'update_time'=>$time]);
 | |
| 
 | |
|             // 找出拼团中&&拼团有效期结束的拼团记录
 | |
|             $map1 = array(
 | |
|                 ['invalid_time', '<=', $time],
 | |
|                 ['status', '=', 0]
 | |
|             );
 | |
|             $map2 = array(
 | |
|                 ['team_activity_id', 'in', $team_ids],
 | |
|                 ['status', '=', 0]
 | |
|             );
 | |
|             $teamFound1 = (new TeamFound())->whereOr([$map1, $map2])->select()->toArray();
 | |
|             $teamFound2 = (new TeamFound())->alias('TF')
 | |
|                                 ->where('TF.people','exp',' <= TF.join ')
 | |
|                                 ->where('status', '=', 0)
 | |
|                                 ->select()->toArray();
 | |
| 
 | |
|             $teamFound = $teamFound1;
 | |
|             if (empty($teamFound1)) {
 | |
|                 $teamFound = array_merge($teamFound1, $teamFound2);
 | |
|             } else {
 | |
|                 $found_ids = array_column($teamFound1, "id");
 | |
|                 if (!empty($teamFound2)) {
 | |
|                     foreach ($teamFound2 as $item) {
 | |
|                         if (!in_array($item['id'], $found_ids)) {
 | |
|                             $teamFound[] = $item;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // 结束拼团时间到的团
 | |
|             $teamJoinModel = new TeamJoin();
 | |
|             foreach ($teamFound as $found) {
 | |
|                 $teamJoin = $teamJoinModel->alias('TJ')
 | |
|                     ->field(['TJ.*,O.order_sn,O.order_status,O.pay_status,O.refund_status,O.order_amount'])
 | |
|                     ->where(['team_id' => $found['id']])
 | |
|                     ->join('order O', 'O.id=TJ.order_id')
 | |
|                     ->select()->toArray();
 | |
| 
 | |
|                 // 已支付的数量
 | |
|                 $payNums = array_column($teamJoin, 'pay_status');
 | |
|                 $payCount = 0;
 | |
|                 foreach ($payNums as $i) {
 | |
|                     if ($i == 1) {
 | |
|                         $payCount += 1;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // 此团有未支付订单: 关闭拼团,关闭订单,给已支付的退款
 | |
|                 if (in_array(1, array_column($teamJoin, 'pay_status'))) {
 | |
|                     if ($automatic == 1 || ($found['people'] == $found['join'] && $found['join'] == $payCount)) {
 | |
|                         $this->teamSuccess($teamJoin, $found, $time);
 | |
|                     } else {
 | |
|                         $this->teamFail($teamJoin, $found, $time);
 | |
|                     }
 | |
|                 } else {
 | |
|                     $this->teamFail($teamJoin, $found, $time);
 | |
| //                    $this->teamSuccess($teamJoin, $found, $time);
 | |
|                 }
 | |
|             }
 | |
|         } catch (Exception $e) {
 | |
|             Log::write('拼团关闭异常'.$e->getMessage());
 | |
|             throw new \think\Exception($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @Notes: 拼团失败
 | |
|      * @Author: 张无忌
 | |
|      * @param $teamJoin (参团列表数据)
 | |
|      * @param $found (开团的数据)
 | |
|      * @param $time (时间)
 | |
|      * @throws \think\Exception
 | |
|      */
 | |
|     private function teamFail($teamJoin, $found, $time)
 | |
|     {
 | |
|         Db::startTrans();
 | |
|         try {
 | |
|             TeamFound::update(['status'=>TeamEnum::TEAM_STATUS_FAIL, 'team_end_time'=>$time], ['id'=>$found['id']]);
 | |
|             foreach ($teamJoin as $item) {
 | |
|                 TeamJoin::update(['status' => TeamEnum::TEAM_STATUS_FAIL, 'update_time' => $time], ['id' => $item['id']]);
 | |
|                 if ($item['order_status'] == OrderEnum::ORDER_STATUS_DOWN) continue;
 | |
|                 if ($item['refund_status'] != OrderEnum::REFUND_STATUS_NO_REFUND) continue;
 | |
|                 $order = (new Order())->findOrEmpty($item['order_id'])->toArray();
 | |
|                 // 取消订单
 | |
|                 OrderRefundLogic::cancelOrder($order['id'], OrderLogEnum::TYPE_SYSTEM);
 | |
|                 if ($order['pay_status'] == OrderEnum::PAY_STATUS_PAID) {
 | |
|                     // 更新订单状态
 | |
|                     OrderRefundLogic::cancelOrderRefundUpdate($order);
 | |
|                     // 订单退款
 | |
|                     OrderRefundLogic::refund($order, $order['order_amount'], $order['order_amount']);
 | |
|                 }
 | |
|             }
 | |
|             Db::commit();
 | |
|         } catch (Exception $e) {
 | |
|             Db::rollback();
 | |
|             throw new \think\Exception($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @Notes: 拼团成功
 | |
|      * @Author: 张无忌
 | |
|      * @param $teamJoin (该团的,参团数据)
 | |
|      * @param $found (该团的, 开团时间)
 | |
|      * @param $time (时间)
 | |
|      * @throws \think\Exception
 | |
|      */
 | |
|     private function teamSuccess($teamJoin, $found, $time)
 | |
|     {
 | |
|         Db::startTrans();
 | |
|         try {
 | |
|             TeamFound::update(['status'=>TeamEnum::TEAM_STATUS_SUCCESS, 'team_end_time'=>$time], ['id'=>$found['id']]);
 | |
|             foreach ($teamJoin as $item) {
 | |
|                 TeamJoin::update(['status'=>TeamEnum::TEAM_STATUS_SUCCESS, 'update_time'=>$time], ['id'=>$item['id']]);
 | |
|             }
 | |
|             Db::commit();
 | |
|         } catch (Exception $e) {
 | |
|             Db::rollback();
 | |
|             throw new \think\Exception($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| } |