<?php

namespace app\api\controller;

use app\common\enum\notice\NoticeEnum;
use app\common\model\Company;
use app\common\model\contract\Contract;
use app\common\model\contract\VehicleContract;
use app\common\model\vehicle\VehicleBuyRecord;
use app\common\model\vehicle\VehicleRent;
use think\facade\Db;

class VehicleController extends BaseApiController
{
    //镇街公司想物流平台申请租赁车辆
    public function setContractByTownCompany()
    {
        //获取参数 测试1111
        $params = $this->request->post(['num']);
        //验证参数
        if(empty($params['num'])){
            return $this->fail('缺少必要参数');
        }
	    //获取该公司已签约的小组服务公司数量
	    $villageCompany = Contract::field('id')->where('party_a',$this->userInfo['company_id'])->where('signing_timer',2)->count();
	    //已经租赁车辆
	    $rentCar = VehicleRent::field('id')->where('company_id',$this->userInfo['company_id'])->whereNotIn('type','1,2')->count();
	    //申请中的车辆
	    $applyCar = VehicleContract::field('num')->where('company_b_id',$this->userInfo['company_id'])->where('status','in','-1,0,1,2')->sum('num');
	    //自有车辆数量
	    $selfCar = VehicleContract::field('id')->where('company_a_id',$this->userInfo['company_id'])->where('type',1)->where('status','in','-1,0,1,2,3')->sum('num');
	    //购买车辆数量
	    //获取下面的小组服务公司
	    $villageCompanys = Contract::field('party_b')->where('party_a',$this->userInfo['company_id'])->where('signing_timer',2)->select()->toArray();
	    $buyCar = 0;
	    foreach ($villageCompanys as $v) {
		    $aa = VehicleContract::field('id')->where('company_b_id',$v['party_b'])->where('type',3)->where('status','in','-1,0,1,2,3')->findOrEmpty();
		    if(!$aa->isEmpty()){
			    $buyCar += 1;
		    }
	    }
	    //可在租车辆
	    $doubleRentCar = max($villageCompany - $rentCar - $applyCar - $selfCar - $buyCar,0);
        if($params['num'] > $doubleRentCar ){
            return $this->fail('数量超过可再租车辆数');
        }
        //判断物流车辆
        $checkNum = curl_post(env('project.logistic_domain').'/api/checkCarNum',[],['num'=>$params['num']]);
        if($checkNum == null){
            return $this->fail('检查车辆数量错误');
        }
        if($checkNum['code'] == 0){
            return $this->fail($checkNum['msg']);
        }
        //查找乙方公司信息
        $party_b = Company::field('id,company_name,organization_code,master_name,master_phone,master_email,company_type')->where('id',$this->userInfo['company_id'])->find();
        if(empty($party_b)) {
            return $this->fail('数据不存在');
        }
        //判断是否是镇街公司
        if($party_b['company_type'] != 41){
            return ['code'=>0,'msg'=>'非镇街公司不能签约'];
        }
        //发送生成合同给物流信息
        $curl_result = curl_post(env('project.logistic_domain').'/api/signContract',[],[
            'num' => $params['num'],
            'company_id' => $party_b['id'],
            'company_name' => $party_b['company_name'],
            'company_code' => $party_b['organization_code'],
            'company_user' => $party_b['master_name'],
            'company_phone' => $party_b['master_phone'],
            'company_email' => $party_b['master_email'],
        ]);
        if(empty($curl_result)){
            return $this->fail('null return from logistic');
        }
        if($curl_result['code'] == 0){
            return $this->fail($curl_result['msg'].' from logistic');
        }
        Db::startTrans();
        try {
            $create_result = VehicleContract::create($curl_result['data']);
            if($create_result->id){
                Db::commit();
                return $this->success('合同发起成功,等待审核 from task');
            }else{
                Db::rollback();
                return $this->success('合同发起失败,请稍后重试 from task');
            }
        } catch (\Exception $e) {
            Db::rollback();
            return $this->fail($e->getMessage().' from task');
        }
    }

