<?php
class YpcKczj extends YpcBase
{
	private $KczjBase = null;
	private $YpwBase = null;
	private $YpcBase = null;
	private $YpwVin = null;
	
	//座位排数
	private $numZwps = ['1'=>'单排','2'=>'双排','3'=>'三排','4'=>'四排','5'=>'五排','6'=>'六排','7'=>'七排','8'=>'八排','9'=>'九排','10'=>'十排'];

	public function __construct()
	{
		parent::__construct();
		$this->KczjBase = new BaseDb(mvc::$cfg['DB']['KCZJ']);
		$this->YpwBase = new YpwBase();
		$this->YpcBase = new YpcBase();
		$this->YpwVin = new YpwVin();
	}
	
	/**
	  * @method 格式化车辆类型
	  * @author soul
	  * @copyright 2023/5/20
	  * @return 
	  */
	private function formatVtype($vtypeValArr, $gxb = '')
	{
		$codeArr = ['XXY'=>'厢式','CCY'=>'仓栅','GJB'=>'搅拌车','XLC'=>'冷藏车','ZXX'=>'垃圾车','ZYS'=>'垃圾车','TQZ'=>'清障车','JSQ'=>'随车吊','GSS'=>'洒水车','TJZ'=>'集装箱半挂车','GJY'=>'加油车','ZLJ'=>'自卸','GPS'=>'喷洒车','XJH'=>'救护车','JGK'=>'高空作业车','GYY'=>'运油车','XLJ'=>'旅居车','TDP'=>'半挂车','JQZ'=>'起重机','GXW'=>'吸污车','ZZZ'=>'垃圾车','TDY'=>'抑尘车','GQX'=>'清洗车','XYZ'=>'邮政车','TSL'=>'扫路车','XZH'=>'指挥车','XGC'=>'工程车','GXE'=>'吸粪车','TXS'=>'洗扫车','GXF'=>'消防车','XYK'=>'翼开启厢式车','GQW'=>'吸污车','XJC'=>'检测车','XXH'=>'救险车','TCA'=>'垃圾车','XQC'=>'囚车','THB'=>'土泵车','ZZX'=>'牵引车','TPB'=>'平板车','XDY'=>'电源车'];

		$vtype_short = '';
		if(!empty($gxb) && in_array(LibFc::getGxbCarType($gxb), [5,9]) && preg_match('/^[A-Z]+[0-9]+([A-Z]{3})/', $gxb, $match))
		{//车辆类型5、9半挂车  首数字后的三个字母
			$code = $match[1];
			if(!empty($codeArr[$code])) $vtype_short = $codeArr[$code];
		}
		if(empty($vtype_short))
		{
			$disVtypeArr = [
				"翼开启厢式车"=>["翼展","翼开启"],
				"栏板"=>["栏板"],
				"仓栅"=>["仓栅"],
				"厢式"=>["厢式","厢货"],
				"自卸"=>["自卸","后卸"],
				"畜禽"=>["畜禽"],
				"蓬式"=>["蓬式","篷式"],
				"牵引车"=>["牵引","半挂"],
				"搅拌车"=>["搅拌"],
				"供水车"=>["供水"],
				"洒水车"=>["洒水","喷洒"],
				"垃圾车"=>["垃圾"],
				"冷藏车"=>["冷藏"],
				"清障车"=>["清障"],
				"油罐车"=>["油罐","加油", "运油"],
				"电源车"=>["电源车"],
				"商务车"=>["商务车"],
				"随车吊"=>["随车吊"],
				"皮卡"=>["皮卡"],
				"轻卡"=>["轻卡"],
				"微卡"=>["微卡"],
				"越野"=>["越野"],
				"轻客"=>["轻客", "微面", "面包"],
				"客车"=>["客车"],
				"底盘"=>["底盘"],
				"封闭货车"=>["封闭货车"],
				"清洗车"=>["清洗车"],
				"教练车"=>["教练车"],
			];
			foreach($disVtypeArr as $realname=>$likevals)
			{
				foreach($vtypeValArr as $longval)
				{
					foreach($likevals as $likeval)
					{
						if(stripos($longval, $likeval) !== false){
							$vtype_short = $realname;
							break;
						}
					}
					if(!empty($vtype_short)) break;
				}
				if(!empty($vtype_short)) break;
			}
		}
		if(empty($vtype_short) && !empty($gxb))
		{
			$vtypeArr = [1=>'栏板', 2=>'越野',3=>'自卸',4=>'牵引车'];
			$type = LibFc::getGxbCarType($gxb);
			if(!empty($vtypeArr[$type])) $vtype_short = $vtypeArr[$type];
		}
		return $vtype_short;
	}
		

