<?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']));
		if($params['mod']) $where['psy_mod'] = $params['mod'];
		$rows = $this->db->select('pro_synlog', '*', $where);
		if(!$rows) $rows = [];
		return $rows;
	}
	
	
	//商品详情
	public function getProductInfoBySyn($pidArr){
		
		$fields = ['p_id','p_oe_id','p_oe', 'p_comnum', 'p_innum', 'p_tb_id', 'tb_cn_name p_tb_name', '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_engine_xj','p_cc', 'p_cc_xj','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','oe_oe', 'oef.pf_name oe_pf_name','p_weight'
		];
		$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 tag_brand on tb_id = p_tb_id 
		LEFT JOIN pro_factory oef ON oe_pf_id = oef.pf_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`
		LEFT 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_id in (#ids#) GROUP BY p_id ORDER BY FIELD(p_id, #ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		$proArr = [];
		$oeIdArr = [];
		foreach($rows as $v){
			$oeIdArr[$v['p_oe_id']] = $v['p_id'];
			$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'=>[],
				'packs'=>[],
				'pairArr'=>[],
				'fatherArr'=>[],
				'sonArr'=>[]
			];
		}
		if(empty($proArr)) return $proArr;
		
		//汽车品牌
		$sqltpl ="SELECT 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 
		JOIN pro ON ptb_p_id = p_id OR p_lnk_p_id = ptb_p_id
		WHERE p_id in (#ids#) order by tb_cn_name";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$p_id = $row['p_id'];
			unset($row['p_id']);
			$proArr[$p_id]['tb_brands'][] = $row;
		}

		//参数
		$fields = ['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
		JOIN pro ON ppv_p_id = p_id OR p_lnk_p_id = ppv_p_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 p_id in (#ids#) ORDER BY FIELD(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 p_id, pn_pf_id, pf_name, pn_number, pn_mk_id, o13.cn_name pn_from, case when pn_id = p_main_pn_id then 1 else 0 end pn_ismain, pn_isborrow, au_name, pn.update_time pn_update_time FROM `pro_numidx` pn
		JOIN pro ON pn_p_id = p_id OR p_lnk_p_id = pn_p_id
		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 p_id in (#ids#) ORDER BY FIELD(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];
				}
			}
			$key= $row['pf_name'].$row['pn_number'];
			//去重一下
			if(!$proArr[$row['p_id']]['nums'][$key]){
				$proArr[$v['p_id']]['nums'][$key] = [
					'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_isborrow'=>$row['pn_isborrow'],
					'pn_from'=>$row['pn_from'],
					'pn_update_time'=>$row['pn_update_time']
				];
			}
			
		}
		foreach ($proArr as &$item) {
			if (!empty($item['nums'])) {
				$item['nums'] = array_values($item['nums']);
			} else {
				$item['nums'] = []; // 确保即使没有号码也返回空数组
			}
		}
		unset($item);
		//国际车型
		/*$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 p_id, pml_mm_id mm_id, pml_remark,pml_para FROM `pro_model_link` JOIN pro ON pml_p_id = p_id OR p_lnk_p_id = pml_p_id WHERE p_id in (#ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			//$proArr[$row['p_id']]['model'][] = $row['mm_id'];
			$proArr[$row['p_id']]['model'][] = ['mm_id'=>$row['mm_id'], 'pml_remark'=>$row['pml_remark'], 'pml_para'=>$row['pml_para']];
		}

		//中国车型
		/*$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 p_id, pml_mod3_id mod3_id, pml_remark FROM `pro_model_cn_link` JOIN pro ON pml_p_id = p_id OR p_lnk_p_id = pml_p_id WHERE p_id in (#ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			//$proArr[$row['p_id']]['cnmodel'][] = $row['mod3_id'];
			$proArr[$row['p_id']]['cnmodel'][] = ['mod3_id'=>$row['mod3_id'], 'pml_remark'=>$row['pml_remark']];
		}
		//包装方案
		$sqltpl = "SELECT pp_id, pp_p_id,pp_name,pp_default,pp_type,pp_com_id,pp_pack_style,
		pp_pack_status,pp_out_remark,pp_craft,pp_lettering_imgs,pp_lettering_files,pp_per_carton,pp_per_bag,pp_per_box,pp_per_pallet_box,pp_per_pallet_layer,pp_per_pallet_volume,pp_weight_carton,pp_weight_bag,pp_weight_box,company.com_cn_name as pp_com_name,cn_name as pp_craft_name
		from pro_pack 
		join company on pp_com_id = com_id
		left join object o1170 on pp_craft = o1170.o_id
		where pp_p_id in (#ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);

		if($rows)
		{	
			$ppIdArr = array_column($rows,'pp_id');
			//获取子材
			$materialArr = [];
			$sqltpl = "SELECT ppm.ppm_pp_id,ppm.ppm_count,ppm.ppm_remark,ppm.ppm_imgs,pmb.pmb_incode,pam.pam_cn_name as pam_name,pam.pam_material_type,o1168.cn_name as pam_material_type_name,pam.pam_length,pam.pam_width,pam.pam_height,pam.pam_spec,pam.pam_pat_id,pat.pat_cn_name as pat_name,pb_cn_name as pb_name,pb_id FROM pro_pack_material as ppm
			JOIN pack_material_brand as pmb on ppm.ppm_pmb_id = pmb.pmb_id
			JOIN pack_material as pam on pmb.pmb_pam_id = pam.pam_id
			LEFT JOIN object as o1168 on pam.pam_material_type = o1168.o_id
			LEFT JOIN pack_type as pat on pam.pam_pat_id = pat.pat_id
			LEFT JOIN pro_brand on pmb.pmb_pb_id = pb_id
			WHERE ppm_pp_id IN (#ids#)";
			$materialRows = $this->getSqlDataByIds($sqltpl, $ppIdArr);
			if($materialRows)
			{
				$fileIds = array_filter(array_column($materialRows, 'ppm_imgs'));
				$fileInfoArr = $this->getJsonPicture($fileIds);

				foreach ($materialRows as $row) {
					$fileinfo = [];
					if (!empty($row['ppm_imgs'])) {
						$fileIds = json_decode($row['ppm_imgs'], true);
						if (is_array($fileIds) && !empty($fileIds)) {
							foreach ($fileIds as $fileId) {
								if (isset($fileInfoArr[$fileId])) {
									$fileinfo[] = \mvc::$cfg['urls']['outfiles'].'/'.$fileInfoArr[$fileId]['filename'];
								}
							}
						}
					}
					$row['ppm_imgs'] = $fileinfo;
					$materialArr[$row['ppm_pp_id']][] = $row;
				}
			}
			//子零件
			$sonProArr = [];
			$sqltpl = "SELECT pps.*,p.p_innum FROM pro_pack_sonpro pps
			JOIN pro p on pps.pps_p_id = p.p_id WHERE pps_pp_id IN (#ids#)";

			$sonProRows = $this->getSqlDataByIds($sqltpl, $ppIdArr);

			if($sonProRows)
			{
				foreach ($sonProRows as $val) {
					$sonProArr[$val['pps_pp_id']][$val['pps_p_id']] = [
						'p_innum'=>$val['p_innum'],
						'pps_count'=>$val['pps_count']
					];
				}
			}
				
			//包装图片
			$fileIds = array_filter(array_column($rows, 'pp_lettering_imgs'));
			$fileInfoArr = $this->getJsonPicture($fileIds);

			//附件
			$attachmentIds = array_filter(array_column($rows, 'pp_lettering_files'));
			$attachmentInfoArr =  $this->getJsonPicture($attachmentIds);

			foreach($rows as $row){
				$fileinfo = [];
				if (!empty($row['pp_lettering_imgs'])) {
					$fileIds = json_decode($row['pp_lettering_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = \mvc::$cfg['urls']['outfiles'].'/'.$fileInfoArr[$fileId]['filename'];
							}
						}
					}
				}

				//附件
				$attachmentInfo = [];
				if (!empty($row['pp_lettering_files'])) {
					$fileIds = json_decode($row['pp_lettering_files'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($attachmentInfoArr[$fileId])) {
								$attachmentInfo[] = \mvc::$cfg['urls']['outfiles'].'/'.$attachmentInfoArr[$fileId]['filename'];
							}
						}
					}
				}
				$row['pp_lettering_files'] = $attachmentInfo;

				$row['pp_lettering_imgs'] = $fileinfo;
				$row['sonpro'] = $sonProArr[$row['pp_id']]?array_values($sonProArr[$row['pp_id']]):[];
				$row['material'] = $materialArr[$row['pp_id']]??[];

				$proArr[$row['pp_p_id']]['packs'][] = $row;
			}
		}

		//关联零件
		if($oeIdArr)
		{		
			//配对商品（关联数据）
			foreach ($oeIdArr as $oe_id => $p_id) {
				list($proArr[$p_id]['pairArr'],$proArr[$p_id]['fatherArr'],$proArr[$p_id]['sonArr']) = $this->getProPairData($oe_id);
			}
		}

		// 适用国家
		$sqltpl = "SELECT p_id, cc_code FROM `pro` 
		LEFT JOIN crm_country_link ON (p_oe_id = cl_value_id AND cl_type = 'poe') 
		JOIN crm_country ON (cl_cc_id = cc_id) 
		WHERE p_id in (#ids#)
		ORDER BY cc_seq,cc_code";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$proArr[$row['p_id']]['country'][] = $row['cc_code'];
		}

		// 事业部商品数据
		$sqltpl = "SELECT plc_p_id, plc_id,plc_com_id FROM pro_link_company WHERE plc_p_id in (#ids#)";
		$rows = $this->getSqlDataByIds($sqltpl, $pidArr);
		foreach($rows as $row){
			$proArr[$row['plc_p_id']]['productComp'][] = [
				'plc_id' => $row['plc_id'],
				'com_id' => $row['plc_com_id'],
			];
		}
		return array_values($proArr);
	}


	public function getProPairData($oe_id)
	{
		$sql = sprintf("SELECT ol_type,p_id,p_item_type,p_oe,p_oe_format,p_".LG_NAME." as p_name,pb_".LG_NAME." as pb_name,pf_name,files.filepath,files.filebasename, files.fileextname
		FROM oe_link 
		JOIN pro ON ol_oe_id2 = p_oe_id
		LEFT JOIN pro_factory ON p_pf_id = pf_id
		LEFT JOIN pro_brand ON p_pb_id = pb_id
		LEFT JOIN files ON p_pic = fileid 
		WHERE ol_type IN ('pair','father','son') AND ol_oe_id1=%d", $oe_id);
		$pairArr = $this->db->query($sql)->fetchAll();
		
		$arr = [];
		if($pairArr)
		{
			$collocation = new collocation();
			foreach ($pairArr as &$val) {
				
				$val['p_item_type_name'] = $collocation->getRowByKey($val['p_item_type'])[cateName()];
				$val['smallImg'] = '';
				$val['bigImg'] = '';
				if($val['filepath']){
					$val['bigImg'] = rtrim(\mvc::$cfg['urls']['outfiles'],'/').'/'.$val['filepath'].'/'.$val['filebasename'].'big.'.$val['fileextname'];
					$val['smallImg'] = rtrim(\mvc::$cfg['urls']['outfiles'],'/').'/'.$val['filepath'].'/'.$val['filebasename'].'small.'.$val['fileextname'];
				}
				unset($val['filepath'],$val['filebasename'],$val['fileextname']);
				$arr[$val['ol_type']][] = $val;
			}
			unset($val);
		}
		return [$arr['pair'],$arr['father'],$arr['son']];
	}
	
	//国际车型库
	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, ms_pc, ms_cv, 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_gpc','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);
		$brandArr = [];
		$makeArr = [];
		if($arr){
			$tbids = array_column($arr,'tb_id');
			//中国品牌
			$tbcArr = $this->db->select('tag_brand_cnbrand(tbc)',['[><]m_cn_model(mcm)'=>['tbc.tbm_brand_id'=>'brand_id']],['tbc.*','brand_name'],['tbm_tb_id'=>$tbids]);
			foreach ($tbcArr as $tval) {
				$brandArr[$tval['tbm_tb_id']][$tval['tbm_brand_id']] = [
					'brand_id'=>$tval['tbm_brand_id'],
					'brand_name'=>$tval['brand_name']
				];
			}
			//国际生产商
			$tbcArr = $this->db->select('tag_brand_make(tbm)',['[><]m_make(mk)'=>['tbm.tbm_mk_id'=>'mk_id']],['tbm.*','mk_cn_name'],['tbm_tb_id'=>$tbids]);
			foreach ($tbcArr as $tval) {
				$makeArr[$tval['tbm_tb_id']][$tval['tbm_mk_id']] = [
					'mk_id'=>$tval['tbm_mk_id'],
					'mk_name'=>$tval['mk_cn_name']
				];
			}
		}
		foreach($arr as $k=>$v){
			$v['prl_codes'] = $link[$v['tb_id']]? $link[$v['tb_id']]: [];
			$v['make_lists'] = $makeArr && $makeArr[$v['tb_id']]?array_values($makeArr[$v['tb_id']]):[];
			$v['brand_lists'] = $brandArr[$v['tb_id']]?array_values($brandArr[$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;
	}

	private function getJsonPicture($fileIds)
	{
		$fileInfoArr = [];
		if (!empty($fileIds)) {
			// 展开所有JSON格式的文件ID数组
			$allFileIds = [];
			foreach ($fileIds as $fileIdJson) {
				$ids = json_decode($fileIdJson, true);
				if (is_array($ids) && !empty($ids)) {
					$allFileIds = array_merge($allFileIds, $ids);
				}
			}
			$allFileIds = array_unique($allFileIds);
			
			if (!empty($allFileIds)) {
				// 一次性获取所有文件信息
				$files = $this->db->select('files', 
					['fileid', 'filename'], 
					['fileid' => $allFileIds]
				);
				$fileInfoArr = array_column($files, null, 'fileid');
			}
		}
		return $fileInfoArr;
	}

	/**
	 * @param  Array $params
	 * @method 更新商品基础信息
	 * @author zhengweihua 
	 * @copyright 2025-12-18
	 */
	public function updateProBase($params)
	{	
		$innums = formatNums($params['innum']);
		
		$updateFields = [];
		// 检查是否有重量参数
		if (isset($params['p_weight'])) {
			$updateFields['p_weight'] = floatval($params['p_weight']);
		}
		
		// 检查是否有重量单位参数
		if (isset($params['p_weight_unit'])) {
			$unitArr = $this->db->select('object',['o_id','en_name'],['o_parent_id'=>7]);
			$unitArr = array_column($unitArr, 'o_id', 'en_name');
			$updateFields['p_weight_unit'] = $unitArr[$params['p_weight_unit']];
			if(!$updateFields['p_weight_unit']){
				exitJson(-1,'无效的重量单位参数');
			}
		}
		
		// 如果没有任何要更新的字段，则返回错误
		if (empty($updateFields)) {
			exitJson(-1,'请提供要更新的字段 (p_weight 或 p_weight_unit)');
		}
		$pidArr = $this->db->select('pro','p_id',['p_innum_format'=>$innums]);
		if($pidArr){
			$this->db->update('pro', $updateFields, ['p_id' => $pidArr]);
		}
		return [];			
	}

	/**
	 * @param  Array $params
	 * @method
	 * @author zhengweihua 
	 * @copyright 2025-12-18
	 */
	public function updateMaterialBase($params)
	{
		$innums = formatNums($params['innum']);
		
		$updateFields = [];
		// 检查是否有重量参数
		if (isset($params['pam_weight'])) {
			$updateFields['pam_weight'] = floatval($params['pam_weight']);
		}
		
		// 检查是否有重量单位参数
		if (isset($params['pam_weight_unit'])) {
			$unitArr = $this->db->select('object',['o_id','en_name'],['o_parent_id'=>7]);
			$unitArr = array_column($unitArr, 'o_id', 'en_name');
			$updateFields['pam_weight_unit'] = $unitArr[$params['pam_weight_unit']];
			if(!$updateFields['pam_weight_unit']){
				exitJson(-1,'无效的重量单位参数');
			}
		}
		
		// 如果没有任何要更新的字段，则返回错误
		if (empty($updateFields)) {
			exitJson(-1,'请提供要更新的字段 (p_weight 或 p_weight_unit)');
		}
		$pamidArr = $this->db->select('pack_material_brand','pmb_pam_id',['pmb_incode'=>$innums,'GROUP'=>['pmb_pam_id']]);
		if($pamidArr){
			$this->db->update('pack_material', $updateFields, ['pam_id' => $pamidArr]);
		}
		return [];	
	}


	/**
	 * @param  Array $params 物料编码，多个用逗号分隔（可选），数量，页码
	 * @author zhengweihua 
	 * @copyright 2026-02-27
	 */
	public function getMaterialList($params)
	{
		$page = empty($params['page'])? 1: (int) $params['page'];
		$page_size = empty($params['page_size'])? 500: (int) $params['page_size'];
		$where = [];
		if($params['incode']){
			$where['pmb_incode'] = array_unique(array_filter(explode(',',$params['incode'])));
		}
		
		$table = 'pack_material_brand(pmb)';
		$join = [
            '[><]pro_brand(pb)'=>['pmb.pmb_pb_id'=>'pb_id'],
            '[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id'],
            '[><]pack_type(pat)'=>['pam.pam_pat_id'=>'pat_id']
        ];
		$total =  $this->db->count($table,$join,'*',$where);

		$where['LIMIT'] = [($page-1)*$page_size, $page_size];
		$fields = ['pmb.*','pam.*','pat_'.LG_NAME.'(pat_name)','pat_size_unit','pb_'.LG_NAME.'(pb_name)'];
        $rows = $this->db->select($table,$join,$fields,$where);

		if($rows)
        {   

            $fileIds = array_filter(array_column($rows, 'pmb_imgs'));
			$fileInfoArr = [];
			
			if (!empty($fileIds)) {
				// 展开所有JSON格式的文件ID数组
				$allFileIds = [];
				foreach ($fileIds as $fileIdJson) {
					$ids = json_decode($fileIdJson, true);
					if (is_array($ids) && !empty($ids)) {
						$allFileIds = array_merge($allFileIds, $ids);
					}
				}
				$allFileIds = array_unique($allFileIds);
				
				if (!empty($allFileIds)) {
					// 一次性获取所有文件信息
					$files = $this->db->select('files', 
						['fileid', 'filename'], 
						['fileid' => $allFileIds]
					);
					$prefix = \mvc::$cfg['urls']['outfiles'].'/';
					foreach($files as &$file) {
						$file['filename'] = $prefix . $file['filename'];
					}
					$fileInfoArr = array_column($files, 'filename', 'fileid');
				}
			}

            $objectArr = [];
            $oArr = $this->db->select('object',['o_id','o_parent_id',LG_NAME.'(o_name)','en_name'],['o_parent_id'=>[7,2,1168]]);
            if($oArr){
                foreach ($oArr as $key => $val) {
                    $objectArr[$val['o_id']] = $val;
                }
            }

            //查找关联的属性
            $mattrArr = [];

            $pamids = array_column($rows,'pmb_pam_id');
            $mattr = $this->db->select('pack_material_attributes(pma)',
			[
				'[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id'],
				'[><]object(o1169)'=>['paa.paa_attcat'=>'o_id']
			],['pma_pam_id','paa_'.LG_NAME.'(paa_name)','paa_id','paa_attcat',LG_NAME.'(attcat_name)'],['pma.pma_pam_id'=>$pamids]);
			if($mattr){
                foreach ($mattr as $key => $val) {
         
                    $mattrArr[$val['pma_pam_id']]['attcat'.$val['paa_attcat']] = [
						'name'=>$val['attcat_name'],
						'value'=>$val['paa_name']
					];
                }
            }
            foreach($rows as &$v){
                
				$v['attributes'] = $mattrArr[$v['pmb_pam_id']]?array_values($mattrArr[$v['pmb_pam_id']]):[];
                $decimalFields = ['pam_length', 'pam_width', 'pam_height','pam_weight'];
				foreach ($decimalFields as $field) {
					if (isset($v[$field]) && is_numeric($v[$field])) {
						// 如果是浮点数且小数部分为0，则转换为整数
						if (strpos($v[$field], '.') !== false) {
							$v[$field] = rtrim(rtrim($v[$field], '0'), '.');
						}
					}
				}

                $fileinfo = [];
				if (!empty($v['pmb_imgs'])) {
					$fileIds = json_decode($v['pmb_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = $fileInfoArr[$fileId];
							}
						}
					}
				}
                $v['pat_size_unit'] = $objectArr[$v['pat_size_unit']]['en_name']?:'';
                $v['pmb_imgs'] = $fileinfo;

                $v['pam_material_type'] =  $objectArr[$v['pam_material_type']]['o_name']??'';
				$v['pam_weight_unit'] =  $objectArr[$v['pam_weight_unit']]['o_name']??'';
                $v['pam_invoice_unit'] =  $objectArr[$v['pam_invoice_unit']]['o_name']??'';
                $v['pam_pat_name'] = $v['pat_name'];
                $v['pmb_pb_name'] = $v['pb_name'];
                $v['pmb_status'] = $v['pmb_status']==-1 ? '停用':'启用';
				unset($v['pam_id'],$v['pam_imgs'],$v['pam_opuser'],$v['pam_update_time'],$v['pam_create_time']);
            }
        }
		return [
			'total'=>$total,
			'items'=>$rows
		];
	}
	/**
	 * @param  Array $params 商品物料编码 根据物料编码获取包装方案列表
	 * @author zhengweihua 
	 * @copyright 2026-02-27
	 */
	public function getProPackList($params)
	{
		$p_innum = $params['p_innum'];
		
		if(!$p_innum) exitJson(-1,'请提供物料编码参数');
		$p_innumArr = array_filter(array_unique(explode(',',$p_innum)));
		$table = 'pro_pack(pp)';
		$join = [
			'[><]company(com)' => ['pp.pp_com_id' => 'com_id'],
            '[>]object(o1170)' => ['pp.pp_craft' => 'o_id'],
            '[><]pro(p)'=>['pp.pp_p_id'=>'p_id'],
		];
		$where = ['p.p_innum_format'=>$p_innumArr];
		$fields = ['pp.*','com.com_cn_name(pp_com_name)', 'o1170.cn_name(pp_craft_name)','p.p_innum'];
		$rows = $this->db->select($table,$join,$fields,$where);
		if($rows)
        {
			$ppIdArr = array_column($rows, 'pp_id');

			//获取子材
			$materialArr = [];
			$sqltpl = "SELECT ppm.ppm_pp_id,ppm.ppm_count,ppm.ppm_remark,pam_id,
			ppm.ppm_imgs,pmb.pmb_incode,pam.pam_comcode,
			pam.pam_cn_name as pam_name,
			pam.pam_material_type,pb.pb_cn_name as pb_name,pb.pb_id,
			o1168.cn_name as pam_material_type_name,
			pam.pam_length,pam.pam_width,pam.pam_height,pam.pam_spec,
			pam.pam_pat_id,pat.pat_cn_name as pat_name 
			FROM pro_pack_material as ppm
			JOIN pack_material_brand as pmb on ppm.ppm_pmb_id = pmb.pmb_id
			JOIN pack_material as pam on pmb.pmb_pam_id = pam.pam_id
			JOIN pro_brand as pb on pmb.pmb_pb_id = pb.pb_id
			LEFT JOIN object as o1168 on pam.pam_material_type = o1168.o_id
			LEFT JOIN pack_type as pat on pam.pam_pat_id = pat.pat_id
			WHERE ppm_pp_id IN (#ids#)";
			$materialRows = $this->getSqlDataByIds($sqltpl, $ppIdArr);
			if($materialRows)
			{	

				$pamids = array_column($materialRows,'pam_id');
				//获取关联的属性
				$attrArr = $this->db->select('pack_material_attributes(pma)',
				[
					'[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id'],
					'[><]object(o)'=>['paa.paa_attcat'=>'o_id']
				],
				['pma_id','pma_paa_id','pma_pam_id','paa_cn_name(paa_name)','paa_attcat','o.'.LG_NAME.'(o_name)'],
				['pma_pam_id'=>$pamids]);
				$attrObjectArr = [];
				if($attrArr){
					foreach ($attrArr as $key => $val) {
						$attrObjectArr[$val['pma_pam_id']][] =[
							'name'=>$val['o_name'],
							'value'=>$val['paa_name']
						];
					}
				}
		
				$fileIds = array_filter(array_column($materialRows, 'ppm_imgs'));
				$fileInfoArr = $this->getJsonPicture($fileIds);

				foreach ($materialRows as $row) {
					$fileinfo = [];
					if (!empty($row['ppm_imgs'])) {
						$fileIds = json_decode($row['ppm_imgs'], true);
						if (is_array($fileIds) && !empty($fileIds)) {
							foreach ($fileIds as $fileId) {
								if (isset($fileInfoArr[$fileId])) {
									$fileinfo[] = \mvc::$cfg['urls']['outfiles'].'/'.$fileInfoArr[$fileId]['filename'];
								}
							}
						}
					}
					$row['attributes'] = $attrObjectArr[$row['pam_id']]??[];
					$row['ppm_imgs'] = $fileinfo;
					$materialArr[$row['ppm_pp_id']][] = $row;
				}
			}

			//子零件数据
			$sonProArr = [];
			$sqltpl = "SELECT pps.*,p_comnum,p_innum,p_id,p_oe,p_".LG_NAME." as p_name,pb_".LG_NAME." as pb_name,pb.pb_id,cat.".cateName()." as p_cate 
			FROM pro_pack_sonpro pps
			JOIN pro p on pps.pps_p_id = p.p_id 
			JOIN pro_brand pb on p.p_pb_id = pb.pb_id
			JOIN pro_cate cat on p.p_cate = cat.id
			WHERE pps_pp_id IN (#ids#)";

			$sonProRows = $this->getSqlDataByIds($sqltpl, $ppIdArr);

			if($sonProRows)
			{
				$pidArr = array_column($sonProRows,'p_id');
				$imgs = [];
				$join = ["[><]files"=>["pic_fileid"=>'fileid']];
				$picrows = $this->db->select('pro_pic',$join,'*',['pic_p_id'=>$pidArr,'pic_ismain'=>1,'pic_type'=>'img']);
				foreach ($picrows as  $pic) {
					$imgs[$pic['pic_p_id']] = \mvc::$cfg['urls']['outfiles'].'/'.$pic['filename'];
				}
				
				foreach($sonProRows as &$v){

					$v['main_pic'] = $imgs[$v['p_id']]??'';
					$sonProArr[$v['pps_pp_id']][] = $v;
				}
				unset($v);
			}
				
			//包装图片
			$fileIds = array_filter(array_column($rows, 'pp_lettering_imgs'));
			$fileInfoArr = $this->getJsonPicture($fileIds);
			//附件
			$attachmentIds = array_filter(array_column($rows, 'pp_lettering_files'));
			$attachmentInfoArr = $this->getJsonPicture($attachmentIds);
			foreach($rows as &$row){
				$fileinfo = [];
				if (!empty($row['pp_lettering_imgs'])) {
					$fileIds = json_decode($row['pp_lettering_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = \mvc::$cfg['urls']['outfiles'].'/'.$fileInfoArr[$fileId]['filename'];
							}
						}
					}
				}

				//附件
				$attachmentInfo = [];
				if (!empty($row['pp_lettering_files'])) {
					$fileIds = json_decode($row['pp_lettering_files'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($attachmentInfoArr[$fileId])) {
								$attachmentInfo[] =\mvc::$cfg['urls']['outfiles'].'/'.$attachmentInfoArr[$fileId]['filename'];
							}
						}
					}
				}
				$row['pp_lettering_files'] = $attachmentInfo;
				$row['pp_lettering_imgs'] = $fileinfo;
				$row['sonpro'] = $sonProArr[$row['pp_id']]?array_values($sonProArr[$row['pp_id']]):[];
				$row['material'] = $materialArr[$row['pp_id']]??[];
		
			}
			unset($row);
        }	
		return $rows;
	}
}