    //镇街公司生成小组服务公司租赁合同
    public function setContractByVillageCompany(){
        //获取参数
        $params = $this->request->post(['id','car_id']);
        if(empty($params['id'])){
            return $this->fail('缺少必要参数');
        }
        //获取数据
        $vehicleContract = VehicleContract::where('id',$params['id'])->find();
        if(empty($vehicleContract)){
            return $this->fail('未找到数据');
        }
        if($this->userInfo['company_id'] != $vehicleContract['company_a_id']){
            return $this->fail('数据错误');
        }
        if($vehicleContract['status'] != -1) {
            return $this->fail('数据状态错误');
        }
        if($vehicleContract['type'] == 0){
            if(empty($params['car_id'])){
                return $this->fail('缺少参数car_id');
            }
        }
        if($vehicleContract['type'] == 0){
            $car = VehicleRent::field('car_id as id,car_license as license')->where('car_id',$params['car_id'])->find();
            if(empty($car)){
                return $this->fail('车辆数据有误');
            }
            $json = json_encode([$car->toArray()]);
            //更改车辆状态
            VehicleRent::where('car_id',$params['car_id'])->update(['status'=>1]);
            //更改状态
            $result = VehicleContract::where('id',$params['id'])->update(['status'=>0,'cars_info'=>$json,'update_time'=>time()]);
        }else{
            //更改状态
            $result = VehicleContract::where('id',$params['id'])->update(['status'=>0,'update_time'=>time()]);
        }
        //返回数据
        if($result){
            return $this->success('合同生成成功,等待风控部审核');
        }else{
            return $this->fail('合同生成失败,请稍后重试');
        }
    }

    //镇街公司发起合同
    public function initiatingRentCarContract() {
        //获取参数
        $params = $this->request->post(['id']);
        if(empty($params['id'])){
            return $this->fail('缺少必要参数');
        }
        //获取数据
        $contract = VehicleContract::where('id',$params['id'])->find();
        if(empty($contract)){
            return $this->fail('数据不存在');
        }
        if($contract['status'] != 1){
            return $this->fail('合同状态错误');
        }
        $signData = [
            'name' => $contract['company_a_name'] . '的合同',
            'signatories' => [
                ['fullName' => $contract['company_a_name'], 'identityType' => 12, 'identityCard' => $contract['company_a_code'], 'email' => $contract['company_a_email'],  'noNeedVerify' => 1, 'signLevel' => 1],
                ['fullName' => $contract['company_b_name'], 'identityType' => 12, 'identityCard' => $contract['company_b_code'], 'email' => $contract['company_b_email'], 'noNeedVerify' => 1, 'signLevel' => 1]
            ],
            'url' => $contract['file']
        ];
        $notify_url = '';
        if($contract['type'] == 0){
            $notify_url = env('project.website_domain').'/api/index/systemCarRent';
        }elseif($contract['type'] == 1){
            $notify_url = env('project.website_domain').'/api/index/selfCarRent';
        }elseif($contract['type'] == 2){
            $notify_url = env('project.website_domain').'/api/index/cancelRent';
        }
        $signRes = app(JunziqianController::class)->VehicleRentSigning($signData, $params['id'],$notify_url);
        if ($signRes->success) {
            $contract->save([
                'id' => $contract['id'],
                'contract_no' => $signRes->data,
                'status' => 2
            ]);
            if($contract['type'] == 2){
                $smsTitle = '《解约合同》';
            }else{
                $smsTitle = '《租赁合同》';
            }
            $this->sendSms($params['id'],$smsTitle);
            return $this->success('合同发送成功');
        } else {
            return $this->fail($signRes->msg);
        }
    }

    public function sendSmsAgain() {
        //获取参数
        $id = $this->request->post('id');
        if(empty($id)){
            return $this->fail('参数错误');
        }
        //获取数据
        $contract = VehicleContract::where('id',$id)->find();
        if(empty($contract)){
            return $this->fail('数据错误');
        }
        if($contract['type'] == 2){
            $smsTitle = '《解约合同》';
        }else{
            $smsTitle = '《租赁合同》';
        }
        $this->sendSms($id,$smsTitle);
        return $this->success('发送成功');
    }

