<?php
/**
  * @method 产品管理
  * @author soul
  * @copyright 2016/3/31
  */
class YpsProduct extends YpsBase
{
	/**
	  * @method 获取配件基本信息
	  * @param  $proIdArr array [11,2222....]
	  * @param  $typeArr ['para', 'picAll'...]
	  * @author soul
	  * @copyright 2017/7/7
	  * @return 
			成功 ["status"=>true, "data"=> [11=>[], ...]] 
			失败 ["status"=>false, "data"=> 错误信息] 
	  */
	public function getAnyProductInfo($proIdArr, $typeArr = [])
	{
		$proArr = [];
		foreach($proIdArr as $k=>$v)
		{
			$proIdArr[$k] = (int) $v;
		}
		$proIdArr = array_unique($proIdArr);
		if(!empty($proIdArr))
		{
			$lres = $this->getItemLocation($proIdArr);
			$locationArr = $lres['data'];

			$table = 'yp_product AS p 
			LEFT join yp_number AS n on p.pid = n.pid AND n.ismain=1 
			LEFT JOIN yp_factory AS fac ON fac.fid = n.fid 
			join yp_part as pa on p.partid = pa.partid
			join yp_lng_des as ld ON ld.desid = pa.desid AND ld.lngid = 1
			JOIN yp_lng_text as lt ON lt.txtid = ld.txtid
			LEFT JOIN yp_files_pro_pic AS f ON p.pid=f.dataid AND p.pro_pic_id=f.fileid';
			$filed = ['p.pid, p.url, p.model_des, n.display, factory, p.partid, lt.txt as pa_name, f.path, f.name AS fname, p.remark'];
			$res = $this->get($table, $filed, sprintf(" and p.pid in (%s) group by p.pid", implode(',', $proIdArr) ));
			foreach($res['data'] as $v)
			{
				$pro = [
					'pro_id'=>$v['pid'],
					'pro_url'=>mvc::$cfg['urls']['yp'].$v['url'].'cn.html',
					'pro_name'=>$v['pa_name'],
					'pic'=>[],
					'num'=>[['factory'=>$v['factory'], 'display'=>$v['display']]],
					'pro_price'=>['title'=>'销售价', 'price'=>'0.00'],
					
				];
				if(!empty($locationArr[$pro['pro_id']]) && stripos($pro['pro_name'], '(') === false)
					$pro['pro_name'] .= '('.implode(';', $locationArr[$pro['pro_id']]).')';

				if(strlen($v['model_des']) > 20)
					$pro['model_des'] = $v['model_des'];
				if(in_array('para', $typeArr))
				{
					$paraRes = $this->getProductPara($v['pid'], $v['partid']);
					$pro['para'] = !empty($paraRes['data'])? $paraRes['data']:[];
					$pro['parastr'] = !empty($paraRes['data'])? '':$v['remark'];
				}

				if(!empty($v['fname']))
					$pro['pic'] = [mvc::$cfg['urls']['ypPic'].'ProFile/Image/'.$v['path'].'/'.$v['fname'].'.jpg'];
				$proArr[$v['pid']] = $pro;
			}
			$proIdArr = array_keys($proArr);
			if(empty($proIdArr)) return LibFc::ReturnData(true, $proArr);
			
			if(in_array('picAll', $typeArr))
			{
				foreach($proArr as $k=>$v)
				{
					$proArr[$k]['pic'] = [];
				}
				$res = $this->get('yp_files_pro_pic', ['dataid', 'path', 'name'], sprintf(" and dataid in(%s) order by seq", implode(',', $proIdArr)));
				foreach($res['data'] as $v)
				{
					$proArr[$v['dataid']]['pic'][] = mvc::$cfg['urls']['ypPic'].'ProFile/Image/'.$v['path'].'320/'.$v['name'].'.jpg';
				}
			}
		}
		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;
		$filed = ['case when n.fid = 770 then 1 else 0 end as oe, case when om.name is not null then om.name else f.factory end as factory, n.display'];
		$table = 'yp_number AS n JOIN yp_factory AS f ON n.fid=f.fid LEFT JOIN yp_oe_make AS om ON om.oe_make_id=n.oe_make_id';
		switch($type)
		{
			case 'main':
				$res = $this->get($table, $filed, sprintf(" and n.ismain=1 and n.pid = %d ORDER BY f.factory, n.format limit %d, %d", $proId, ($page-1)*$per, $per));
				$arr = $res['data'];
			break;
			case 'oe':
				$res = $this->get($table, $filed, sprintf(" and n.fid=770 and n.pid = %d ORDER BY f.factory, n.format limit %d, %d", $proId, ($page-1)*$per, $per));
				$arr = $res['data'];
			break;
			case 'ref':
				$res = $this->get($table, $filed, sprintf(" and n.fid !=770 and n.pid = %d ORDER BY f.factory, n.format limit %d, %d", $proId, ($page-1)*$per, $per));
				$arr = $res['data'];
			break;
			default:
				$res = $this->get($table, $filed, sprintf(" and n.pid = %d ORDER BY f.factory, n.format limit %d, %d", $proId, ($page-1)*$per, $per));
				$arr = $res['data'];
			break;
		}
		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 getProductPara($pid, $partId, $lang = 1)
	{
		$pid = (int) $pid;
		$partId = (int) $partId;
		$lang = (int) $lang;
		$para = [];
		if($pid > 0 && $partId > 0)
		{
			$ParaVal = array();
			$ParaVal2 = array();

			$FiledArr = $lang == 1? ['labelid, cn_value as value'] : ['labelid, value'];

			$Res = $this->get('yp_para_float_link', ['labelid, value'], sprintf(" AND pid=%d", $pid));
			foreach($Res['data'] as $V)
			{
				$ParaVal[$V['labelid']] = $V;
			}

			$Res = $this->get('yp_para_string_link', $FiledArr, sprintf(" AND pid=%d", $pid));
			foreach($Res['data'] as $V)
			{
				$ParaVal2[$V['labelid']] = $V;
			}

			$Table = 'yp_para_part_label_link AS ppll
			JOIN yp_para_label AS pl ON ppll.labelid = pl.labelid
			JOIN yp_lng_des as ld ON ld.desid = pl.desid AND ld.lngid = '.$lang.'
			JOIN yp_lng_text as lt ON lt.txtid = ld.txtid
			LEFT JOIN yp_para_unit AS pu ON ppll.unitid = pu.unitid';
			$Res = $this->get($Table, ['ppll.labelid, lt.txt as name, pu.name as uname'], sprintf(" AND ppll.partid=%d ORDER BY ppll.seq", $partId));
			foreach($Res['data'] as $V)
			{
				if(!empty($ParaVal[$V['labelid']]))
				{
					$V['uname'] = empty($V['uname']) ? '': $V['uname'];
					$para[] = ['name'=>$V['name'], 'val'=>$ParaVal[$V['labelid']]['value'], 'unit'=>$V['uname']];
				}
				else if(!empty($ParaVal2[$V['labelid']]))
				{
					$V['uname'] = empty($V['uname']) ? '': $V['uname'];
					if($V['uname'] != 'mmLocation')
						$para[] = ['name'=>$V['name'], 'val'=>$ParaVal2[$V['labelid']]['value'], 'unit'=>$V['uname']];
				}
			}
		}
		return LibFc::ReturnData(true, $para);
	}


	/**
	  * @method 获取产品的宜配适用车型
	  * @param  $proIdArr int|array  支持直接传产品ID
	  * @author soul
	  * @copyright 2016/3/30
	  * @return array(3) { ["status"]=> bool(true) ["data"]=>["code"]=> int(0) } 
	  */
	public function getYpcModelId($proIdArr)
	{
		$arr = [];
		$proIdArr = is_array($proIdArr)? $proIdArr: [$proIdArr];
		foreach($proIdArr as $k=>$v)
		{
			$proIdArr[$k] = (int) $v; 
		}
		$proIdArr = array_unique($proIdArr);
		
		if(empty($proIdArr)) return LibFc::ReturnData(true, $arr);
		$res = $this->get('yp_number as n join yp_factory as f on n.fid=f.fid', ['factory, display'], sprintf(" and pid in (%s)", implode(',', $proIdArr)));
		if(!empty($res['data']))
		{
			$YpcModel = new YpcModel();
			$res = $YpcModel->getM3idByNum($res['data']);
			$arr = $res['data'];
		}

		$mres = $this->get('yp_tcd_model3_pro_link AS pm JOIN yp_tcd_model3 AS m ON pm.model3_id = m.model3_id', ['distinct from_id as typ_id'], sprintf(" and pid in (%s) and from_id > 0", implode(',', $proIdArr)));
		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'], 'typ_id'))));
			$arr = array_merge($arr, array_column($res['data'], 'mtl_m3_id'));
		}
		return LibFc::ReturnData(true, array_unique($arr));
	}



