<?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
{
	//同步日志
	public function getSynLog($params)
	{
		$where = ['psy_create_time[>=]'=>date('Y-m-d H:i:s', strtotime($params['start_time']))];
		if($params['end_time']) $where['psy_create_time[<=]'] = date('Y-m-d H:i:s', strtotime($params['end_time']));
		$rows = $this->db->select('pro_synlog', '*', $where);
		if(!$rows) $rows = [];
		return $rows;
	}
	
	
	
	public function getProductInfoBySyn($pidArr){
		
		$fields = ['p_id', 'p_oe', 'p_comnum', 'p_innum', 'p_standard_name', 'o1.cn_name p_item_type_name', 'p_item_type', 'o2.cn_name p_unit_name', 'p_unit', 'o3.cn_name cat_unit_customs_name', 'cat_unit_customs', 'o5.cn_name p_fuel_type_name', 'p_fuel_type', 'o16.cn_name p_material_name', 'p_material',
			'p_cate', 'cat.cn_name cat_name', 'cat.cat_from_id', 'p_state_main', 'p_state_remark', 
			'pb_id', 'pb_cn_name pb_name', 'pb_from_id',
			'cm_id', 'cm_cn_name cm_name', 'cm_from_id',
			'p_iskit','p_chassis','p_model_year','p_engine','p_cc','cat_hsbm p_hsbm','cat_ktsl p_ktsl','cat_invoice p_invoice','p_features','p_isdevelop', 'o17.cn_name p_develop_status_name', 'p_develop_status', 'pc1.pc_name p_source_province', 'pc2.pc_name p_source_city',
			'p_developno', 'oe_etk_info p_etk_info', 'epa_partitem p_etk_partitem', 'p_pos1', 'p_pos2', 'p_pos3', 'p_pos4', 'p_pos5','p_from_id','p_seqno','oe_amount'
		];
		$fields = langFields($fields, 'p_');
		$fields = langFields($fields, 'oe_');
		$fields = langFields($fields, 'p_model_');
		$fields = langFields($fields, 'p_des_');
		$sqltpl ="SELECT ".implode(',', $fields)."
		FROM `pro` p 
		JOIN oe_item ON p_oe_id = oe_id
		LEFT JOIN etk_partitem ON oe_etk_epa_id = epa_id
		JOIN pro_brand ON pb_id = p_pb_id
		LEFT JOIN cd_make ON cm_id = p_cm_id
		JOIN `pro_cate` cat ON p.`p_cate`=cat.`id`
		JOIN `pro_ext` pe ON p_id = pe_p_id
		LEFT JOIN object o1 ON o1.o_id = p_item_type
		LEFT JOIN object o2 ON o2.o_id = p_unit
		LEFT JOIN object o3 ON o3.o_id = cat_unit_customs
		LEFT JOIN object o5 ON o5.o_id = p_fuel_type
		LEFT JOIN object o16 ON o16.o_id = p_material
		LEFT JOIN object o17 ON o17.o_id = p_develop_status
		LEFT JOIN province_city pc1 ON pc1.pc_id = p_source_province_id
		LEFT JOIN province_city pc2 ON pc2.pc_id = p_source_city_id
		LEFT JOIN (SELECT pde_p_id, GROUP_CONCAT(pde_number) p_developno FROM `pro_developno` GROUP BY pde_p_id) t on t.pde_p_id = p_id
		WHERE p_pb_id = 1 and p_id in (#ids#) GROUP BY p_id ORDER BY FIELD(p_id, #ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		$proArr = [];
		foreach($rows as $v){
			$proArr[$v['p_id']] = [
				'p_id'=>$v['p_id'],
				'p_comnum'=>$v['p_comnum'],
				'p_innum'=>$v['p_innum'],
				'base'=>$v,
				'tb_brands'=>[],
				'params'=>[],
				'nums'=>[],
				'model'=>[],
				'cnmodel'=>[]
			];
		}

		if(empty($proArr)) return $proArr;
		
		//汽车品牌
		$sqltpl ="SELECT ptb_p_id, tb_id, tb_cn_name tb_name, tb_from_ids FROM pro_tag_brand join tag_brand on tb_id = ptb_tb_id WHERE ptb_p_id in (#ids#) order by tb_cn_name";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$p_id = $row['ptb_p_id'];
			unset($row['ptb_p_id']);
			$proArr[$p_id]['tb_brands'][] = $row;
		}

		//参数
		$fields = ['ppv_p_id p_id', 'ptpa_id', 'ptpa_type', 'ptpa_unit', 'ptpa_decimal', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string', 'ptpa_col_order'];
		$fields = langSqlFields($fields, 'pa.', 'ptpa_', true);
		$fields = langSqlFields($fields, 'pps.', 'ppv_val_', true);
		$fields = langSqlFields($fields, 'ppsu.', 'ptpa_unit_', true);
		$sqltpl ="SELECT ".implode(',', $fields)."  FROM `pro_param_val` pv
		JOIN part_param pa ON ptpa_id = ppv_ptpa_id
		LEFT JOIN part_param_sche pps ON ((pps.pps_ptpa_id = ptpa_id AND ppv_val_string = pps.cn_name) or (pps.pps_ptpa_id = ptpa_pid and pps_id = ppv_val_int))
		LEFT JOIN part_param_sche ppsu ON ppsu.pps_ptpa_id = 0 and ptpa_unit = ppsu.cn_name
		WHERE ppv_p_id in (#ids#) ORDER BY FIELD(ppv_p_id, #ids#), ptpa_col_order";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$p_id = $row['p_id'];
			$row['ppv_val'] = $row['ppv_val_string'];
			if($row['ptpa_type'] == 'int'){
				$row['ppv_val'] = $row['ppv_val_int'];
			}else if($row['ptpa_type'] == 'double'){
				$row['ppv_val'] = floatval(number_format($row['ppv_val_double'], $row['ptpa_decimal'],".",""));
			}
			unset($row['ptpa_decimal']);
			unset($row['ppv_val_int']);
			unset($row['ppv_val_double']);
			unset($row['ppv_val_string']);
			unset($row['ptpa_col_order']);
			unset($row['p_id']);
			$proArr[$p_id]['params'][] = $row;
		}

		//号码
		$sqltpl ="SELECT pn_p_id p_id, pn_pf_id, pf_name, pn_number, pn_mk_id, o13.cn_name pn_from,pn_ismain, au_name, pn.update_time pn_update_time FROM `pro_numidx` pn
		JOIN `pro_factory` ON pf_id = pn_pf_id
		LEFT JOIN adm_user ON au_id = pn.opuser
		LEFT JOIN object o13 ON o13.o_id = pn_from
		WHERE pn_type = 'none' AND pn_is_sys = 0 and pn_p_id in (#ids#) ORDER BY FIELD(pn_p_id, #ids#), pf_name, pn_formart";
		$numrows = $this->getSqlDataByIds($sqltpl, $pidArr);
		$mkIdArr = [];
		foreach($numrows as $row){
			if(!empty($row['pn_mk_id'])){
				$mkIdArr = array_merge($mkIdArr, explode(',', $row['pn_mk_id']));
			}
		}
		$mkArr = [];
		if($mkIdArr){
			$mkIdArr = array_unique($mkIdArr);
			$rows = $this->db->select('m_make', ['mk_id', 'mk_cn_name', 'mk_en_name'], ['mk_id'=>$mkIdArr]);
			$mkArr = array_column($rows, null, 'mk_id');
		}
		
		foreach($numrows as $row){
			$row['pn_mk'] = [];
			if(!empty($row['pn_mk_id'])){
				foreach(explode(',', $row['pn_mk_id']) as $mkid){
					if($mkArr[$mkid]) $row['pn_mk'][] = $mkArr[$mkid];
				}
			}
			$proArr[$v['p_id']]['nums'][] = [
				'pn_pf_id'=>$row['pn_pf_id'],
				'pf_name'=>$row['pf_name'],
				'pn_number'=>$row['pn_number'],
				'pn_mk'=>$row['pn_mk'],
				'au_name'=>$row['au_name'],
				'pn_ismain'=>$row['pn_ismain'],
				'pn_from'=>$row['pn_from'],
				'pn_update_time'=>$row['pn_update_time']
			];
		}

		//国际车型
		/*$sqltpl ="SELECT pml_id, pml_p_id p_id, mk_id, mk_cn_name, mk_en_name, ms_id,ms_name, mm_id, mm_name, mm_year_from, mm_month_from, mm_year_to,mm_month_to,mm_engine, mm_kw,mm_hp,mm_fuel,mm_cc,mm_cylinders, mm_drive,mm_body, mm_doors FROM `pro_model_link` 
		JOIN m_model mm ON mm_id = pml_mm_id
		JOIN m_series ms ON mm.mm_ms_id=ms_id
		JOIN m_make mk ON mm.mm_mk_id=mk_id
		WHERE pml_p_id in (#ids#) ORDER BY FIELD(pml_p_id, #ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$proArr[$row['p_id']]['model'][] = $row;
		}*/
		$sqltpl ="SELECT pml_p_id p_id, pml_mm_id mm_id FROM `pro_model_link` WHERE pml_p_id in (#ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$proArr[$row['p_id']]['model'][] = $row['mm_id'];
		}

		//中国车型
		/*$sqltpl ="SELECT pml_id, pml_p_id p_id, mod3_id,brand_id,brand_name,make_id,make_name,mod1_id,mod1_name,mod2_id,mod2_name,mod2_start_year,mod2_end_year,mod2_pc,mod2_cv,mod3_name,mod3_start_year,mod3_start_month,mod3_end_year,mod3_end_month,mod3_kw,mod3_cc,mod3_engine,mod3_transmission,mod3_fuel,mod3_body,mod3_front_brake,mod3_rear_brake,mod3_parking_brake,mod3_drive FROM `pro_model_cn_link` 
		JOIN `m_cn_model` mo ON mod3_id = pml_mod3_id
		WHERE pml_p_id in (#ids#) ORDER BY FIELD(pml_p_id, #ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			unset($row['']);
			$proArr[$row['p_id']]['cnmodel'][] = $row;
		}*/
		$sqltpl ="SELECT pml_p_id p_id, pml_mod3_id mod3_id FROM `pro_model_cn_link` WHERE pml_p_id in (#ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$proArr[$row['p_id']]['cnmodel'][] = $row['mod3_id'];
		}

		return array_values($proArr);
	}
	
	//国际车型库
	public function getModel($params){
		$page = empty($params['page'])? 1: (int) $params['page'];
		$page_size = empty($params['page_size'])? 500: (int) $params['page_size'];
		$sql = sprintf("SELECT mk_id, mk_cn_name, mk_en_name, ms_id, ms_name, mm_id, mm_name, mm_year_from, mm_month_from, mm_year_to,mm_month_to, mm_engine, mm_kw,mm_hp,mm_fuel,mm_cc,mm_cylinders, mm_drive,mm_body, mm_doors FROM m_model mm
		JOIN m_series ms ON mm.mm_ms_id=ms_id
		JOIN m_make mk ON mm.mm_mk_id=mk_id order by mm_id limit %d, %d", ($page-1)*$page_size, $page_size);
		return [
			'total'=>$this->db->count('m_model'),
			'items'=>$this->db->query($sql)->fetchAll(),
		];
	}
	
	//中国车型库
	public function getCnModel($params){
		$page = empty($params['page'])? 1: (int) $params['page'];
		$page_size = empty($params['page_size'])? 500: (int) $params['page_size'];
		$sql = sprintf("SELECT mod3_id,brand_id,brand_name,make_id,make_name,mod1_id,mod1_name,mod2_id,mod2_name,mod2_start_year,mod2_end_year,mod2_pc,mod2_cv,mod3_name,mod3_start_year,mod3_start_month,mod3_end_year,mod3_end_month,mod3_kw,mod3_cc,mod3_engine,mod3_transmission,mod3_fuel,mod3_body,mod3_front_brake,mod3_rear_brake,mod3_parking_brake,mod3_drive from m_cn_model order by mod3_id limit %d, %d", ($page-1)*$page_size, $page_size);
		return [
			'total'=>$this->db->count('m_cn_model'),
			'items'=>$this->db->query($sql)->fetchAll()
		];
	}

	//小类
	public function getAllCate(){
		$fields = ['id cat_id', 'parent_id cat_parent_id', 'is_engine', 'keyword cat_keyword', 'cat_from_id', 'cat_pos1', 'cat_pos2', 'cat_pos3', 'cat_pos4', 'cat_pos5', 'cat_prouni_material','prl.prl_code_a cat_code'];
		$fields = langSqlFields($fields, '', '', true);
		$sql ="SELECT ".implode(',', $fields)."  FROM pro_cate cat
		LEFT JOIN pro_rule_link prl ON cat.id = prl_val_id and prl_type='cate' and prl_pb_id=1";
		return $this->db->query($sql)->fetchAll();
	}

	//获取关联属性
	public function getObject($o_parent_id){
		$fields = ['o_id'];
		$fields = langSqlFields($fields, '', '');
		return $this->db->select('object', $fields, ['o_parent_id'=>$o_parent_id]);
	}

	//获取汽车品牌
	public function getTbBarnd(){
		$link = [];
		$sql = "SELECT prl_val_id tb_id, pb_id, pb_cn_name, pb_from_id, prl_code_a FROM `pro_rule_link` JOIN `pro_brand` ON pb_id = prl_pb_id WHERE prl_type='brand' order by tb_id, pb_id";
		$rows = $this->db->query($sql)->fetchAll();
		foreach($rows as $row){
			$tb_id = $row['tb_id'];
			unset($row['tb_id']);
			$link[$tb_id][] = $row;
		}
		$fields = ['tb_id', 'tb_from_ids'];
		$fields = langSqlFields($fields, 'tb_', 'tb_');
		$arr = $this->db->select('tag_brand', $fields);
		foreach($arr as $k=>$v){
			$v['prl_codes'] = $link[$v['tb_id']]? $link[$v['tb_id']]: [];
			$arr[$k] = $v;
		}
		return $arr;
	}

	public function getPbBarnd(){
		$fields = ['pb_id', 'pb_code_rule', 'pb_from_id', 'com_id', 'com_code', 'com_cn_name'];
		$fields = langSqlFields($fields, 'pb_', 'pb_', true);
		$sql ="SELECT ".implode(',', $fields)."  FROM pro_brand LEFT JOIN company on com_id = pb_company";
		return $this->db->query($sql)->fetchAll();
	}
	
	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;
	}
}