    //小组服务公司租赁申请
    public function rentApply() {
        //验证请求类型
        if(!$this->request->isPost()){
            return $this->fail('请求类型错误');
        }
        //获取参数
        $params = $this->request->post(['type','license','pic']);
        if(!isset($params['type'])){
            return $this->fail('缺少必要参数');
        }
        if($params['type'] == 1){
            if(empty($params['license']) || empty($params['pic'])){
                return $this->fail('缺少必要参数');
            }
        }
        //获取当前公司信息
        $party_b = Company::field('id,company_name,master_name,master_phone,master_email,is_contract,organization_code,company_type')->where('id',$this->userInfo['company_id'])->find();
        if(empty($party_b)){
            return $this->fail('账号异常');
        }
        if($party_b['company_type'] != 18){
            return $this->fail('非小组服务公司不能申请');
        }
        if($party_b['is_contract'] != 1){
            return $this->fail('当前小组服务公司未签约');
        }
        //获取签约信息
        $contract = Contract::where('party_b',$this->userInfo['company_id'])->where('signing_timer',2)->findOrEmpty();
	    if($contract->isEmpty()){
		    return $this->fail('未找到签约镇街公司');
	    }
        $party_a = Company::field('id,company_name,master_name,master_phone,master_email,is_contract,organization_code,company_type')->where('id',$contract['party_a'])->find();
        if($party_a['company_type'] != 41){
            return $this->fail('不能与非镇街公司签约');
        }
        if($party_a['is_contract'] != 1){
            return $this->fail('当前镇街公司未签约');
        }
        //判断是否申请过
        $vehicleContract = VehicleContract::where('company_b_id',$this->userInfo['company_id'])->whereNotIn('type','2,3')->whereNotIn('status','4,5,6')->find();
        if(!empty($vehicleContract)){
            return $this->fail('请勿重复申请');
        }
        if($params['type'] == 1){
            $cars_info = json_encode([['license'=>$params['license'],'pic'=>$params['pic']]]);
            $car_type = 1;
        }else{
            $cars_info = null;
            $car_type = 0;
        }
        //设置数据
        $data = [
            'contract_logistic_id' => 0,
            'contract_no' => time(),
            'company_a_id' => $party_a['id'],
            'company_a_name' => $party_a['company_name'],
            'company_a_code' => $party_a['organization_code'],
            'company_a_user' => $party_a['master_name'],
            'company_a_phone' => $party_a['master_phone'],
            'company_a_email' => $party_a['master_email'],
            'company_b_id' => $party_b['id'],
            'company_b_name' => $party_b['company_name'],
            'company_b_code' => $party_b['organization_code'],
            'company_b_user' => $party_b['master_name'],
            'company_b_phone' => $party_b['master_phone'],
            'company_b_email' => $party_b['master_email'],
            'cars_info' => $cars_info,
            'num' => 1,
            'type' => $car_type,
            'status' => -1,
            'create_time' => time(),
            'update_time' => time()
        ];
        //写入数据
        $result = VehicleContract::create($data);
        if($result){
            return $this->success('申请成功,待镇街公司审核');
        }else{
            return $this->fail('申请失败,请稍后重试');
        }
    }

    //镇街公司驳回小组服务公司的租赁申请
    public function rejectRentApply() {
        //验证请求类型
        if(!$this->request->isPost()){
            return $this->fail('请求类型错误');
        }
        //获取参数
        $params = $this->request->post(['id','content']);
        if(empty($params['id']) || empty($params['content'])){
            return $this->fail('缺少必要参数');
        }
        //获取数据
        $vehicleContract = VehicleContract::where('id',$params['id'])->find();
        if(empty($vehicleContract)){
            return $this->fail('未查找到数据');
        }
        if($vehicleContract['company_a_id'] != $this->userInfo['company_id']){
            return $this->fail('数据不匹配');
        }
        //判断合同类型
        if($vehicleContract['type'] == 2){
            Db::startTrans();
            try{
                //查找原合同
                $car = json_decode($vehicleContract['cars_info'],true);
                $carRentInfo = VehicleRent::where('car_id',$car['id'])->findOrEmpty();
                $oldVehicleContractUpdate = VehicleContract::where('id',$carRentInfo['contract_id'])->update(['status'=>3]);
                //更新
                $result = VehicleContract::where('id',$params['id'])->update([
                    'status' => 4,
                    'reject_message' => $params['content']
                ]);
                if($oldVehicleContractUpdate && $result){
                    Db::commit();
                    return $this->success('驳回成功');
                }else{
                    Db::rollback();
                    return $this->fail('驳回失败');
                }
            }catch (\Exception $e) {
                Db::rollback();
                return $this->fail($e->getMessage());
            }
        }else{
            //更新
            $result = VehicleContract::where('id',$params['id'])->update([
                'status' => 4,
                'reject_message' => $params['content']
            ]);
            if($result){
                return $this->success('驳回成功');
            }else{
                return $this->fail('驳回失败');
            }
        }
    }

    //镇街公司收到的小组服务公司租赁申请列表
    public function rentApplyList() {

        $data = VehicleContract::where('company_a_id',$this->userInfo['company_id'])->where('status','<>',4)->select();
        return $this->success('请求成功',$data->toArray());
    }

