<?php
namespace model\pro;
use \model;
use \model\pro\pro;
use \model\pro\factory;
use \model\pro\promodel;
use \model\pro\promodelcn;
use \model\pro\promodelna;
use \model\carmodel;
use \model\collocation;
use \model\excel;
use model\import\promasattaqty;

class master extends \model
{
	public $masAttaqtyNames = [
		'mas_attaqty_1'=>'Wheel Bearing',	
		'mas_attaqty_2'=>'Boot Kits',	
	];
	public function __construct()
	{
		parent::__construct();
		\mvc::loadConfig('master');
	}
	
	/**
		$params['partname'] == tecdoc|cate 默认cate
		//自定义模板导出
		$master = new \model\master();
		$master->export('self', '', ['sql'=>$sql, 'tpls'=>[]]);
	**/
	public function export($mainkey, $shkeys, $params = [])
	{
		set_time_limit(0);
	    ini_set('memory_limit', \mvc::$cfg['export_memory_limit']);
		$sheets = [];
		$rows = $this->db->select('m_make', ['mk_id', 'name']);
		$makeArr = array_column($rows, 'name', 'mk_id');
		$factory = new factory(); 
		$cfgArr = [];
		if($mainkey == 'self')
		{
			//来自报表模板
			if(!empty($shkeys))
			{
				$rows = $this->db->select('master_report(mr)', ['[><]master_tpl(mt)'=>['mr.mr_mt_id'=>'mt_id']], '*', ['mr_id'=>$shkeys]);
				foreach($rows as $cfg)
				{
					$cfg['sql'] = $cfg['mr_sql'];
					$cfg['name'] = $cfg['mr_name'];
					$cfgArr[] = $cfg;
				}
			}
			else
			{
				$rows = $this->db->select('master_tpl', '*', ['mt_id'=>explode(',', $params['mtids'])]);
				foreach($rows as $cfg)
				{
					$cfg = array_merge($cfg, $params);
					$cfg['name'] = $cfg['mt_name'];
					$cfgArr[] = $cfg;
				}
			}
			
			foreach($cfgArr as $skey=>$cfg)
			{
				$cfg['mt_tpl'] = json_decode($cfg['mt_tpl'], true);
				if(!empty($cfg['mt_tpl']['data'])){
					$dataRows = $cfg['mt_tpl']['data'];
					if(!empty($cfg['mt_tpl']['header'])) $cfg['header'] = $cfg['mt_tpl']['header'];
				}else{
					$dataRows = $cfg['mt_tpl'];
				}
				$hrows = $dataRows[0];
				$hrowkey = $dataRows[1]? $dataRows[1]: [];
				$cfg['cols'] = [];

				//竞品规则
				if(empty($cfg['pf_reg'])) $cfg['pf_reg'] = [];

				if(!empty($cfg['mt_tpl'][2][0]))
				{
					$country = new \model\country();
					$collocation = new \model\collocation();
					foreach(explode("\n", $cfg['mt_tpl'][2][0]) as $reg)
					{
						$rt = explode(":", $reg);
						if(empty($rt[0]) || empty($rt[1])) continue;
						$rval = $rt[1];
						switch($rt[0])
						{
							case '复审结论':
								$cfg['ckresult2'] = [];
								foreach(explode(',', $rval) as $tname)
								{
									$cfg['ckresult2'][] = $collocation->getOidByName($tname, 24);
								}
							break;
							case '包装区域':
								$cfg['packarea'] = $rval;
							break;
							case '交叉号适用国家':
								$ccids = $country->getCountryIdsByTxt($rval);
								$tdata = $country->formatDataCountry([['sale_coun_ids'=>$ccids]], 1);
								$cfg['numcountry'] = $tdata[0]['sale_coun_ids_end'];
							break;
							case '竞品号码':
								//['pf_id'=>2410, 'numreg'=>"pn_formart like 'VK%'"]
								//竞品号码:AUTOFREN SEINSA@优先非C结尾  竞品号码:AUTOFREN SEINSA@非C结尾(非C结尾)
								$tt = explode('@', $rval);
								$facid = $factory->getFacId($tt[0]);
								if($facid){
									if(preg_match('/非(.+)结尾/', $tt[1], $match))
									{
										$facreg = ['pf_id'=>$facid, 'numreg'=>"pn_formart NOT like '%{$match[1]}'"];
										if(stripos($tt[1], '优先') !== false) $facreg['youxian'] = 1;
										$cfg['pf_reg'][] = $facreg;
									}
								}
							break;
						}
					}
				}
				$cfg['pf_ids'] = [];
				//结论顺序:OK=>试下单=>需确认       橡胶件、悬挂件:OK=>需确认=>试下单  
				if(empty($cfg['ckresult2'])) $cfg['ckresult2'] = [10121,10120,10119];
				foreach($hrows as $tk=>$txt)
				{
					$txt = trim($txt);
					if(empty($txt)) continue;
					$colval = '';
					if(!empty($hrowkey[$tk])){
						$colval = $hrowkey[$tk];
						foreach(['fac_remark_', 'fac_make_', 'fac_'] as $btxt)
						{
							if(stripos($colval, $btxt) === 0){
								$facname = str_replace($btxt, '', $colval);
								$facid = $factory->getFacId($facname);
								if(!empty($facid)){
									$colval = $btxt.$facid;
									if(!in_array($facid, $cfg['pf_ids'])) $cfg['pf_ids'][] = $facid;
								}
								break;
							}
						}
					}
					$cfg['cols'][] = ['col'=>$txt, 'val'=>$colval];
				}
				$cfgArr[$skey] = $cfg;
			}
		}
		else
		{
			foreach(\mvc::$cfg['master'][$mainkey] as $sk=>$cfg)
			{
				if(!in_array($sk,  $shkeys)) continue;
				if($params['cat_name'] == 'tcd' && $cfg['val'] == 'cat_name') $cfg['cat_name'] = 'cat_name_tcd';
				$cfgArr[$sk] = $cfg;
			}
		}

		foreach($cfgArr as $sk=>$cfg)
		{
			$sheetArr = [];
			if(!is_array($cfg['paras']))
			{//参数字段
				$cfg['paras'] = [];
				foreach($cfg['cols'] as $ck=>$cv)
				{
					if(stripos($cv['val'], 'para_') === 0)
					{
						if($cv['val'] == 'para_abs_type') $cv['val'] = 'para_ABS Type';
						$cfg['paras'][] = substr($cv['val'], 5);
						$cfg['cols'][$ck]['val'] = strtolower(trim($cv['val']));
					}
				}
			}
			$cfg['paras'] = array_unique($cfg['paras']);
			
			if(!is_array($cfg['pmls']))
			{//通用库字段
				$cfg['pmls'] = [];
				foreach($cfg['cols'] as $ck=>$cv)
				{
					if(stripos($cv['val'], 'pml_') === 0)
						$cfg['pmls'][$cv['val']] = "GROUP_CONCAT(DISTINCT ".$cv['val'].") ".$cv['val'];
				}
			}

			if(!is_array($cfg['packs']))
			{//包装字段
				$cfg['packs'] = [];
				foreach($cfg['cols'] as $ck=>$cv)
				{
					if(stripos($cv['val'], 'pack_') === 0){
						$cfg['packs'][$cv['val']] = substr($cv['val'], 5);
					}
				}
			}
			
			//追加自动列
			if(!empty($cfg['pf_ids']))
			{
				$cfg['pf_ids'] = array_unique($cfg['pf_ids']);
				$rows = $this->db->select('pro_factory', ['pf_id', 'pf_name'], ['pf_id'=>$cfg['pf_ids'], 'ORDER'=>['pf_id'=>$cfg['pf_ids']]]);
				$facArr = array_column($rows, 'pf_name', 'pf_id');
				//重新整理列头
				$hascol = array_column($cfg['cols'], 'val');
				$newcols = [];
				foreach($cfg['cols'] as $ck=>$cv)
				{
					if(preg_match('/^fac\_(\d{1})$/', $cv['val'], $match)) unset($facArr[$match[1]]); 
					if(stripos($cv['val'], 'fac_auto') === 0)
					{
						foreach($facArr as $pfid=>$pfname)
						{
							if(in_array('fac_'.$pfid, $hascol)) continue;
							$newcols[] = ['col'=>$pfname, 'val'=>'fac_'.$pfid];
							if($cfg['cols'][$ck+1]['val'] == 'fac_auto_remark')
								$newcols[] = ['col'=>'Remark', 'val'=>'fac_remark_'.$pfid];
							unset($facArr[$pfid]);
						}
					}
					else
					{
						$newcols[] = $cv;
					}
				}
				$cfg['cols'] = $newcols;
			}
			
			//表头
			$sheetArr = [array_column($cfg['cols'], 'col')];
			$table = 'p_code cod 
			JOIN pro p ON p.p_id = cod.pc_id
			LEFT JOIN pro mp ON mp.p_id = pc_merge_p_id
			JOIN pro_cate cat ON cod.pc_cate=cat.id';
			$numTypeWhere = '';
			if($cfg['sql']){
				$where = sprintf(" and pc_id in (%s)", $cfg['sql']);
			}else{
				$where = sprintf(" and cod.pc_cate in (%s)", implode(',', $cfg['cate_ids']));
				if(!empty($cfg['where'])) $where .= $cfg['where'];
				//数据版本
				if(!empty($cfg['tags']))
				{
					$twhere = [];
					foreach($cfg['tags'] as $tid)
					{
						$twhere[] = sprintf(" tl_t_id > tl_t_id ^ %d", $tid);
					}
					$table .= " JOIN tags_link ON tl_value_id = pc_id AND tl_type = 'pro'";
					$where .= " AND (".implode(' OR ', $twhere).")";
					$numTypeWhere = " AND (".implode(' OR ', $twhere).")";
				}
			}
			
			//取数据
			$sql = sprintf("SELECT pc_id, pc_outnum, pc_state_main, p.p_vio, mp.p_comnum mp_outnum, cat.en_name cat_name, cat.as cat_name_tcd from %s where 1 %s GROUP BY pc_id order by cod.pc_cate, pc_outnum", $table, $where);
			$rows = $this->db->query($sql)->fetchAll();
			if(!empty($rows))
			{
				$proArr = [];
				foreach($rows as $k=>$v)
				{
					$proArr[$v['pc_id']] = $v;
				}
				$proArr = array_column($proArr, null, 'pc_id');
				$pids = array_keys($proArr);
				$pidstrs = implode(',', $pids);

				$country = new \model\country();
				$numOthWhere = '';
				if(!empty($cfg['numcountry']))
				{
					$twhere = $country->formatSearchWhere('number', ['country'=>implode(',', $cfg['numcountry'])], ['coutype'=>'and', 'backtype'=>'sql']);
					if($twhere['SQL_COUNTRY']) $numOthWhere = ' AND '.$twhere['SQL_COUNTRY'];
				}
				
				
				//竞品品牌
				if(!empty($cfg['pf_ids']) && !empty($cfg['ckresult2']))
				{
					$sql = sprintf("SELECT t1.* FROM (
					SELECT pn_p_id, pn_pf_id, pn_number,pn_mk_id, ckresult2, pn_en_remark pn_remark FROM pro_numidx
					JOIN tags_link ON tl_value_id = pn_id AND tl_type = 'number'
					WHERE pn_type='none' AND pn_p_id in (%s) AND pn_pf_id IN (%s) AND ckresult2 IN (%s) %s %s
					ORDER BY pn_p_id,pn_pf_id, FIELD(ckresult2, %s)
					) t1, (SELECT @i:=0) t	
					GROUP BY pn_p_id,pn_pf_id", $pidstrs, implode(",", $cfg['pf_ids']), implode(",", $cfg['ckresult2']), $numTypeWhere, $numOthWhere, implode(",", $cfg['ckresult2']));
					$rows = $this->db->query($sql)->fetchAll();
					if(!empty($rows))
					{
						foreach($rows as $rv)
						{
							$tm = [];
							foreach(explode(',', $rv['pn_mk_id']) as $tid)
							{
								if(!empty($makeArr[$tid])) $tm[] = $makeArr[$tid];
							}
							$proArr[$rv['pn_p_id']]['fac_'.$rv['pn_pf_id']] = $rv['pn_number'];
							$proArr[$rv['pn_p_id']]['fac_remark_'.$rv['pn_pf_id']] = $rv['pn_remark'];
							$proArr[$rv['pn_p_id']]['fac_make_'.$rv['pn_pf_id']] = implode(',', $tm);
						}
					}
				}

				//指定规则,替换前面的
				if(!empty($cfg['pf_reg']) && !empty($cfg['ckresult2']))
				{
					foreach($cfg['pf_reg'] as $rev)
					{
						if(empty($facreg['youxian']))
						{//只取符合规则的要置空，优先的规则不需要
							foreach($proArr as $pid=>$pv)
							{
								unset($pv['fac_'.$rev['pf_id']]);
								unset($pv['fac_remark_'.$rev['pf_id']]);
								unset($pv['fac_make_'.$rev['pf_id']]);
								$proArr[$pid] = $pv;
							}
						}
						$sql = sprintf("SELECT t1.* FROM (
						SELECT pn_p_id, pn_pf_id, pn_number, pn_mk_id, ckresult2, pn_en_remark pn_remark FROM pro_numidx
						JOIN tags_link ON tl_value_id = pn_id AND tl_type = 'number'
						WHERE pn_type='none'  AND pn_p_id in (%s) AND pn_pf_id =%d and %s AND ckresult2 IN (%s) %s %s 
						ORDER BY pn_p_id,pn_pf_id, FIELD(ckresult2, %s)
						) t1, (SELECT @i:=0) t	
						GROUP BY pn_p_id,pn_pf_id", $pidstrs, $rev['pf_id'], $rev['numreg'], implode(",", $cfg['ckresult2']), $numTypeWhere, $numOthWhere, implode(",", $cfg['ckresult2']));
						$rows = $this->db->query($sql)->fetchAll();
						if(!empty($rows))
						{
							foreach($rows as $rv)
							{
								$tm = [];
								foreach(explode(',', $rv['pn_mk_id']) as $tid)
								{
									if(!empty($makeArr[$tid])) $tm[] = $makeArr[$tid];
								}
								$proArr[$rv['pn_p_id']]['fac_'.$rv['pn_pf_id']] = $rv['pn_number'];
								$proArr[$rv['pn_p_id']]['fac_remark_'.$rv['pn_pf_id']] = $rv['pn_remark'];
								$proArr[$rv['pn_p_id']]['fac_make_'.$rv['pn_pf_id']] = implode(',', $tm);
							}
						}
					}
				}
				
				$colvals = array_column($cfg['cols'], 'val');
				//G号码
				if(in_array('g_outnum', $colvals))
				{
					$sql = sprintf("SELECT pcn_pc_id, pcn_number FROM p_code_number WHERE pcn_pf_id = 4 and pcn_pc_id IN (%s) GROUP BY pcn_pc_id", $pidstrs);
					$rows = $this->db->query($sql)->fetchAll();
					if(!empty($rows))
					{
						foreach($rows as $rv)
						{
							$proArr[$rv['pcn_pc_id']]['g_outnum'] = $rv['pcn_number'];
						}
					}
				}
				
				//参数
				if(!empty($cfg['paras']))
				{
					$join = ['[><]gsp_part_param(pp)'=>['pv.ppv_ptpa_id'=>'ptpa_id']];
					$rows = $this->db->select('gsp_pro_param_val(pv)', $join,['ppv_p_id', 'en_name', 'ppv_val_string'], ['en_name'=>$cfg['paras'], 'ppv_p_id'=>$pids]);
					if(!empty($rows))
					{
						foreach($rows as $rv)
						{
							$proArr[$rv['ppv_p_id']][strtolower(trim('para_'.$rv['en_name']))] = $rv['ppv_val_string'];
						}
					}
				}

				//父号码 father_outnum
				if(!empty(array_intersect(['father_hub', 'father_wbk'], $colvals)))
				{
					//父
					$srows = [];
					$sql = sprintf("SELECT pf_father_pid, p_id, p_comnum, en_name cat_name, p_cate FROM pro_fatherson JOIN pro ON pf_son_pid = p_id JOIN pro_cate ON p_cate = id WHERE pf_father_pid in(%s)", $pidstrs);
					$trows = $this->db->query($sql)->fetchAll();
					if(!empty($trows)) $srows = $trows;
					
					//子
					$sql = sprintf("SELECT pf_son_pid pf_father_pid, p_id, p_comnum, en_name cat_name, p_cate FROM pro_fatherson JOIN pro ON pf_father_pid = p_id JOIN pro_cate ON p_cate = id WHERE pf_son_pid in(%s)", $pidstrs);
					$trows = $this->db->query($sql)->fetchAll();
					if(!empty($trows))
					{
						foreach($trows as $tr)
						{
							$srows[] = $tr;
						}
					}
					if(!empty($srows))
					{
						$tpids = array_unique(array_column($srows, 'p_id'));
						//对应的OE和OE品牌
						$sql = sprintf("SELECT pn_p_id, pn_number, GROUP_CONCAT(DISTINCT pn_mk_id) pn_mk_id,  ckresult2,  pn_remark  FROM (
						SELECT pn_p_id, pn_number, pn_mk_id, ckresult2, pn_en_remark pn_remark FROM pro_numidx
						JOIN tags_link ON tl_value_id = pn_id AND tl_type = 'number'
						WHERE pn_type='none'  AND pn_p_id in (%s) AND pn_pf_id = 1 AND ckresult2 IN (%s) %s
						ORDER BY pn_p_id, FIELD(ckresult2, %s)
						) t1, (SELECT @i:=0) t	
						GROUP BY pn_p_id", implode(",", $tpids), implode(",", $cfg['ckresult2']), $numTypeWhere, implode(",", $cfg['ckresult2']));
						
						$rows = $this->db->query($sql)->fetchAll();
						$toeArr = [];
						if(!empty($rows))
						{
							foreach($rows as $rv)
							{
								$tm = [];
								foreach(explode(',', $rv['pn_mk_id']) as $tid)
								{
									if(!empty($makeArr[$tid])) $tm[] = $makeArr[$tid];
								}
								$rv['pn_mks'] = $tm;
								$toeArr[$rv['pn_p_id']] = $rv;
							}
						}

						foreach($srows as $rv)
						{
							if(!empty($cfg['father_hub']))
							{
								foreach($cfg['father_hub'] as $hcateid)
								{
									if($rv['p_cate'] == $hcateid)
									{
										$tkey = 'father_hub';
										$proArr[$rv['pf_father_pid']][$tkey] = $rv['p_comnum'];
										$proArr[$rv['pf_father_pid']][$tkey.'_oe'] = !empty($toeArr[$rv['p_id']]['pn_number'])? $toeArr[$rv['p_id']]['pn_number']: '';
										break;
									}
								}
							}

							if(!empty($cfg['father_wbk']))
							{
								foreach($cfg['father_wbk'] as $hcateid)
								{
									if($rv['p_cate'] == $hcateid)
									{
										$tkey = 'father_wbk';
										$proArr[$rv['pf_father_pid']][$tkey] = $rv['p_comnum'];
										$proArr[$rv['pf_father_pid']][$tkey.'_oe'] = !empty($toeArr[$rv['p_id']]['pn_number'])? $toeArr[$rv['p_id']]['pn_number']: '';
										break;
									}
								}
							}
							if(empty($proArr[$rv['pf_father_pid']]['father_oe_mks'])) $proArr[$rv['pf_father_pid']]['father_oe_mks'] = [];
							if(!empty($toeArr[$rv['p_id']]['pn_mks'])) $proArr[$rv['pf_father_pid']]['father_oe_mks'] = array_merge($proArr[$rv['pf_father_pid']]['father_oe_mks'], $toeArr[$rv['p_id']]['pn_mks']);
						}
					}
				}


				//车型位置
				if(!empty($cfg['pmls']))
				{
					$sql = sprintf("SELECT pml_p_id, %s FROM pro_model_link WHERE pml_p_id IN (%s) GROUP BY pml_p_id", implode(',', $cfg['pmls']), $pidstrs);
					$rows = $this->db->query($sql)->fetchAll();
					if(!empty($rows))
					{
						foreach($rows as $rv)
						{
							foreach($cfg['pmls'] as $fkey=>$gkey)
							{
								$proArr[$rv['pml_p_id']][$fkey] = trim($rv[$fkey], ',');
							}
						}
					}
				}

				//包装
				if(!empty($cfg['packs']))
				{
					$sql = sprintf("SELECT pp_p_id, %s FROM pro_pack_area WHERE pp_p_id IN (%s)", implode(',', $cfg['packs']), $pidstrs);
					if(!empty($cfg['packarea'])) $sql .= sprintf(" and (cn_name in ('%s') or en_name='%s')", $cfg['packarea'], $cfg['packarea']);
					$rows = $this->db->query($sql)->fetchAll();
					if(!empty($rows))
					{
						foreach($rows as $rv)
						{
							foreach($cfg['packs'] as $fkey=>$gkey)
							{
								$proArr[$rv['pp_p_id']][$fkey] = $rv[$gkey];
							}
						}
					}
				}

				$reStatus = ['Y1'=>'Normal','Y2'=>'Normal','Y3'=>'Normal','Y4'=>'Normal','Y6'=>'Discontinued'];
				$reAbs = ['齿圈'=>'Gear ring','磁性圈'=>'Magnetic encoder','传感器安装壳'=>'ABS mounting cap','盖式'=>'ABS mounting cap','线式'=>'Line type ABS','盖线式'=>'Line type ABS'];
				$reCate = ['Steering boot kit'=>'Steering rack bellow kit','Steering boot'=>'Steering rack bellow','Bearing'=>'Friction Bearing'];
		
				//组装数据
				$autonum = 0;
				foreach($proArr as $pid=>$pv)
				{
					$autonum++;
					//状态
					if(isset($reStatus[$pv['pc_state_main']])) $pv['pc_state_main'] = $reStatus[$pv['pc_state_main']];
					if($pv['pc_state_main'] == 'Y5') $pv['pc_state_main'] = 'Replaced by '.$pv['mp_outnum'];
					//品名
					if(isset($reCate[$pv['cat_name']])) $pv['cat_name'] = $reCate[$pv['cat_name']];
					if(isset($reCate[$pv['cat_name_tcd']])) $pv['cat_name_tcd'] = $reCate[$pv['cat_name_tcd']];
					
					//abs
					if($pv['para_abs type']){
						if(isset($reAbs[$pv['para_abs type']])) $pv['para_abs type'] = $reAbs[$pv['para_abs type']];
						if(isset($pv['para_abs type']) && $pv['para_abs type'] == '') $pv['para_abs type'] = 'NO';
					}

					if(isset($pv['father_oe_mks']) && is_array($pv['father_oe_mks']))
					{
						$pv['father_oe_mks'] = array_unique($pv['father_oe_mks']);
						sort($pv['father_oe_mks']);
						$pv['father_oe_mks'] = implode(',', $pv['father_oe_mks']);
					}

					$row = [];
					foreach($cfg['cols'] as $cv)
					{
						$val = '';
						if($cv['val'] =='autonum'){
							$val = $autonum;
						}else if(!empty($cv['val']) && isset($pv[$cv['val']])){
							$val = $pv[$cv['val']];
						}
						$row[] = $val;
					}
					$sheetArr[] = $row;
				}
			}
			$sheets[] = [
				'header'=>$cfg['header']?: [],
				'name'=>$cfg['name'],
				'data'=>$sheetArr,
			];
		}
		$excel = new excel();
		$excel->writerAny($sheets, 'Master list'.date('YmdHis').'.xlsx');
	}