	/**
	  * @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 = 'yp_tcd_model3_pro_link AS m3p 
		JOIN yp_tcd_model_engine_link AS mel ON m3p.model3_id=mel.model_last_id  
		JOIN yp_tcd_engine2 AS e2 ON e2.engine2_id=mel.engine_last_id';
		$res = $this->get($table, ['m3p.model3_id, e2.name'], sprintf(" and m3p.pid= %d order by e2.name", $proId));
		$TypeEng = [];
		foreach($res['data'] as $v)
		{
			$TypeEng[$v['model3_id']][$v['name']] = $v['name'];
		}

		$table = 'yp_tcd_model3_pro_link as m3p
		join yp_tcd_model3 as m3 on m3p.model3_id = m3.model3_id
		left join yp_tcd_model3_info as m3i on m3.model3_id=m3i.model3_id
		join yp_tcd_model2 as m2 on m2.model2_id= m3.model2_id
		join yp_make as m on m.make_id=m3.make_id';
		$filed = ['m.make_id, m.desid as mdesid, m2.desid as m2desid, m3.desid as m3mdesid, m3.model3_id AS mod3_id, m3.start_year as mod3_start_year, m3.end_year as mod3_end_year, "" as mod3_engine, kw as mod3_kw, cylinder as mod3_cylinder,cc as mod3_cc,m3.style as mod3_body'];
		$mres = $this->get($table, $filed, sprintf(" and m3p.pid= %d", $proId));
		if(!empty($mres['data']))
		{
			foreach($mres['data'] as $v)
			{
				$desidArr[] = $v['mdesid'];
				$desidArr[] = $v['m2desid'];
				$desidArr[] = $v['m3mdesid'];
			}
			$lres = $this->getLang($desidArr, 1);
			$langArr = $lres['data'];
			foreach($mres['data'] as $v)
			{
				$v['make_name'] = $langArr[$v['mdesid']];
				$v['mod2_name'] = $langArr[$v['m2desid']];
				$v['mod3_name'] = trim(str_replace($v['mod2_name'], '', $langArr[$v['m3mdesid']]));
				$v['mod3_engine'] = !empty($TypeEng[$v['mod3_id']])? implode(';', $TypeEng[$v['mod3_id']]): '';
				unset($v['mdesid']);unset($v['m2desid']); unset($v['m3mdesid']);
				$arr[] = $v;
			}
		}
		return LibFc::ReturnData(true, $arr);
	}

	/**
	  * @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, $typIdArr = [])
	{
		foreach($proIdArr as $k=>$v)
		{
			$proIdArr[$k] = (int)$v;
		}
		$arr = [];
		if(!empty($proIdArr))
		{
			if(!empty($typIdArr))
			{
				foreach($typIdArr as $k=>$v)
				{
					$typIdArr[$k] = (int)$v;
				}

				$res = $this->get('yp_tcd_model_para_link', ['pid, value'], sprintf(" and label_id=1 and pid in (%s) and carid in (%s) group by pid, value order by value", implode(',', $proIdArr), implode(',', $typIdArr)));
				foreach($res['data'] as $v)
				{
					$arr[$v['pid']][] = $v['value'];
				}
			}

			$noIdArr = array_diff($proIdArr, array_keys($arr));
			//产品参数补齐
			if(!empty($noIdArr))
			{
				$res = $this->get('yp_para_string_link psl join yp_para_label pl on psl.labelid = pl.labelid', ['psl.pid, cn_value as value'], sprintf(" and pl.name = 'Location' and pid in (%s) group by pid, value order by value", implode(',', $noIdArr)));
				foreach($res['data'] as $v)
				{
					$arr[$v['pid']][] = $v['value'];
				}
			}

			$noIdArr = array_diff($proIdArr, array_keys($arr));
			//其它车型位置补齐
			if(!empty($noIdArr))
			{
				$res = $this->get('yp_tcd_model_para_link', ['pid, value'], sprintf(" and label_id=1 and pid in (%s) group by pid, value order by value", implode(',', $noIdArr)));
				foreach($res['data'] as $v)
				{
					$arr[$v['pid']][] = $v['value'];
				}
			}
		}
		return LibFc::ReturnData(true, $arr);
	}
}