	/**
	  * @method 初始化卡车之家的参数信息
	  * @author soul
	  * @copyright 2023/3/7
	  * @return 
	  */
	public function initModel2Para($Params)
	{
		//规范数据
		$gxbInfoArr = [];
		$tranInfoArr = [];
		$allReArr = [
			'tran'=>['挡'=>'档','当'=>'档', '五'=>'5'],
			'drive'=>['X'=>'×','*'=>'×'],
		];
	
		//优先匹配前面的
		$plidArr = [
			350=>'mpi_zmod',
			14=>'mpi_engine',//发动机型号
			245=>'mpi_engine',//电机型号
			27=>'mpi_kw',
			23=>'mpi_cc_name',
			8=>'gxb',//公告型号
			123=>'gxb',//整车公告
			158=>'gxb',//型号
			120=>'gxb',//底盘型号
			42=>'mpi_lts',
			9=>'mpi_passenger',
			202=>'mpi_passenger',//座位数
			16=>'tran',
			21=>'hdfs',//换挡方式
			333=>'hdfs',//换档方式
			98=>'hdfs',//换挡形式
			330=>'hdfs',//换档形式

			97=>'dws',//挡位数
			329=>'dws',//档位数

			11=>'qjdws',//前进档位
			332=>'qjdws',//前进档位

			47=>'mpi_drive',
			231=>'mpi_axle',//轴数
			53=>'mpi_zwps',//座位排数
			38=>'mpi_hxxs',//货箱形式
			34=>'mpi_fuel',//燃料种类
			325=>'mpi_fuel',//燃料类别
		];
		$disVals = [
			'mpi_drive'=>['后置后驱','前置后驱','前置前驱','中置后驱','4X4(四驱)','4X2(后驱)','后驱','全驱','前驱','10X6','10X4','8X2R','6X2R','8X6','6X2','4X4','8X8','8X2','6X6','6X4','4X2','8X4'],
			'mpi_zwps'=>['排半','单排','双排']
		];
		$this->KczjBase->BaseDb->Begin();
		$table = 'model2
			join model1 on m2_m1_id = m1_id
			join brand on m1_b_id = b_id 
			join manufacturer on m1_maf_id = maf_id';
		if(preg_match('/\d/', $Params['m2_id'], $match)) 
			$where = sprintf(" and m2_id =%d order by m2_id", $Params['m2_id']);
		else if($Params['type'] == 'all'){
			$where = ' order by m2_id';
			//清空表
			foreach(['mer_model2_gxb', 'mer_model2_para', 'mer_model2_size'] as $deltable)
			{//TRUNCATE 不在事务里
				 $this->KczjBase->del($deltable, ' and 1 ');
			}
		}else{
			exit('?type=xxx&m2_id=xxx');
		}
		//$where = ' and m2_id in (select mpi_m2_id from mer_model2_para where mpi_vtype_short = "") order by m2_id';
		$mres = $this->KczjBase->get($table, ['*'], $where);
		foreach($mres['data'] as $m2)
		{
			//参数表
			$res = $this->KczjBase->get('para_value', ['pv_pl_id, pv_value'], sprintf(" and pv_m2_id=%d and pv_pl_id in (%s)", $m2['m2_id'], implode(',', array_keys($plidArr))));
			$tarr = array_column($res['data'], 'pv_value', 'pv_pl_id');
			foreach($plidArr as $plid=>$pf)
			{
				if(empty($m2[$pf]))
				{
					$m2[$pf] = isset($tarr[$plid])? $tarr[$plid]: '';
				}
			}
			
			//轮胎数必须单数
			if($m2['mpi_lts'] && $m2['mpi_lts']%2 == 1) $m2['mpi_lts'] = 0;

			$m2['mpi_engine'] = LibFc::GetSemiangle($m2['mpi_engine']);
			$m2['mpi_engine'] = trim(preg_replace('/[\x80-\xff]/','', $m2['mpi_engine']));
			$m2['mpi_engine_format'] = LibFc::FormatEng($m2['mpi_engine']);
			if(preg_match('/^(\d+\.?\d*)([LT])/i', $m2['mpi_cc_name'], $match)){
				$m2['mpi_cc'] = $match[1]*1000;
			}
			$m2['mpi_kw'] = (float) $m2['mpi_kw'];
			if(empty($m2['mpi_kw'])) $m2['mpi_kw'] = '';
			
			if(!empty($this->numZwps[$m2['mpi_zwps']])) $m2['mpi_zwps'] = $this->numZwps[$m2['mpi_zwps']];
			
			//金杯 海狮V卡 151马力 汽油 4X2 救护车(SY5032XJHL-G9S1BG)
			if(empty($m2['gxb']) && preg_match('/\(([A-Z]{2,}[^\)]{2,})\)/i', $m2['m2_name'], $match)){
				$m2['gxb'] = $match[1];
			}
			
			//型号
			$m2['gxbs'] = [];
			foreach(explode('/', $m2['gxb']) as $tv)
			{
				$tvf = LibFc::FormatNum($tv);
				if(strlen($tvf) < 4) continue;
				if(!isset($gxbInfoArr[$tvf]))
				{
					$res = $this->YpwBase->get("gxb_base", ['gb_id', 'gb_gxb_code_show', 'gb_vtype'], sprintf(" and gb_type='gxb' and gb_gxb_code='%s'", $tvf), true);
					$gxbInfoArr[$tvf] = $res['data'];
					if(!empty($gxbInfoArr[$tvf]))
					{
						//轴数  轮胎数 载客
						$res = $this->YpwBase->get('gxb_params', ['gp_gl_code','gp_value'], sprintf(" and gp_gb_id=%d and gp_gl_code in ('passenger','lts','axle','qpck')", $gxbInfoArr[$tvf]['gb_id']));
						foreach($res['data'] as $ptv)
						{
							if($ptv['gp_gl_code'] == 'qpck') $ptv['gp_gl_code'] = 'passenger';
							$gxbInfoArr[$tvf][$ptv['gp_gl_code']][] = $ptv['gp_value'];
						}
						$res = $this->YpwBase->get('gxb_engine', ['ge_engine_format','ge_engine', 'ge_kw', 'ge_cc'], sprintf(" and ge_gb_id=%d", $gxbInfoArr[$tvf]['gb_id']));
						$gxbInfoArr[$tvf]['engs'] = array_column($res['data'], null, 'ge_engine_format');
					}
				}
				if(!empty($gxbInfoArr[$tvf])) $m2['gxbs'][$tvf] = $gxbInfoArr[$tvf];
			}

			if(!empty($m2['gxbs']))
			{
				$mgxb = ['gb_vtype'=>[],'passenger'=>[], 'lts'=>[], 'axle'=>[],'engs'=>[],'ge_kw'=>[],'ge_cc'=>[]];
				foreach($m2['gxbs'] as $tvf=>$tvv)
				{
					if(!empty($tvv['gb_vtype'])) $mgxb['gb_vtype'][] = $tvv['gb_vtype'];
					if(!empty($tvv['passenger'])) $mgxb['passenger'] = array_merge($mgxb['passenger'], $tvv['passenger']);
					if(!empty($tvv['lts'])) $mgxb['lts'] = array_merge($mgxb['lts'], $tvv['lts']);
					if(!empty($tvv['axle'])) $mgxb['axle'] = array_merge($mgxb['axle'], $tvv['axle']);
					foreach($tvv['engs'] as $tek=>$tev)
					{
						$mgxb['engs'][$tek] = $tev;
						if(!empty($tev['ge_kw'])) $mgxb['ge_kw'][] = $tev['ge_kw'];
						if(!empty($tev['ge_cc'])) $mgxb['ge_cc'][] = $tev['ge_cc'];
					}
				}
				$mgxb['gb_vtype'] = array_unique($mgxb['gb_vtype']);
				$mgxb['passenger'] = array_unique($mgxb['passenger']);
				$mgxb['lts'] = array_unique($mgxb['lts']);
				$mgxb['axle'] = array_unique($mgxb['axle']);
				$mgxb['ge_cc'] = array_unique($mgxb['ge_cc']);
				$mgxb['ge_kw'] = array_unique($mgxb['ge_kw']);

				if(count($mgxb['passenger']) == 1) $m2['mpi_passenger'] = $mgxb['passenger'][0];
				if(count($mgxb['lts']) == 1) $m2['mpi_lts'] = $mgxb['lts'][0];
				if(count($mgxb['axle']) == 1) $m2['mpi_axle'] = $mgxb['axle'][0];
				if(empty($m2['mpi_vtype']) && !empty($mgxb['gb_vtype'])) $m2['mpi_vtype'] = $mgxb['gb_vtype'][0];
				if(empty($m2['mpi_axle']) && !empty($mgxb['axle'])) $m2['mpi_axle'] = $mgxb['axle'][0];
				
				//补发动机
				if(empty($m2['mpi_engine_format']) && !empty($mgxb['engs']) && count($mgxb['engs']) == 1)
				{
					$teng = array_values($mgxb['engs'])[0];
					$m2['mpi_engine'] = $teng['ge_engine'];
					$m2['mpi_engine_format'] = $teng['ge_engine_format'];
					if(empty($m2['mpi_kw']) && !empty($teng['ge_kw'])) $m2['mpi_kw'] = $teng['ge_kw'];
					if(empty($m2['mpi_cc']) && !empty($teng['ge_cc'])) $m2['mpi_cc'] = $teng['ge_cc'];
				}
				//功率排量
				if(empty($m2['mpi_kw']) && count($mgxb['ge_kw']) == 1) $m2['mpi_kw'] = $mgxb['ge_kw'][0];
				if(empty($m2['mpi_cc']) && count($mgxb['ge_cc']) == 1) $m2['mpi_cc'] = $mgxb['ge_cc'][0];
			}
			else
			{
				$f = LibFc::FormatNum($m2['gxb']);
				if(!empty($f))
				$m2['gxbs'] = [$f=>['gb_gxb_code_show'=>$m2['gxb']]];
			}

			//通过发动机直接补功率排量
			if(empty($m2['mpi_kw']) && !empty($m2['mpi_engine_format']))
			{
				$res = $this->YpwBase->get('gxb_engine', ['distinct ge_kw'], sprintf(" and ge_engine_format='%s' and ge_kw != ''", $m2['mpi_engine_format']));
				if(!empty($res['data']) && count($res['data']) == 1)
					$m2['mpi_kw'] = $res['data'][0]['ge_kw'];
			}
			if(empty($m2['mpi_cc']) && !empty($m2['mpi_engine_format']))
			{
				$res = $this->YpwBase->get('gxb_engine', ['distinct ge_cc'], sprintf(" and ge_engine_format='%s' and ge_cc != ''", $m2['mpi_engine_format']));
				if(!empty($res['data']) && count($res['data']) == 1)
					$m2['mpi_cc'] = $res['data'][0]['ge_cc'];
			}

			if(empty($m2['mpi_cc']) && preg_match('/ (\d+.?\d*?)[TL] /', $m2['m2_name'], $match))
			{
				//$m2['mpi_cc'] = $match[1]*1000;
				$m2['mpi_cc_name'] = trim($match[0]);
			}
			if(!empty($m2['mpi_cc_name']))
			{
				$m2['mpi_cc_short'] = $m2['mpi_cc_name'];
				if(preg_match('/(\d+.?\d*?)([TL])/', $m2['mpi_cc_name'], $match))
				{
					$m2['mpi_cc_short'] = sprintf('%.1f', round($match[1], 1)).$match[2];
				}
			}
			
			$m2['mpi_lts'] = (int) $m2['mpi_lts'];
			$m2['mpi_passenger'] = (int) $m2['mpi_passenger'];
			$m2['mpi_axle'] = (int) $m2['mpi_axle'];
			
			//卡车之家数据错误 BJ5036CCYT6  m2_id=70366
			if($m2['mpi_passenger'] == 5 && $m2['mpi_zwps'] == '单排') $m2['mpi_zwps'] = '双排';

			//子车型
			$pos = stripos($m2['mpi_zmod'], $m2['m1_name']);
			if($pos !== false) $m2['mpi_zmod'] = substr($m2['mpi_zmod'], $pos+strlen($m2['m1_name']));

			//变速箱
			$m2['tran'] = trim(preg_replace('/^[\x80-\xff]+/','', LibFc::GetSemiangle($m2['tran'])));
			if(!isset($tranInfoArr[$m2['tran']]))
			{
				$tranInfoArr[$m2['tran']] = [];
				$twhere = sprintf(" and param_model IN (SELECT param_model FROM enging_transmission WHERE param_product = 'transmission' AND param_label = '变速箱型号' AND param_value = '%s') AND param_label IN ('档位数', '换档方式', '换档形式', '前进档位') GROUP BY param_label", $m2['tran']);
				$res = $this->KczjBase->get('enging_transmission', ['param_label, GROUP_CONCAT(DISTINCT param_value) param_value'], $twhere);
				$tArr = []; $reArr = ['档位数'=>'dws', '换档方式'=>'hdfs', '换档形式'=>'hdfs', '前进档位'=>'qjdws'];
				foreach($res['data'] as $tv)
				{
					if(!empty($tv['param_value']))
						$tranInfoArr[$m2['tran']][$reArr[$tv['param_label']]] = $tv['param_value'];
				}
			}
			
			//档位
			if(empty($m2['dws']) && preg_match('/(\d{1,2})档/', $m2['tran'], $match)) $m2['dws'] = $match[1].'档';
			if(empty($m2['dws']) && !empty($tranInfoArr[$m2['tran']]['dws'])) $m2['dws'] = $tranInfoArr[$m2['tran']]['dws'];
			if(empty($m2['dws']) && !empty($m2['qjdws'])) $m2['dws'] = $m2['qjdws'];
			if(empty($m2['dws']) && !empty($tranInfoArr[$m2['tran']]['qjdws'])) $m2['dws'] = $tranInfoArr[$m2['tran']]['qjdws'];

			if(empty($m2['hdfs']) && !empty($tranInfoArr[$m2['tran']]['hdfs'])) $m2['hdfs'] = $tranInfoArr[$m2['tran']]['hdfs'];
			$m2['dws'] = strtr($m2['dws'], $allReArr['tran']);
			$m2['hdfs'] = strtr($m2['hdfs'], $allReArr['tran']);
			
			$tranfull = $m2['dws'].$m2['hdfs'];
			$res = $this->YpwVin->formatTran($tranfull);
			$tranArr = $res['data'];
			if(!empty($tranArr['dws'])) $m2['dws'] = $tranArr['dws'];
			if(!empty($tranArr['hdfs'])) $m2['hdfs'] = $tranArr['hdfs'];
			if(!empty($tranArr['tran'])) $m2['mpi_tran'] = $tranArr['tran'];
			
			//通过名称补数据
			foreach($disVals as $df=>$dvals)
			{
				if(!empty($m2[$df])) continue;
				foreach($dvals as $dval)
				{
					if(stripos($m2['m2_name'], $dval) !== false){
						$m2[$df] = $dval;
						break;
					}
				}
			}
			//通过正则补
			$matRegArr = [
				'mpi_drive'=>[
					'/ (\dX\d[^ ]*) /i',
					'/ ([^ ]+驱) /i'
				],
				'mpi_zwps'=>[
					'/ ([^ ]+排)/i'
				]
			];
			foreach($matRegArr as $mfn=>$regs)
			{
				if(!empty($m2[$mfn])) continue;
				foreach($regs as $reg)
				{
					if(preg_match($reg, $m2['m2_name'], $match)){
						$m2[$mfn] = $match[1];
						break;
					}
				}
			}
			//驱动
			$m2['mpi_drive'] = strtr($m2['mpi_drive'], $allReArr['drive']);
			
			//4×4(四驱) 6×2R
			if(preg_match('/(\d×\d[^\(]*)\(/', $m2['mpi_drive'], $match))
			{
				$m2['mpi_drive'] = $match[1];
			}else if(stripos($m2['mpi_drive'], '后驱') !== false || stripos($m2['mpi_drive'], '前驱') !== false){
				$m2['mpi_drive'] = '4×2';
			}else if(stripos($m2['mpi_drive'], '四驱') !== false || stripos($m2['mpi_drive'], '全驱') !== false){
				if($m2['mpi_axle'] == 2 || $m2['mpi_lts'] == 4)
					$m2['mpi_drive'] = '4×4';
			}
			//本身错误RLQ5045TQZPJH6
			if(preg_match('/[a-zA-Z]{2}[0-9a-zA-Z]+/', $m2['mpi_drive'])) $m2['mpi_drive'] = '';

			$vtypeValArr = [$m2['mpi_hxxs'], $m2['mpi_vtype'], $m2['mpi_zmod'], $m2['m2_name']];
			$m2['mpi_vtype_short'] = $this->formatVtype($vtypeValArr);

			if(empty($m2['mpi_vtype_short']) && !empty($m2['mpi_hxxs'])) $m2['mpi_vtype_short'] = $m2['mpi_hxxs'];
			if(empty($m2['mpi_vtype_short']) && !empty($m2['mpi_vtype'])) $m2['mpi_vtype_short'] = $m2['mpi_vtype'];

			//尺寸
			$hasSizeArr = []; $newSizeArr = [];
			$res = $this->KczjBase->get('mer_model2_size', ['*'], sprintf(" and ms_m2_id=%d", $m2['m2_id']));
			foreach($res['data'] as $tv)
			{
				$unikey = $tv['ms_length'].'@'.$tv['ms_width'].'@'.$tv['ms_height'].'@'.$tv['ms_wheel'];
				$hasSizeArr[$unikey] = $tv['ms_id'];
			}
			foreach(explode('/', $m2['m2_length']) as $lv)
			{
				$lv = (float) $lv;
				foreach(explode('/', $m2['m2_width']) as $wv)
				{
					$wv = (float) $wv;
					foreach(explode('/', $m2['m2_height']) as $hv)
					{
						$hv = (float) $hv;
						foreach(explode('/', $m2['m2_wheelbase']) as $whv)
						{
							if(preg_match('/[a-z]/', $whv, $match)){
								$whv = '';
							}else{
								$whv = preg_replace('/[^\d\+\.]/', '', $whv);
							}
							if($lv > 0 && $wv > 0 && $hv > 0 && !empty($whv))
							{
								$unikey = $lv.'@'.$wv.'@'.$hv.'@'.$whv;
								$newSizeArr[$unikey] = [
									'ms_m2_id'=>$m2['m2_id'],
									'ms_length'=>$lv,
									'ms_width'=>$wv,
									'ms_height'=>$hv,
									'ms_wheel'=>$whv,
								];
							}
						}
					}
				}
			}
			
			$addArr = []; $delIds = [];
			foreach($newSizeArr as $unikey=>$ta)
			{
				if(empty($hasSizeArr[$unikey])) $addArr[] = $ta;
			}
			if(!empty($addArr)) $this->KczjBase->addAny('mer_model2_size', array_keys($addArr[0]), $addArr);
			foreach($hasSizeArr as $unikey=>$ta)
			{
				if(empty($newSizeArr[$unikey])) $delIds[] = $ta;
			}
			if(!empty($delIds)) $this->KczjBase->del('mer_model2_size', sprintf(" and ms_id in (%s)", implode(',', $delIds)));

			$res = $this->KczjBase->get('mer_model2_gxb', ['mg_gxb_code'], sprintf(" and mg_m2_id=%d", $m2['m2_id']));
			$hasGxbArr = array_column($res['data'], 'mg_gxb_code');
			$addArr = [];
			foreach($m2['gxbs'] as $tvf=>$tvv)
			{
				if(!in_array($tvf, $hasGxbArr))
					$addArr[] = ['mg_m2_id'=>$m2['m2_id'], 'mg_gxb_code'=>$tvf, 'mg_gxb_show'=>$tvv['gb_gxb_code_show']];
			}
			if(!empty($addArr)) $this->KczjBase->addAny('mer_model2_gxb', array_keys($addArr[0]), $addArr);
			
			$delwhere = sprintf(" and mg_m2_id=%d", $m2['m2_id']);
			if(!empty($m2['gxbs'])) $delwhere .= sprintf(" and mg_gxb_code not in ('%s')", implode("','", array_keys($m2['gxbs'])));
			$this->KczjBase->del('mer_model2_gxb', $delwhere);

			$setArr = ['mpi_m2_id'=>$m2['m2_id'], 'mpi_etime'=>time()];
			foreach($m2 as $mk=>$mv)
			{
				if(stripos($mk, 'mpi_') === 0)
				{
					if($mk == 'mpi_cc') $mv = (int) $mv;
					$setArr[$mk] = $mv;
				}
			}
			$this->KczjBase->replace('mer_model2_para', $setArr);
		}
		$this->KczjBase->BaseDb->End();
		return LibFc::ReturnData(true);
	}

