<?php
/**
  * @method 宜配车型库管理
  * @author soul
  * @copyright 2016/3/31
  */
class ComModel extends ComBase
{
	/**
	  * @method 获取所有车型品牌
	  * @param  $cache  true|false   false:将重置缓存
	  * @author soul
	  * @copyright 2017/6/5
	  * @return ["status"=> bool(true), "data"=> [1=>['brand_id'=>1, 'brand_name'=>''], ....]]
	  */
	public function getAllBrand($cache = true)
	{
		$file = mvc::$cfg['AUTOLOAD']['Com']['path'].'cache/allBrand.php';
		$resArr = [];
		if(!file_exists($file) || !$cache)
		{
			$Res = $this->get('bc_brand', ['brand_id', 'brand_name', 'brand_initial', 'brand_keyword', 'brand_code'], ' order by brand_seq,brand_initial');
			foreach($Res['data'] as $V)
			{
				$resArr[$V['brand_id']] = $V;
			}
			LibFc::ArraySave($resArr, $file);
		}
		else
		{//括起来为了防止读取文件失败
			$resArr = include($file);
		}
		return LibFc::ReturnData(true, $resArr);
	}

	/**
	  * @method 获取车型
	  * @param  $level 1|2|3
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2017/6/5
	  * @return 
			成功 ["status"=>true, "data"=> $OneRow=false 二维数组 ; $OneRow=true 一维数组] 
			失败 ["status"=>false, "data"=> 错误信息] 
	  */
	public function getModel($Level, $FieldArr, $Where = '', $OneRow = false)
	{
		$Level = (int) $Level;
		switch($Level)
		{
			case 1: 
				$table = 'bc_model1
				join bc_make on mod1_make_id = make_id
				join bc_brand on mod1_brand_id = brand_id';
			break;
			case 2: 
				$table = 'bc_model2
				join bc_model1 on mod2_mod1_id = mod1_id
				join bc_make on mod1_make_id = make_id
				join bc_brand on mod1_brand_id = brand_id';
			break;
			case 3: 
				$table = 'bc_model3
				join bc_model2 on mod3_mod2_id = mod2_id
				join bc_model1 on mod2_mod1_id = mod1_id
				join bc_make on mod1_make_id = make_id
				join bc_brand on mod1_brand_id = brand_id';
			break;
		}
		return $this->get($table, $FieldArr, $Where, $OneRow);
	}


	/**
	  * @method 获取底盘件模式车型
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2017/6/5
	  * @return 
			成功 ["status"=>true, "data"=> $OneRow=false 二维数组 ; $OneRow=true 一维数组] 
			失败 ["status"=>false, "data"=> 错误信息] 
	  */
	public function getChassisModel($FieldArr, $Where = '', $OneRow = false)
	{
		$table = 'bc_modchassis
		join bc_model2 on mch_mod2_id = mod2_id
		join bc_model1 on mod2_mod1_id = mod1_id
		join bc_make on mod1_make_id = make_id
		join bc_brand on mod1_brand_id = brand_id';
		return $this->get($table, $FieldArr, $Where, $OneRow);
	}


	/**
	  * @method 获取发动机件模式车型
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2017/6/5
	  * @return 
			成功 ["status"=>true, "data"=> $OneRow=false 二维数组 ; $OneRow=true 一维数组] 
			失败 ["status"=>false, "data"=> 错误信息] 
	  */
	public function getEngineModel($FieldArr, $Where = '', $OneRow = false)
	{
		$table = 'bc_modengine
		join bc_model2 on men_mod2_id = mod2_id
		join bc_model1 on mod2_mod1_id = mod1_id
		join bc_make on mod1_make_id = make_id
		join bc_brand on mod1_brand_id = brand_id';
		return $this->get($table, $FieldArr, $Where, $OneRow);
	}


