<?php
namespace model\pro;
use \model\pro\cate;
use \model\pro\factory;
use \model\pro\param;
use \model\pro\paramset;
use \model\carmodel;
use \model\tags;
use \model\pro\pro;
use \model\pro\numidx;
use \model\pro\promodel;
use \model\collocation;
class product extends \model
{
	//通过各种条件查找产品ID  ['gsp_num', ]
	/*{
	gsp_no:,
	base:{
	p_update_time_nums（号码列表最近变动时间含删除）、pt_en_name、pt_en_name、gsp_image(主图)、p_id、p_num_old(其他号码)、p_num_old_noabs(其他号码)、p_remark1(产品备注)、p_ver、p_update_time、p_status(on是上架产品，否则都是要删除)
	}
	merge:Array{
	pm_from_num(合并的gsp号码)、pm_create_time
	}
	nums:Array{
	n_factory、n_number_format、n_number、n_remark1、n_remark2、n_update_time
	}
	}*/
    public function searchProListByRca($params)
	{
		$proArr = [];
		$pro = new pro();
		if(!empty($params['gsp_num']))
		{
			$pidArr = $pro->chkProIdByAny(['innum'=>$params['gsp_num'], 'outnum'=>$params['gsp_num']]);
		}
		else
		{
			$page = empty($params['page'])? 1: (int) $params['page'];
			$page_size = empty($params['page_size'])? 1: (int) $params['page_size'];
			if(!in_array($params['time_type'], ['create_time', 'update_time'])) return $proArr;
			$tfiled = $params['time_type'];
			$sql = sprintf("select p_id from pro where %s >= '%s' and %s <= '%s' order by p_id limit %d, %d",
				$tfiled, date('Y-m-d H:i:s', strtotime($params['start_time'])),$tfiled, date('Y-m-d H:i:s', strtotime($params['end_time'])), ($page-1)*$page_size, $page_size);
			
			$rows = $this->db->query($sql)->fetchAll();
            if(!empty($rows))
				$pidArr = array_column($rows, 'p_id');
		}
		if(!empty($pidArr))
		{
			$sqltpl ="SELECT cat.`cn_name` pt_cn_name, cat.`en_name` pt_en_name, p_id, p_pic, p_innum p_num_old, p_comnum gsp_no,p_innum_abs p_num_old_noabs, p_remark p_remark1, p_state_main, p.update_time p_update_time
			FROM `pro` p 
			JOIN `pro_cate` cat ON p.`p_cate`=cat.`id`
			WHERE p_id in (#ids#) ORDER BY FIELD(p_id, #ids#)";
			$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
			$tags = new \model\tags();
			$tagArr = $tags->getTypeValTags('pro', $pidArr);
			$tagArr = array_column($tagArr, 'tags', 'tl_value_id');
			foreach($resArr as $k=>$row)
			{
				$p_id = $row['p_id'];
				$row['gsp_image'] = '';
				if(!empty($row['p_pic']))
					$row['gsp_image'] = \mvc::$cfg['urls']['outfiles'].'/pro/catalog_gsp/'.($row['p_id'] % 100).'/'.$row['p_id'].'big.jpg';

				$row['p_update_time_nums'] = $row['p_update_time'];
				$row['p_ver'] = !empty($tagArr[$p_id]) && in_array(8, array_column($tagArr[$p_id], 't_id'))? 4: 0;
				$row['p_status'] = in_array($row['p_state_main'],['Y5','Y6'])? '': 'on';
				
				$prow = [
					'gsp_no'=>$row['gsp_no'],
					'base'=>$row,
					'nums'=>[],
					'merge'=>[]
				];

				$sql = sprintf("SELECT fac.pf_name n_factory,pn_formart n_number_format, pn_number n_number,
					p_state_main,co.cn_name co_cn_name,pn_cn_remark,co.en_name co_en_name,pn_en_remark,
					num.update_time n_update_time
					FROM `pro_numidx` num
					JOIN pro on p_id = pn_p_id
					left join object co on o_id = ckresult2 and o_parent_id = 24
					JOIN `pro_factory` fac ON num.pn_pf_id = fac.pf_id
					JOIN tags_link ON tl_type = 'number' AND tl_value_id = pn_id
					WHERE pn_type = 'none' and pn_is_sys = 0 and tl_t_id > tl_t_id ^ 8  and pn_p_id = %d ORDER BY pf_name, pn_formart", $p_id);
				$tdata = $this->db->query($sql)->fetchAll();
				if(!empty($tdata))
				{
					//$reArr = ['L'=>'1','I'=>'1', 'O'=>'0'];
					$reArr = [];
					foreach($tdata as $v)
					{
						$v['n_number_format'] = strtr($v['n_number_format'], $reArr);
						$v['n_remark1'] = sprintf("[%s;%s]%s", $v['p_state_main'], $v['co_cn_name'], $v['pn_cn_remark']);
						$v['n_remark2'] = sprintf("[%s;%s]%s", $v['p_state_main'], $v['co_en_name'], $v['pn_en_remark']);
						$prow['nums'][] = $v;
					}
				}

				$tdata = $pro->getMergeFrom($p_id);
				if(!empty($tdata))
				{
					$temp = [];
					foreach($tdata as $v)
					{
						$temp[$v['pch_p_id_from']] = ['pm_from_num'=>$v['p_comnum'], 'pm_create_time'=>$v['cktime3']];
					}
					$prow['merge'] = array_values($temp);
				}
				$proArr[$p_id] = $prow;
			}
		}
		return array_values($proArr);
	}


	public function searchProduct($params, $filter = [])
	{
		if(empty($filter['rules'])) $filter['rules'] = [];
		$page = empty($params['page'])? 1: (int) $params['page'];
		$page_size = empty($params['page_size'])? 1: (int) $params['page_size'];
		$proArr = [];
		$where = '';
		$hasFlag = false;
		$order = 'order by p_id';
		if(!empty($params['gsp_num']))
		{
			$pro = new pro();
			$pidArr = $pro->chkProIdByAny(['innum'=>$params['gsp_num'], 'outnum'=>$params['gsp_num']]);
			if(empty($pidArr)) return $proArr;
			$where .= sprintf(" and p_id in ('%s')", implode(',', $pidArr));
			$hasFlag = true;
		}
		else if(in_array($params['time_type'], ['create_time', 'update_time']))
		{
			$hasFlag = true;
			$tfiled = $params['time_type'];
			$order = 'order by p_id';
			$where .= sprintf(" and p.%s >= '%s' and p.%s <= '%s'",
				$tfiled, date('Y-m-d H:i:s', strtotime($params['start_time'])),$tfiled, date('Y-m-d H:i:s', strtotime($params['end_time'])));
		}else if($page_size>1){
			$hasFlag = true;
		}

		if(!$hasFlag) return $proArr;

		foreach($filter['rules'] as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'state':
					$where .= sprintf(" and p_state_main in ('%s')", implode("','", $val));
				break;
				case 'cate':
					$where .= sprintf(" and p_cate in (%s)", implode(',', $val));
				break;
				case 'tags':
					$tl_t_id = addXor($val, 0);
					$where .= sprintf(" and p_id in (SELECT distinct tl_value_id FROM tags_link WHERE tl_type = 'pro' and tl_t_id <= %d)", $tl_t_id);
				break;
				case 'area':
					$where .= sprintf(" and p_id in (SELECT distinct pml_p_id FROM pro_model_area_link JOIN pro_model_link ON pml_id = pma_pml_id WHERE pma_ma_id in (%s))", implode(',', $val));
				break;
				case 'source':
					$where .= sprintf(" and p_id in (SELECT DISTINCT pml_p_id FROM pro_model_link JOIN m_model_source ON mms_mm_id = pml_mm_id WHERE mms_source in (%s))", implode(',', $val));
				break;
			}
		}
		$sql = sprintf("select p_id from pro as p join p_code as pc on p.p_id = pc.pc_id where 1 %s %s limit %d, %d", $where, $order, ($page-1)*$page_size, $page_size);
		$rows = $this->db->query($sql)->fetchAll();
        if(!empty($rows))
		{
			$pidArr = array_column($rows, 'p_id');
			$filter['number']['ckremark2'] = NUMIDX_CKRESULT2_OK;
			$proArr = $this->getProAll($pidArr, $params['block'], $filter);
		}
		return $proArr;
	}

	public function getProAll($pidArr, $blockArr = [], $filter = [])
	{
		$allBolck = ["base","params","nums","model","cnmodel","merge","father","son","sample"];
		if(empty($blockArr) || !is_array($allBolck)) $blockArr = $allBolck;
		$proArr = [];
		if(empty($pidArr)) return $pidArr;

		$rows = $this->getProBase($pidArr, $filter);
		foreach($rows as $v)
		{
			$proArr[$v['p_id']] = [
				'p_comnum'=>$v['p_comnum'],
				'p_innum'=>$v['p_innum'],
			];

			foreach($blockArr as $block)
			{
				if($block == 'base')
				{
					$proArr[$v['p_id']][$block] = $v;
				}
				else if(in_array($block, $allBolck))
				{
					$proArr[$v['p_id']][$block] = [];
				}
			}
		}
		$pidArr = array_keys($proArr);
		foreach($blockArr as $block)
		{
			$rows = [];
			switch($block)
			{
				case 'params':
					$rows = $this->getProParams($pidArr);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'nums':
					$rows = $this->getProNumber($pidArr, $filter);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'model':
					$rows = $this->getProModel($pidArr, $filter);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'cnmodel':
					$rows = $this->getProCnModel($pidArr);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'merge':
					$rows = $this->getProMerge($pidArr);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'father':
					$rows = $this->getProFather($pidArr);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'son':
					$rows = $this->getProSon($pidArr);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
				case 'sample':
					$rows = $this->getProSample($pidArr);
					foreach($rows as $v)
					{
						$proArr[$v['p_id']][$block][] = $v;
					}
				break;
			}
		}
		return array_values($proArr);
	}

	/**
	 * 产品基本信息
     * @param $pidArr array [1,2,3...]
     * @return array
     */
	public function getProBase($pidArr, $filter = [])
	{
		$sqltpl ="SELECT pcat.`cn_name` pcat_cn_name, pcat.`en_name` pcat_en_name, cat.`cn_name` cat_cn_name, cat.`en_name` cat_en_name, p_id, p_cate, p_pic, p_innum, p_comnum, p_innum_abs, p_remark, p_state_main,p_state_sub,p_sales_qty, p_lineimg, p.create_time p_create_time, p.update_time p_update_time, cat.cat_cnpos, s_id, s_plmseq
		FROM `pro` p 
		JOIN `pro_cate` cat ON p.`p_cate`=cat.`id`
		JOIN `pro_cate` pcat ON cat.parent_id = pcat.id
		left JOIN sample sam ON sam.s_p_id = p_id
		WHERE p_id in (#ids#) GROUP BY p_id ORDER BY FIELD(p_id, #ids#)";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($resArr as $k=>$row)
		{
			if(!empty($filter['rules']['area']))
			{
				$tsql = sprintf("SELECT pf_name, pcn_number, ma.en_name ma_en_name, ma.cn_name ma_cn_name FROM p_code_number JOIN pro_factory ON pf_id = pcn_pf_id JOIN m_area ma ON ma_id = pcn_ma_id where pcn_ma_id in (%s) and pcn_pc_id=%d", implode(',', $filter['rules']['area']), $row['p_id']);
				$trows = $this->db->query($tsql)->fetchAll();
				$row['areanum'] = $trows;
				if(empty($row['areanum'])) $row['areanum'] = [];
			}

			$row['g_pic'] = '';
			if(!empty($row['p_pic']))
			{
				$row['p_pic'] = \mvc::$cfg['path']['files'].'/pro/catalog_gsp/'.($row['p_id'] % 100).'/'.$row['p_id'].'big.jpg';
				$row['g_pic'] = \mvc::$cfg['path']['files'].'/pro/catalog_g/'.($row['p_id'] % 100).'/'.$row['p_id'].'big.jpg';
			}
			if(!empty($row['p_lineimg']))
				$row['p_lineimg'] = \mvc::$cfg['path']['files'].'/pro/lineimg/'.$row['p_lineimg'];
			$row['cat_cnpos'] = json_decode($row['cat_cnpos'], true);
			if(!is_array($row['cat_cnpos'])) $row['cat_cnpos'] = [];
			$resArr[$k] = $row;
		}
		return $resArr;
	}

	//合并记录
	public function getProMerge($pidArr)
	{
		$data = [];
		$pro = new \model\pro\pro();
		foreach($pidArr as $p_id)
		{
			$pchids = $pro->getMergeHistory($p_id);
			if(!empty($pchids))
			{
				$sql = sprintf("SELECT `pcatf`.`cn_name` AS `pcat_namef`,`catf`.`en_name` AS `cat_namef`,`prof`.`p_innum` AS `p_innumf`,`prof`.`p_comnum` AS `p_comnumf`,`prot`.`p_innum` AS `p_innumt`,`prot`.`p_comnum` AS `p_comnumt`, ckuser3, cktime3, pch.remark FROM `pro_merge` AS `pch` 
				LEFT JOIN `pro` AS `prof` ON `pch`.`pch_p_id_from` = `prof`.`p_id` 
				INNER JOIN `pro_cate` AS `catf` ON `prof`.`p_cate` = `catf`.`id` 
				INNER JOIN `pro_cate` AS `pcatf` ON `catf`.`parent_id` = `pcatf`.`id` 
				LEFT JOIN `pro` AS `prot` ON `pch`.`pch_p_id_to` = `prot`.`p_id` WHERE `pch_id` IN (%s)", implode(',', $pchids));
				$rows = $this->db->query($sql)->fetchAll();
				foreach($rows as $v)
				{
					$v['p_id'] = $p_id;
					$data[] = $v;
				}
			}
		}
		return $data;
	}

	/**
	 * 父配件
     * @param $pidArr array [1,2,3...]
     * @return array
     */
	public function getProFather($pidArr)
	{
		$sqltpl ="SELECT pf_son_pid p_id,p_innum pf_innum, p_comnum pf_outnum, p_innum_abs pf_innum_abs
		FROM `pro_fatherson` fs
		JOIN `pro` p  ON p_id = fs.pf_father_pid
		WHERE pf_son_pid IN (#ids#) ORDER BY FIELD(p_id, #ids#)";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		return $resArr;
	}

	/**
	 * 子配件
     * @param $pidArr array [1,2,3...]
     * @return array
     */
	public function getProSon($pidArr)
	{
		$sqltpl ="SELECT pf_father_pid p_id,p_innum ps_innum, p_comnum ps_outnum, p_innum_abs ps_innum_abs
		FROM `pro_fatherson` fs
		JOIN `pro` p  ON p_id = fs.pf_son_pid
		WHERE pf_father_pid IN (#ids#) ORDER BY FIELD(p_id, #ids#)";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		return $resArr;
	}
	

	//产品参数
	public function getProParams($pidArr)
	{
		$data = [];
		$param = new \model\pro\param();
		foreach($pidArr as $p_id)
		{
			$rows = $param->getProParamByPid($p_id);
			foreach($rows as $v)
			{
				$v['p_id'] = $p_id;
				$data[] = $v;
			}
		}
		return $data;
	}
	

	/**
	 * 产品交叉号
     * @param $pidArr array [1,2,3...]
     * @return array
     */
	public function getProNumber($pidArr, $filter = [])
	{
		$twhere = '';
		if(!empty($filter['rules']['tags']))
		{
			$tl_t_id = addXor($filter['rules']['tags'], 0);
			$twhere .= sprintf(" and pn_id in (SELECT distinct tl_value_id FROM tags_link WHERE tl_type = 'number' and tl_t_id <= %d)", $tl_t_id);
		}
		if(!empty($filter['number']['ckremark2']))
		{
			$twhere .= sprintf(" and num.ckremark2 = %d", $filter['number']['ckremark2']);
		}
		$sqltpl ="SELECT p_id,fac.pf_id, fac.pf_name,pn_id, pn_pf_id, pn_number, pn_mk_id,pn_src,pn_cn_remark,pn_en_remark,pn_ref,pn_merge_remark
		FROM `pro_numidx` num
		JOIN `pro` p  ON p_id = num.pn_p_id
		JOIN `pro_cate` cat ON p.`p_cate`=cat.`id`
		JOIN `pro_cate` pcat ON cat.parent_id = pcat.id
		JOIN `pro_factory` fac ON num.pn_pf_id = fac.pf_id
		WHERE pn_type = 'none' and pn_is_sys = 0 and p_id in (#ids#) ".$twhere." ORDER BY FIELD(p_id, #ids#), pf_name, pn_formart";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		/*$numidx = new numidx();
		$resArr = $numidx->fillProNumidx($resArr);*/
		return $resArr;
	}

	
	//产品国际车型
	public function getProModel($pidArr, $filter = [])
	{
		$twhere = '';
		if(!empty($filter['rules']['tags']))
		{
			$tl_t_id = addXor($filter['rules']['tags'], 0);
			$twhere .= sprintf(" and pml_id in (SELECT distinct tl_value_id FROM tags_link WHERE tl_type = 'promodel' and tl_t_id <= %d)", $tl_t_id);
		}

		if(!empty($filter['rules']['area']))
		{
			$twhere .= sprintf(" and pml_id in (SELECT distinct pma_pml_id FROM pro_model_area_link WHERE pma_ma_id in (%s))", implode(',', $filter['rules']['area']));
		}

		if(!empty($filter['rules']['source']))
		{
			$twhere .= sprintf(" and pml_mm_id in (SELECT distinct mms_mm_id FROM m_model_source WHERE mms_source in (%s))", implode(',', $filter['rules']['source']));
		}
		$sqltpl ="SELECT p_id,pml_mm_id mm_id,pml_id,pml_pos0,pml_pos1,pml_pos2,pml_pos3,pml_pos4,pml_pos5,pml_pos6,pml_node1,pml_node2,pml_node3,pml_node4,pml_quote_number,fac.pf_name pml_quote_pf_name,pml_quote_time,pml_merge_remark
		FROM `pro_model_link` pml
		JOIN `pro` p  ON p_id = pml.pml_p_id
		JOIN `pro_cate` cat ON p.`p_cate`=cat.`id`
		JOIN `pro_cate` pcat ON cat.parent_id = pcat.id
		LEFT JOIN `pro_factory` fac ON pml.pml_quote_pf_id = fac.pf_id
		WHERE p_id in (#ids#) ".$twhere." ORDER BY FIELD(p_id, #ids#)";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		return $resArr;
	}


	/**
	 * 产品中国查询
     * @param $pidArr array [1,2,3...]
     * @return array
     */
	public function getProCnModel($pidArr)
	{
		$sqltpl ="SELECT p_id, pml_mod3_id mod3_id,pml.pml_pos0, pml.pml_pos1, pml.pml_pos2, pml.pml_pos3, pml.pml_pos4, pml.pml_node1
		FROM `pro_model_cn_link` pml
		JOIN `pro` p  ON p_id = pml.pml_p_id
		JOIN `pro_cate` cat ON p.`p_cate`=cat.`id`
		JOIN `pro_cate` pcat ON cat.parent_id = pcat.id
		JOIN `m_cn_model` mo ON pml_mod3_id = mod3_id
		WHERE p_id in (#ids#) ORDER BY FIELD(p_id, #ids#),brand_initial,brand_name,make_name,mod1_name,mod2_name,mod2_start_year,mod3_name,mod3_start_year";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		return $resArr;
	}

	/**
	 * 产品 样品
     * @param $pidArr array [1,2,3...]
     * @return array
     */
	public function getProSample($pidArr)
	{
		$sqltpl ="SELECT s_p_id p_id, s_id, s_plmseq FROM sample WHERE s_p_id in (#ids#) ORDER BY FIELD(p_id, #ids#), s_id";
		$resArr = $this->getSqlDataByIds($sqltpl, $pidArr);
		return $resArr;
	}

	private function getSqlDataByIds($sqltpl, $ids, $per = 1000)
	{
		$resArr = [];
		$ids = array_unique($ids);
		$idcount = count($ids);
		$tidArr = [];
		foreach($ids as $k=>$pid)
		{
			$tidArr[] = (int) $pid;
			if(count($tidArr) == $per || ($k+1) == $idcount)
			{
				$sql = str_replace('#ids#', implode(',', $tidArr), $sqltpl);
				$rows = $this->db->query($sql)->fetchAll();
				foreach($rows as $row)
				{
					$resArr[] = $row;
				}
				$tidArr = [];
			}
		}
		return $resArr;
	
	}
}