    //小组服务公司租赁申请详情
    public function rentApplyInfo() {
        //获取参数
        $id = $this->request->get('id');
        if(empty($id)){
            return $this->fail('缺少必要参数');
        }
        //获取数据
        $vehicleContract = VehicleContract::where('id',$id)->find();
        $vehicleContract['cars_info'] = json_decode($vehicleContract['cars_info'],true);
        if(empty($vehicleContract)){
            return $this->fail('获取数据失败');
        }
        if($vehicleContract['company_a_id'] != $this->userInfo['company_id']){
            return $this->fail('数据不匹配');
        }
        $vehicleRentCars = VehicleRent::where('company_id',$vehicleContract['company_a_id'])->where('status',0)->select()->toArray();
        $data = [
            'vehicleContract' => $vehicleContract->toArray(),
            'vehicleRentCars' => $vehicleRentCars
        ];
        return $this->success('请求成功',$data);
    }

    //镇街公司车辆管理首页
    public function townCompanyVehicleIndex() {
        //获取公司信息
        $company = Company::where('id',$this->userInfo['company_id'])->find();
        if(empty($company)){
            return $this->fail('数据错误');
        }
        if($company['company_type'] != 41){
            return $this->fail('非镇街公司不能访问');
        }
        //获取小组服务公司申请信息
        $vehicleContract_pre = VehicleContract::where('company_a_id',$company['id'])->where('status','in','-1,0,1,2')->where('type','<>',2)->limit(4)->order('create_time desc')->select()->toArray();
        $vehicleContract = [];
        foreach ($vehicleContract_pre as $v) {
            $vehicleBuy = VehicleBuyRecord::where('contract_id',$v['id'])->findOrEmpty();
            if($vehicleBuy->isEmpty()){
                $vehicleContract[] = $v;
            }
        }
        //获取车辆列表
        $vehicleRentCars = VehicleRent::where('company_id',$company['id'])->where('status','in','0,1,2')->select()->each(function($item){
            if($item['status'] == 2){
                $item['rent_user'] = Company::field('company_name,master_name as user_name,master_phone as user_phone,province,city,area,street,village,brigade')->where('id',$item['rent_company_id'])->find()->append(['province_name', 'city_name', 'area_name', 'street_name', 'village_name','brigade_name']);
            }
        })->toArray();
        //获取该公司已签约的小组服务公司数量
        $villageCompany = Contract::field('id')->where('party_a',$company['id'])->where('signing_timer',2)->count();
        //已经租赁车辆
        $rentCar = VehicleRent::field('id')->where('company_id',$company['id'])->whereNotIn('type','1,2')->count();
        //申请中的车辆
        $applyCar = VehicleContract::field('num')->where('company_b_id',$company['id'])->where('status','in','-1,0,1,2')->sum('num');
        //自有车辆数量
		$selfCar = VehicleContract::field('id')->where('company_a_id',$company['id'])->where('type',1)->where('status','in','-1,0,1,2,3')->sum('num');
		//购买车辆数量
	    //获取下面的小组服务公司
	    $villageCompanys = Contract::field('party_b')->where('party_a',$company['id'])->where('signing_timer',2)->select()->toArray();
	    $buyCar = 0;
		foreach ($villageCompanys as $v) {
			$aa = VehicleContract::field('id')->where('company_b_id',$v['party_b'])->where('type',3)->where('status','in','-1,0,1,2,3')->findOrEmpty();
			if(!$aa->isEmpty()){
				$buyCar += 1;
			}
		}
        //可在租车辆
        $doubleRentCar = max($villageCompany - $rentCar - $applyCar - $selfCar - $buyCar,0);
        //设置数据
        $data = [
            'apply' => $vehicleContract,
            'car_list' => $vehicleRentCars,
            'monitor_num' => $villageCompany,
            'rent_num' => $rentCar,
            'can_rent_num' => intval($doubleRentCar),
            'self_num' => $selfCar,
	        'buy_num' => $buyCar,
            'apply_num' => $applyCar
        ];
        //返回
        return $this->success('请求成功',$data);
    }

    public function villageCompanyIndex() {
        //获取公司信息
        $company = Company::field('id,master_name as user_name,master_phone as user_phone,company_name,company_type,province,city,area,street,village,brigade')->where('id',$this->userInfo['company_id'])->find()->append(['province_name', 'city_name', 'area_name', 'street_name', 'village_name','brigade_name']);
        if(empty($company)){
            return $this->fail('数据错误');
        }
        if($company['company_type'] != 18 ){
            return $this->fail('非小组公司不能访问');
        }
        //获取购买车辆记录
        $buyCarRent = VehicleBuyRecord::where('company_id',$company['id'])->where('status','<>',4)->findOrEmpty();
        if($buyCarRent->isEmpty()){
            $data = VehicleContract::where('company_b_id',$company['id'])->where('type','<>',2)->order('id desc')->findOrEmpty();
        }else{
            $data = $buyCarRent;
            $data['status'] = 0;
            $data['type'] = 0;
        }
        //获取签约合同
        return $this->success('请求成功',$data->toArray());
    }

