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()); | ||
|  |         } | ||
|  |     } | ||
|  | } |