	/**
	  * @method 根据mod3Ids获取车的详细数据
	  * @param  $mod3Ids array('mod3Id1','mod3Id2','mod3Id3')
	  * @author xu
	  * @copyright 2017/12/22
	  * @return 
			成功 ["status"=>true, "data"=> 二维数组 ;] 
			失败 ["status"=>false, "data"=> 错误信息] 
	  */
	public function getModelBymodThreeIds($mod3Ids)
	{
		// 过滤掉数组之中非整形的数据
		$newMod3Ids = array_filter($mod3Ids,"LibFc::Int");

		$table = " bc_model3 left join bc_brand on mod3_brand_id=brand_id left join bc_make on make_id=mod3_make_id left join bc_model2 on mod3_mod2_id=mod2_id ";
		// 拼接搜索条件,并且按照指定ID排序
		$where = sprintf(" and mod3_id in (%s) ",implode(',', $newMod3Ids));
		// print_r($where);die;
		// 拼接需要的数据
		$fileArr = array('brand_code','brand_name','make_name','mod3_name','mod2_name','mod3_start_year','mod3_end_year','mod3_id');

		$res = $this->get($table,$fileArr,$where);
		$res = $res['data'];
		return LibFc::ReturnData(true, $res);
	}

	/**
	  * @method 通过底盘件模式选择车型
	  * @param  $Params [
			'brand_id'=>'品牌',
			'engines'=>'精准匹配,多个逗号分隔',
			'engine'=>'模糊匹配',
		]
	  * @author soul
	  * @copyright 2021/7/7
	  * @return 
	  */
	public function getAllModByAny($Params)
	{
		$arr = [];
		$comWhere = '';
		$flag = false;
		foreach($Params as $filed=>$val)
		{
			if(!is_array($val))
			{
				$val = trim($val);
				if($val == '') continue;
			}
			switch($filed)
			{
				case 'mod3_id':
					$tArr = [];
					foreach(explode(',', $val) as $tv)
					{
						if(!empty($tv)) $tArr[] = (int) $tv;
					}
					if(!empty($tArr)){
						$comWhere .= sprintf(" and mod3_id in (%s)", implode(',', $tArr));
						$flag = true;
					}
				break;
				case 'brand_id': $comWhere .= sprintf(" and brand_id=%d", $val);$flag = true; break;
				case 'make_id': $comWhere .= sprintf(" and make_id=%d", $val);$flag = true; break;
				case 'mod1_id': $comWhere .= sprintf(" and mod1_id=%d", $val);$flag = true; break;
				case 'mod2_id': $comWhere .= sprintf(" and mod2_id=%d", $val);$flag = true; break;
				case 'engines':
					$tArr = [];
					foreach(explode(',', $val) as $tv)
					{
						if(!empty($tv)) $tArr[] = "'".LibFc::Escape($tv)."'";
					}
					if(!empty($tArr)){
						$flag = true;
						$comWhere .= sprintf(" and mod3_engine in (%s)", implode(',', $tArr));
					}
				break;
				case 'engine':
					$val = LibFc::FormatNum($val);
					if($val != ''){
						$flag = true;
						$comWhere .= sprintf(" and mod3_engine_format like '%%%s%%'", $val); 
					}
				break;
				case 'mod3_drive': $comWhere .= sprintf(" and mod3_drive='%s'",  LibFc::Escape($val)); break;
				case 'mod3_drive_short': $comWhere .= sprintf(" and mod3_drive_short='%s'",  LibFc::Escape($val)); break;
				case 'mod3_cc_name': $comWhere .= sprintf(" and mod3_cc_name='%s'",  LibFc::Escape($val)); break;
				case 'mod3_cc': $comWhere .= sprintf(" and mod3_cc='%s'",  LibFc::Escape($val)); break;
				case 'mod3_kw': $comWhere .= sprintf(" and mod3_kw='%s'",  LibFc::Escape($val)); break;
				case 'year': $comWhere .= sprintf(" and %d >= mod2_start_year  and (%d <= mod2_end_year or mod2_end_year=0) ", $val, $val); break;
				case 'cctran':
					$val = base64_decode($val);
					$cc = explode('@', $val);
					$comWhere .= sprintf(" and mod3_cc_name = '%s' and (mod3_transmission ='%s' or mod3_transmission REGEXP '^[0-9]+%s$' or mod3_transmission like '电动车%s%%')", LibFc::Escape($cc[0]), LibFc::Escape($cc[1]), LibFc::Escape($cc[1]), LibFc::Escape($cc[1]));
				break;
				//车型关键字
				case 'keyword':
					$wordArr = LibFc::keyword($val);
                    if(!empty($wordArr))
					{
						$flag = true;
						$wordIdArr = [];
						$caseArr = [];
						foreach($wordArr as $word)
						{
							$res = $this->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
							if(!empty($res['data']))
							{
								$ids = array_column($res['data'], 'mw_id');
								$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
								$wordIdArr = array_merge($wordIdArr, $ids);
							}
						}
						if(!empty($caseArr))
						{
							$wordIdArr = array_unique($wordIdArr);
							for($i = count($caseArr); $i > 0; $i--)
							{
								$table = sprintf("( SELECT mwl_mod3_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
								$res = $this->get($table, ['mwl_mod3_id'], sprintf(" GROUP BY mwl_mod3_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
								if(!empty($res['data']))
								{
									$comWhere .= sprintf(" and mod3_id in (SELECT mwl_mod3_id from %s %s)", $table, sprintf(" GROUP BY mwl_mod3_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
									break;
								}
							}
						}
                    }
				break;
				case 'vin': 
					$LibYpApi = new LibYpApi();
					$res = $LibYpApi->Get('vin/decodeYpcModelId',['vin'=>$val]);
					if(empty($res['data'])) return LibFc::ReturnData(true, $arr);
					$flag = true;
					$comWhere .= sprintf(" and mod3_id in (%s)", implode(',', $res['data']));
				break;
				case 'nums':
					if(!empty($val))
					{
						$LibYpApi = new LibYpApi();
						$res = $LibYpApi->Get('ypc/getModelByYpcNum', [], ['nums'=>$val, 'spartId'=>$Params['spartId']]);
						if(empty($res['data'])) return LibFc::ReturnData(true, $arr);
						$flag = true;
						$comWhere .= sprintf(" and mod3_id in (%s)", implode(',', $res['data']));
					}
				break;
				//有指定全车件品牌限制
				case 'brand_limit':
					$comWhere .= sprintf(" and brand_id in (%s)", $val);
				break;
				case 'pc':
					$comWhere .= sprintf(" and mod2_pc=1 and mod2_cv=0");
					break;
				case 'cv':
					$comWhere .= sprintf(" and mod2_pc=0 and mod2_cv=1");
				break;
			}
		}
		if(!empty($comWhere) && $flag)
		{
			$filed = ['mod3_id, brand_id, brand_name, make_id, make_name, mod1_id, mod1_name, mod2_id, mod2_name, mod2_start_year, mod2_end_year,mod3_name, mod3_start_year, mod3_end_year,  mod3_cc_name,mod3_engine,mod3_kw,mod3_cc,mod3_transmission,mod3_fuel,mod3_drive,mod3_front_brake,mod3_rear_brake,mod3_parking_brake,mod3_start_stop,mod3_body,mod3_chassis'];
			$comWhere .= ' group by mod3_id order by brand_initial, make_seq, make_initial, mod1_name, mod2_name, mod2_start_year, mod3_name, mod3_start_year';
			$res = $this->getModel(3, $filed, $comWhere);
			foreach($res['data'] as $v)
			{
				$v['mod2_year'] = LibFc::formatViewYear($v['mod2_start_year'], $v['mod2_end_year'], 2);
				$v['mod3_year'] = LibFc::formatViewYear($v['mod3_start_year'], $v['mod3_end_year'], 2);
				$arr[] = $v;
			}


			//车型号码参数
			/*$res = $LibYpApi->Get('ypc/getModelNumberPara', [], ['m3ids'=>$mod3IdArr, 'nums'=>$numsArr, 'spartId'=>$spartId]);
			$modPara = $res['data'];*/
		}
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 通过底盘件模式选择车型
	  * @param  $Params [
			'brand_id'=>'品牌',
			'engines'=>'精准匹配,多个逗号分隔',
			'engine'=>'模糊匹配',
		]
	  * @author soul
	  * @copyright 2021/7/7
	  * @return 
	  */
	public function getChassisModByAny($Params)
	{
		$arr = [];
		$comWhere = '';
		$flag = false;
		foreach($Params as $filed=>$val)
		{
			$val = trim($val);
			if($val == '') continue;
			switch($filed)
			{
				case 'mch_code':
					$tArr = [];
					foreach(explode(',', $val) as $tv)
					{
						if(!empty($tv)) $tArr[] = "'".LibFc::Escape($tv)."'";
					}
					if(!empty($tArr)){
						$flag = true;
						$comWhere .= sprintf(" and mch_code in (%s)", implode(',', $tArr));
					}
				break;
				case 'brand_id': $comWhere .= sprintf(" and brand_id=%d", $val);$flag = true; break;
				case 'make_id': $comWhere .= sprintf(" and make_id=%d", $val);$flag = true; break;
				case 'mod1_id': $comWhere .= sprintf(" and mod1_id=%d", $val);$flag = true; break;
				case 'mod2_id': $comWhere .= sprintf(" and mod2_id=%d", $val);$flag = true; break;
				case 'engines':
					$tArr = [];
					foreach(explode(',', $val) as $tv)
					{
						if(!empty($tv)) $tArr[] = "'".LibFc::Escape($tv)."'";
					}
					if(!empty($tArr)) {
						$flag = true;
						$comWhere .= sprintf(" and mch_engine in (%s)", implode(',', $tArr));
					}
				break;
				case 'engine':
					$val = LibFc::FormatNum($val);
					if($val != ''){
						$flag = true;
						$comWhere .= sprintf(" and mch_engine_format like '%%%s%%'", $val); 
					}
				break;
				case 'mod3_drive': $comWhere .= sprintf(" and mch_drive='%s'",  LibFc::Escape($val)); break;
				case 'mod3_drive_short': $comWhere .= sprintf(" and mch_drive_short='%s'",  LibFc::Escape($val)); break;
				case 'mod3_cc_name': $comWhere .= sprintf(" and mch_cc_name='%s'",  LibFc::Escape($val)); break;
				case 'mod3_cc': $comWhere .= sprintf(" and mch_cc='%s'",  LibFc::Escape($val)); break;
				case 'mod3_kw': $comWhere .= sprintf(" and mch_kw='%s'",  LibFc::Escape($val)); break;
				//车型关键字
				case 'keyword':
					$wordArr = LibFc::keyword($val);
                    if(!empty($wordArr))
					{ 
						$flag = true;
						$wordIdArr = [];
						$caseArr = [];
						foreach($wordArr as $word)
						{
							$res = $this->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
							if(!empty($res['data']))
							{
								$ids = array_column($res['data'], 'mw_id');
								$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
								$wordIdArr = array_merge($wordIdArr, $ids);
							}
						}
						if(!empty($caseArr))
						{
							$wordIdArr = array_unique($wordIdArr);
							for($i = count($caseArr); $i > 0; $i--)
							{
								$table = sprintf("( SELECT mod3_mod2_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link JOIN bc_model3 ON mwl_mod3_id = mod3_id WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
								$res = $this->get($table, ['mod3_mod2_id'], sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
								if(!empty($res['data']))
								{
									$comWhere .= sprintf(" and mch_mod2_id in (SELECT mod3_mod2_id from %s %s)", $table, sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
									break;
								}
							}
						}
                    }
				break;
				//有指定全车件品牌限制
				case 'brand_limit':
					$comWhere .= sprintf(" and brand_id in (%s)", $val);
				break;
				case 'pc':
					$comWhere .= sprintf(" and mod2_pc=1 and mod2_cv=0");
					break;
				case 'cv':
					$comWhere .= sprintf(" and mod2_pc=0 and mod2_cv=1");
				break;
			}
		}
		if(!empty($comWhere) && $flag)
		{
			$filed = ['mch_code,brand_id, brand_name, make_id, make_name, mod1_id, mod1_name, mod2_id, mod2_name, mod2_start_year, mod2_end_year, mch_cc_name,mch_engine,mch_kw,mch_cc,mch_transmission,mch_fuel,mch_drive,mch_chassis'];
			$comWhere .= ' group by mch_code order by brand_initial, make_seq, make_initial, mod1_name, mod2_name,mch_engine,mch_kw,mch_cc,mch_transmission,mch_drive';
			$res = $this->getChassisModel($filed, $comWhere);
			foreach($res['data'] as $v)
			{
				$v['mod2_year'] = LibFc::formatViewYear($v['mod2_start_year'], $v['mod2_end_year'], 2);
				$arr[] = $v;
			}
		}
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 通过发动机件模式选择车型
	  * @param  $Params [
			'brand_id'=>'品牌',
			'engines'=>'精准匹配,多个逗号分隔',
			'engine'=>'模糊匹配',
		]
	  * @author soul
	  * @copyright 2021/7/7
	  * @return 
	  */
	public function getEngineModByAny($Params)
	{
		$arr = [];
		$comWhere = '';
		$flag = false;
		foreach($Params as $filed=>$val)
		{
			$val = trim($val);
			if($val == '') continue;
			switch($filed)
			{
				case 'men_code':
					$tArr = [];
					foreach(explode(',', $val) as $tv)
					{
						if(!empty($tv)) $tArr[] = "'".LibFc::Escape($tv)."'";
					}
					if(!empty($tArr)){
						$flag = true;
						$comWhere .= sprintf(" and men_code in (%s)", implode(',', $tArr));
					}
				break;
				case 'brand_id': $comWhere .= sprintf(" and brand_id=%d", $val);$flag = true; break;
				case 'make_id': $comWhere .= sprintf(" and make_id=%d", $val);$flag = true; break;
				case 'mod1_id': $comWhere .= sprintf(" and mod1_id=%d", $val);$flag = true; break;
				case 'mod2_id': $comWhere .= sprintf(" and mod2_id=%d", $val);$flag = true; break;
				case 'engines':
					$tArr = [];
					foreach(explode(',', $val) as $tv)
					{
						if(!empty($tv)) $tArr[] = "'".LibFc::Escape($tv)."'";
					}
					if(!empty($tArr)){
						$flag = true;
						$comWhere .= sprintf(" and men_engine in (%s)", implode(',', $tArr));
					}
				break;
				case 'engine':
					$val = LibFc::FormatNum($val);
					if($val != ''){
						$flag = true;
						$comWhere .= sprintf(" and men_engine_format like '%%%s%%'", $val); 
					}
				break;
				case 'mod3_cc_name': $comWhere .= sprintf(" and men_cc_name='%s'",  LibFc::Escape($val)); break;
				case 'mod3_cc': $comWhere .= sprintf(" and men_cc='%s'",  LibFc::Escape($val)); break;
				case 'mod3_kw': $comWhere .= sprintf(" and men_kw='%s'",  LibFc::Escape($val)); break;
				//车型关键字
				case 'keyword':
					$wordArr = LibFc::keyword($val);
                    if(!empty($wordArr))
					{ 
						$flag = true;
						$wordIdArr = [];
						$caseArr = [];
						foreach($wordArr as $word)
						{
							$res = $this->get('yp_model_word', ['mw_id'], sprintf(" and mw_word like '%s%%'", LibFc::Escape($word)));
							if(!empty($res['data']))
							{
								$ids = array_column($res['data'], 'mw_id');
								$caseArr[] = sprintf("WHEN mwl_mw_id IN (%s) THEN %d", implode(',', $ids), count($caseArr)+1);
								$wordIdArr = array_merge($wordIdArr, $ids);
							}
						}
						if(!empty($caseArr))
						{
							$wordIdArr = array_unique($wordIdArr);
							for($i = count($caseArr); $i > 0; $i--)
							{
								$table = sprintf("( SELECT mod3_mod2_id, CASE %s END AS mwl_mw_id FROM yp_model_word_link JOIN bc_model3 ON mwl_mod3_id = mod3_id WHERE mwl_mw_id IN (%s)) AS a", implode(' ', $caseArr), implode(',', $wordIdArr));
								$res = $this->get($table, ['mod3_mod2_id'], sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
								if(!empty($res['data']))
								{
									$comWhere .= sprintf(" and men_mod2_id in (SELECT mod3_mod2_id from %s %s)", $table, sprintf(" GROUP BY mod3_mod2_id HAVING COUNT(DISTINCT mwl_mw_id) = %d", $i));
									break;
								}
							}
						}
                    }
				break;
				//有指定全车件品牌限制
				case 'brand_limit':
					$comWhere .= sprintf(" and brand_id in (%s)", $val); break;
				break;
				case 'pc':
					$comWhere .= sprintf(" and mod2_pc=1 and mod2_cv=0");
					break;
				case 'cv':
					$comWhere .= sprintf(" and mod2_pc=0 and mod2_cv=1");
				break;
			}
		}
		if(!empty($comWhere) && $flag)
		{
			$filed = ['men_code,brand_id, brand_name, make_id, make_name, mod1_id, mod1_name, mod2_id, mod2_name, mod2_start_year, mod2_end_year, men_cc_name,men_engine,men_kw,men_cc,men_fuel'];
			$comWhere .= ' group by men_code order by brand_initial, make_seq, make_initial, mod1_name, mod2_name,men_engine,men_kw,men_cc';
			$res = $this->getEngineModel($filed, $comWhere);
			foreach($res['data'] as $v)
			{
				$v['mod2_year'] = LibFc::formatViewYear($v['mod2_start_year'], $v['mod2_end_year'], 2);
				$arr[] = $v;
			}
		}
		return LibFc::ReturnData(true, $arr);
	}
}