<?php
/**
  * @method 
  * @author soul
  * @copyright 2016/3/31
  */
class TcdArt extends TcdBase
{

	//新版和旧版一起搜索
	public function searchNumberAll($number, $maxCount = 20, $typeArr = [])
	{
		return $this->searchNumber($number, $maxCount, $typeArr);
	}


	/**
	  * @method 通过号码 厂商获取产品ID
	  * @param  
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getArtIdByFacNumber($number, $fac)
	{
		$arr = ['pro_id'=>0, 'tcd_version'=>''];
		$formatNum = LibFc::FormatNum($number);
		$res = $this->get('TOF_ARTICLES JOIN TOF_ART_LOOKUP ON ART_ID=ARL_ART_ID JOIN TOF_SUPPLIERS ON SUP_ID = ART_SUP_ID', ['ART_ID'], sprintf(" AND ARL_SEARCH_NUMBER ='%s' AND ARL_KIND = 1 AND SUP_BRAND = '%s'", LibFc::Escape($formatNum), LibFc::Escape($fac)), true);
		if(!empty($res['data'])) 
			$arr = ['pro_id'=>$res['data']['ART_ID'], 'tcd_version'=>'old'];
		return LibFc::ReturnData(true, $arr);
	}

	
	/**
	  * @method 通过号码 厂商获取产品车型
	  * @param  
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getModelByFacNumber($number, $fac)
	{
		$arr = [];
		$formatNum = LibFc::FormatNum($number);
		$res = $this->get('TOF_ARTICLES JOIN TOF_ART_LOOKUP ON ART_ID=ARL_ART_ID JOIN TOF_SUPPLIERS ON SUP_ID = ART_SUP_ID', ['ART_ID'], sprintf(" AND ARL_SEARCH_NUMBER ='%s' AND ARL_KIND = 1 AND SUP_BRAND = '%s'", LibFc::Escape($formatNum), LibFc::Escape($fac)), true);
		if(!empty($res['data']))
		{
			$res = $this->getItemModel($res['data']['ART_ID']);
			$arr = $res['data'];
		}
		return LibFc::ReturnData(true, $arr);
	}



	/**
	  * @method 号码搜索
	  * @param  $number   string [必填] GDB2100
	  * @param  $maxCount string [选填] 最大数量 默认20
	  * @author soul
	  * @copyright 2017/4/13
	  * @return ["status"=>true, "data"=>[
			'pro_id'=>'产品唯一标识',
			'pro_name'=>'',
			'pro_yppartid'=>[对应的宜配ID],
			'num'=>[
				['factory'=>'TRW', 'display'=>'GDB2100'],...
			],
			'pic'=>[],
			'para'=>[
				[ 'name'=>'', 'val'=>'','unit'=>''],
			]
	  ] ] 
	  */
	public function searchNumber($number, $maxCount = 20)
	{	
		$arr = [];
		$formatNum = LibFc::FormatNum($number);
		$maxCount = (int) $maxCount;
		if(strlen($formatNum) > 2)
		{
			//PFI 
			$formatNumArr = LibFc::SearchNum($formatNum);
			$ignoreSupId = [0, 11404];
			$table =  sprintf("(SELECT ART_ID, MAX(ART_PIC) ART_PIC, MAX(ART_URL) ART_URL, MAX(SUP_BRAND) SUP_BRAND, MAX(ART_ARTICLE_NR) ART_ARTICLE_NR, MAX(GA_DES) GA_DES, MAX(GA_DES_CN) GA_DES_CN, MAX(ART_GA_ID) ART_GA_ID, MAX(ART_PRO_ID_CN) ART_PRO_ID_CN FROM 
					TOF_ART_LOOKUP
					JOIN TOF_ARTICLES ON  ARL_ART_ID = ART_ID
					LEFT JOIN TOF_SUPPLIERS ON SUP_ID = ART_SUP_ID 
					LEFT JOIN TOF_GENERIC_ARTICLES ON GA_ID = ART_GA_ID 
					LEFT JOIN MS_GA_SUP_SEQ ON GSS_SUP_ID=ART_SUP_ID AND ART_GA_ID = GSS_GA_ID 
					WHERE ARL_SEARCH_NUMBER in ('%s') AND ART_SUP_ID NOT IN (%s) GROUP BY ART_ID,GSS_SEQ, SUP_BRAND ORDER BY GSS_SEQ, SUP_BRAND)",
					implode("','", $formatNumArr), implode(',', $ignoreSupId));
			$tcdRes = $this->get($table, ['*'], sprintf(" AND ROWNUM <= %d", $maxCount));
			if(!empty($tcdRes['data']))
			{
				$artIdArr = array_column($tcdRes['data'], 'ART_ID');
				
				//中国版数据
				$cnArtArr = [];
				if(mvc::$cfg['dLang'] != 'en')
				{
					$artCnIdArr = [];
					foreach($tcdRes['data'] as $v)
					{
						if($v['ART_PRO_ID_CN'] > 0) $artCnIdArr[] = $v['ART_PRO_ID_CN'];
					}
					$TcdCnProduct = new TcdCnProduct();
					$res = $TcdCnProduct->getAnyProductInfo($artCnIdArr, ['para']);
					$cnArtArr = $res['data'];
				}

				$lres = $this->getItemLocation($artIdArr);
				$locationArr = $lres['data'];

				//参数
				$paramRes = $this->getArtParam($artIdArr);
				
				//零件对应宜配
				$ypGaArr = [];
				$gaIdArr = array_unique(array_column($tcdRes['data'], 'ART_GA_ID'));
				$YpsBase = new YpsBase();
				$gaRes = $YpsBase->get('yp_part_tcdga', ['partid, ga_id'], sprintf(" AND ga_id in (%s)", implode(',', $gaIdArr)));
				foreach($gaRes['data'] as $v)
				{
					$ypGaArr[$v['ga_id']][] = $v['partid'];
				}

				$snumArr = [];
				
				$where = sprintf(" AND ARL_SEARCH_NUMBER in ('%s') AND ARL_ART_ID IN (%s)",  implode("','", $formatNumArr), implode(',', $artIdArr));
				$numRes = $this->get('TOF_ART_LOOKUP JOIN TOF_BRANDS ON BRA_ID = ARL_BRA_ID', ['ARL_ART_ID, BRA_BRAND, ARL_DISPLAY_NR'], $where);
				foreach($numRes['data'] as $v)
				{
					$snumArr[$v['ARL_ART_ID']] = $v;
				}

				
				foreach($tcdRes['data'] as $v)
				{
					$tNum = [];
					if(!empty($snumArr[$v['ART_ID']])){
						$tNum[] = [ 'factory'=>$snumArr[$v['ART_ID']]['BRA_BRAND'], 'display'=>$snumArr[$v['ART_ID']]['ARL_DISPLAY_NR']];
					}
					$tNum[] = [ 'factory'=>$v['SUP_BRAND'], 'display'=>$v['ART_ARTICLE_NR'] ];

					$pro = [
						'pro_id'=>$v['ART_ID'],
						'pro_code'=>$v['ART_URL'],
						'pro_url'=>mvc::$cfg['urls']['yp'].'dt/'.$v['ART_URL'].'.html',
						'pro_name'=>mvc::$cfg['dLang'] != 'en'? $v['GA_DES_CN']: $v['GA_DES'],
						'pro_yppartid'=>!empty($ypGaArr[$v['ART_GA_ID']])? $ypGaArr[$v['ART_GA_ID']] : [],
						'num'=>$tNum,
						'pro_price'=>['title'=>'销售价', 'price'=>'0.00'],
						'pic'=>!empty($v['ART_PIC'][0])? [$v['ART_PIC'][0]['small']] : [],
						'para'=>!empty($paramRes['data'][$v['ART_ID']])? $paramRes['data'][$v['ART_ID']] : []
					];
					if(!empty($locationArr[$pro['pro_id']]) && stripos($pro['pro_name'], '(') === false)
						$pro['pro_name'] .= '('.implode(';', $locationArr[$pro['pro_id']]).')';

					if($v['ART_PRO_ID_CN'] > 0 && !empty($cnArtArr[$v['ART_PRO_ID_CN']]))
					{
						$cnPro = $cnArtArr[$v['ART_PRO_ID_CN']];
						$reFiled = ['pic', 'pro_name', 'para'];
						foreach($reFiled as $filed)
						{
							if(!empty($cnPro[$filed])) $pro[$filed] = $cnPro[$filed];
						}
					}
					$arr[] = $pro;
				}
			}
		}
		return LibFc::ReturnData(true, $arr);
	}
	
	
	/**
	  * @method 获取产品信息
	  * @param  $artId
	  * @param  $typeArr ['para', 'picAll', 'model', 'nums'...]
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getProductInfo($proIdArr, $typeArr = [], $mod3Id = 0, $typIdArr = [])
	{
		$proArr = [];
		foreach($proIdArr as $k=>$v)
		{
			$proIdArr[$k] = (int) $v;
		}
		$proIdArr = array_unique($proIdArr);
		if(!empty($proIdArr))
		{
			$lres = $this->getItemLocation($proIdArr, $mod3Id,  $typIdArr);
			$locationArr = $lres['data'];

			$Table = 'TOF_ARTICLES 
			JOIN TOF_SUPPLIERS ON SUP_ID = ART_SUP_ID 
			JOIN TOF_GENERIC_ARTICLES ON GA_ID=ART_GA_ID
			LEFT JOIN MS_GA_SUP_SEQ ON GSS_SUP_ID=ART_SUP_ID AND ART_GA_ID = GSS_GA_ID';
			$tcdRes = $this->get($Table, ['ART_ID, ART_URL, ART_PIC, SUP_BRAND, ART_ARTICLE_NR, GA_DES, GA_DES_CN, ART_PRO_ID_CN'], sprintf(" AND ART_ID in(%s) ORDER BY GSS_SEQ, SUP_BRAND", implode(',', $proIdArr)));
			if(!empty($tcdRes['data']))
			{
				$proIdArr = array_column($tcdRes['data'], 'ART_ID');

				//中国版数据
				$cnArtArr = [];
				$artCnIdArr = [];
				foreach($tcdRes['data'] as $v)
				{
					if($v['ART_PRO_ID_CN'] > 0) $artCnIdArr[] = $v['ART_PRO_ID_CN'];
				}
				if(!empty($artCnIdArr))
				{
					$TcdCnProduct = new TcdCnProduct();
					$res = $TcdCnProduct->getAnyProductInfo($artCnIdArr, ['para'], $mod3Id, $typIdArr);
					$cnArtArr = $res['data'];
				}
				
				if(in_array('para', $typeArr))
				{
					$paramRes = $this->getArtParam($proIdArr);
				}

				foreach($tcdRes['data'] as $v)
				{
					$pro = [
						'pro_id'=>$v['ART_ID'],
						'pro_code'=>$v['ART_URL'],
						'pro_url'=>mvc::$cfg['urls']['yp'].'dt/'.$v['ART_URL'].'.html',
						'pro_name'=>mvc::$cfg['dLang'] != 'en'? $v['GA_DES_CN']: $v['GA_DES'],
						'para'=>!empty($paramRes['data'][$v['ART_ID']])? $paramRes['data'][$v['ART_ID']] : [],
						'pic'=>[],
						'num'=>[['factory'=>$v['SUP_BRAND'], 'display'=>$v['ART_ARTICLE_NR']]],
						'nums'=>[],
						'model'=>[]
					];
					if(!empty($locationArr[$pro['pro_id']]) && stripos($pro['pro_name'], '(') === false)
						$pro['pro_name'] .= '('.implode(';', $locationArr[$pro['pro_id']]).')';
					
					if(!empty($v['ART_PIC']))
					{
						foreach($v['ART_PIC'] as $pic)
						{
							$pro['pic'][] = $pic['small'];
							if(!in_array('picAll', $typeArr)) break;
						}
					}
					
					//中国版参数替换
					if($v['ART_PRO_ID_CN'] > 0 && !empty($cnArtArr[$v['ART_PRO_ID_CN']]))
					{
						$cnPro = $cnArtArr[$v['ART_PRO_ID_CN']];
						$reFiled = mvc::$cfg['dLang'] != 'en'? ['pic', 'pro_name', 'para']: ['pic'];
						foreach($reFiled as $filed)
						{
							if(!empty($cnPro[$filed])) $pro[$filed] = $cnPro[$filed];
						}
					}

					$proArr[$v['ART_ID']] = $pro;
				}

				if(in_array('nums', $typeArr))
				{
					$tres = $this->get('TOF_ART_LOOKUP LEFT OUTER JOIN TOF_BRANDS ON ARL_BRA_ID=BRA_ID', ['ARL_ART_ID, BRA_BRAND, ARL_DISPLAY_NR, ARL_KIND'], sprintf(" AND ARL_DISPLAY_NR is not null AND ARL_KIND < 5 AND ARL_ART_ID IN(%s) ORDER BY BRA_BRAND", implode(',', $proIdArr)));
					foreach($tres['data'] as $nv)
					{
						$proArr[$nv['ARL_ART_ID']]['nums'][] = ['oe'=>$nv['ARL_KIND'] == 3? 1: 0, 'factory'=>$nv['BRA_BRAND'], 'display'=>$nv['ARL_DISPLAY_NR']];
					}
				}

				if(in_array('model', $typeArr))
				{
					$filed = ["LAT_ART_ID, LAT_TYP_ID, MFA_BRAND, MFA_ID, A.VEHICLE, A.CC, A.KW, A.BODY, A.CYLINDER, A.START_Y, A.END_Y"];
					$table = 'TOF_LINK_LA_TYP 
					JOIN TOF_LINK_ART ON LAT_LA_ID = LA_ID 
					JOIN MODELS A ON LAT_TYP_ID=A.TCD_ID 
					JOIN MODEL_SERIES B ON B.TCD_ID=A.MODEL_SERIES_ID
					JOIN TOF_MANUFACTURERS ON MFA_ID = A.BRAND_ID';
					$where = count($proIdArr) == 1 ? sprintf(" AND LAT_ART_ID IN (%s) AND ROWNUM <= 1000", implode(',', $proIdArr)) : sprintf(" AND LAT_ART_ID IN (%s)", implode(',', $proIdArr));
					$res = $this->get($table, $filed, $where);
					if(!empty($res['data']))
					{
						$table = 'TOF_LINK_TYP_ENG JOIN TOF_ENGINES ON ENG_ID = LTE_ENG_ID';
						$engres = $this->get($table, ['LTE_TYP_ID, LISTAGG(ENG_CODE, \',\') WITHIN GROUP (ORDER BY ENG_CODE) ENG_CODE'], sprintf(" AND LTE_TYP_ID IN (%s) GROUP BY LTE_TYP_ID", implode(',', array_unique(array_column($res['data'], 'LAT_TYP_ID')))));
						$engineArr = array_column($engres['data'], 'ENG_CODE', 'LTE_TYP_ID');
						foreach($res['data'] as $v)
						{
							if(count($arr[$v['LAT_ART_ID']]['model']) > 1000) continue;
							$t = [
								'make_id'=>$v['MFA_ID'],
								'make'=>$v['MFA_BRAND'],
								'vehicle'=>$v['VEHICLE'],
								'cc'=>$v['CC'],
								'kw'=>$v['KW'],
								'body_type'=>$v['BODY'],
								'cyilinder'=>$v['CYLINDER'],
								'year'=>$v['START_Y'].'-'.($v['END_Y'] > 0 ? $v['END_Y']: ''),
								'engines'=>!empty($engineArr[$v['LAT_TYP_ID']])? $engineArr[$v['LAT_TYP_ID']]: ''
							];
							$proArr[$v['LAT_ART_ID']]['model'][] = $t;
						}
					}
				}
			}
		}
		return LibFc::ReturnData(true, $proArr);
	}


	/**
	  * @method 获取配件的号码
	  * @param  $proId int 配件ID
	  * @param  $type string  oe|ref|all
	  * @param  $page int 第几页
	  * @param  $per int 每页数量
	  * @author soul
	  * @copyright 2017/6/5
	  * @return  ["status"=>true, "data"=>[{"factory":"FERODO","display":"2114023"},...] ]
	  */
	public function getItemNumber($proId, $type, $page, $per)
	{
		$proId = (int) $proId;
		$arr = [];
		$per = empty($per) || $per < 1 ? 20: (int) $per;
		$page = empty($page) || $page < 1 ? 1: (int) $page;
		switch($type)
		{
			case 'main':
				$tableWhere = ' AND ARL_KIND =1';
			break;
			case 'oe':
				$tableWhere = ' AND ARL_KIND =3';
			break;
			case 'ref':
				$tableWhere = ' AND ARL_KIND !=3 ';
			break;
			default:
				$tableWhere = '';
			break;
		}
		$table = sprintf("(SELECT BRA_BRAND, ARL_DISPLAY_NR, ARL_KIND, ROWNUM RN FROM (
			SELECT CASE WHEN BRA_BRAND IS NULL THEN SUP_BRAND ELSE BRA_BRAND END BRA_BRAND, 
				CASE WHEN ARL_DISPLAY_NR IS NULL THEN ART_ARTICLE_NR ELSE ARL_DISPLAY_NR END ARL_DISPLAY_NR, ARL_KIND 
				FROM TOF_ART_LOOKUP
				JOIN TOF_ARTICLES ON ART_ID = ARL_ART_ID
				LEFT JOIN TOF_SUPPLIERS ON ART_SUP_ID = SUP_ID
				LEFT JOIN TOF_BRANDS ON ARL_BRA_ID=BRA_ID
				WHERE ARL_ART_ID=%d AND ARL_KIND < 5 %s ORDER BY BRA_BRAND, ARL_SEARCH_NUMBER ASC
			) WHERE ROWNUM <= %d)", $proId,$tableWhere, $page*$per);

		$res = $this->get($table, ['*'], sprintf(" AND RN > %d", ($page-1)*$per));
		foreach($res['data'] as $v)
		{
			$arr[] = ['oe'=>$v['ARL_KIND'] == 3? 1: 0, 'factory'=>$v['BRA_BRAND'], 'display'=>$v['ARL_DISPLAY_NR']];
		}
		return LibFc::ReturnData(true, $arr);
	}


	
	/**
	  * @method 获取产品的宜配适用车型
	  * @param  
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getYpcModelId($proId)
	{
		$arr = [];
		$proId = (int) $proId;
		if($proId < 1) return LibFc::ReturnData(true, $arr);

		$res = $this->get('TOF_ART_LOOKUP', ['ARL_SEARCH_NUMBER'], sprintf(" AND ARL_KIND =3 AND ARL_ART_ID =%d ", $proId));
		if(!empty($res['data']))
		{
			$oeNumArr = array_column($res['data'], 'ARL_SEARCH_NUMBER');
			$YpcModel = new YpcModel();
			$res = $YpcModel->getM3idByNum($oeNumArr);
			$arr = $res['data'];
		}

		$mres = $this->get('TOF_LINK_LA_TYP', ['DISTINCT LAT_TYP_ID'], sprintf(" and LAT_ART_ID =%d", $proId));
		if(!empty($mres['data']))
		{
			$YpcBase = new YpcBase();
			$res = $YpcBase->get('yp_model3_tcdcn_link join yp_model3 on mtl_m3_id = m3_id', ['distinct mtl_m3_id'], sprintf(" and mtl_typ_id in (%s)", implode(',', array_column($mres['data'], 'LAT_TYP_ID'))));
			$arr = array_merge($arr, array_column($res['data'], 'mtl_m3_id'));
		}
		return LibFc::ReturnData(true, array_unique($arr));
	}



	/**
	  * @method 查找产品参数
	  * @param  $artIdArr   array [必填] [1,2,3...]
	  * @author soul
	  * @copyright 2017/4/13
	  * @return ["status"=>true, "data"=>[ ['label'=>'', 'value'=>'','unit'=>''],...]] 
	  */
	public function getArtParam($artIdArr)
	{
		$paramArr = [];
		if(!empty($artIdArr))
		{
			$filed = mvc::$cfg['dLang'] != 'en'? ['ACR_ART_ID, C.CRI_ID, MAX(CRI_NAME_CN) CRI_SHORT, MAX(ACR_VALUE) ACR_VALUE, MAX(CRI_UNIT) CRI_UNIT, MAX(ACR_KV) ACR_KV']: ['ACR_ART_ID, C.CRI_ID, MAX(CRI_SHORT) CRI_SHORT, MAX(ACR_VALUE) ACR_VALUE, MAX(CRI_UNIT) CRI_UNIT, MAX(ACR_KV) ACR_KV , MAX(CRI_DES) CRI_DES'];
			$table = 'TOF_ARTICLE_CRITERIA
			JOIN TOF_CRITERIA C ON ACR_CRI_ID = C.CRI_ID
			JOIN MS_REPLACE_CRITERIA_TEMP SQ ON SQ.CRI_ID = C.CRI_ID AND ACR_GA_ID = SQ.GA_ID';
			$Res = $this->get($table, $filed, sprintf(" AND ACR_ART_ID IN (%s) GROUP BY ACR_ART_ID, C.CRI_ID ORDER BY ACR_ART_ID, MIN(SQ.DSORT)", implode(',', $artIdArr)));
			foreach($Res['data'] as $Row)
			{
				$Lable = !empty($Row['CRI_SHORT'])? $Row['CRI_SHORT']: $Row['CRI_DES'];
				$Value = !empty($Row['ACR_VALUE'])? str_replace( ',', '.', $Row['ACR_VALUE']):  trim($Row['ACR_KV']);
				$Unit = !empty($Row['CRI_UNIT'])? $Row['CRI_UNIT']: '';
				$paramArr[$Row['ACR_ART_ID']][] = ['name'=>trim($Lable), 'val'=>trim($Value), 'unit'=>trim($Unit)];
			}
		}
		return LibFc::ReturnData(true, $paramArr);
	}


	/**
	  * @method 获取产品车型
	  * @param  
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getItemModel($proId)
	{
		$arr = [];
		$proId = (int) $proId;

		$table = 'TOF_LINK_LA_TYP JOIN TOF_LINK_TYP_ENG ON LTE_TYP_ID = LAT_TYP_ID JOIN TOF_ENGINES ON ENG_ID = LTE_ENG_ID';
		$res = $this->get($table, ['LAT_TYP_ID, ENG_CODE'], sprintf(" AND LAT_ART_ID=%d ORDER BY ENG_CODE", $proId));
		$TypeEng = [];
		foreach($res['data'] as $v)
		{
			$TypeEng[$v['LAT_TYP_ID']][$v['ENG_CODE']] = $v['ENG_CODE'];
		}

		$table = 'TOF_LINK_LA_TYP 
			JOIN TOF_LINK_ART ON LAT_LA_ID = LA_ID 
			JOIN MODELS A ON LAT_TYP_ID=A.TCD_ID 
			JOIN MODEL_SERIES B ON B.TCD_ID=A.MODEL_SERIES_ID
			JOIN TOF_MANUFACTURERS ON MFA_ID = A.BRAND_ID';
		$res = $this->get($table, ['A.BRAND_ID MAKE_ID, MFA_BRAND, MFA_BRAND_CN,B.NAME MOD2_NAME,SHORT_DES MOD3_NAME, LAT_TYP_ID MOD3_ID, A.START_Y, A.END_Y,A.START_Y, A.END_Y, A.KW, A.CC, A.BODY,A.CYLINDER'], sprintf(" AND LAT_ART_ID =%d order by MFA_BRAND, B.NAME, SHORT_DES", $proId));
		foreach($res['data'] as $v)
		{
			$arr[] = [
				'make_id'=>$v['MAKE_ID'],
				'make_name'=>mvc::$cfg['dLang'] != 'en'? $v['MFA_BRAND_CN']: $v['MFA_BRAND'],
				'mod2_name'=>$v['MOD2_NAME'],
				'mod3_id'=>$v['MOD3_ID'],
				'mod3_name'=>$v['MOD3_NAME'],
				'mod3_start_year'=>$v['START_Y'],
				'mod3_end_year'=>$v['END_Y'],
				'mod3_engine'=>!empty($TypeEng[$v['MOD3_ID']])? implode(';', $TypeEng[$v['MOD3_ID']]): '',
				'mod3_kw'=>$v['KW'],
				'mod3_cc'=>$v['CC'],
				'mod3_cylinder'=>$v['CYLINDER'],
				'mod3_body'=>$v['BODY'],
			];
		}
		return LibFc::ReturnData(true, $arr);
	}


	/**
	  * @method 获取TCD的号码外比较
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> ["code"]=> int(0) } 
	  */
	public function getNumContrast($oeArr)
	{
		if(empty($oeArr) || !is_array($oeArr))
			return LibFc::ReturnData(false, 'getOeContrast提供的参数不正确。');
		$temp = [];
		foreach($oeArr as $v)
		{
			$tt = explode(':', $v);
			$fac = count($tt) > 1? $tt[0]: 'OE';
			$num = count($tt) > 1? $tt[1]: $tt[0];
			$format = LibFc::FormatNum($num);
			if(strlen($format) > 0)
			{
				$unikey = strtoupper(str_replace(' ', '', $fac).'@'.$format);
				$temp[$unikey]['base'] = ['factory'=>$fac, 'display'=>$num, 'format'=>$format];
			}
		}
		$oeArr = $temp;
		$conArr = ['allKey'=>[], 'nums'=>[]];
		if(count($oeArr) > 0)
		{
			$allNumArr = [];
			$allNumKeyArr = [];
			foreach($oeArr as $unikey=>$v)
			{
				$table = 'TOF_ARTICLES JOIN TOF_ART_LOOKUP ON ART_ID=ARL_ART_ID AND ARL_KIND = 1 JOIN TOF_SUPPLIERS ON SUP_ID = ART_SUP_ID ';
				$where = sprintf(" AND ART_ID IN (SELECT ARL_ART_ID FROM TOF_ART_LOOKUP WHERE ARL_SEARCH_NUMBER ='%s' AND ARL_KIND = 3) GROUP BY SUP_BRAND, ARL_SEARCH_NUMBER", LibFc::Escape($v['base']['format']));
				$res = $this->get($table, ['SUP_BRAND, MAX(ART_ARTICLE_NR) ART_ARTICLE_NR, ARL_SEARCH_NUMBER'], $where);
				foreach($res['data'] as $vv)
				{
					$vv['SUP_BRAND'] = LibFc::ToEnFac($vv['SUP_BRAND']);
					$uniqueKey = strtoupper(str_replace(' ', '', $vv['SUP_BRAND']).'@'.$vv['ARL_SEARCH_NUMBER']);
					$v['nums'][$uniqueKey] = ['factory'=>$vv['SUP_BRAND'], 'display'=>$vv['ART_ARTICLE_NR']];
					
					$allNumKeyArr[$uniqueKey]['key'] = $uniqueKey;
					$allNumKeyArr[$uniqueKey]['count']++;
					$allNumKeyArr[$uniqueKey] = array_merge($allNumKeyArr[$uniqueKey], $v['nums'][$uniqueKey]);
				}
				$oeArr[$unikey] = $v;
			}

			$sortCount = [];
			$sortKey = [];
			foreach($allNumKeyArr as $unique=>$v)
			{
				$sortCount[$unique] = $v['count'];
				$sortKey[$unique] = $v['key'];
			}
			array_multisort($sortCount, SORT_DESC, $sortKey, SORT_ASC, $allNumKeyArr);

			/*foreach($allNumKeyArr as $k=>$v)
			{
				//unset($allNumKeyArr[$k]['key']);
			}*/
			$conArr['allKey'] = $allNumKeyArr;
			$conArr['bynum'] = $oeArr;
		}
		return LibFc::ReturnData(true, $conArr);	
	}


	/**
	  * @method 通过TCD的配件对比数据
	  * @param  $artIdArr   array  配件ID数组
	  * @author soul
	  * @copyright 2018/3/28
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> ["code"]=> int(0) } 
	  */
	public function getArtContrast($artIdArr)
	{
		if(empty($artIdArr) || !is_array($artIdArr))
			return LibFc::ReturnData(false, 'getArtContrast提供的参数不正确。');
		foreach($artIdArr as $k=>$v)
		{
			$artIdArr[$k] = (int) $v;
		}
		
		$res = $this->get('TOF_ARTICLES JOIN TOF_SUPPLIERS ON SUP_ID = ART_SUP_ID', ['ART_ID', 'ART_ARTICLE_NR', 'SUP_BRAND'], sprintf(" AND ART_ID IN(%s) ORDER BY SUP_BRAND, ART_ARTICLE_NR", implode(',', $artIdArr)));
		$artArr = [];
		$allNumKeyArr = [];
		foreach($res['data'] as $v)
		{
			$v['SUP_BRAND'] = LibFc::ToEnFac($v['SUP_BRAND']);
			$v['format'] = LibFc::FormatNum($v['ART_ARTICLE_NR']);
			$uniqueKey = strtoupper(str_replace(' ', '', $v['SUP_BRAND']).'@'.$v['format']);
			$artArr[$v['ART_ID']] = [
				'base'=>['factory'=>$v['SUP_BRAND'], 'display'=>$v['ART_ARTICLE_NR'], 'format'=>$v['format']],
				'nums'=>[$uniqueKey=>['factory'=>$v['SUP_BRAND'], 'display'=>$v['ART_ARTICLE_NR']]]
			];
			$allNumKeyArr[$uniqueKey] = $artArr[$v['ART_ID']]['nums'][$uniqueKey];
			$allNumKeyArr[$uniqueKey]['key'] = $uniqueKey;
			$allNumKeyArr[$uniqueKey]['count']++;
		}
		if(!empty($artArr))
		{
			$table = 'TOF_ART_LOOKUP LEFT OUTER JOIN TOF_BRANDS ON ARL_BRA_ID=BRA_ID';
			$where = sprintf(" AND ARL_KIND IN (3,4) AND ARL_ART_ID IN (%s) GROUP BY ARL_ART_ID, BRA_BRAND, ARL_SEARCH_NUMBER", implode(',', array_keys($artArr)));
			$res = $this->get($table, ['ARL_ART_ID', 'MAX(ARL_KIND) ARL_KIND', 'BRA_BRAND', 'MAX(ARL_DISPLAY_NR) ARL_DISPLAY_NR', 'ARL_SEARCH_NUMBER'], $where);
			foreach($res['data'] as $v)
			{
				$v['BRA_BRAND'] = $v['ARL_KIND'] == 3? 'OE': LibFc::ToEnFac($v['BRA_BRAND']);
				$uniqueKey = strtoupper(str_replace(' ', '', $v['BRA_BRAND']).'@'.$v['ARL_SEARCH_NUMBER']);
				if(isset($artArr[$v['ARL_ART_ID']]['nums'][$uniqueKey])) continue;
				$artArr[$v['ARL_ART_ID']]['nums'][$uniqueKey] = ['factory'=>$v['BRA_BRAND'], 'display'=>$v['ARL_DISPLAY_NR']];
				if(!isset($allNumKeyArr[$uniqueKey])) $allNumKeyArr[$uniqueKey] = $artArr[$v['ARL_ART_ID']]['nums'][$uniqueKey];
				$allNumKeyArr[$uniqueKey]['key'] = $uniqueKey;
				$allNumKeyArr[$uniqueKey]['count']++;
			}
		}

		$sortCount = [];
		$sortKey = [];
		foreach($allNumKeyArr as $unique=>$v)
		{
			$sortCount[$unique] = $v['count'];
			$sortKey[$unique] = $v['key'];
		}
		array_multisort($sortCount, SORT_DESC, $sortKey, SORT_ASC, $allNumKeyArr);
		$conArr = [];
		$conArr['allKey'] = $allNumKeyArr;
		$conArr['bynum'] = $artArr;
		return LibFc::ReturnData(true, $conArr);	
	}

	/**
	  * @method 获取厂商BRANDID
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> ["code"]=> int(0) } 
	  */
	public function getBrandId($brand)
	{
		$braIdArr = [];
		if(!empty($brand))
		{
			$res = $this->get('TOF_BRANDS', ['BRA_ID'], sprintf(" AND BRA_BRAND='%s'", LibFc::Escape($brand)));
			$braIdArr = array_column($res['data'], 'BRA_ID');

		}
		return LibFc::ReturnData(true, $braIdArr);	
	}


	/**
	  * @method 重建TCD知名品牌的车型/发动机关联表 MS_SUP_TYPES、MS_SUP_ENGINES
	  * @param  supIdArr              array [选填] 默认所有
	  * @author soul
	  * @copyright 2019/5/27
	  * @return {"status":true,"data":true,"code":0,"encry":0,"runtime":74}
	  */
	public function resetFacTypLink($supIdArr = [])
	{
		set_time_limit(0);
		if(empty($supIdArr))
		{
			$B2cBase = new B2cBase();
			$res = $B2cBase->get('sh_super', ['ssu_tcd_supid'], sprintf(" and ssu_tcd_supid > 0 and ssu_style = 'TCD'"));
			$supIdArr = array_column($res['data'], 'ssu_tcd_supid');
		}
		else
		{
			foreach($supIdArr as $k=>$v)
			{
				$supIdArr[$k] = (int) $v;
			}
		}
		if(!empty($supIdArr))
		{
			$this->TCDDb->Begin();
			
			$sqlArr = [
				sprintf("DELETE FROM MS_SUP_TYPES WHERE SUT_SUP_ID IN (%s)",  implode(',', $supIdArr)),
				sprintf("INSERT INTO MS_SUP_TYPES SELECT LAT_SUP_ID, BRAND_ID, MODEL_SERIES_ID, LAT_TYP_ID FROM TOF_LINK_LA_TYP JOIN MODELS ON TCD_ID = LAT_TYP_ID WHERE LAT_SUP_ID IN (%s) GROUP BY LAT_SUP_ID, BRAND_ID, MODEL_SERIES_ID, LAT_TYP_ID", implode(',', $supIdArr)),

				sprintf("DELETE FROM MS_SUP_ENGINES WHERE SUE_SUP_ID IN (%s)",  implode(',', $supIdArr)),
				sprintf("INSERT INTO MS_SUP_ENGINES SELECT LAT_SUP_ID, ENG_ID FROM TOF_LINK_LA_TYP T 
				JOIN TOF_LINK_TYP_ENG EL ON EL.LTE_TYP_ID = T.LAT_TYP_ID
				JOIN TOF_ENGINES E ON EL.LTE_ENG_ID = E.ENG_ID
				WHERE LAT_SUP_ID IN (%s) GROUP BY LAT_SUP_ID, ENG_ID", implode(',', $supIdArr)),
			];
			foreach($sqlArr as $sql)
			{
				$ResFlag = $this->TCDDb->Query($sql);
				if(!$ResFlag) return LibFc::ReturnData(false, $sql.'执行失败。');
			}
			$this->TCDDb->End();
		}
		return LibFc::ReturnData(true);	
	}


	/**
	  * @method 获取产品的安装位置
	  * @param  $proIdArr array 产品ID 
	  * @param  $typIdArr array 车型ID
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getItemLocation($proIdArr, $mod3Id=0, $typIdArr = [])
	{
		foreach($proIdArr as $k=>$v)
		{
			$proIdArr[$k] = (int)$v;
		}
		$arr = [];
		if(!empty($proIdArr))
		{
			$locationArr = [];
			if(mvc::$cfg['dLang'] != 'en')
			{
				$YpcBase = new YpcBase();
				$res = $YpcBase->get('yp_location', ['loc_word_format, loc_word_cn']);
				$locationArr = array_column($res['data'], 'loc_word_cn', 'loc_word_format');
			}

			if(!empty($typIdArr))
			{
				foreach($typIdArr as $k=>$v)
				{
					$typIdArr[$k] = (int)$v;
				}

				$res = $this->get('TOF_LA_CRITERIA JOIN TOF_CRITERIA ON CRI_ID = LAC_CRI_ID', ['LAC_LA_ID ART_ID, LAC_KV'], sprintf(" AND CRI_DES='Fitting Position' AND LAC_LA_ID in (%s) and LAC_TYP_ID in (%s) group by LAC_LA_ID, LAC_KV order by LAC_KV", implode(',', $proIdArr), implode(',', $typIdArr)));
				foreach($res['data'] as $v)
				{
					$arr[$v['ART_ID']][] = $v['LAC_KV'];
				}
			}
			$noIdArr = array_diff($proIdArr, array_keys($arr));
			//产品参数补齐
			if(!empty($noIdArr))
			{
				$res = $this->get('TOF_ARTICLE_CRITERIA JOIN TOF_CRITERIA ON CRI_ID = ACR_CRI_ID', ['ACR_ART_ID ART_ID, ACR_KV'], sprintf(" AND CRI_DES='Fitting Position' AND ACR_ART_ID in (%s) group by ACR_ART_ID, ACR_KV order by ACR_KV", implode(',', $noIdArr)));
				foreach($res['data'] as $v)
				{
					$arr[$v['ART_ID']][] = $v['ACR_KV'];
				}
			}

			$noIdArr = array_diff($proIdArr, array_keys($arr));
			//其它车型位置补齐
			if(!empty($noIdArr))
			{
				$res = $this->get('TOF_LA_CRITERIA JOIN TOF_CRITERIA ON CRI_ID = LAC_CRI_ID', ['LAC_LA_ID ART_ID, LAC_KV'], sprintf(" AND CRI_DES='Fitting Position' AND LAC_LA_ID in (%s) group by LAC_LA_ID, LAC_KV order by LAC_KV", implode(',', $proIdArr)));
				foreach($res['data'] as $v)
				{
					$arr[$v['ART_ID']][] = $v['LAC_KV'];
				}
			}
			
			foreach($arr as $proId=>$v)
			{
				$v = array_unique($v);
				if(mvc::$cfg['dLang'] != 'en')
				{
					foreach($v as $kk=>$vv)
					{
						$fvv = LibFc::FormatNum($vv);
						if(!empty($locationArr[$fvv]))
							$v[$kk] = $locationArr[$fvv];
					}
				}
				sort($v);
				$arr[$proId] = $v;
			}
		}
		return LibFc::ReturnData(true, $arr);
	}
}