    //车辆详情
    public function vehicleInfo() {
        $id = $this->request->get('car_id');
        //获取数据
        if(!empty($id) && $id != 'undefined'){
            $data = VehicleRent::where('car_id',$id)->where('status',2)->findOrEmpty();
        }else{
            $data = VehicleRent::where('rent_company_id',$this->userInfo['company_id'])->where('status',2)->findOrEmpty();
        }
        if($data->isEmpty()){
            return $this->fail('数据不存在');
        }
        $data['mileage'] = 0;
        $data['company'] =  Company::field('company_name,master_name as user_name,master_phone as user_phone,province,city,area,street,village,brigade')->where('id',$data['rent_company_id'])->find()->append(['province_name', 'city_name', 'area_name', 'street_name', 'village_name','brigade_name']);
        //获取合同
        $data['contract'] = VehicleContract::field('id,contract_no,contract_url,file,status,create_time,update_time')->where('id',$data['contract_id'])->findOrEmpty();
        //当前坐标位置
        $position = curl_get(env('project.logistic_domain').'/api/getCarLocal?car_id='.$data['car_id']);
        if($position && $position['code'] == 1){
            $data['position'] = $position['data'];
        }else{
            $data['position'] = [];
        }
        return $this->success('请求成功',$data->toArray());
    }

    public function vehicleTrack() {
        //获取参数
        $params = $this->request->post(['car_id','start_time','end_time']);
        if(empty($params['car_id']) || empty($params['start_time']) || empty($params['end_time'])){
            return $this->fail('缺少必要参数');
        }
        //获取轨迹
        $url = env('project.logistic_domain').'/api/getCarHistory?car_id='.$params['car_id'].'&start_time='.$params['start_time'].'&end_time='.$params['end_time'];
        $result = curl_get($url);
        $data = [];
        foreach($result['data'] as $k => $v){
            $data[$k]['latitude'] = $v['lat'];
            $data[$k]['longitude'] = $v['lon'];
        }
        return $this->success('success',$data);
    }

    public function cancelContract() {
        //获取参数
        $params = $this->request->post(['car_id']);
        if(empty($params['car_id'])){
            return $this->fail('参数错误');
        }
        //获取车辆信息
        $carInfo = VehicleRent::where('car_id',$params['car_id'])->where('type',1)->find();
        if(empty($carInfo)){
            return $this->fail('车辆信息错误');
        }
        if($carInfo['rent_company_id'] != $this->userInfo['company_id']){
            return $this->fail('当前公司与车辆信息不匹配');
        }
        //获取原签约信息
        $contract = VehicleContract::where('id',$carInfo['contract_id'])->where('status',3)->find();
        if(empty($contract)){
            return $this->fail('原签约信息错误');
        }
        //获取甲方公司信息
        $party_a = Company::where('id',$carInfo['company_id'])->find();
        if(empty($party_a)){
            return $this->fail('甲方公司信息错误');
        }
        //获取乙方公司信息
        $party_b = Company::where('id',$this->userInfo['company_id'])->find();
        if(empty($party_b)){
            return $this->fail('乙方公司信息错误');
        }
        //判断是否申请过
        $vehicleContract = VehicleContract::where('company_b_id',$this->userInfo['company_id'])->where('type',3)->where('status','<>',4)->find();
        if(!empty($vehicleContract)){
            return $this->fail('请勿重复申请');
        }
        //设置数据
        $data = [
            'contract_logistic_id' => 0,
            'contract_no' => time(),
            'company_a_id' => $party_a['id'],
            'company_a_name' => $party_a['company_name'],
            'company_a_code' => $party_a['organization_code'],
            'company_a_user' => $party_a['master_name'],
            'company_a_phone' => $party_a['master_phone'],
            'company_a_email' => $party_a['master_email'],
            'company_b_id' => $party_b['id'],
            'company_b_name' => $party_b['company_name'],
            'company_b_code' => $party_b['organization_code'],
            'company_b_user' => $party_b['master_name'],
            'company_b_phone' => $party_b['master_phone'],
            'company_b_email' => $party_b['master_email'],
            'cars_info' => json_encode(['id'=>$carInfo['car_id'],'license'=>$carInfo['car_license']]),
            'num' => 1,
            'type' => 2,
            'status' => -1,
            'create_time' => time(),
            'update_time' => time(),
            'old_file' => $contract['contract_url'],
        ];
        Db::startTrans();
        try{
            //写入数据
            $new_result = VehicleContract::create($data);
            //修改原合同状态
            $old_result = VehicleContract::where('id',$contract['id'])->update(['status'=>5]);
            if($new_result && $old_result){
                Db::commit();
                return $this->success('申请成功,待镇街公司审核');
            }else{
                Db::rollback();
                return $this->fail('申请失败,请稍后重试');
            }
        }catch (\Exception $e) {
            Db::rollback();
            return $this->fail($e->getMessage());
        }
    }

