<?php
/**
  * @method  zp
  * @author soul
  * @copyright 2022/1/8
  */
class YpcZp extends YpcBase
{
	public $cationCount = 0;


	/**
	  * @method 采集车架号
	  * @method $vin 车架号
	  * @method $account 指定账户 默认系统第一个
	  * @author soul
	  * @copyright 2022/1/8
	  * @return 
	  */
	public function catchVin($vin, $account = '')
	{
		$vin = LibFc::FormatVin($vin);
		if(strlen($vin) != 17) return LibFc::ReturnData(false, 'VIN长度不符');
		if(!empty($account) && empty(mvc::$cfg['ZHIPEI'][$account])) 
			return LibFc::ReturnData(false, $account.'账号不存在');
		if(empty($account)) $account = array_keys(mvc::$cfg['ZHIPEI'])[0];

		$accountCfg = mvc::$cfg['ZHIPEI'][$account];

		$YPCAR67Db = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$LibHttp = new LibHttp();
		$LibHttp->timeout = 20;
		$getFiles = ['zvm_id, zvm_vin, zvm_status, zvm_catch_status, zvm_model, zvm_drive, zvm_catch_etime, zvm_catch_count'];
		$res = $YPCAR67Db->get('zp_vin_model', $getFiles, sprintf(" and zvm_vin = '%s'", $vin), true);
		$catchCount = 0;
		if(!empty($res['data']))
		{
			$arr = $res['data'];
			$catchCount = $arr['zvm_catch_count'];
			
			//已经采集
			if($arr['zvm_catch_status'] == 2 && (time() - $arr['zvm_catch_etime']) < 24*3600*2)
			{
				//格式化
				if($arr['zvm_status'] == -2)
				{
					$this->formatInfo($vin);
				}
				return LibFc::ReturnData(true, $arr);
			}
		}
		else
		{
			//新任务
			$YPCAR67Db->add('zp_vin_model', ['zvm_vin'=>$vin]);
		}
		
		$YpwBase = new YpwBase();
		$res = $YpwBase->getKeyVal('zhipei_userticket');
		if(empty($res['data'])) return LibFc::ReturnData(false, 'UserTicket不存在');
		$ukey = json_decode($res['data'], true);
		if(!empty($ukey['Header']['UserTicket'])){
			$UserTicket = $ukey['Header']['UserTicket'];
			$SignCode = $ukey['Header']['SignCode'];
		}
		if(empty($UserTicket)) return LibFc::ReturnData(false, 'UserTicket不存在');
		$Domain = 'zhibao.51cjml.com';
		$headstr = ['data'=>'{"Header":{"SourceType":1,"UserPermit":"","UserTicket":"'.$UserTicket.'","ClientSignCheckStr":"[pi=1&ps=50&qt=3&v='.$vin.'&ver=v2][1][]['.$UserTicket.']","SignCode":"'.$SignCode.'","AllowOriginUrl":"https://'.$Domain.'","ExpandInfo":"","AutoInfo":""},"Body":"{\"qt\":3,\"pc\":0,\"v\":\"'.$vin.'\",\"c\":0,\"sts\":0,\"flag\":\"\",\"cs\":\"\",\"pi\":1,\"ps\":50,\"ver\":\"v2\",\"resetAutoParam\":false,\"mom\":\"\"}"}'];
		$zpurl = 'https://cjmlvin.51cjml.com/h5Search/ApiResult?CJML_H5_TargetDomain='.$Domain; 
		$LibHttp = new LibHttp();
		$html = $LibHttp->fetch($zpurl, $headstr);
		/*
		$zpurl = 'https://vvip.zhipeicloud.com/api/SearchAuto/SearchAutoV2';
		$headstr = '{"Header":{"AgentTicket":"","SourceType":1,"UserTicket":"'.$accountCfg['UserTicket'].'","SignCode":"'.$accountCfg['SignCode'].'","machineKey":"","timeStamp":"'.time().'","version":6},"Body":{"vinCode":"'.$vin.'"}}';
		$LibHttp->httpheader = [
			'Content-Type:application/json',
			'Content-Length:'.strlen($headstr)
		];
		$html = $LibHttp->fetch($zpurl, $headstr);*/
		//var_dump($html);exit;
		if(stripos($html, '流量限制') !== false) return LibFc::ReturnData(false, '出错了=>'.$html);
		if(stripos($html, $vin) === false) return LibFc::ReturnData(false, '返回数据无车架号，检查是否登陆失效'.$html);
		$resArr = json_decode($html, true);
		$catchCount++;
		$setArr = [];
		
		if(!is_array($resArr) || empty($resArr['Body']) || !empty($resArr['Header']['ErrorCode']))
		{
			if(!empty($resArr['Header']['ErrorCode']) && stripos($resArr['Header']['Message'], '解析失败'))
			{
				$setArr = [
					'zvm_catch_status'=>-1,
					'zvm_catch_etime'=>time(),
					'zvm_catch_count'=>$catchCount,
					'zvm_catch_account'=>$account
				];
			}
			else
			{
				//{"Alert":null,"Header":{"ErrorCode":999,"Message":"本次登录已过期，请至\"我的\"-\"设置\"-\"退出登录\"后，重新登录。"}
				return LibFc::ReturnData(false, '出错了=>'.$html);
			}
		}
		else if(!empty($resArr['Body']['message']) && stripos($resArr['Body']['message'], '验证码'))
		{
			//{"Alert":null,"Header":{"ErrorCode":0,"Message":"执行成功"},"Body":{"autoInfo":null,"auto_text":null,"jYAutoByVin":null,"autoParamGroups":[],"validBrands":null,"validCategorys":null,"vinCode":null,"isNeedNext":false,"isShowSliderVerification":true,"message":"请验证滑块验证码,证明您不是机器人"}}
			if($this->cationCount <= 2)
			{
				$vheadstr = '{"Header":{"AgentTicket":"","SourceType":1,"UserTicket":"'.$accountCfg['UserTicket'].'","SignCode":"'.$accountCfg['SignCode'].'","machineKey":"","timeStamp":"'.time().'","version":6},"Body":{"id":1480,"x":142}}';
				$LibHttp->httpheader = [
					'Content-Type:application/json',
					'Content-Length:'.strlen($vheadstr)
				];
				$vhtml = $LibHttp->fetch('https://vvip.zhipeicloud.com/api/SliderVerification/ValidationSliderVerificationCode', $vheadstr);
				$this->cationCount++;
				$tresArr = json_decode($html, true);
				if(is_array($tresArr) && $tresArr['Body'])
				{
					return $this->catchVin($vin, $account);
				}
			}
			return LibFc::ReturnData(false, '出现验证码'.$html);
		}
		else
		{
			$this->cationCount = 0;
			//{"Alert":null,"Header":{"ErrorCode":0,"Message":"执行成功"},"Body":{"autoInfo":null,"auto_text":null,"jYAutoByVin":null,"autoParamGroups":[],"validBrands":null,"validCategorys":null,"vinCode":null,"isNeedNext":false,"isShowSliderVerification":false,"message":"非乘用车！参考车型：长安 长安微卡 长安SC1034  SD4AE454U;4A1-62C43 手动档"}}
			$setArr = [
				'zvm_catch_status'=>empty($resArr['Body']['expandInfo']['autoName'])? -1: 2,	
				'zvm_catch_etime'=>time(),
				'zvm_catch_count'=>$catchCount,
				'zvm_catch_account'=>$account
			];
		}
		$YPCAR67Db->BaseDb->Begin();
		if(!empty($setArr))
		{
			$cArr = [
				'zc_vin'=>$vin,	
				'zc_html'=>$html,	
				'zc_atime'=>time(),
				'zc_account'=>$account
			];
			$res = $YPCAR67Db->add('zp_catch', $cArr);
			$setArr['zvm_zc_id'] = $res['data'];
			$YPCAR67Db->set('zp_vin_model', $setArr, sprintf(" and zvm_vin='%s'", $vin));
		}
		$this->formatInfo($vin);
		$YPCAR67Db->BaseDb->End();
		return $YPCAR67Db->get('zp_vin_model', $getFiles, sprintf(" and zvm_vin = '%s'", $vin), true);
	}