	/**
	  * @method 品牌+生产商的wmi 型号数字前一段
	  * @author soul
	  * @copyright 2023/3/7
	  * @return 
		SELECT b_name '品牌', maf_name '生产商',mw_wmis 'wmi',mw_gxb_types '型号前缀' FROM `mer_wmi` 
		JOIN `brand` ON mw_b_id = b_id
		JOIN `manufacturer` ON mw_m_id = maf_id
		ORDER BY b_name, maf_name
	  */
	public function initWmi()
	{
		$this->KczjBase->BaseDb->Begin();
		$mres = $this->KczjBase->get('mer_model2_gxb join model2 on m2_id=mg_m2_id', ['m2_b_id,m2_maf_id,mg_gxb_code'], ' and mg_gxb_code != "" group by m2_b_id,m2_maf_id,mg_gxb_code');
		$addArr = [];
		foreach($mres['data'] as $v)
		{
			$unikey = $v['m2_b_id'].'@'.$v['m2_maf_id'];
			if(empty($addArr[$unikey])) $addArr[$unikey] = ['mw_b_id'=>$v['m2_b_id'],'mw_m_id'=>$v['m2_maf_id'], 'mw_wmis'=>[], 'mw_gxb_types'=>[]];
			if(preg_match('/^[A-Z]+\d/', $v['mg_gxb_code'], $match)) $addArr[$unikey]['mw_gxb_types'][] = $match[0];

			$res = $this->YpwBase->get('gxb_base left join gxb_params on gp_gb_id = gb_id and gb_type="gxb"', ['gp_value'], sprintf(" and gp_gl_code='vin18' and gb_gxb_code='%s' group by gp_value", $v['mg_gxb_code']));
			foreach($res['data'] as $gv)
			{
				$addArr[$unikey]['mw_wmis'][] = substr($gv['gp_value'], 0, 3);
			}
		}

		$this->KczjBase->del('mer_wmi', sprintf(" and concat(mw_b_id, '@', mw_m_id) not in ('%s')", implode("','", array_keys($addArr))));
		foreach($addArr as $add)
		{
			$add['mw_wmis'] = implode(',', array_unique($add['mw_wmis']));
			$add['mw_gxb_types'] = implode(',', array_unique($add['mw_gxb_types']));
			$this->KczjBase->replace('mer_wmi', $add);
		}
		$this->KczjBase->BaseDb->End();
		return LibFc::ReturnData(true);
	}

	
	/**
	  * @method 尺寸统计报表（600万表和卡车之家共有）    注意2020年开始的尺寸
	  * @param  $gxbs  array [选填] 空为所有
	  * @author soul
	  * @copyright 2023/3/7
	  * @return 
	  */
	public function initSizeTj($gxbs = [])
	{
		$gxbArr = [];
		//卡车之家的型号集合
	
		if(empty($gxbs))
		{
			//$bid = 55;
			//$where = sprintf(" and mg_m2_id IN (SELECT DISTINCT m2_id FROM model2 WHERE m2_b_id=%d) GROUP BY mg_m2_id, mg_gxb_code", $bid);
			$where = "";
			$res = $this->KczjBase->get('mer_model2_gxb', ['DISTINCT mg_gxb_code gxb_code'], $where);
			$gxbArr['kczj'] = array_column($res['data'], 'gxb_code');
			
			//这些型号在宜配库所属车系 宜配库的型号
			$table = 'yp_model3_gxb_num
			JOIN yp_model3 ON m3_id = mg_m3_id
			JOIN yp_model2 ON m2_id = m3_m2_id';
			$res = $this->YpcBase->get($table, ['distinct mg_code gxb_code'], sprintf(" and m2_m1_id in (SELECT DISTINCT m2_m1_id FROM yp_model3_gxb_num JOIN yp_model3 ON m3_id = mg_m3_id JOIN yp_model2 ON m2_id = m3_m2_id WHERE mg_code IN ('%s'))", implode("','", $gxbArr['kczj'])));
			$gxbArr['ypc'] = array_column($res['data'], 'gxb_code');

			//卡车之家没有的
			$gxbArr['kczj_no'] = array_diff($gxbArr['ypc'], $gxbArr['kczj']);
			$gxbArr['ypc_no'] = array_diff($gxbArr['kczj'], $gxbArr['ypc']);
			$gxbArr['all'] = array_merge($gxbArr['kczj'], $gxbArr['ypc']);
		}
		else
		{
			foreach($gxbs as $gxb)
			{
				$format = LibFc::FormatNum($gxb);
				if(!empty($format))
				{
					$gxbArr['all'][] = $format;
				}
			}
			$gxbArr['all'] = array_unique($gxbArr['all']);
		}
		if(empty($gxbArr['all'])) return LibFc::ReturnData(true);
		
		$gxbTypeArr = [];
		$res = $this->KczjBase->get('mer_wmi join manufacturer on maf_id = mw_m_id join brand on b_id = mw_b_id', ['mw_wmis,mw_gxb_types,maf_id,maf_name,b_id,b_name']);
		foreach($res['data'] as $v)
		{
			$v['wmi'] = explode(',', $v['mw_wmis']);
			foreach(explode(',', $v['mw_gxb_types']) as $gt)
			{
				if(empty($gxbTypeArr[$gt])) $gxbTypeArr[$gt] = ['wmi'=>[], 'brand'=>[], 'make'=>[]];
				$gxbTypeArr[$gt]['wmi'] = array_unique(array_merge($gxbTypeArr[$gt]['wmi'], $v['wmi']));
				$gxbTypeArr[$gt]['brand'][$v['b_id']] = $v['b_name'];
				$gxbTypeArr[$gt]['make'][$v['maf_id']] = $v['maf_name'];
			}
		}

		//sma有的型号
		$res = $this->YpwBase->get('stand_model_any', ['distinct sma_gxb_code gxb_code'], sprintf(" and sma_gxb_code in ('%s')", implode("','", $gxbArr['all'])));
		$gxbArr['sma'] = array_column($res['data'], 'gxb_code');
		$gxbArr['sma_no'] = array_diff($gxbArr['all'], $gxbArr['sma']);

		$this->KczjBase->BaseDb->Begin();
		foreach($gxbArr['sma'] as $gxb)
		{
			//基本表
			$tgxbArr = [];
			$axle = 0;
			$res = $this->YpwBase->get("gxb_base", ['group_concat(gb_id) gb_ids', 'gb_gxb_code_show', 'max(gb_vtype) gb_vtype', 'max(gb_fuel) gb_fuel'], sprintf(" and gb_type='gxb' and gb_gxb_code='%s' group by gb_gxb_code", $gxb), true);
			$tgxbArr = $res['data'];
			if(!empty($tgxbArr))
			{
				//轴数  轮胎数 载客
				$res = $this->YpwBase->get('gxb_params', ['gp_gl_code','gp_value'], sprintf(" and gp_gb_id in (%s) and gp_gl_code in ('qpck','passenger','lts','axle','wheel','axle','vin18') GROUP BY gp_gl_code,gp_value", $tgxbArr['gb_ids']));
				foreach($res['data'] as $ptv)
				{
					$tgxbArr[$ptv['gp_gl_code']][] = $ptv['gp_value'];
				}
				if(empty($tgxbArr['passenger']) && !empty($tgxbArr['qpck'])) $tgxbArr['passenger'] = $tgxbArr['qpck'];
				if(!empty($tgxbArr['axle'])) $axle = (int) $tgxbArr['axle'][0];
				$res = $this->YpwBase->get('gxb_engine', ['ge_engine_format','ge_engine', 'ge_kw', 'ge_cc'], sprintf(" and ge_gb_id in (%s)", $tgxbArr['gb_ids']));
				$tgxbArr['engs'] = array_column($res['data'], null, 'ge_engine_format');
			}
			
			//型号数字前一段
			$tgxbArr['gtcode'] = '';
			$tgxbArr['gxb_type'] = [];
			if(preg_match('/^[A-Z]+\d/', $gxb, $match))
			{
				$tgxbArr['gtcode'] = $match[0];
				if($gxbTypeArr[$match[0]]) $tgxbArr['gxb_type'] = $gxbTypeArr[$match[0]];
			}

			$maxYear = 0;
			//型号600万表有的
			$smaFiledVals = ['engine'=>[], 'wheel'=>[]];
			$res = $this->YpwBase->get('stand_model_any', ['sma_gxb_code,sma_gxb_code_show,sma_engine, sma_kw, sma_cc,sma_length,sma_width,sma_height,sma_wheel, count(*) vin_count, group_concat(distinct sma_vin10) sma_vin10s, max(sma_vyear) sma_vyear'], sprintf(" and sma_gxb_code='%s' GROUP BY sma_gxb_code,sma_engine,sma_length,sma_width,sma_height,sma_wheel", $gxb));
			$smaArr = [];
			foreach($res['data'] as $rv)
			{
				if($rv['sma_vyear'] > $maxYear) $maxYear = $rv['sma_vyear'];
				$rv['sma_engine_format'] = LibFc::FormatEng($rv['sma_engine']);
				if(!in_array($rv['sma_engine_format'], $smaFiledVals['engine'])) $smaFiledVals['engine'][] = $rv['sma_engine_format'];
				if(empty($rv['sma_wheel'])) $rv['sma_wheel'] = '';
				if($axle == 2){
					$rv['group_wheel'] = $rv['sma_wheel'];
					if(!in_array($rv['sma_wheel'], $smaFiledVals['wheel'])) $smaFiledVals['wheel'][] = $rv['sma_wheel'];
				}else{
					$rv['group_wheel'] = '';
				}
				$unikey = $rv['sma_gxb_code'].'@'.$rv['sma_length'].'@'.$rv['sma_width'].'@'.$rv['sma_height'].'@'.$rv['group_wheel'].'@'.$rv['sma_engine_format'];
				if(empty($smaArr[$unikey])){
					$smaArr[$unikey] = $rv;
				}else{
					$smaArr[$unikey]['vin_count'] += $rv['vin_count'];
					$vin10s = array_merge(explode(',', $smaArr[$unikey]['sma_vin10s']), explode(',', $rv['sma_vin10s']));
					sort($vin10s);
					$smaArr[$unikey]['sma_vin10s'] = implode(',', $vin10s);
				}
			}
			$newArr = [];
			foreach($smaArr as $unikey=>$rv)
			{
				if(!empty($newArr[$unikey])) continue;
				$newArr[$unikey] = [
					'skt_gxb_code'=>$rv['sma_gxb_code'],	
					'skt_gxb_code_show'=>$rv['sma_gxb_code_show'],	
					'skt_length'=>$rv['sma_length'],	
					'skt_width'=>$rv['sma_width'],	
					'skt_height'=>$rv['sma_height'],	
					'skt_wheel'=>$rv['sma_wheel'],	
					'skt_wheel_group'=>$rv['group_wheel'],	
					'skt_axle'=>$axle,	
					'skt_engine_show'=>$rv['sma_engine'],	
					'skt_engine'=>$rv['sma_engine_format'],	
					'skt_kw'=>$rv['sma_kw'],	
					'skt_cc'=>$rv['sma_cc'],	
					'skt_vin_count'=>$rv['vin_count'],	
					'skt_vin10s'=>$rv['sma_vin10s'],
					'skt_etime'=>time()
				];
			}

			/*
			//拆分的车型过多，取消
			if($maxYear >= 2022)
			{//2022年前 泽达有完整数据，新数据计算所有可能性
				//型号的所有可能性
				$table = "gxb_base 
				LEFT JOIN gxb_engine ON ge_gb_id = gb_id
				LEFT JOIN gxb_size gs ON gs_gb_id = gb_id
				LEFT JOIN gxb_params wh ON wh.gp_gb_id = gb_id AND wh.gp_gl_code = 'wheel'";
				$fileds = ["gb_gxb_code,gb_gxb_code_show,ge_engine, ge_engine_format,0 gs_length,0 gs_width,0 gs_height,GROUP_CONCAT(DISTINCT wh.gp_value) AS all_wheel, wh.gp_value group_wheel, ge_kw, ge_cc"];
				$res = $this->YpwBase->get($table, $fileds, sprintf(" and gb_type='gxb' and gb_gxb_code='%s' GROUP BY gb_gxb_code, ge_engine_format,group_wheel", $gxb));
				$ggArr = [];
				foreach($res['data'] as $rv)
				{
					$rv['group_wheel'] = $axle == 2? $rv['group_wheel']: '';
					$unikey = $rv['gb_gxb_code'].'@'.$rv['gs_length'].'@'.$rv['gs_width'].'@'.$rv['gs_height'].'@'.$rv['group_wheel'].'@'.$rv['ge_engine_format'];
					$ggArr[$unikey] = $rv;
				}

				foreach($ggArr as $unikey=>$rv)
				{
					if(!empty($newArr[$unikey])) continue;
					//样本中发动机或者轴距为空
					if(
						(in_array("", $smaFiledVals['engine']) || in_array($rv['ge_engine_format'], $smaFiledVals['engine'])) &&
						(in_array("0", $smaFiledVals['wheel']) || $axle == 2 && in_array($rv['group_wheel'], $smaFiledVals['wheel']))
					){
						$newArr[$unikey] = [
							'skt_gxb_code'=>$rv['gb_gxb_code'],	
							'skt_gxb_code_show'=>$rv['gb_gxb_code_show'],	
							'skt_length'=>$rv['gs_length'],	
							'skt_width'=>$rv['gs_width'],	
							'skt_height'=>$rv['gs_height'],	
							'skt_wheel'=>$rv['all_wheel'],	
							'skt_wheel_group'=>$rv['group_wheel'],	
							'skt_axle'=>$axle,	
							'skt_engine_show'=>$rv['ge_engine'],	
							'skt_engine'=>$rv['ge_engine_format'],	
							'skt_kw'=>$rv['ge_kw'],	
							'skt_cc'=>$rv['ge_cc'],
							'skt_vin_count'=>!empty($smaArr[$unikey]['vin_count'])? $smaArr[$unikey]['vin_count']: 0,	
							'skt_vin10s'=>!empty($smaArr[$unikey]['sma_vin10s'])? $smaArr[$unikey]['sma_vin10s']: '',
							'skt_etime'=>time()
						];
					}
				}
			}*/

			//变速箱 ypc sma base
			$tgxbArr['tran'] = '';
			$res = $this->YpwBase->get('stand_model_any', ['sma_tran tran', 'count(*) count'], sprintf(" and sma_gxb_code='%s' and sma_tran != '' group by sma_tran order by count(*) desc", $gxb));
			if(count($res['data']) == 1)
			{
				$tgxbArr['tran'] = $res['data'][0]['tran'];
			}
			else if(empty($res['data']))
			{//多个直接忽略
				$res = $this->YpcBase->get('yp_model3_gxb_num JOIN yp_model3 ON m3_id = mg_m3_id', ['m3_transmission tran', 'count(*) count'], sprintf(" and m3_transmission != '' and mg_code = '%s' GROUP BY m3_transmission ORDER BY COUNT(*) DESC", $gxb));
				if(count($res['data']) == 1)
				{
					$tgxbArr['tran'] = $res['data'][0]['tran'];
				}
				else if(empty($res['data']))
				{
					$res = $this->YpwBase->get('stand_gxb_base', ['sgb_rtran tran'], sprintf(" and sgb_gxb_code='%s' and sgb_rtran != ''", $gxb), true);
					if(!empty($res['data']))
					{
						$trans = explode(',', $res['data']['tran']);
						if(count($trans) == 1) $tgxbArr['tran'] = $trans[0];
					}
				}
			}
			
			$tgxbArr['drive'] = '';
			$res = $this->YpcBase->get('yp_model3_gxb_num JOIN yp_model3 ON m3_id = mg_m3_id', ['m3_drive drive', 'count(*) count'], sprintf(" and m3_drive !='' and mg_code = '%s' GROUP BY m3_drive ORDER BY COUNT(*) DESC", $gxb));
			if(count($res['data']) == 1)
			{
				$tgxbArr['drive'] = $res['data'][0]['drive'];
			}
			else if(empty($res['data']))
			{
				$res = $this->YpwBase->get('stand_gxb_base', ['sgb_rdrive drive'], sprintf(" and sgb_gxb_code='%s' and sgb_rdrive != ''", $gxb), true);
				if(!empty($res['data']))
				{
					$drives = explode(',', $res['data']['drive']);
					if(count($drives) == 1) $tgxbArr['drive'] = $drives[0];
				}
			}
			
			//确认车系、变速箱、驱动、车辆类型等
			foreach($newArr as $unikey=>$stv)
			{
				$stv['skt_drive'] = $tgxbArr['drive'];
				$stv['skt_tran'] = $tgxbArr['tran'];
				$stv['skt_vtype'] = $tgxbArr['gb_vtype'];
				$stv['skt_fuel'] = $tgxbArr['gb_fuel'];
				$stv['skt_lts'] = !empty($tgxbArr['lts'])? implode(',', $tgxbArr['lts']): '';
				//10,11,12,13,14,15,16,17,18,19,20,21,22
				$stv['passenger'] = !empty($tgxbArr['passenger']) && count($tgxbArr['passenger']) == 1? implode(',', $tgxbArr['passenger']): '';
				if(empty($stv['skt_cc']) && !empty($tgxbArr['engs'][$stv['skt_engine']]['ge_cc'])) $stv['skt_cc'] = $tgxbArr['engs'][$stv['skt_engine']]['ge_cc'];
				if(empty($stv['skt_kw']) && !empty($tgxbArr['engs'][$stv['skt_engine']]['ge_kw'])) $stv['skt_kw'] = $tgxbArr['engs'][$stv['skt_engine']]['ge_kw'];
				
				$stv['skt_cc_name'] = '';
				$stv['skt_cc'] = (float) $stv['skt_cc'];
				if(!empty($stv['skt_cc']))
				{
					$res = $this->KczjBase->get('mer_model2_para', ['right(mpi_cc_short, 1) cc_unit'], sprintf(" and mpi_engine_format='%s' and right(mpi_cc_short, 1) in ('L', 'T') group by cc_unit", $stv['engine_format']));
					if(!empty($res['data']) && count($res['data']) == 1){
						$stv['skt_cc_name'] = sprintf('%.1f', $stv['skt_cc']/1000).$res['data'][0]['cc_unit'];
					}else{
						$stv['skt_cc_name'] = sprintf('%.1fL', $stv['skt_cc']/1000);
					}
				}else if($stv['skt_fuel'] == '纯电动'){
					$stv['skt_cc_name'] = '纯电动';
				}
				if(empty($stv['skt_cc'])) $stv['skt_cc'] = '';

				if(stripos($stv['skt_drive'], '后驱') !== false || stripos($stv['skt_drive'], '前驱') !== false){
					$stv['skt_drive'] = '4×2';
				}else if(stripos($stv['skt_drive'], '四驱') !== false || stripos($stv['skt_drive'], '全驱') !== false){
					if($stv['skt_axle'] == 2 || $stv['lts'] == 4)
						$stv['skt_drive'] = '4×4';
				}
				
				//尺寸 或 型号 反查卡车之家?
				$vtype_short = $this->formatVtype([$stv['skt_vtype']], $gxb);
			
				if(!empty($vtype_short)) $stv['skt_vtype'] = $vtype_short;
				$stv['skt_zwps'] = '';
				//2人有可能是排半
				if($stv['passenger'] == 5){
					$stv['skt_zwps'] = '双排';
				}else if($stv['passenger']){
					$stv['skt_zwps'] = $stv['passenger'].'座';
				}
				
				//利用唯一值确认  品牌 生产商 车系 驱动 变速器  
				//2023/7/4取消车辆类型'mpi_vtype_short'=>'skt_vtype' 使用型号本身类型
				$unifileds = ['b_name'=>'skt_b_name', 'maf_name'=>'skt_m_name', 'm1_name'=>'skt_m1_name','mpi_tran'=>'skt_tran','mpi_drive'=>'skt_drive','mpi_zwps'=>'skt_zwps'];
				
				foreach($unifileds as $fromf=>$tof)
				{//避免原来有值，但是当前无值情况下出现数据错乱
					$stv[$tof] = '';
				}
				
				$table = 'model2 
				JOIN mer_model2_para ON mpi_m2_id = m2_id
				JOIN model1 ON m2_m1_id = m1_id
				JOIN brand ON m1_b_id = b_id 
				JOIN manufacturer ON m1_maf_id = maf_id 
				JOIN mer_model2_gxb ON mg_m2_id = m2_id
				LEFT JOIN mer_model2_size ON ms_m2_id = m2_id';
				$whereArr = [];
				$twhere = '';
				$ctfileds = ['mg_gxb_code'=>'skt_gxb_code', 'mpi_engine_format'=>'skt_engine', 'ms_length'=>'skt_length', 'ms_width'=>'skt_width', 'ms_height'=>'skt_height', 'ms_wheel'=>'skt_wheel_group'];
				foreach($ctfileds as $stf=>$stt)
				{
					if(empty($stv[$stt])) continue;
					if($stf == 'ms_wheel' && $stv['skt_axle'] != 2) continue;
					$twhere .= sprintf(" and %s='%s'", $stf, $stv[$stt]);
					$res = $this->KczjBase->get($table, array_keys($unifileds), $twhere);
					$rows = $res['data'];
					if(empty($rows)) break;
					//var_dump($twhere, $rows);
					//echo $twhere, '<br>';
					foreach($unifileds as $fromf=>$tof)
					{
						$vals = [];
						foreach($rows as $row)
						{
							if(!empty($row[$fromf]) && !in_array($row[$fromf], $vals)) $vals[] = $row[$fromf];
						}
						if(count($vals) == 1)
						{
							//echo $fromf, '=>', implode(',', $vals), '<br>';
							$stv[$tof] = $vals[0];
							unset($unifileds[$fromf]);
						}
					}
					if(empty($unifileds)) break;
				}

				//$tgxbArr['gtcode'] 一样 长宽高轴距一样只在一个车系中，补空车系 
				if(!empty($tgxbArr['gtcode']) && empty($stv['skt_m1_name']) && !empty($stv['skt_length']) && !empty($stv['skt_width']) && !empty($stv['skt_height']) && (!empty($v['skt_wheel_group']) || $v['skt_axle'] != 2))
				{
					$chkwhere = sprintf(" and mg_gxb_code like '%s%%' and ms_length='%s' and ms_width='%s' and ms_height='%s'", $tgxbArr['gtcode'], $stv['skt_length'], $stv['skt_width'], $stv['skt_height']);
					if($v['skt_axle'] == 2) $chkwhere .= sprintf(" and ms_wheel='%s'", $stv['skt_wheel_group']);
					$table = 'model2 
					JOIN mer_model2_gxb ON mg_m2_id = m2_id
					JOIN model1 ON m2_m1_id = m1_id
					JOIN brand ON m1_b_id = b_id 
					JOIN manufacturer ON m1_maf_id = maf_id 
					JOIN mer_model2_size ON ms_m2_id = m2_id';
					$res = $this->KczjBase->get($table, ['b_name skt_b_name', 'maf_name skt_m_name', 'm1_name skt_m1_name'], $chkwhere.' group by m1_id');
					if(!empty($res['data']) && count($res['data']) == 1)
					{
						$row = $res['data'][0];
						if(!empty($stv['skt_b_name'])) $stv['skt_b_name'] = $row['skt_b_name'];
						if(!empty($stv['skt_m_name'])) $stv['skt_m_name'] = $row['skt_m_name'];
						if(!empty($stv['skt_m1_name'])) $stv['skt_m1_name'] = $row['skt_m1_name'];
					}
				}
				//去掉括号内容
				if(!empty($stv['skt_b_name']) && preg_match('/^(.*?)\(/', $stv['skt_b_name'], $match)) $stv['skt_b_name'] = $match[1];
				if(!empty($stv['skt_m_name']) && preg_match('/^(.*?)\(/', $stv['skt_m_name'], $match)) $stv['skt_m_name'] = $match[1];
				$newArr[$unikey] = $stv;
			}
			
			$res = $this->YpwBase->get('stand_kczj_tj', ['*'], sprintf(" and skt_gxb_code='%s'", $gxb));
			$hasArr = [];
			foreach($res['data'] as $v)
			{
				$unikey = $v['skt_gxb_code'].'@'.$v['skt_length'].'@'.$v['skt_width'].'@'.$v['skt_height'].'@'.$v['skt_wheel_group'].'@'.$v['skt_engine'];
				$hasArr[$unikey] = $v;
			}
			//是否有人工编辑导致忽略更新的，需要重新更新样本数
			$hasIgnore = false;
			foreach($newArr as $unikey=>$stv)
			{
				$addArr = [];
				foreach($stv as $filed=>$val)
				{
					if(stripos($filed, 'skt_') === 0) $addArr[$filed] = $val;
				}
			
				if(!empty($hasArr[$unikey]))
				{
					if($hasArr[$unikey]['skt_uid']== 8){
						$this->YpwBase->set('stand_kczj_tj', $addArr, sprintf(" and skt_id=%d and skt_uid =8", $hasArr[$unikey]['skt_id']));
					}else{
						$hasIgnore = true;
					}
				}
				else
				{
					$addArr['skt_uid'] = 8;
					$this->YpwBase->add('stand_kczj_tj', $addArr);
				}
			}
			
			foreach($hasArr as $unikey=>$hasv)
			{
				if(empty($newArr[$unikey]))
				{
					if($hasv['skt_uid'] == 8){
						$this->YpwBase->del('stand_kczj_tj', sprintf(" and skt_id=%d and skt_uid =8", $hasv['skt_id']));
					}else{
						$hasIgnore = true;
					}
				}
			}

			if($hasIgnore) $this->updateKczjSizeTj([$gxb]);
		}
		$this->KczjBase->BaseDb->End();
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 建立车型  1栏板 5仓栅式...  6
	  * @author soul
	  * @copyright 2023/3/7
	  * @return 
	  */
	public function buildCar($brandname = '')
	{
		$allReArr = [
			'unikey'=>['-'=>'', ' '=>'', '.'=>'', '('=>'', ')'=>'', ' '=>'']
		];

		$this->KczjBase->BaseDb->Begin();
		
		if(empty($brandname)){
			$this->KczjBase->del('mer_model3', ' and 1 ');
			$this->KczjBase->del('mer_model3_gxb', ' and 1 ');
			$this->KczjBase->del('mer_model3_size', ' and 1 ');
		}else{//按品牌
			$this->KczjBase->del('mer_model3_gxb', sprintf(" and mmg_m3_code in (select m3_code from mer_model3 where m3_b_name='%s')", $brandname));
			$this->KczjBase->del('mer_model3_size', sprintf(" and mms_m3_code in (select m3_code from mer_model3 where m3_b_name='%s')", $brandname));
			$this->KczjBase->del('mer_model3', sprintf(" and m3_b_name='%s'", $brandname));
		}
	
		$localBaseDb67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$table = 'yp_model2_kczj
		LEFT JOIN yp_model2 ON m2k_m2_id = m2_id
		LEFT JOIN yp_make ON m2k_m_id = m_id
		LEFT JOIN yp_brand ON m2k_b_id = b_id';
		$res = $localBaseDb67->get($table, ['*'], "");
		$m2Link = [];
		foreach($res['data'] as $v)
		{
			$tkey = $v['m2k_b_name'].'@'.$v['m2k_m_name'].'@'.$v['m2k_m1_name'];
			$v['b_name'] = !empty($v['b_name'])? $v['b_name']: $v['m2k_b_tname'];
			$v['m_name'] = !empty($v['m_name'])? $v['m_name']: $v['m2k_m_tname'];
			$v['m2_name'] = !empty($v['m2_name'])? $v['m2_name']: $v['m2k_m2_tname'];
			$m2Link[$tkey] = $v;
		}
		
		$bcomwhere = "  and skt_statue=1 and skt_m_name != '' and skt_m1_name != ''";
		$bcomwhere .= empty($brandname)? " and skt_b_name != ''": sprintf(" and skt_b_name='%s'", $brandname);
		$bres = $this->YpwBase->get('stand_kczj_tj', ['skt_b_name'], $bcomwhere." GROUP BY skt_b_name");
		foreach($bres['data'] as $bv)
		{
			$newMod3Arr = [];
			$noWheelArr = [];
			$noWheelTjArr = [];
			//ZB1030DDE1L 有车系无品牌
			$tjres = $this->YpwBase->get('stand_kczj_tj', ['*'], $bcomwhere.sprintf(" and skt_engine!='' and skt_b_name ='%s'", $bv['skt_b_name']));
			foreach($tjres['data'] as $tjv)
			{
				$maxYear = 0;
				foreach(explode(',', $tjv['skt_vin10s']) as $v10)
				{
					$year = LibFc::VinYear($v10);
					if($year > $maxYear) $maxYear = $year;
				}
				//泽达有完整数据，轴距不能为空
				if($maxYear < 2022 && $tjv['skt_axle'] == 2 && empty($tjv['skt_wheel_group'])) continue;

				$tkey = $tjv['skt_b_name'].'@'.$tjv['skt_m_name'].'@'.$tjv['skt_m1_name'];
				if(!empty($m2Link[$tkey]['b_name'])) $tjv['skt_b_name'] = $m2Link[$tkey]['b_name'];
				if(!empty($m2Link[$tkey]['m_name'])) $tjv['skt_m_name'] = $m2Link[$tkey]['m_name'];
				if(!empty($m2Link[$tkey]['m2_name'])) $tjv['skt_m1_name'] = $m2Link[$tkey]['m2_name'];
				
				$tjv['size'] = $tjv['skt_length'].'×'.$tjv['skt_width'].'×'.$tjv['skt_height'];
				$mod3 = [
					'm3_b_name'=>$tjv['skt_b_name'],
					'm3_m_name'=>$tjv['skt_m_name'],
					'm3_m1_name'=>$tjv['skt_m1_name'],
					'm3_engine'=>$tjv['skt_engine_show'],
					'm3_engine_format'=>$tjv['skt_engine'],
					'm3_kw'=>$tjv['skt_kw'],
					'm3_cc'=>$tjv['skt_cc'],
					'm3_cc_name'=>$tjv['skt_cc_name'],
					'm3_fuel'=>$tjv['skt_fuel'],
					'm3_tran'=>$tjv['skt_tran'],
					'm3_vtype'=>$tjv['skt_vtype'],
					'm3_wheel'=>$tjv['skt_wheel_group'],
					'm3_drive'=>$tjv['skt_drive'],
					'm3_zwps'=>$tjv['skt_zwps'],
					'm3_axle'=>$tjv['skt_axle'],
					'm3_lts'=>$tjv['skt_lts']
				];
				$unikey = $mod3['m3_b_name'].'@'.$mod3['m3_m_name'].'@'.$mod3['m3_m1_name'].'@'.$mod3['m3_cc_name'].'@'.$mod3['m3_engine_format'].'@'.$mod3['m3_tran'].'@'.$mod3['m3_drive'].'@'.$mod3['m3_vtype'].'@'.$mod3['m3_lts'].'@'.$mod3['m3_zwps'].'@'.$mod3['m3_wheel'].'@'.$mod3['m3_fuel'];
				$unikey = strtoupper(strtr(LibFc::GetSemiangle($unikey), $allReArr['unikey']));
				$mod3['m3_unikey'] = $unikey;
				$mod3['m3_code'] = md5($unikey);
				
				//除了轴距以外的统计
				$isNullWheel = $mod3['m3_axle'] == 2 && empty($mod3['m3_wheel'])? 1: 0;
				if($mod3['m3_axle'] == 2)
				{
					$noWheelKey = $mod3['m3_b_name'].'@'.$mod3['m3_m_name'].'@'.$mod3['m3_m1_name'].'@'.$mod3['m3_cc_name'].'@'.$mod3['m3_engine_format'].'@'.$mod3['m3_tran'].'@'.$mod3['m3_drive'].'@'.$mod3['m3_vtype'].'@'.$mod3['m3_lts'].'@'.$mod3['m3_zwps'].'@@'.$mod3['m3_fuel'];
					if($isNullWheel){
						$noWheelArr[$noWheelKey][] = [
							'mod3'=>$mod3,
							'tjv'=>$tjv
						];
					}else{
						$noWheelTjArr[$noWheelKey][$mod3['m3_wheel']][] = $unikey;
					}
				}

				if(!$isNullWheel)
				{//轴距为空的不纳入
					if(empty($newMod3Arr[$unikey]))
					{
						$mod3['gxb'] = []; 
						$mod3['size'] = []; 
						$newMod3Arr[$unikey] = $mod3;
					}
					$newMod3Arr[$unikey]['gxb'][$tjv['skt_gxb_code']] = $tjv['skt_gxb_code_show'];
					$newMod3Arr[$unikey]['size'][$tjv['size']] = $tjv['size'];
				}
			}
			
			//型号 尺寸合并到已有轴距的车型
			foreach($noWheelArr as $noWheelKey=>$trows)
			{
				$noWheelTj = $noWheelTjArr[$noWheelKey];
				foreach($trows as $trk=>$trv)
				{
					$tjv = $trv['tjv'];
					//型号包含的轴距
					$res = $this->YpwBase->get('gxb_params JOIN gxb_base ON gb_id = gp_gb_id and gb_type="gxb"', ['distinct gp_value'], sprintf(" and gb_gxb_code ='%s' and gp_gl_code='wheel'", $tjv['skt_gxb_code']));
					$hasall = true;
					foreach($res['data'] as $tvv)
					{
						if(empty($noWheelTj[$tvv['gp_value']]))
						{
							$hasall = false;
							break;
						}
					}
					if($hasall)
					{//全部轴距已在统计里
						foreach($noWheelTj as $wheel=>$unikeys)
						{
							foreach($unikeys as $unikey)
							{//将型号尺寸追加到对应的车型里
								$newMod3Arr[$unikey]['gxb'][$tjv['skt_gxb_code']] = $tjv['skt_gxb_code_show'];
								$newMod3Arr[$unikey]['size'][$tjv['size']] = $tjv['size'];
							}
						}
						unset($trows[$trk]);
					}
				}
				$noWheelArr[$noWheelKey] = $trows;
			}
			
			//尚未合并的无轴距统计
			foreach($noWheelArr as $noWheelKey=>$trows)
			{
				foreach($trows as $trk=>$trv)
				{
					$mod3 = $trv['mod3'];
					$unikey = $mod3['m3_unikey'];
					$tjv = $trv['tjv'];
					if(empty($newMod3Arr[$unikey]))
					{
						$mod3['gxb'] = []; 
						$mod3['size'] = []; 
						$newMod3Arr[$unikey] = $mod3;
					}
					$newMod3Arr[$unikey]['gxb'][$tjv['skt_gxb_code']] = $tjv['skt_gxb_code_show'];
					$newMod3Arr[$unikey]['size'][$tjv['size']] = $tjv['size'];
				}
			}
			
			//过滤出不同的字段用作命名
			$diffArr = [];
			foreach($newMod3Arr as $unikey=>$mod3)
			{
				$difkey = $mod3['m3_b_name'].'@'.$mod3['m3_m_name'].'@'.$mod3['m3_m1_name'];
				$mod3['difkey'] = $difkey;
				$comfileds = ['m3_drive', 'm3_zwps','m3_vtype', 'm3_engine', 'm3_tran', 'm3_lts', 'm3_wheel'];
				foreach($comfileds as $cf)
				{
					if(!isset($diffArr[$difkey][$cf])) $diffArr[$difkey][$cf] = [];
					if(!empty($mod3[$cf]) && !in_array($mod3[$cf], $diffArr[$difkey][$cf]))
						$diffArr[$difkey][$cf][] = $mod3[$cf];
				}
				$newMod3Arr[$unikey] = $mod3;
			}

			$this->KczjBase->del('mer_model3_gxb', " and mmg_m3_code IN (SELECT m3_code FROM mer_model3 WHERE m3_b_name='{$bv['skt_b_name']}')");
			$this->KczjBase->del('mer_model3_size', " and mms_m3_code IN (SELECT m3_code FROM mer_model3 WHERE m3_b_name='{$bv['skt_b_name']}')");
			$this->KczjBase->del('mer_model3', " and m3_b_name='{$bv['skt_b_name']}'");
			foreach($newMod3Arr as $unikey=>$mod3)
			{
				//组装名称
				$difkey = $mod3['difkey'];
				$mod3['m3_name'] = $mod3['m3_cc_name'];
				foreach($diffArr[$difkey] as $cf=>$cvals)
				{
					if(count($cvals) > 1 && !empty($mod3[$cf]))
					{
						$val = $mod3[$cf];
						if($cf == 'm3_wheel') $val = $val.'轴距';
						if($cf == 'm3_lts'){
							if($val == 4)
								$val = '后单轮';
							else if($val == 6) 
								$val = '后双轮';
							else 
								$val = $val.'轮';
						}
						$mod3['m3_name'] .= ' '.$val;
					}
				}

				$addArr = [];
				foreach($mod3 as $mk=>$mv)
				{
					if(stripos($mk, 'm3_') === 0) $addArr[$mk] = $mv;
				}
				$this->KczjBase->replace('mer_model3', $addArr);

				$addArr = [];
				foreach($mod3['gxb'] as $gxb=>$show)
				{
					$addArr[] = [
						'mmg_m3_code'=>$mod3['m3_code'],
						'mmg_gxb_code'=>$gxb,
						'mmg_gxb_show'=>$show
					];
				}
				if(!empty($addArr)) $this->KczjBase->addAny('mer_model3_gxb', array_keys($addArr[0]), $addArr);

				$addArr = [];
				$mod3['size'] = array_unique($mod3['size']);
				foreach($mod3['size'] as $size)
				{
					if(preg_match('/(\d+)×(\d+)×(\d+)/', $size, $match))
					{
						if($match[1] > 0 && $match[2] > 0 && $match[3] > 0)
						$addArr[] = [
							'mms_m3_code'=>$mod3['m3_code'],
							'mms_length'=>$match[1],
							'mms_width'=>$match[2],
							'mms_height'=>$match[3],
						];
					}
				}
				if(!empty($addArr)) $this->KczjBase->addAny('mer_model3_size', array_keys($addArr[0]), $addArr);
			}
		}
		$this->KczjBase->BaseDb->End();
		return LibFc::ReturnData(true);
	}

	
	
	/**
	  * @method 通过型号更新卡车尺寸统计报表的VIN数和年份统计字段
	  * @param  $gxbArr 默认所有
	  * @author soul
	  * @copyright 2023/3/7
	  * @return 
	  */
	public function updateKczjSizeTj($gxbArr = [])
	{
		if(count($gxbArr) > 0)
		{
			$tarr = [];
			foreach($gxbArr as $tv)
			{
				$tvf = LibFc::FormatNum($tv);
				if(!empty($tvf)) $tarr[] = $tvf;
			}
			$gxbArr = array_unique($gxbArr);
		}
		else
		{
			$res = $this->YpwBase->get('stand_kczj_tj', ['DISTINCT skt_gxb_code']);
			$gxbArr = array_column($res['data'], 'skt_gxb_code');
		}
		$this->YpwBase->YpwDb->Begin();
		foreach($gxbArr as $gxb)
		{
			$res = $this->YpwBase->get('stand_model_any', ['sma_gxb_code,sma_engine,sma_length,sma_width,sma_height,sma_wheel, max(sma_axle) sma_axle, count(*) vin_count, group_concat(distinct sma_vin10) sma_vin10s'], sprintf(" and sma_gxb_code='%s' GROUP BY sma_gxb_code,sma_engine,sma_length,sma_width,sma_height,sma_wheel", $gxb));
			$smaArr = [];
			foreach($res['data'] as $rv)
			{
				$rv['sma_engine_format'] = LibFc::FormatEng($rv['sma_engine']);
				if(empty($rv['sma_wheel'])) $rv['sma_wheel'] = '';
				if($rv['sma_axle'] == 2){
					$rv['group_wheel'] = $rv['sma_wheel'];
				}else{
					$rv['group_wheel'] = '';
				}
				$unikey = $rv['sma_gxb_code'].'@'.$rv['sma_length'].'@'.$rv['sma_width'].'@'.$rv['sma_height'].'@'.$rv['group_wheel'].'@'.$rv['sma_engine_format'];
				if(empty($smaArr[$unikey])){
					$smaArr[$unikey] = $rv;
				}else{
					$smaArr[$unikey]['vin_count'] += $rv['vin_count'];
					$vin10s = array_merge(explode(',', $smaArr[$unikey]['sma_vin10s']), explode(',', $rv['sma_vin10s']));
					sort($vin10s);
					$smaArr[$unikey]['sma_vin10s'] = implode(',', $vin10s);
				}
			}

			$tjres = $this->YpwBase->get('stand_kczj_tj', ['*'], sprintf(" and skt_gxb_code='%s'", $gxb));
			foreach($tjres['data'] as $rv)
			{
				$unikey = $rv['skt_gxb_code'].'@'.$rv['skt_length'].'@'.$rv['skt_width'].'@'.$rv['skt_height'].'@'.$rv['skt_wheel_group'].'@'.$rv['skt_engine'];
				if(!empty($smaArr[$unikey])){
					$setArr = [
						'skt_vin_count'=>$smaArr[$unikey]['vin_count'],	
						'skt_vin10s'=>$smaArr[$unikey]['sma_vin10s'],	
					];
				}else{
					$setArr = [
						'skt_vin_count'=>0,	
						'skt_vin10s'=>'',	
					];
				}
				$this->YpwBase->set('stand_kczj_tj', $setArr, sprintf(" and skt_id='%d'", $rv['skt_id']));
			}
		}
		$this->YpwBase->YpwDb->End();
		return LibFc::ReturnData(true);
	}
}