    public function townCompanyContractList() {
        //获取公司信息
        $company = Company::where('id',$this->userInfo['company_id'])->find();
        if(empty($company)){
            return $this->fail('请求错误');
        }
        if($company['company_type'] != 41){
            return $this->fail('非镇街公司不能访问');
        }
        $data = VehicleContract::field('id,contract_no,contract_url,status,create_time,update_time')->where('contract_logistic_id','<>',0)->where('company_b_id',$company['id'])->select();
        return $this->success('请求成功',$data->toArray());
    }

    public function sendSms($id,$title) {
        //获取合同数据
        $contract = VehicleContract::where('id',$id)->find();
        if ($contract && !$contract->isEmpty() && $contract['file'] != '') {
            //发送短信
            $data = [
                //甲方
                [
                    "applyNo" => $contract['contract_no'],
                    "fullName" => $contract['company_a_name'],
                    "identityCard" => $contract['company_a_code'],
                    "identityType" => 12,
                    "master_phone" => $contract['company_a_phone'],
                    "type"=>"party_a"
                ],
                //乙方
                [
                    "applyNo" => $contract['contract_no'],
                    "fullName" => $contract['company_b_name'],
                    "identityCard" => $contract['company_b_code'],
                    "identityType" => 12,
                    "master_phone" => $contract['company_b_phone'],
                    "type"=>"party_b"

                ],
            ];

            $url = [];
            foreach ($data as $v) {
                $res = app(JunziqianController::class)->SigningLink($v);
                if (!$res->success) {
                    return false;
                }
                if ($v['type'] == 'party_a') {
                    $url['party_a'] =$res->data;
                } else {
                    $url['party_b'] =$res->data;
                }
                //发送短信
                $sms = [
                    'mobile' => $v['master_phone'],
                    'name' => $v['fullName'],
                    'type' => $title,
                    'code' => 'api/Hetong/info?id='.$id.'&type='.$v['type'],
                    'scene' => 'WQ'
                ];
                $scene = NoticeEnum::getSceneByTag($sms['scene']);
                if (empty($scene)) {
                    throw new \Exception('场景值异常');
                }
                event('Notice',  [
                    'scene_id' => $scene,
                    'params' => $sms
                ]);
            }
            VehicleContract::where('id', $id)->update(['url' => json_encode($url)]);
            return true;
        }else{
            return false;
        }
    }

    //获取空闲车辆列表
    public function getFreeCars(): \think\response\Json
    {
        //1、获取当前登录用户信息并判断其公司是否是小组服务公司
        $xzCompany = Company::field('id,company_type')->where('id',$this->userInfo['company_id'])->findOrEmpty();
        if($xzCompany->isEmpty() || $xzCompany['company_type'] != 18){
            return $this->fail('当前用户非小组服务公司');
        }
        //2、获取小组服务公司签约的镇街公司
        $zjCompany = Contract::field('party_a')->where('party_b',$this->userInfo['company_id'])->where('signing_timer',2)->findOrEmpty();
		if($zjCompany->isEmpty()){
			return $this->fail('未获取到小组服务公司签约的镇街公司');
		}
        //3、获取镇街公司向平台租赁的且未二次租赁给小组公司的车辆
        $zjRentCars = VehicleRent::field('car_id')->where('company_id',$zjCompany['party_a'])->where('status',0)->select()->toArray();
        $zjRentCars = array_column($zjRentCars,'car_id');
        //4、获取小组公司自己租赁的车辆
        $xzRentCars = VehicleRent::field('car_id')->where('company_id',$zjCompany['party_a'])->where('rent_company_id',$xzCompany['id'])->where('status',2)->where('type','<>',1)->where('type','<>',2)->select()->toArray();
        $xzRentCars = array_column($xzRentCars,'car_id');
        //5、获取平台未出租的车辆
        $result = curl_post(env('project.logistic_domain').'/api/Vehicle/getFreeCars',[],['ids'=>implode(',',array_merge($zjRentCars,$xzRentCars))]);
        foreach($result['data'] as $k => $v){
            $result['data'][$k]['checked'] = [];
        }
        //6、返回
        return $this->success('success',$result['data']);
    }