	/**
	  * @method 格式zp VIN车型数据
	  * @author soul
	  * @copyright 2022/1/8
	  * @return 
	  */
	public function formatInfo($vin = '')
	{
		$YPCAR67Db = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$where = !empty($vin)? sprintf(" and zvm_vin='%s'", $vin): '';
		$vmres = $YPCAR67Db->get('zp_vin_model join zp_catch on zc_vin=zvm_vin and zc_id=zvm_zc_id', ['*'], $where." and zvm_catch_status in (-1, 2)");
		$labelArr = [];
		$filedArr = [
			'autoName'=>'zvm_model',
			'autoBrandId'=>'zvm_brand_id',
			'autoBrandName'=>'zvm_brand_name',
			'autoModelAreaId'=>'zvm_make_id',
			'autoModelAreaName'=>'zvm_make_name',
			'车系'=>'zvm_mod1_name',
			'车系名称'=>'zvm_mod1_name',
			'autoModelId'=>'zvm_mod2_id',
			'autoModelName'=>'zvm_mod2_name',
			'autoModelSubId'=>'zvm_mod3_id',
			'autoModelSubName'=>'zvm_mod3_name',
			'StartYearMonth'=>'zvm_start_year',
			'EndYearMonth'=>'zvm_end_year',
			'发动机型号'=>'zvm_engine',
			'功率'=>'zvm_kw',
			'排量'=>'zvm_cc',
			'发动机描述'=>'zvm_cc_name',
			'驱动形式'=>'zvm_drive',
			'驱动方式'=>'zvm_drive',
			//'发动机启停技术'=>'zvm_qt',
			'座位数'=>'zvm_passenger',
			'车门数'=>'zvm_doors',
			'车身形式'=>'zvm_body',
			'年款'=>'zvm_nk',
			'配置级别'=>'zvm_pzjb',
			'排放标准'=>'zvm_pfbz',
			'变速箱类型'=>'zvm_tran',
			'变速箱型号'=>'zvm_tran',
			'变速箱档数'=>'zvm_tran_dw',
			'轴距'=>'zvm_wheel',
			//'供油方式'=>'zvm_fuel_gy',
			//'进气形式'=>'zvm_fuel_jq',
			//'发动机气门数'=>'zvm_engine_qm',
			//'空调类型'=>'zvm_ktlx',
			'能源类型'=>'zvm_bylx',
			'动力类型'=>'zvm_fuel',
			'燃油类型'=>'zvm_fuel',
			//'前轮胎规格'=>'zvm_qltgg',
			//'后轮胎规格'=>'zvm_hltgg',
			'images'=>'zvm_imgs',
		];
		$reArr = ['，'=>',','：'=>':','；'=>',', ';'=>','];
		foreach($vmres['data'] as $mv)
		{
			$mv['zc_html'] = strtr($mv['zc_html'], $reArr); 
			$info = json_decode($mv['zc_html'], true);
			
			$addArr = [];
			if($mv['zvm_catch_status'] == 2)
			{
				$info = $info['Body'];
				$baseArr = $info['expandInfo'];
				if(!empty($info['VinAutoInfo']))
				{
					foreach($info['VinAutoInfo'] as $pk=>$pv){
						if(isset($filedArr[$pk]) && !isset($baseArr[$pk])){
							$baseArr[$pk] = $pv;
						}
					}
					if($info['VinAutoInfo']['AutoParamList']){
						foreach($info['VinAutoInfo']['AutoParamList'] as $pvv){
							$baseArr[$pvv['paramTypeName']] = $pvv['paramValue'];
							$labelArr[$pvv['paramTypeName']] = $pvv['paramValue'];
						}
					}
				}
				
				$sameArr = ['zvm_vin'=>$info['FeedbackUserEntity']['SearchKey']];
				foreach($filedArr as $fk=>$fv)
				{
					if(!empty($baseArr[$fk]))
						$sameArr[$fv] = $baseArr[$fk];
				}
				
				$addAnyArr = [];
				/*if(!empty($info['jYAutoByVin']['vinAutos']))
				{
					foreach($info['jYAutoByVin']['vinAutos'] as $vm)
					{
						$addArr = $sameArr;
						foreach($vm['vinAutoBase'] as $lk=>$lv)
						{
							if(!empty($filedArr[$lk]))
								$addArr[$filedArr[$lk]] = $lv;
						}
						if(is_array($vm['autoParamList']))
						{
							foreach($vm['autoParamList'] as $lk=>$lv)
							{
								if(!empty($filedArr[$lv['paramName']]))
									$addArr[$filedArr[$lv['paramName']]] = $lv['paramValue'];
							}
						}
						$addAnyArr[] = $addArr;
					}
				}
				else
				{
					$addAnyArr[] = $sameArr;
				}*/
				
				$addAnyArr[] = $sameArr;
				
				//只入库第一条记录，用车型数
				$addArr = $addAnyArr[0];
				$addArr['zvm_model_count'] = count($addAnyArr);
				
				//原来是待格式化的
				if($mv['zvm_status'] == -2) $addArr['zvm_status'] = 0;

				if(!empty($addArr['zvm_imgs']))
				{
					$imgs = [];
					foreach($addArr['zvm_imgs'] as $iv)
					{
						$imgs[] = $iv;
						if(count($imgs) === 3) break;
					}
					$addArr['zvm_imgs'] = implode(',', $imgs);
				}
				if(!empty($addArr['zvm_engine']))
					$addArr['zvm_engine_format'] = LibFc::FormatNum($addArr['zvm_engine']);
				if(!empty($addArr['zvm_start_year']))
				{
					$addArr['zvm_start_month'] = substr($addArr['zvm_start_year'], -2);
					$addArr['zvm_start_year'] = substr($addArr['zvm_start_year'], 0, 4);
				}

				if(!empty($addArr['zvm_end_year']) && $addArr['zvm_end_year'] > date('Ym', strtotime('+1year')))
					unset($addArr['zvm_end_year']);

				if(!empty($addArr['zvm_end_year']))
				{
					$addArr['zvm_end_month'] = substr($addArr['zvm_end_year'], -2);
					$addArr['zvm_end_year'] = substr($addArr['zvm_end_year'], 0, 4);
				}

				$tfiled = ['zvm_kw', 'zvm_cc'];
				foreach($tfiled as $tf)
				{
					if(!empty($addArr[$tf]))
					{
						$newVal = [];
						foreach(explode(',', $addArr[$tf]) as $tfv)
						{
							if(preg_match('/^(\d+(.\d*))?/', $tfv, $tm))
							{
								$tfv = $tm[1];
								if($tf == 'zvm_cc' && $tfv < 100) $tfv *= 1000;
								$newVal[] = floatval($tfv);
							}
						}
						$addArr[$tf] = implode(',', array_unique($newVal));
					}
				}
				
				//变速箱转换
				if(!empty($addArr['zvm_tran']))
				{
					$dwArr = !empty($addArr['zvm_tran_dw'])? explode(',', $addArr['zvm_tran_dw']): [];
					$newVal = [];
					foreach(explode(',', $addArr['zvm_tran']) as $tfv)
					{
						$tval = $tfv;
						$dw = '';
						//档位 LFV3B28R9A3000688  手自一体变速器(AT) 8,双离合变速器(DCT) 7  7,8
						if(preg_match('/(\d{1,2}) *速/', $tfv, $match))
						{
							$dw = $match[1];
						}
						if(preg_match('/^(\d{1,2})/', $tfv, $match))
						{
							$dw = $match[1];
						}
						else if(count($dwArr) == 1 && !empty($dwArr[0]))
						{
							$dw = $dwArr[0];
						}
						$cArr = [
							'手自一体'=>'A/MT',
							'双离合'=>'DCT',
							'手动'=>'MT',
							'自动'=>'AT',
							'E-CVT'=>'E-CVT',
							'A/MT'=>'A/MT',
							'AMT'=>'AMT',
							'MT'=>'MT',
							'AT'=>'AT',
							'CVT'=>'CVT',
							'固定齿比'=>'固定齿比'
						];
						foreach($cArr as $ck=>$cv)
						{
							if(stripos($tfv, $ck) !== false)
							{
								if(!empty($dw)) $cv = $dw.$cv;
								$tval = $cv;
								break;
							}
						}
						$newVal[] = $tval;
					}
					$addArr['zvm_tran'] = implode(',', array_unique($newVal));
				}
			}
			else
			{
				$addArr = [];
				foreach($filedArr as $fk=>$fv)
				{
					$addArr[$fv] = in_array($fv, ['zvm_brand_id', 'zvm_make_id', 'zvm_mod2_id', 'zvm_mod3_id', 'zvm_start_year', 'zvm_end_year'])? 0: '';
				}
				if(!empty($info['Body']['VinOriginalValue']['carModelName'])){
					$addArr['zvm_model'] = $info['Body']['VinOriginalValue']['carModelName'];
				}else if(!empty($info['Body']['noDataMessage'])){
					$addArr['zvm_model'] = $info['Body']['noDataMessage'];
				}else{
					$addArr['zvm_model'] = '采集失败，无相关信息';
				}
			}

			if(!empty($addArr['zvm_mod3_id']))
			{
				$addArr['zvm_model'] = $addArr['zvm_make_name'].' '.$addArr['zvm_mod2_name'].' '.$addArr['zvm_mod3_name'];
				if(!empty($addArr['zvm_nk'])) $addArr['zvm_model'] .= ' '.$addArr['zvm_nk'].'款';
				if(!empty($addArr['zvm_tran'])) $addArr['zvm_model'] .= ' '.$addArr['zvm_tran'];
				if(!empty($addArr['zvm_engine'])) $addArr['zvm_model'] .= ' '.$addArr['zvm_engine'];
			}

			$allSetFields = ['zvm_model_count','zvm_model','zvm_brand_id','zvm_brand_name','zvm_make_id','zvm_make_name','zvm_mod1_name','zvm_mod2_id','zvm_mod2_name','zvm_mod3_id','zvm_mod3_name','zvm_nk','zvm_pzjb','zvm_start_year','zvm_start_month','zvm_end_year','zvm_end_month','zvm_kw','zvm_engine','zvm_engine_format','zvm_cc','zvm_cc_name','zvm_drive','zvm_passenger','zvm_doors','zvm_body','zvm_bylx','zvm_pfbz','zvm_tran','zvm_tran_dw','zvm_wheel','zvm_fuel','zvm_imgs'];
			foreach($allSetFields as $sfield){
				if(!isset($addArr[$sfield])){
					$addArr[$sfield] = in_array($sfield, ['zvm_model_count', 'zvm_brand_id', 'zvm_make_id', 'zvm_mod1_name', 'zvm_mod2_id', 'zvm_mod3_id', 'zvm_start_year', 'zvm_end_year'])? 0: '';
				}
			}
			
			//解码信息是否发生变化
			$changeArr = [];
			//品牌	车代	车型	车型年	发动机	功率 排量 变速箱	驱动方式	配置
			$comFileds = ['zvm_make_name','zvm_mod2_name','zvm_mod3_name','zvm_engine','zvm_kw','zvm_cc','zvm_nk', 'zvm_tran','zvm_drive', 'zvm_pzjb'];
			$treArr = $reArr;
			$treArr[' '] = '';
			foreach($comFileds as $fv)
			{
				$old = empty($mv[$fv])? '': strtr($mv[$fv], $treArr);
				$new = empty($addArr[$fv])? '': strtr($addArr[$fv], $treArr);
				if($old != $new) $changeArr[$fv] = ['old'=>$old, 'new'=>$new];
			}
			if(!empty($changeArr))
			{
				//解析到车型，重新审核
				if(!empty($addArr['zvm_mod3_id']) && in_array($mv['zvm_status'], [-3]))
				{
					$addArr['zvm_status'] = 0;
					$changeArr['zvm_status'] = ['old'=>$mv['zvm_status'], 'new'=>$addArr['zvm_status']];
				}
				$addArr['zvm_last_change'] = json_encode($changeArr, JSON_UNESCAPED_UNICODE);
				$addArr['zvm_same_count'] = 0;
			}
			else if($mv['zvm_catch_etime'] != $mv['zvm_last_fromat'])
			{
				if(!empty($addArr['zvm_mod3_id']) && !empty($mv['zvm_last_fromat'])) $addArr['zvm_same_count'] = '#@zvm_same_count+1';
				$addArr['zvm_last_fromat'] = $mv['zvm_catch_etime'];
			}
			$YPCAR67Db->set('zp_vin_model', $addArr, sprintf(" and zvm_vin='%s'", $mv['zvm_vin']));
		}
		return LibFc::ReturnData(true);
	}
}