	/*public function setReportTpl($add)
	{
		if(!empty($add['mr_name']) && !empty($add['mr_mt_id']) && !empty($add['mr_sql']))
		{
			$datetime = getNowTime();
			$opuser = getOpuser();
			$add['update_time']=$datetime;
			$id = $this->db->get('master_report', 'mr_id', ['mr_name'=>$add['mr_name']]);
			if(empty($id)){
				$add['create_time'] = $datetime;
				$add['opuser'] = $opuser;
				$this->db->insert('master_report', $add);
				$id = $this->db->id();
			}else{
				$this->db->update('master_report', $add, ['mr_id'=>$id]);
			}
			return $id;
		}
	}*/

	/*public function getSelfReport()
	{
		return $this->db->select('master_report', '*');
	}*/

	/*public function delMasterTpl($mtids)
	{
		$id = $this->db->get('master_report', 'mr_id', ['mr_mt_id'=>$mtids]);
		if(!empty($id)){
			msgJson(lg('模板已被引用，请先删除报表'));
		}else{
			$this->db->delete('master_tpl', ['mt_id'=>$mtids]);
		}
	}*/

	public function getMasKV($k,$v='')
	{
		$data = $this->getKV($k,$v);
		$arr = [];
		$promas = new promasattaqty();
		$oriarr = $promas->getOriArr();
		if($data){
			foreach ($data as $key => $val) {
				$arr[$key] = [
					'name'=>$val,
					'fileurl'=>1,
					'label'=>$oriarr[$k][$val]??$val
				];
				if(!file_exists(\mvc::$cfg['dir']['static'].'/images/mas/'.$val.'.png')){
					$arr[$key]['fileurl']=0;
				}
			}
		}
		return $arr;
	}

	
	//保存模板 new
	public function saveTpl($req)
	{
		$chk = $req['mt_id'] > 0? ['mt_id'=>$req['mt_id']] : ['mt_name'=>$req['mt_name']];
		$id = $this->db->get('master_tpl', 'mt_id', $chk);
		$set = [];
		if(!empty($req['mt_name'])) $set['mt_name'] = $req['mt_name'];
		if(isset($req['mt_file'])) $set['mt_file'] = $req['mt_file'];
		//dd($req['mt_tpl']);
		if(!empty($req['mt_tpl'])) $set['mt_tpl'] = json_encode($req['mt_tpl'], JSON_UNESCAPED_UNICODE);
		$this->db->Begin();
		if(!empty($set)){
			$set['update_time'] = getNowTime();
			if($id){
				$this->db->update('master_tpl', $set, ['mt_id'=>$id]);
			}else{
				$set['create_time'] = getNowTime();
				$set['opuser'] = getOpuser();
				$this->db->insert('master_tpl', $set);
				$id = $this->db->id();
			}
		}
		if($id && isset($req['ar_ids'])){
			//权限角色
			$pwcode = 'R300';
			$where = [
				'prl_power_code'=>$pwcode,
				'RAW_mas'=>raw("concat(',',prl_masters,',') like '%,".$id.",%'")
			];
			$has = $this->db->select('power_role_link', ['prl_id','prl_ar_id','prl_masters'], $where);
			$hasArids = array_column($has, 'prl_ar_id');
			foreach($req['ar_ids'] as $ar_id){
				if(!in_array($ar_id, $hasArids)){
					$row = $this->db->get('power_role_link', ['prl_id','prl_ar_id','prl_masters'], ['prl_power_code'=>$pwcode, 'prl_ar_id'=>$ar_id]);
					if(!empty($row)){
						$row['prl_masters'] = $row['prl_masters']? explode(',', $row['prl_masters']):[];
						$row['prl_masters'][] = $id;
						$set = ['prl_masters'=>implode(',', array_unique($row['prl_masters'])), 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
						$this->db->update('power_role_link', $set, ['prl_id'=>$row['prl_id']]);
					}else{
						$add = ['prl_power_code'=>$pwcode, 'prl_ar_id'=>$ar_id, 'prl_value'=>1, 'prl_masters'=>$id, 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
						$this->db->insert('power_role_link', $add);

						$chk = $this->db->get('power_role_link', ['prl_id'], ['prl_power_code'=>'R000', 'prl_ar_id'=>$ar_id]);
						if(empty($chk)){//主菜单
							$add = ['prl_power_code'=>'R000', 'prl_ar_id'=>$ar_id, 'prl_value'=>1, 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
							$this->db->insert('power_role_link', $add);
						}
					}
				}
			}
			foreach($has as $row){
				if(!in_array($row['prl_ar_id'], $req['ar_ids'])){
					$row['prl_masters'] = $row['prl_masters']? explode(',', $row['prl_masters']):[];
					if(($key = array_search($id, $row['prl_masters'])) !== false) unset($row['prl_masters'][$key]);
					$set = ['prl_masters'=>implode(',', array_unique($row['prl_masters'])), 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
					$this->db->update('power_role_link', $set, ['prl_id'=>$row['prl_id']]);
				}
			}
		}
		$this->db->End();
		return $this->getTplInfo(['mt_id'=>$id]);
	}

	public function getTplInfo($req)
	{
		$chk = $req['mt_id']? ['mt_id'=>$req['mt_id']] : ['mt_name'=>$req['mt_name']];
		$arr = $this->db->get('master_tpl', '*', $chk);
		if(!empty($arr)){
			$arr['mt_tpl'] = json_decode($arr['mt_tpl'], true);
			// $arr['roles'] = $this->getRole($arr['mt_id']);
			// $arr['ar_ids'] = implode(',', array_column($arr['roles'], 'ar_id'));
			// $arr['ar_names'] = implode(',', array_column($arr['roles'], 'ar_name'));
		}
		return $arr;
	}

	public function listTpl($params)
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];
		$table = 'master_tpl';
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
        });
		
		$pwcode = 'R300';
		if(!\p::has($pwcode,['delete'])){//无模板权限
			$uid = getOpuser();
			$user = new \model\user();
			$pws = $user->getPowersByUid($uid);
			$ids = !empty($pws[$pwcode]['prl_masters'])? explode(',', $pws[$pwcode]['prl_masters']): [0];
			$where['mt_id'] = $ids;
		}

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		$fields = '*';
        $arr = $this->db->select($table,$fields,$where);
		if(!empty($arr))
		{
			foreach($arr as &$v)
			{
				if($v['mt_file']) $v['captions']['mt_file'] = '<a href="'.\mvc::$cfg['path']['files'].$v['mt_file'].'" target="_blank">'.$v['mt_file'].'</a>';
				if(\p::has('R200','view')) $v['captions']['mt_name'] = '<a href="'.\mvc::$cfg['path']['site'].'/master/tplManage?mt_id='.$v['mt_id'].'" tab>'.$v['mt_name'].'</a>';
				$master = new \model\pro\master();
				$roles = $this->getRole($v['mt_id']);
				$v['link_role'] = implode(',', array_column($roles, 'ar_name'));
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}
	

	public function saveReport($req)
	{
		$id = (int) $req['mr_id'];
		$set = [];
		if(!empty($req['mr_name'])) $set['mr_name'] = $req['mr_name'];
		if(!empty($req['mr_mt_ids'])) $set['mr_mt_ids'] = $req['mr_mt_ids'];
		if(isset($req['mr_file'])) $set['mr_file'] = $req['mr_file'];
		$this->db->Begin();
		if(!empty($set)){
			$set['update_time'] = getNowTime();
			if($id > 0){
				$this->db->update('master_report', $set, ['mr_id'=>$id]);
			}else{
				$set['create_time'] = getNowTime();
				$set['opuser'] = getOpuser();
				$this->db->insert('master_report', $set);
				$id = $this->db->id();
				$this->buildReport($id);
			}
		}
		if($id && isset($req['ar_ids'])){
			if(!is_array($req['ar_ids'])) $req['ar_ids'] = explode(',', $req['ar_ids']);
			//权限角色
			$pwcode = 'R300';
			$where = [
				'prl_power_code'=>$pwcode,
				'RAW_mas'=>raw("concat(',',prl_masters,',') like '%,".$id.",%'")
			];
			$has = $this->db->select('power_role_link', ['prl_id','prl_ar_id','prl_masters'], $where);
			$hasArids = array_column($has, 'prl_ar_id');
			foreach($req['ar_ids'] as $ar_id){
				if(!in_array($ar_id, $hasArids)){
					$row = $this->db->get('power_role_link', ['prl_id','prl_ar_id','prl_masters'], ['prl_power_code'=>$pwcode, 'prl_ar_id'=>$ar_id]);
					if(!empty($row)){
						$row['prl_masters'] = $row['prl_masters']? explode(',', $row['prl_masters']):[];
						$row['prl_masters'][] = $id;
						$set = ['prl_masters'=>implode(',', array_unique($row['prl_masters'])), 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
						$this->db->update('power_role_link', $set, ['prl_id'=>$row['prl_id']]);
					}else{
						$add = ['prl_power_code'=>$pwcode, 'prl_ar_id'=>$ar_id, 'prl_value'=>1, 'prl_masters'=>$id, 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
						$this->db->insert('power_role_link', $add);

						$chk = $this->db->get('power_role_link', ['prl_id'], ['prl_power_code'=>'R000', 'prl_ar_id'=>$ar_id]);
						if(empty($chk)){//主菜单
							$add = ['prl_power_code'=>'R000', 'prl_ar_id'=>$ar_id, 'prl_value'=>1, 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
							$this->db->insert('power_role_link', $add);
						}
					}
				}
			}
			foreach($has as $row){
				if(!in_array($row['prl_ar_id'], $req['ar_ids'])){
					$row['prl_masters'] = $row['prl_masters']? explode(',', $row['prl_masters']):[];
					if(($key = array_search($id, $row['prl_masters'])) !== false) unset($row['prl_masters'][$key]);
					$set = ['prl_masters'=>implode(',', array_unique($row['prl_masters'])), 'prl_opuser'=>getOpuser(), 'prl_update_time'=>getNowTime()];
					$this->db->update('power_role_link', $set, ['prl_id'=>$row['prl_id']]);
				}
			}
		}
		$this->db->End();
		return $this->getTplInfo(['mr_id'=>$id]);
	}

	public function getReportInfo($id)
	{
		$arr = $this->db->get('master_report', '*', ['mr_id'=>$id]);
		if(!empty($arr)){
			$arr['roles'] = $this->getRole($arr['mr_id']);
			$arr['ar_ids'] = implode(',', array_column($arr['roles'], 'ar_id'));
			$arr['ar_names'] = implode(',', array_column($arr['roles'], 'ar_name'));
		}
		return $arr;
	}

	//报表角色
	public function getRole($id)
	{
		$sql = "SELECT * FROM `adm_role` WHERE ar_model='pdc' and ar_id IN (SELECT prl_ar_id FROM power_role_link WHERE concat(',',prl_masters,',') like '%,".$id.",%') order by ar_name";
		return $this->db->query($sql)->fetchAll();
	}

	public function listReport($params)
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];
		$table = 'master_report';
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
        });
		
		$pwcode = 'R300';
		if(!\p::has($pwcode,['delete'])){//无模板权限
			$uid = getOpuser();
			$user = new \model\user();
			$pws = $user->getPowersByUid($uid);
			$ids = !empty($pws[$pwcode]['prl_masters'])? explode(',', $pws[$pwcode]['prl_masters']): [0];
			$where['mr_id'] = $ids;
		}

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		$fields = '*';
        $arr = $this->db->select($table,$fields,$where);
		if(!empty($arr))
		{
			$rows = $this->db->select('master_tpl', '*');
			$tpls = array_column($rows, null, 'mt_id');
			foreach($arr as &$v)
			{
				if($v['mr_file']) $v['captions']['mr_file'] = '<a href="'.\mvc::$cfg['path']['files'].$v['mr_file'].'" target="_blank">'.$v['mr_file'].'</a>';
				$master = new \model\pro\master();
				$roles = $this->getRole($v['mr_id']);
				$v['link_role'] = implode(',', array_column($roles, 'ar_name'));
				$v['captions']['mr_mt_ids'] = [];
				foreach(explode(',', $v['mr_mt_ids']) as $mrid)
				{
					if(!empty($tpls[$mrid]))
						$v['captions']['mr_mt_ids'][] = $tpls[$mrid]['mt_name'];
				}
				$v['captions']['mr_mt_ids'] = implode(',', $v['captions']['mr_mt_ids']);
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}
	
	
	//报表下载 ['mt_id|mt_name'=>'', 'isusever'=>true|false] isusever=true生成报表否则是预览
	public function exportData($req)
	{
		ignore_user_abort(true);
		ini_set('memory_limit', \mvc::$cfg['export_memory_limit']);
		set_time_limit(\mvc::$cfg['export_time_limit']);

		$where = $req['mt_id']? ['mt_id'=>$req['mt_id']]: ['mt_name'=>$req['mt_name']];
		$tplArr = $this->db->get('master_tpl', '*', $where);
		if(empty($tplArr)) exitJson(lg('模板不存在'));
		$country = new \model\country();
		$tplArr['mt_tpl'] = json_decode($tplArr['mt_tpl'], true);
		foreach($tplArr['mt_tpl']['values'] as $k=>$v)
		{
			if(!empty($v['json'])) unset($tplArr['mt_tpl']['values'][$k]['json']);
		}
		$params = $tplArr['mt_tpl']['values'];
		// dd($params);
		$cols = [];
		
		//字段规整
		$cfg = [];
		// 预留导出语言配置，后续可按该配置切换实际导出内容
		$cfg['report_lang'] = (!empty($params['report_lang']['value']) ? $params['report_lang']['value'] : 'cn');
		if(!empty($params['pro_factory']['extValue']['cellType'])) $cfg['fac_show'] = $params['pro_factory']['extValue']['cellType'];
		if(!empty($params['pro_model']['extValue']['cellType'])) $cfg['pml_show'] = $params['pro_model']['extValue']['cellType'];
		
		// 需要额外连表才能获取的基础信息字段数组
		$proBaseKeys = ['p_oe','oe_id','pb_name','p_tb_name','p_unit'];
		foreach($tplArr['mt_tpl']['cols'] as $v)
		{
			//竞品
			if(stripos($v['key'], 'pro_factory_') === 0){
				if($cfg['fac_show'] == 'one'){
					continue;
				}else{
					$fid = str_replace('pro_factory_', '', $v['key']);
					$cfg['pf_ids'][] = $fid;
					$facCfg = $params['pro_factory_'.$fid];
					if(empty($facCfg['qty'])) $facCfg['qty'] = 1;
					for($i = 0; $i < $facCfg['qty']; $i++){
						$tkey = 'fac_'.$fid.'_'.$i;
						$cols[$tkey] = ['key'=>$tkey, 'name'=>($cfg['report_lang']=='cn'? $v['text']: $v['en_text'])];
						if($params['pro_factory_'.$fid]['oeband']) $cols[$tkey.'_oeband'] = ['key'=>$tkey.'_oeband', 'name'=>'OE Brand'];
					}
				} 
			}else if($cfg['fac_show'] == 'one' && $v['key'] == 'pro_reference_no'){
				//竞品合并一行
				$cfg['pf_ids'] = $params['pro_factory']['values'];
				$cols[$v['key']] = ['key'=>$v['key'], 'name'=>'Reference No.'];
				foreach($cfg['pf_ids'] as $fid)
				{
					if($params['pro_factory_'.$fid]){
						if($params['pro_factory_'.$fid]['oeband']) $cols[$v['key'].'_oeband'] = ['key'=>$v['key'].'_oeband', 'name'=>'OE Brand'];
					}
				}
			}else if(stripos($v['key'], 'pro_param_') === 0){
				$cfg['paras'][] = str_replace('pro_param_', '', $v['key']);
				$cols[$v['key']] = ['key'=>$v['key'], 'name'=>($cfg['report_lang']=='cn'? $v['text']: $v['en_text'])];
			}else if(stripos($v['key'], 'pro_model_') === 0){
				//车型
				$tkey = str_replace('pro_model_', '', $v['key']);
				$cfg['pmls'][] = $tkey;
				if($cfg['pml_show'] == 'rows'){
					$cols[$tkey] = ['key'=>$tkey, 'name'=>($cfg['report_lang']=='cn'? $v['text']: $v['en_text'])];
				}else{
					//合并
					if(empty($cols['vehicle']))
						$cols['vehicle'] = ['key'=>'vehicle', 'name'=>'Vehicle'];
				}
			}else if(stripos($v['key'], 'img_') === 0){
				$cfg['img'][] = str_replace('img_', '', $v['key']);
				$cols[$v['key']] = ['key'=>$v['key'], 'name'=>($cfg['report_lang']=='cn'? $v['text']: $v['en_text'])];
			}else if(stripos($v['key'], 'col_pro_father_') === 0){
				$cfg['father'][] = str_replace('col_pro_father_', '', $v['key']);
				if(empty($cols['father'])) $cols['father'] = ['key'=>'father', 'name'=>'father'];
			}else if(stripos($v['key'], 'col_pro_son_') === 0){
				$cfg['son'][] = str_replace('col_pro_son_', '', $v['key']);
				if(empty($cols['son'])) $cols['son'] = ['key'=>'son', 'name'=>'son'];
			}else if(in_array($v['key'], $proBaseKeys)){
				$cfg['base'][] = $v['key'];
				$cols[$v['key']] = ['key'=>$v['key'], 'name'=>($cfg['report_lang']=='cn'? $v['text']: $v['en_text'])];
			}else{
				$cols[$v['key']] = ['key'=>$v['key'], 'name'=>($cfg['report_lang']=='cn'? $v['text']: $v['en_text'])];
			}
		}

		//型号条件
		$where = [];
		$fields = ['pro.*', 'cat.id(cat_id)'];
		$table = "pro(pro)";
		$join = [
			"[>]pro_cate(cat)" => ["pro.p_cate" => "id"],
			"[>]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[>]tags_link(tl)" => ["pro.p_id" => "tl_value_id", "AND" => "tl_type='pro'"],
			"[>]tags" => ["tl.tl_t_id" => "t_id"],
		];
		if(!empty($params['cates'])) $where['pro.p_cate'] = $params['cates'];
		if(!empty($params['pro_bigcate']['values'])) $where['cat.parent_id'] = $params['pro_bigcate']['values'];
		if(!empty($params['pro_cate']['values'])) $where['pro.p_cate'] = $params['pro_cate']['values'];
		if(!empty($params['pro_state']['values'])) $where['pro.p_state_main'] = $params['pro_state']['values'];
		// 数据标签筛选
		if(!empty($params['pro_data_tag']['values'])) {
			$where['tl_t_id'] = $params['pro_data_tag']['values'];
		}

		if(!empty($cfg['base']))
		{//基础信息
			foreach($cfg['base'] as $k){
				switch($k){
					case 'p_oe':
						$join['[>]pro_numidx(pn)'] = ['p_oe_format' => 'pn_formart','p_pf_id'=>'pn_pf_id','p_id'=>'pn_p_id'];
						$join['[>]pro_factory(pf)'] = ['pn.pn_pf_id'=>'pf_id'];
						$fields[] = 'pn_formart';
						$fields[] = 'pf.pf_name';
						break;
					case 'oe_id':
						$join['[>]oe_item(oi)'] = ['p_oe_id' => 'oe_id'];
						$join['[>]oe_numidx(on)'] = ['oi.oe_id'=> 'on_oe_id','oi.oe_pf_id'=>'on_pf_id','oi.oe_oe_format'=>'on_formart'];
						$join['[>]pro_factory(pf2)'] = ['on.on_pf_id'=>'pf_id'];
						$fields[] = 'on_formart';
						$fields[] = 'pf2.pf_name(oe_pf_name)';
						break;
					case 'pb_name':
						$join['[>]pro_brand'] = ['p_pb_id' => 'pb_id'];
						$fields[] = 'pb_'.$cfg['report_lang'].'_name(pb_name)' ;
						break;
					case 'p_tb_name':
						$join['[>]tag_brand'] = ['p_tb_id' => 'tb_id'];
						$fields[] = 'tb_'.$cfg['report_lang'].'_name(p_tb_name)' ;
						break;
					case 'p_unit':
						$join['[>]object'] = ['p_unit' => 'o_id'];
						$fields[] = 'object.'.$cfg['report_lang'].'_name(p_unit)' ;
						break;
				}
			}
		}

		$where['GROUP'] = 'pro.p_id';
		//$where["LIMIT"] = [0,10];
		if($cfg['report_lang']){
			// 多语言
			$fields[] = 'cat.'.$cfg['report_lang'].'_name(cat_name)' ;
			$fields[] = 'pcat.'.$cfg['report_lang'].'_name(pcat_name)' ;
			$fields[] = 'tags.'.$cfg['report_lang'].'_name(data_tag)' ;
			$fields[] = 'p_'.$cfg['report_lang'].'_name(p_name)' ;
		}
		$rows = $this->db->select($table,$join,$fields, $where);
		$proArr = array_column($rows, null, 'p_id');
		if(!empty($rows)){
			$pids = array_keys($proArr);
			$pidstrs = implode(',', $pids);
			$mkNameKey = '';
			switch($cfg['report_lang']){
				case 'cn':
					$mkNameKey = 'mk_cn_name';
					break;
				case 'en':
					$mkNameKey = 'mk_en_name';
					break;
				case 'py':
					$mkNameKey = 'mk_py_name';
					break;
				default:
					$mkNameKey = 'mk_en_name';
					break;
			}
			$m_makeFeild = [
				'mk_id', 
				$mkNameKey.'(name)'
			];
			$rows = $this->db->select('m_make', $m_makeFeild);
			$makeArr = array_column($rows, 'name', 'mk_id');

			//参数
			if(!empty($cfg['paras']))
			{
				$join = ['[><]part_param(pp)'=>['pv.ppv_ptpa_id'=>'ptpa_id']];
				$rows = $this->db->select('pro_param_val(pv)', $join,['ptpa_type','ptpa_decimal','ppv_p_id', 'en_name', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string'], ['en_name'=>$cfg['paras'], 'ppv_p_id'=>$pids]);
				foreach($rows as $rv)
				{
					$val = $rv['ppv_val_'.$rv['ptpa_type']];
					if($rv['ptpa_type'] == 'double' && $rv['ptpa_decimal'] > 0){
						$val = sprintf('%.'.$rv['ptpa_decimal'].'f', $val);
					}
					$proArr[$rv['ppv_p_id']]['pro_param_'.$rv['en_name']] = $val;
				}
			}
			
			if(!empty($cfg['father']))
			{//父
				$sql = sprintf("SELECT t1.* FROM (
				SELECT pf_son_pid, p_id, p_comnum, pn_number,pn_mk_id, en_name cat_name FROM pro_fatherson 
				JOIN pro ON pf_father_pid = p_id
				JOIN pro_cate ON p_cate = id
				LEFT JOIN pro_numidx ON pn_p_id = p_id AND pn_pf_id = 1 AND pn_type='none' 
				WHERE pf_son_pid in (%s) 
				) t1, (SELECT @i:=0) t GROUP BY p_id,pf_son_pid",  $pidstrs);
				$rows = $this->db->query($sql)->fetchAll();
				$tcates = [];
				foreach($rows as $rv)
				{
					$tm = [];
					foreach(explode(',', $rv['pn_mk_id']) as $tid)
					{
						if(!empty($makeArr[$tid])) $tm[] = $makeArr[$tid];
					}
					$rv['pn_make'] = implode(',', $tm);
					$proArr[$rv['pf_son_pid']]['father_'.$rv['cat_name']][] = $rv;
					
					if(!empty($rv['pn_make']))
					{
						$mkey = 'father_make';
						if(empty($proArr[$rv['pf_son_pid']][$mkey])){
							$proArr[$rv['pf_son_pid']][$mkey] = $rv['pn_make'];
						}else{
							$tval = array_unique(array_merge(explode(',', $proArr[$rv['pf_son_pid']][$mkey]), explode(',', $rv['pn_make'])));
							sort($tval);
							$proArr[$rv['pf_son_pid']][$mkey] = implode(',', $tval);
						}
					}
					$count = count($proArr[$rv['pf_son_pid']]['father_'.$rv['cat_name']]);
					//同品类最大列数
					$tcates[$rv['cat_name']] = empty($tcates[$rv['cat_name']]) || $count > $tcates[$rv['cat_name']]? $count: 1;
				}

				//追加列
				$newCols = [];
				foreach($cols as $ck=>$cv)
				{
					if($cv['key'] =='father')
					{
						if(empty($tcates)) continue;
						foreach($tcates as $cate=>$count)
						{
							for($i = 0; $i < $count; $i++)
							{
								$tkey = 'father_'.$cate.'_'.$i;
								$newCols[$tkey.'_gsp'] = ['key'=>$tkey.'_gsp', 'name'=>$cate.' No.'];
								if(in_array('oe', $cfg['father'])) $newCols[$tkey.'_oe'] = ['key'=>$tkey.'_oe', 'name'=>'OE'];
							}
						}
						if(in_array('make', $cfg['father'])) $newCols['father_make'] = ['key'=>'father_make', 'name'=>'Manufactuer'];
					}
					else{
						$newCols[$ck] = $cv;
					}
				}
				$cols = $newCols;
			}

			if(!empty($cfg['son']))
			{//子
				$sql = sprintf("SELECT t1.* FROM (
				SELECT pf_father_pid, p_id, p_comnum, pn_number,pn_mk_id, en_name cat_name FROM pro_fatherson 
				JOIN pro ON pf_son_pid = p_id
				JOIN pro_cate ON p_cate = id
				LEFT JOIN pro_numidx ON pn_p_id = p_id AND pn_pf_id = 1 AND pn_type='none'
				WHERE pf_father_pid in (%s) 
				) t1, (SELECT @i:=0) t GROUP BY p_id,pf_father_pid",$pidstrs);
				$rows = $this->db->query($sql)->fetchAll();
				$tcates = [];
				foreach($rows as $rv)
				{
					$tm = [];
					foreach(explode(',', $rv['pn_mk_id']) as $tid)
					{
						if(!empty($makeArr[$tid])) $tm[] = $makeArr[$tid];
					}
					$rv['pn_make'] = implode(',', $tm);
					$proArr[$rv['pf_father_pid']]['son_'.$rv['cat_name']][] = $rv;
					
					if(!empty($rv['pn_make']))
					{
						$mkey = 'son_make';
						if(empty($proArr[$rv['pf_father_pid']][$mkey])){
							$proArr[$rv['pf_father_pid']][$mkey] = $rv['pn_make'];
						}else{
							$tval = array_unique(array_merge(explode(',', $proArr[$rv['pf_father_pid']][$mkey]), explode(',', $rv['pn_make'])));
							sort($tval);
							$proArr[$rv['pf_father_pid']][$mkey] = implode(',', $tval);
						}
					}
					$count = count($proArr[$rv['pf_father_pid']]['son_'.$rv['cat_name']]);
					//同品类最大列数
					$tcates[$rv['cat_name']] = empty($tcates[$rv['cat_name']]) || $count > $tcates[$rv['cat_name']]? $count: 1;
				}

				//追加列
				$newCols = [];
				foreach($cols as $ck=>$cv)
				{
					if($cv['key'] =='son')
					{
						if(empty($tcates)) continue;
						foreach($tcates as $cate=>$count)
						{
							for($i = 0; $i < $count; $i++)
							{
								$tkey = 'son_'.$cate.'_'.$i;
								$newCols[$tkey.'_gsp'] = ['key'=>$tkey.'_gsp', 'name'=>$cate.' No.'];
								if(in_array('oe', $cfg['son'])) $newCols[$tkey.'_oe'] = ['key'=>$tkey.'_oe', 'name'=>'OE'];
							}
						}
						if(in_array('make', $cfg['son'])) $newCols['son_make'] = ['key'=>'son_make', 'name'=>'Manufactuer'];
					}
					else{
						$newCols[$ck] = $cv;
					}
				}
				$cols = $newCols;
			}

			if(!empty($cfg['pmls']))
			{//通用库
				$showFileds = $cfg['pmls'];
				$showFileds[] = 'p_id';
				$areaType = $params['pro_model']['values'][0];
				$pmlParams = ['from'=>'master', 'p_id'=>$pids, 'showFileds'=>$showFileds, 'rows'=>5000000];
				if(!empty($params['pro_model_country']['values'][0])){
					$pmlParams['country'] = implode(',', $params['pro_model_country']['values']);
					$pmlParams['coutype'] = 'and';
					$pmlParams['backtype'] = 'raw';
				}	
				if(!empty($params['pro_tag_brand']['values'][0])){
					$pmlParams['tag_brand'] = implode(',', $params['pro_tag_brand']['values']);
				}
				$promodel = null;
				// 根据选择的区域不同，调取不同的model获取数据
				switch($areaType){
					case 'IN':
						// 国际车型
						$promodel = new promodel();
						break;
					case 'NA':
						// 北美车型
						$promodel = new promodelna();
						break;
					case 'CN':
						// 中国车型
						$promodel = new promodelcn();
						break;
				}
				$tdata = $promodel->getListMaster($pmlParams);
				foreach($tdata['rows'] as $k=>$v)
				{
					$proArr[$v['p_id']]['pmls'][] = $v;
				}
			}
			if(!empty($params['pro_factory']['values']))
			{//竞品
				foreach($params['pro_factory']['values'] as $fid)
				{
					$facCfg = $params['pro_factory_'.$fid];
					$numOthWhere = '';
					$sql = sprintf("SELECT pn_p_id, pf_id, pf_name, pn_number,pn_mk_id FROM pro_numidx
					join pro_factory on pn_pf_id = pf_id
					WHERE pn_type='none' AND pn_p_id in (%s) AND pn_pf_id =%d  %s
					ORDER BY pn_p_id", $pidstrs, $fid, $numOthWhere);
					$rows = $this->db->query($sql)->fetchAll();
					foreach($rows as $rv)
					{
						$tm = [];
						foreach(explode(',', $rv['pn_mk_id']) as $tid)
						{
							if(!empty($makeArr[$tid])) $tm[] = $makeArr[$tid];
						}
						$rv['pn_oeband'] = implode(',', array_unique($tm));
						if(!empty($proArr[$rv['pn_p_id']]['factory'][$rv['pf_id']]) && count($proArr[$rv['pn_p_id']]['factory'][$rv['pf_id']]) >= $facCfg['qty']) continue;
								$proArr[$rv['pn_p_id']]['factory'][$rv['pf_id']][] = $rv;
					}
				}
			}

			if(!empty($cfg['img']))
			{//图片
				// 暂时只有主图处理相关逻辑
				$picRes = $this->db->select('pro_pic',['[><]files'=>['pic_fileid'=>'fileid']],'*',['pic_p_id'=>$pids,'pic_type'=>'img','pic_ismain'=>1]);
				$picArr = [];
				foreach ($picRes as $pic) {
					// 先展示小图
					if($pic['pic_type']=='img' && $pic['filetype']=='image'){
						$picArr[$pic['pic_p_id']] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
					}
				}
				foreach($pids as $pid)
				{
					foreach($cfg['img'] as $brand)
					{
						if($brand=='p_pic'){
							$imgsrc = \mvc::$cfg['dir']['files'].'/'.$picArr[$pid];
							if(file_exists($imgsrc) && !empty($picArr[$pid]))
								$proArr[$pid]['img_'.$brand] = ['img'=>$imgsrc, 'width'=>48, 'height'=>192];
						}
						
					}
				}
			}

			if(!empty($cfg['base'])){
				foreach($pids as $pid){
					if(in_array('p_oe', $cfg['base'])){
						$proArr[$pid]['p_oe'] = $proArr[$pid]['pf_name'].':'.$proArr[$pid]['pn_formart'];
					}
					if(in_array('oe_id', $cfg['base'])){
						$proArr[$pid]['oe_id'] = $proArr[$pid]['oe_pf_name'].':'.$proArr[$pid]['on_formart'];
					}
				}
			}
		}
		$sheets = [];
		$header = [];
		//表头
		$sheetArr = [array_column($cols, 'name')];
		$autonum = 0;
		foreach($proArr as $pid=>$pv)
		{
			$autonum++;
			$row = [];
			foreach($cols as $cv)
			{
				$val = '';
				if($cv['key'] =='autonum'){
					$val = $autonum;
				}else if(preg_match('/(father_.+)_(\d+)_([a-zA-Z]+)/', $cv['key'], $fm)){//父
					if(!empty($pv[$fm[1]][$fm[2]]))
					{
						if($fm[3] == 'gsp') $val = $pv[$fm[1]][$fm[2]]['p_comnum'];
						if($fm[3] == 'oe') $val = $pv[$fm[1]][$fm[2]]['pn_number'];
					}
				}else if(preg_match('/(son_.+)_(\d+)_([a-zA-Z]+)/', $cv['key'], $fm)){//父
					if(!empty($pv[$fm[1]][$fm[2]]))
					{
						if($fm[3] == 'gsp') $val = $pv[$fm[1]][$fm[2]]['p_comnum'];
						if($fm[3] == 'oe') $val = $pv[$fm[1]][$fm[2]]['pn_number'];
					}
				}else if(stripos($cv['key'], 'pro_reference_no') === 0 && !empty($pv['factory'])){//竞品合并一行
					$tvals = [];
					foreach($pv['factory'] as $fvs){
						foreach($fvs as $fvv){
							if($cv['key'] == 'pro_reference_no_remark' && !empty($fvv['pn_remark'])){
								$tvals[] = $fvv['pn_number'].':'.$fvv['pn_remark'];
							}else if($cv['key'] == 'pro_reference_no_oeband' && !empty($fvv['pn_oeband'])){
								if(!empty($fvv['pn_oeband']))
									$tvals[] = $fvv['pn_number'].':'.$fvv['pn_oeband'];
							}else if($cv['key'] == 'pro_reference_no') {
								$tvals[] = $fvv['pf_name'].':'.$fvv['pn_number'];
							}
						}
					}
					$val = implode("\n", array_unique($tvals));
				}else if($cfg['pml_show'] != 'rows' && $cv['key'] == 'vehicle' && !empty($pv['pmls'])){//车型合并
					$tvals = [];
					foreach($pv['pmls'] as $fvv){
						$tt = [];
						foreach($cfg['pmls'] as $filed){
							if(!empty($fvv[$filed])) $tt[] = $fvv[$filed];
						}
						$tvals[] = implode(' ', $tt);
						if($cfg['pml_show'] == 'one') break;
					}
					$val = implode("\n", array_unique($tvals));
				}else if($cfg['pml_show'] == 'rows' && !empty($cfg['pmls']) && in_array($cv['key'], $cfg['pmls']) && !empty($pv['pmls'])) {
					$val = 'expmls_'.$cv['key'];
				}else if(preg_match('/fac_(\d+)_(\d+)_?(.*)/', $cv['key'], $fm)){
					if(!empty($pv['factory'][$fm[1]][$fm[2]])) {
						if($fm[3] == 'oeband'){
							$val = $pv['factory'][$fm[1]][$fm[2]]['pn_oeband'];
							if(stripos($val, ',')) $val = implode(',', array_unique(explode(',', $val)));
						}else{
							$val = $pv['factory'][$fm[1]][$fm[2]]['pn_number'];
						}
					}
				}else if(!empty($cv['key']) && $cv['key'] == 'p_state_main'){
					$matchArr = [
						'00' =>[
							'cn'=>'未定义',
							'en'=>'Undefined',
						],
						'01' =>[
							'cn'=>'开发中',
							'en'=>'Developing',
						],
						'02' =>[
							'cn'=>'国内不做外贸订做',
							'en'=>'NotForTrade',
						],
						'03' =>[
							'cn'=>'上市',
							'en'=>'Listing',
						],
						'04' =>[
							'cn'=>'退市',
							'en'=>'Delisting',
						],
						'05' =>[
							'cn'=>'升级中',
							'en'=>'Upgrading',
						],
						'06' =>[
							'cn'=>'可研发生产',
							'en'=>'CanDevelop',
						],
						'07' =>[
							'cn'=>'新品在途可预定',
							'en'=>'NewInTrans',
						],
						'99' =>[
							'cn'=>'删除',
							'en'=>'Delete',
						],
					];
					$val = $matchArr[$pv[$cv['key']]][$cfg['report_lang'] == 'cn'? 'cn': 'en'];
				}else if(!empty($cv['key']) && isset($pv[$cv['key']])){
					$val = $pv[$cv['key']];
				}
				$row[] = $val;
			}
			if($cfg['pml_show'] == 'rows' && !empty($pv['pmls']))
			{//车型多行扩展
				foreach($pv['pmls'] as $fvv){
					$exrow = $row;
					foreach($exrow as $exk=>$exv){
						if(!is_array($exv) && stripos($exv, 'expmls_') === 0){
							$realfiled = str_replace('expmls_','',$exv);
							$exrow[$exk] = !empty($fvv[$realfiled])? $fvv[$realfiled]: '';
						}
					}
					$sheetArr[] = $exrow;
				}
			}else{
				$sheetArr[] = $row;
			}
		}
		
		//列宽，行高
		foreach($sheetArr as $k=>$v)
		{
			foreach($v as $kk=>$vv)
			{
				if(!empty($vv['width']) && empty($header['width'][$kk+1])){
					$header['width'][$kk+1] = ['key'=>$kk+1, 'val'=>$vv['width']];
				}
				if(!empty($vv['height']) && empty($header['height'][$k+1])){
					$header['height'][$k+1] = ['key'=>$k+1, 'val'=>$vv['height']];
				}
			}
		}
		if(!empty($header['height'])) $header['height'] = array_values($header['height']);
		if(!empty($header['width'])) $header['width'] = array_values($header['width']);

		$sheets[] = [
			'header'=>$header,
			'name'=>msubstr($tplArr['mt_name'], 0, 27),
			'data'=>$sheetArr,
		];

		if($req['return'] == 'data'){
			return $sheets;
		}
		$excel = new excel();
		if($req['isusever'] == 1){
			$filename = $tplArr['mt_name'].'.xlsx';
			$path = '/master';
			mkdirs(\mvc::$cfg['dir']['files'].$path);
			$set = [
				'mt_file'=>$path.'/'.$filename, 
				'mt_file_time'=>getNowTime(),
				'mt_file_opuser'=>getOpuser(),
				'update_time'=>getNowTime(),
			];
			$file = \mvc::$cfg['dir']['files'].$set['mt_file'];

			$this->db->update('master_tpl', $set, ['mt_id'=>$tplArr['mt_id']]);
			$arr = $excel->writerAny($sheets, $file, true);
			$arr['url'] = \mvc::$cfg['path']['files'].$set['mt_file'];
			return $arr;
		}else{
			$filename = 'Masterlist_'.$tplArr['mt_name'].'_view.xlsx';
			$excel->writerAny($sheets, $filename);
		}
	}
	
	//综合报表生成
	public function buildReport($ids)
	{
		$rows = $this->db->select('master_report', '*', ['mr_id'=>$ids]);
		foreach($rows as $row)
		{
			$mergeSheet = [];
			foreach(explode(',', $row['mr_mt_ids']) as $mt_id)
			{
				$sheets = $this->exportData(['mt_id'=>$mt_id, 'return'=>'data']);
				foreach($sheets as $sheet)
				{
					$mergeSheet[] = $sheet;
				}
			}

			$filename = $row['mr_name'].'.xlsx';
			$path = '/master';
			mkdirs(\mvc::$cfg['dir']['files'].$path);
			$set = [
				'mr_file'=>$path.'/'.$filename, 
				'mr_file_time'=>getNowTime(),
				'mr_file_opuser'=>getOpuser(),
				'update_time'=>getNowTime(),
			];
			$file = \mvc::$cfg['dir']['files'].$set['mr_file'];
			$excel = new excel();
			$arr = $excel->writerAny($mergeSheet, $file, true);
			$arr['url'] = \mvc::$cfg['path']['files'].$set['mt_file'];
			$this->db->update('master_report', $set, ['mr_id'=>$row['mr_id']]);
		}
		return [];
	}
	

	public function getImgFileByWater($band,$srcFilename,$distFilename){
		$watermark = \mvc::$cfg['dir']['static'].'/images/watermark/pro/'.$band.'.png';
		if(file_exists($watermark) && file_exists($srcFilename)){
			$this->image->Watermark($srcFilename,$distFilename,$watermark);
		}
		return $distFilename;
	}
	

}