    //申请购车
    public function buyCars() {
        //验证请求类型
        if(!$this->request->isPost()){
            return $this->fail('请求类型错误');
        }
        //1、获取购买车辆的id参数
        $cars = $this->request->post('cars');
        $cars = json_decode($cars,true);
        if(empty($cars)){
            return $this->fail('参数错误');
        }
        //获取小组服务公司信息
        $xzCompany = Company::field('id,company_name,master_name,master_phone,master_email,organization_code,company_type')->where('id',$this->userInfo['company_id'])->findOrEmpty();
        if($xzCompany->isEmpty() || $xzCompany['company_type'] != 18){
            return $this->fail('当前用户非小组服务公司');
        }
        //获取镇街公司信息
        $zjCompany = Contract::field('party_a')->where('party_b',$this->userInfo['company_id'])->where('signing_timer',2)->findOrEmpty();
        if($zjCompany->isEmpty()){
            return $this->fail('签约镇街公司不存在');
        }
        //判断购买车辆中是否包含镇街公司租赁的车辆
        $car_ids = array_column($cars,'id');
        $zjRentCars = VehicleRent::field('car_id as id,car_license as license')->where('company_id',$zjCompany['party_a'])->where('car_id','in',$car_ids)->where('status',0)->where('type',0)->select();
        //判断小组服务公司是否租车或者有自有车辆
        $xzRentCars = VehicleRent::where('rent_company_id',$xzCompany['id'])->where('status','in','1,2')->where('type','<>',2)->findOrEmpty();
        //如果没有租赁车俩和上传自有车辆,也没有购买镇街公司租赁的车辆 则直接发起购买合同
        if($xzRentCars->isEmpty() && $zjRentCars->isEmpty()){
            //发送购买合同给物流系统
            $curl_result = curl_post(env('project.logistic_domain').'/api/signContract',[],[
                'num' => count($cars),
                'company_id' => $xzCompany['id'],
                'company_name' => $xzCompany['company_name'],
                'company_code' => $xzCompany['organization_code'],
                'company_user' => $xzCompany['master_name'],
                'company_phone' => $xzCompany['master_phone'],
                'company_email' => $xzCompany['master_email'],
                'cars_info' => json_encode($cars),
                'type' => 3
            ]);
            if(empty($curl_result)){
                return $this->fail('null return from logistic');
            }
            if($curl_result['code'] == 0){
                return $this->fail($curl_result['msg'].' from logistic');
            }
            //生成本地合同
            VehicleContract::create($curl_result['data']);
        }
        //如果没有租赁车俩和上传自有车辆,但有购买镇街公司租赁的车辆 则发起镇街公司与平台公司的解约合同
        if($xzRentCars->isEmpty() && !$zjRentCars->isEmpty()){
            $zjCompanyInfo = Company::field('id,company_name,master_name,master_phone,master_email,organization_code')->where('id',$zjCompany['party_a'])->findOrEmpty();
            //发送解约合同给物流系统
            $curl_result = curl_post(env('project.logistic_domain').'/api/signContract',[],[
                'num' => count($zjRentCars),
                'company_id' => $zjCompanyInfo['id'],
                'company_name' => $zjCompanyInfo['company_name'],
                'company_code' => $zjCompanyInfo['organization_code'],
                'company_user' => $zjCompanyInfo['master_name'],
                'company_phone' => $zjCompanyInfo['master_phone'],
                'company_email' => $zjCompanyInfo['master_email'],
                'cars_info' => json_encode($zjRentCars),
                'type' => 2
            ]);
            if(empty($curl_result)){
                return $this->fail('null return from logistic');
            }
            if($curl_result['code'] == 0){
                return $this->fail($curl_result['msg'].' from logistic');
            }
            //生成本地合同
            $res = VehicleContract::create($curl_result['data']);
            //生成关联记录
            VehicleBuyRecord::create([
                'company_id' => $xzCompany['id'],
                'company_name' => $xzCompany['company_name'],
                'company_code' => $xzCompany['organization_code'],
                'company_user' => $xzCompany['master_name'],
                'company_phone' => $xzCompany['master_phone'],
                'company_email' => $xzCompany['master_email'],
                'cars_info' => json_encode($cars),
                'num' => count($cars),
                'status' => 3,
                'contract_id' => $res->id,
                'create_time' => time()
            ]);
            //更改本地车辆状态
            VehicleRent::where('car_id','in',$car_ids)->update(['status'=>1]);
        }
        //如果有租赁车俩和上传自有车辆,但没有购买镇街公司租赁的车辆 则先向镇街公司发起解约合同
        if(!$xzRentCars->isEmpty() && $zjRentCars->isEmpty()){
            //获取镇街公司信息
            $zjCompanyInfo = Company::field('id,company_name,master_name,master_phone,master_email,organization_code')->where('id',$zjCompany['party_a'])->findOrEmpty();
            //生成本地解约合同
            $res = VehicleContract::create([
                'contract_no' => time(),
                'contract_logistic_id' => 0,
                'company_a_id' => $zjCompanyInfo['id'],
                'company_a_name' => $zjCompanyInfo['company_name'],
                'company_a_code' => $zjCompanyInfo['organization_code'],
                'company_a_user' => $zjCompanyInfo['master_name'],
                'company_a_phone' => $zjCompanyInfo['master_phone'],
                'company_a_email' => $zjCompanyInfo['master_email'],
                'company_b_id' => $xzCompany['id'],
                'company_b_name' => $xzCompany['company_name'],
                'company_b_code' => $xzCompany['organization_code'],
                'company_b_user' => $xzCompany['master_name'],
                'company_b_phone' => $xzCompany['master_phone'],
                'company_b_email' => $xzCompany['master_email'],
                'num' =>1,
                'cars_info' => json_encode([['id'=>$xzRentCars['car_id'],'license'=>$xzRentCars['car_license']]]),
                'type' => 2,
                'status' => 0,
                'create_time' => time(),
                'update_time' => time(),
            ]);
            //生成关联记录
	        if($xzRentCars['type'] == 0){
				$status = 2;
	        }else{
		        $status = 1;
	        }
            VehicleBuyRecord::create([
                'company_id' => $xzCompany['id'],
                'company_name' => $xzCompany['company_name'],
                'company_code' => $xzCompany['organization_code'],
                'company_user' => $xzCompany['master_name'],
                'company_phone' => $xzCompany['master_phone'],
                'company_email' => $xzCompany['master_email'],
                'cars_info' => json_encode($cars),
                'num' => count($cars),
                'status' => $status,
                'contract_id' => $res->id,
                'create_time' => time()
            ]);
        }
        //如果有租赁车俩和上传自有车辆,也有购买镇街公司租赁的车辆 则先向镇街公司发起解约合同,再由镇街公司向平台公司发起解约合同
        if(!$xzRentCars->isEmpty() && !$zjRentCars->isEmpty()){
            //获取镇街公司信息
            $zjCompanyInfo = Company::field('id,company_name,master_name,master_phone,master_email,organization_code')->where('id',$zjCompany['party_a'])->findOrEmpty();
            //生成本地解约合同
            $res = VehicleContract::create([
                'contract_no' => time(),
                'contract_logistic_id' => 0,
                'company_a_id' => $zjCompanyInfo['id'],
                'company_a_name' => $zjCompanyInfo['company_name'],
                'company_a_code' => $zjCompanyInfo['organization_code'],
                'company_a_user' => $zjCompanyInfo['master_name'],
                'company_a_phone' => $zjCompanyInfo['master_phone'],
                'company_a_email' => $zjCompanyInfo['master_email'],
                'company_b_id' => $xzCompany['id'],
                'company_b_name' => $xzCompany['company_name'],
                'company_b_code' => $xzCompany['organization_code'],
                'company_b_user' => $xzCompany['master_name'],
                'company_b_phone' => $xzCompany['master_phone'],
                'company_b_email' => $xzCompany['master_email'],
                'num' =>1,
                'cars_info' => json_encode([['id'=>$xzRentCars['car_id'],'license'=>$xzRentCars['car_license']]]),
                'type' => 2,
                'status' => 0,
                'create_time' => time(),
                'update_time' => time(),
            ]);
            //生成关联记录
            VehicleBuyRecord::create([
                'company_id' => $xzCompany['id'],
                'company_name' => $xzCompany['company_name'],
                'company_code' => $xzCompany['organization_code'],
                'company_user' => $xzCompany['master_name'],
                'company_phone' => $xzCompany['master_phone'],
                'company_email' => $xzCompany['master_email'],
                'cars_info' => json_encode($cars),
                'num' => count($cars),
                'status' => 2,
                'contract_id' => $res->id,
                'create_time' => time()
            ]);
        }
        //更新物流系统
        curl_post(env('project.logistic_domain').'/api/Vehicle/updateVehicleStatusToBuy',[],['car_ids'=>implode(',',$car_ids)]);
        return $this->success('合同发起成功,等待审核 from task');
    }
}