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