<?php
namespace model\pro;
use \model;
use \model\pro\pro;
use \model\pro\cate;
use \model\pro\factory;
use \model\carmodel;
use \model\tags;
use \model\check;
use \model\collocation;
/**
 * Class 产品车型关系
 * @package model
 */
class promodel extends model
{
	public $canSetFiled = ['pml_pos0', 'pml_pos1','pml_pos6', 'pml_pos2', 'pml_pos3', 'pml_pos4', 'pml_pos5', 'pml_node1', 'pml_node2', 'pml_node3', 'pml_node4', 'pml_quote_pf_id', 'pml_quote_number'];
	
	public function __construct ()
    {
		parent::__construct();
		$this->factory = new factory();
	}

	/**
	  * @method 待进入
	  * @author soul
	  */
	public function getListTemp($params, $rules = [])
	{
		$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 = 'pro_model_link_temp(pmlt)';
		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)','mm.mm_id', 'p_id', 'p_innum', 'p_comnum', 'p_state_main', 'mm.mm_id', 'pb_'.LG_NAME.'(pb_name)', 'pmlt.*'];
		
		$refiled = [
			'pb_name'=>'pb.pb_'.LG_NAME,
			'mk_name'=>'mk_'.LG_NAME,
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
			'opuser'=>'pmlt.opuser',
			'create_time'=>'pmlt.update_time',
			'update_time'=>'pmlt.update_time',
		];
		$this->set('othjoin', []);
		$this->set('sTags', false);
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$join = [
			"[><]pro(pro)" => ["pmlt.pmlt_p_id" => "p_id"],
			"[>]pro_brand(pb)" => ["pro.p_pb_id" => "pb_id"],
			"[><]p_code(cod)" => ["pro.p_id" => "pc_id"],
			"[><]pro_cate(cat)" => ["pro.p_cate" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[>]m_model(mm)" => ["pmlt.pmlt_mm_id" => "mm_id"],
			"[>]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			/*"[>]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"],
			"[>]m_model_source(mms)" => ["mm.mm_id" => "mms_mm_id"]*/
		];

		$this->set('carmodel', new carmodel());
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			if($field == 'pmlt_sample' && $data == 1) $op = 'ge';

			if(in_array($field, ['pmlt_pos0','pmlt_pos1','pmlt_pos1','pmlt_pos2','pmlt_pos4','pmlt_pos6']))
			{
				if(in_array($op, ['cn', 'eq']))
				{
					$data = raw(sprintf("concat('/',%s,'/') like '%%/%s/%%'", $field, $data));
					$op = 'RAW_'.$field.$op;
				}
				else if(in_array($op, ['ni']))
				{
					$data = raw(sprintf("concat('/',%s,'/') not like '%%/%s/%%'", $field, $data));
					$op = 'RAW_'.$field.$op;
				}
			}
			if($field == 'tags')
			{
				$res = $this->get('carmodel')->medooAnyLink($field, 'pmlt_id', $op, $data, ['tl_type'=>'_promodel']);
				$data = $res['data'];
				$op = $res['op'];
			}
			
			if($field == 'mms_source')
			{
				$res = $this->get('carmodel')->medooAnyLink($field, 'mm_id', $op, $data);
				$data = $res['data'];
				$op = $res['op'];
			}

			if($field == 'ktype_id'){
				if($op=='eq'){
					$data = raw(sprintf(" mms_source=10116 and mms_link_id = '%s'",$data));
				}else{
					$data = raw(sprintf(" mms_source=10116 and mms_link_id like '%s%%'",$data));
				}
				$op = 'RAW_'.$field.$op;
			}
			if($field == 'hmd_id'){
				if($op=='eq'){
					$data = raw(sprintf(" mms_source=10113 and mms_link_id = '%s'",$data));
				}else{
					$data = raw(sprintf(" mms_source=10113 and mms_link_id like '%s%%'",$data));
				}
				$op = 'RAW_'.$field.$op;
			}

			if($field == 'pmlt_para'){
				$field = 'RAW #1';
				$data =  raw("JSON_SEARCH(pmlt_para,'one','%{$data}%')  IS NOT NULL");
			}
        });
		$join = array_merge($join, $this->get('othjoin'));
		if(stripos($sidx,'hmd_id')!==false)
		{
			$sidx = strtr($sidx, ['hmd_id'=>'mms_link_id']);
		}
		if(stripos($sidx,'ktype_id')!==false)
		{
			$sidx = strtr($sidx, ['ktype_id'=>'mms_link_id']);
		}
		
		foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'numbers':
					foreach($val as $tk=>$tv)
					{
						$val[$tk] = formatNum($tv);
					}
					$where["AND #num"] = [
						"OR" => [
							'p_comnum_format'.($rules['numlike']? '[~]': '') => $val,
							'p_innum_format'.($rules['numlike']? '[~]': '') => $val
						]
					];
				break;
			}
		}
		$fields = array_unique($fields);

		$where["pmlt_status"] = empty($params['pmlt_status']) || $params['pmlt_status'] != -1 ? 1: -1;

		$check = new \model\check();
		$ruleWhere = $check->getPowerWhere('pro_model_link_temp', $where["pmlt_status"] == 1? 'F500':'F600');
		$where = array_merge($where, $ruleWhere);

		if(!empty($params['srcIds']) && $params['srcType'] != -1)
		{
			$where['mms_link_id'] = explode(',', $params['srcIds']);
			$where['mms_source'] = $params['srcType'];
		}
		else if(!empty($params['srcIds']) && $params['srcType'] == -1)
		{
			$where['mm_id'] = explode(',', $params['srcIds']);
		}
		
		if(!empty($params['keys'])) $where['pmlt_id'] = explode(',', $params['keys']);
		if(!empty($params['pmlt_id'])) $where['pmlt_id'] = $params['pmlt_id'];
		
		if(isset($params['ck1'])) $where['ck1'] = $params['ck1'];
		if(isset($params['ck2'])) $where['ck2'] = $params['ck2'];
		if(!empty($params['p_lnk_p_id'])){
			$where['p_id'] = $params['p_lnk_p_id'];
			$orgPid = $params['p_id'];
		}else if(!empty($params['p_id'])){
			$where['p_id'] = $params['p_id'];
		}
		$where['p_pb_id'] = 1;
		$where['GROUP'] = 'pmlt_id';
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, 'pmlt_id',$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		
        $modArr = $this->db->select($table,$join,$fields, $where);
		if(!empty($modArr))
		{
			$modArr = $this->fillProModelTemp($modArr);
		}

		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => array_values($modArr)
		];
		return $data;
	}


	//初始化对应的数据
	public function fillProModelTemp($modArr)
	{
		if(!empty($modArr))
		{
			$pmatids = array_column($modArr, 'pmlt_id');

			$carmodel = new carmodel();
			$modInfoArr = $carmodel->getModelInfoByIds(array_column($modArr, 'mm_id'));
			$modInfoArr = array_column($modInfoArr, null, 'mm_id');
			
			$collocation = new collocation();
			$collArr = $collocation->getCollItems('model');

			/*$tags = new tags();
			$tagsArr = $tags->getTypeValTags('_promodel', $pmatids);
			$tagsArr = array_column($tagsArr, 'tags', 'tl_value_id');*/

			foreach($modArr as $k=>$v)
			{
				if(!empty($modInfoArr[$v['mm_id']])) 
					$v = array_merge($modInfoArr[$v['mm_id']], $v);
				$plareas = empty($areas[$v['pmlt_id']]) ? []: $areas[$v['pmlt_id']];
				$v['areas'] = [];
				foreach($plareas as $tv)
				{
					if($tv['ma_mlzy']) $v['areas'][] = $tv;
					$v['catalog_notes_'.$tv['ma_id']] = $tv['pmat_catalog_notes'];
				}

				$v['pmlt_para'] = empty($v['pmlt_para'])? []:json_decode($v['pmlt_para'], true);
				//$v['tags'] = empty($tagsArr[$v['pmlt_id']]) ? '': implode(',', array_column($tagsArr[$v['pmlt_id']], 't_id'));
				//$v['captions']['tags'] = empty($tagsArr[$v['pmlt_id']]) ? '': implode(',', array_column($tagsArr[$v['pmlt_id']], LG_NAME));
				$v['captions']['pmlt_sign_type'] = !empty($collArr[$v['pmlt_sign_type']])? $collArr[$v['pmlt_sign_type']]: '';
				$v['captions']['ckresult1'] = !empty($collArr[$v['ckresult1']])? $collArr[$v['ckresult1']]: '';
				$v['captions']['ckresult2'] = !empty($collArr[$v['ckresult2']])? $collArr[$v['ckresult2']]: '';
				$modArr[$k] = $v;
			}
		}
		return $modArr;
	}


	/**
	  * @method 新增或者编辑待进入
	  * @param  $pmlt_id int [必填] 0表示新增
	  * @param  $setArr array [必填] ['pmlt_cate'=>.....]
	  * @author soul
	  */
	public function saveProModelTempDetail($pmlt_id, $setArr)
	{
		$baseArr = $setArr['base'];
		if(empty($baseArr['pmlt_mm_id'])) exitJson('GSP ID必填');
		//确认产品ID
		if(empty($baseArr['pmlt_p_id']))
		{
			$pro = new pro();
			$pidArr = $pro->chkProIdByAny(['innum'=>$baseArr['pmlt_innum'], 'outnum'=>$baseArr['pmlt_outnum']]);
			if(empty($pidArr)) exitJson('GSP型号不存在');
			$baseArr['pmlt_p_id'] = $pidArr[0];
		}

		//品类
		$row = $this->db->get('pro', ['p_cate', 'p_innum', 'p_comnum'], ['p_id'=>$baseArr['pmlt_p_id']]);
		if($pmlt_id > 0)
			if(!\p::catesEdit('F500', $row['p_cate'])) exitJson('无此品名权限');
		else
			if(!\p::catesAdd('F500', $row['p_cate'])) exitJson('无此品名权限');

		
		$baseArr['pmlt_cate'] = $row['p_cate'];
		$baseArr['pmlt_innum'] = $row['p_innum'];
		$baseArr['pmlt_outnum'] = $row['p_comnum'];

		$exists = $this->checkExistTemp($baseArr, $pmlt_id);
		if(!empty($exists)) return $exists;

		$datetime = getNowTime();
		$opuser = getOpuser();
		$this->db->Begin();
		$baseArr['opuser'] = $opuser;
		$baseArr['update_time'] = $datetime;
		if($pmlt_id > 0)
		{
			$this->db->update('pro_model_link_temp', $baseArr, ['pmlt_id'=>$pmlt_id]);
		}
		else
		{
			$baseArr['create_time'] = $datetime;
			$this->db->insert('pro_model_link_temp', $baseArr);
			$pmlt_id = $this->db->id();
		}

		if($pmlt_id > 0 && isset($setArr['areas']))
		{
			foreach($setArr['areas'] as &$v)
			{
				$v['pmat_pmlt_id'] = $pmlt_id;
			}
			$carmodel = new carmodel();
			$carmodel->changeAreaLink('_promodel', 'replace', $setArr['areas'], $pmlt_id);
		}

		if($pmlt_id > 0 && isset($setArr['tags']))
		{
			$tagsLinkArr = [['t_id'=>$setArr['tags'], 'value_id'=>$pmlt_id]];
			$tags = new tags();
			$tags->changeTagsLink('_promodel', 'replace', $tagsLinkArr);
		}
		$this->db->End();
		return ['pmlt_id'=>$pmlt_id];
	}


	/**
	  * @method 删除待进入
	  * @param  $idArr array [必填] pmlt_id [1,2,3,...]
	  * @author soul
	  */
	public function delProModelTemp($idArr)
	{
		if(!empty($idArr))
		{
			$rows = $this->db->select('pro_model_link_temp', 'pmlt_p_id', ['pmlt_id'=>$idArr]);
			$check = new check();
			$proCateRule = $check->checkProRuleCate($rows, 'F600', 'delete');
			if(!empty($proCateRule['no'])) exitJson('无此品名权限');

			$this->db->Begin();
			$this->db->delete('pro_model_link_temp', ['pmlt_status'=>-1, 'pmlt_id'=>$idArr]);
			$this->db->delete('tags_link', ['tl_type'=>'_promodel', 'tl_value_id'=>$idArr]);
			$this->db->End();
		}
		return [];
	}


	
	/**
	  * @method 编辑待进入单字段
	  * @param  $pmlt_id  int  [必填] pmlt_id
	  * @param  $setArr  array  [必填] ['pmlt_pos1'=>'',....]
	  * @author soul
	  */
	public function setProModelCellTemp($pmlt_id, $setArr)
	{
		$canSetFiled = ['tags','pmlt_remark','pmlt_para'];
		if(!empty($pmlt_id) && !empty($setArr))
		{
			$old = $this->db->get('pro_model_link_temp', '*', ['pmlt_id'=>$pmlt_id]);
			if(empty($old)) exitJson('记录不存在');

			//品类
			$row = $this->db->get('pro', ['p_cate', 'p_innum', 'p_comnum'], ['p_id'=>$old['pmlt_p_id']]);
			if(!\p::catesEdit('F500', $row['p_cate'])) exitJson('无此品名权限');
			
			$this->db->Begin();
			
			foreach($setArr as $filed=>$val)
			{
				if($filed == 'tags')
				{
					$tagsLinkArr = [['t_id'=>$val, 'value_id'=>$pmlt_id]];
					$tags = new tags();
					$tags->changeTagsLink('_promodel', 'replace', $tagsLinkArr);
					unset($setArr[$filed]);
				}
				else if(stripos($filed, 'catalog_notes_') !== false)
				{//区域目录备注
					$areaid = str_replace('catalog_notes_', '', $filed);
					$carmodel = new carmodel();
					$carmodel->changeAreaLink('_promodel', 'add', [['pmat_ma_id'=>$areaid, 'pmat_pmlt_id'=>$pmlt_id,'pmat_catalog_notes'=>$val]]);
					unset($setArr[$filed]);
				}
				else if(!in_array($filed, $canSetFiled)) 
				{
					unset($setArr[$filed]);
					continue;
				}
			}

			if(!empty($setArr))
			{
				$exists = $this->checkExistTemp(array_merge($old, $setArr), $pmlt_id);
				if(!empty($exists)) exitJson($exists['msg']);

				$opuser = getOpuser();
				$datetime = getNowTime();

				$setArr['opuser'] = $opuser;
				$setArr['update_time'] = $datetime;

				$this->db->update('pro_model_link_temp', $setArr, ['pmlt_id'=>$pmlt_id]);
			}
			$this->db->End();
		}
		return [];
	}

	/**
     * 加入待进入检测是否存在
	 * @param  $dataArr  array  [必填] ['pmlt_p_id'=>'', 'pmlt_mm_id'=>'', 'pmlt_pos0'=>'', 'pmlt_pos1'=>'', 'pmlt_pos2'=>'', 'pmlt_pos3'=>'', 'pmlt_pos4'=>'', 'pmlt_node1'=>'']
     */
	public function checkExistTemp($dataArr, $pmlt_id = 0)
	{
		//国际通用库
		$uniwhere = [
			'pml_p_id'=>$dataArr['pmlt_p_id'],
			'pml_mm_id'=>$dataArr['pmlt_mm_id'],
		];
		$table = 'pro_model_link(pml)';
		$join = ["[><]pro(pro)" => ["pml.pml_p_id" => "p_id"]];
		$chk = $this->db->get($table, $join, ['pml_id'], $uniwhere);
		if(!empty($chk)){
			return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'国际通用库已存在'];
		}
		$uniwhere = [
			'pmlt_p_id'=>$dataArr['pmlt_p_id'],
			'pmlt_mm_id'=>$dataArr['pmlt_mm_id'],
			'pmlt_id[!]'=>$pmlt_id
		];
		$chk = $this->db->get('pro_model_link_temp', ['pmlt_status', 'ckuser2', 'ckremark2', 'cktime2'], $uniwhere);
		if(!empty($chk)){
			return ['code'=>0, 'table'=>'pro_model_link_temp', 'msg'=>'待进入车型库已存在'];
		}
	}


	/**
	  * @method 复审待进入
	  * @param  $idArr array [必填] [1,2,3,...]
	  * @param  $setArr array [必填] ['act'=>'ok|del','ckresult2'=>'结论'] 
	  * @author soul
	  */
	public function check2Temp($idArr, $setArr)
	{
		if(!empty($idArr))
		{
			//转正式，并删除待进入
			$join = [
				"[><]pro(pro)" => ["pmlt.pmlt_p_id" => "p_id"],
			];
			$tempArr = $this->db->select('pro_model_link_temp(pmlt)', $join, '*', ['pmlt_id'=>$idArr]);
			if(empty($tempArr)) exitJson('记录不存在');

			$check = new check();
			$proCateRule = $check->checkProRuleCate(array_column($tempArr, 'pmlt_p_id'), 'F500', 'check2');
			if(!empty($proCateRule['no'])) exitJson('无此品名权限');
			
			$opuser = getOpuser();
			$datetime = getNowTime();
			
			if($setArr['act'] && $setArr['act'] == 'ok')
			{
				$pro = new pro();
				$tags = new tags();
				$carmodel = new carmodel();
				$tagsArr = $tags->getTypeValTags('_promodel', array_column($tempArr, 'pmlt_id'));
				$tagsArr = array_column($tagsArr, 'tags', 'tl_value_id');

				$this->db->Begin();
				foreach($tempArr as $mt)
				{
					//此产品是否有合并后产品
					$mergePid = $this->db->get('p_code', 'pc_merge_p_id', ['pc_p_id'=>$mt['pmlt_p_id']]);
					if(!empty($mergePid)) $mt['pmlt_p_id'] = $mergePid;

					$chk = $pro->canSetPro($mt['pmlt_p_id']);
					if(!empty($chk['msg'])) exitJson($chk['msg']);

					if(empty($mt['pmlt_mm_id'])) exitJson('', '车型不存在');

					$set = [
						'pml_p_id'=>$mt['pmlt_p_id'],
						'pml_mm_id'=>$mt['pmlt_mm_id'],
						'pml_remark'=>$mt['pmlt_remark'],
						'pml_para'=>$mt['pmlt_para'],
						'ckuser2'=>$opuser,
						'cktime2'=>$datetime,
						'ckresult2'=>$setArr['ckresult2'],
						'ckremark2'=>$setArr['ckremark2'],
						'opuser'=>$opuser,
						'update_time'=>$datetime
					];

					//合并历史
					if(!empty($mergePid)) $set['pml_merge_remark'] = $mt['p_innum'];

					$exists = $this->checkExist($set);
					if(!empty($exists)) exitJson($exists['msg']);

					$set['create_time'] = $datetime;
					$this->db->insert('pro_model_link', $set);
					$pml_id = $this->db->id();

					//数据版本
					/*if(!empty($tagsArr[$mt['pmlt_id']]))
					{
						$tags->changeTagsLink('promodel', 'replace', ['t_id'=>array_column($tagsArr[$mt['pmlt_id']], 't_id'), 'value_id'=>$pml_id]);
					}*/
				}
				$this->db->delete('pro_model_link_temp', ['pmlt_id'=>$idArr]);
				$this->db->End();
			}
			else if($setArr['act'] && $setArr['act'] == 'notpass')
			{
				$set = [
					'ck2'=>1,	
					//'pmlt_status'=>-1,
					'ckuser2'=>$opuser,
					'cktime2'=>$datetime,
					'ckresult2'=>$setArr['ckresult2'],
					'ckremark2'=>$setArr['ckremark2'],
					'update_time'=>$datetime,
					'opuser'=>$opuser
				];
				$this->db->update('pro_model_link_temp', $set, ['pmlt_id'=>$idArr]);
			}else if($setArr['act'] && $setArr['act'] == 'del'){
				$this->db->delete('pro_model_link_temp', $set, ['pmlt_id'=>$idArr]);
			}
		}
		return [];
	}



	/**
     * 加入正式检测是否存在
	 * @param  $dataArr  array  [必填] ['pml_p_id'=>'', 'pml_mm_id'=>'', 'pml_pos0'=>'', 'pml_pos1'=>'', 'pml_pos2'=>'', 'pml_pos3'=>'', 'pml_pos4'=>'', 'pml_node1'=>'']
     */
	public function checkExist($dataArr, $pml_id = 0)
	{
		$uniwhere = [
			'pml_p_id'=>$dataArr['pml_p_id'],
			'pml_mm_id'=>$dataArr['pml_mm_id'],
			//'pml_id[!]'=>$pml_id
		];
		$chk = $this->db->get('pro_model_link', ['pml_id'], $uniwhere);
		if(!empty($chk)){
			$msg = '国际车型已存在';
			//$msg .= '<br>'.$chk['delremark'].' '.$chk['pmc_opuser'].' '.$chk['pmc_create_time'];
			return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'车型ID:'.$dataArr['pml_mm_id'].$msg];
		}


		/*if(empty($dataArr['pml_pos1']) && empty($dataArr['pml_pos6']) && empty($dataArr['pml_pos2']) && empty($dataArr['pml_pos3']) && empty($dataArr['pml_pos4']))
			return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'无安装位置'];*/
		//品类限制
		/*$cat_id = $this->db->select('pro', 'p_cate', ['p_id'=>$dataArr['pml_p_id']]);
		
		//变更库
		$uniwhere = [
			'pmc_act'=>'del',
			'pml_p_id'=>$dataArr['pml_p_id'],
			'pml_mm_id'=>$dataArr['pml_mm_id'],
			'pml_pos0'=>$dataArr['pml_pos0'],
			'pml_pos1'=>$dataArr['pml_pos1'],
			'pml_pos6'=>$dataArr['pml_pos6'],
			'pml_pos2'=>$dataArr['pml_pos2'],
			'pml_pos3'=>$dataArr['pml_pos3'],
			'pml_pos4'=>$dataArr['pml_pos4'],
			'pml_node1'=>$dataArr['pml_node1'],
		];
		$chk = $this->db->get('pro_model_change', ['delremark', 'pmc_opuser', 'pmc_create_time'], $uniwhere);
		if(!empty($chk)){
			$msg = '变更车型库已存在';
			$msg .= '<br>'.$chk['delremark'].' '.$chk['pmc_opuser'].' '.$chk['pmc_create_time'];
			return ['code'=>0, 'table'=>'pro_model_change', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].$msg];
		}
		
		//拆分比较
		$table = 'pro_model_link(pml)';
		$join = ["[><]pro(pro)" => ["pml.pml_p_id" => "p_id"]];
		$posFiled = ['pml_pos0','pml_pos1','pml_pos6','pml_pos2','pml_pos3','pml_pos4'];
		$comFiled = $posFiled;

		$dataArr['exppos'] = [];
		$dataArr['exp'] = $this->expProModelPos($dataArr, $comFiled);
		foreach($dataArr['exp'] as $tvv)
		{
			$unikey = implode(',', $tvv);
			$dataArr['exppos'][] = $unikey;
		}

		$fileds = array_merge($posFiled, ['pml_id','pml_p_id','pml_mm_id','pml_node1']);
		$pmArr = $this->db->select($table, $join, $fileds, ['p_state_main[!]'=>'Y5','p_cate'=>$cat_id, 'pml_mm_id'=>$dataArr['pml_mm_id'], 'pml_id[!]'=>$pml_id]);
		$pmArr = array_column($pmArr, null, 'pml_id');
		$unikeyArr = [];
		foreach($pmArr as $pmlid=>$tv)
		{
			$tv['exppos'] = [];
			$tv['exp'] = $this->expProModelPos($tv, $comFiled);
			foreach($tv['exp'] as $tvv)
			{
				$unikey = implode(',', $tvv);
				$tv['exppos'][] = $unikey;
			}
			$pmArr[$pmlid] = $tv;
			$sameArr = array_intersect($dataArr['exppos'], $tv['exppos']);
			if(!empty($sameArr))
			{	//型号一样，位置1~6一样
				if($dataArr['pml_p_id'] == $tv['pml_p_id'])
				{	
					if($dataArr['pml_node1'] == $tv['pml_node1'])
					{//逻辑一
						return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'国际通用库已存在-逻辑一'];
					}
					else
					{//逻辑三
						return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'备注可以合并-逻辑三'];
					}
				}
				else if(empty($dataArr['pml_node1']) || empty($tv['pml_node1']) || $dataArr['pml_node1'] == $tv['pml_node1'])
				{//逻辑二位置1~6，GSP型号不一样，其他车型备注一个有值一个为空或备注相同，不让进正式库（提示“重复型号需增加备注”）
					return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'重复型号需增加备注-逻辑二'];
				}
			}

			if($dataArr['pml_node1'] == $tv['pml_node1'])
			{
				foreach($dataArr['exp'] as $dvv)
				{
					foreach($tv['exp'] as $tvv)
					{
						if($dvv['pml_pos0'] == $tvv['pml_pos0'])
						{//逻辑五 五个安装位置，某一列相同，其他列一行有值一行为空，不让进入正式库。
							$tFiled = ['pml_pos1','pml_pos6','pml_pos2','pml_pos3','pml_pos4'];
							$tsArr = [];$ntsArr = [];
							foreach($tFiled as $tf)
							{
								if($dvv[$tf] == $tvv[$tf])
								{//相同字段
									$tsArr[] = $tf;
								}
								else if((empty($dvv[$tf]) || empty($tvv[$tf])) && $dvv[$tf] != $tvv[$tf])
								{//一行有值一行为空
									$ntsArr[] = $tf;
								}
								if(count($tsArr) > 0 && count($ntsArr) > 0)
								{
									return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'有重复需排查-逻辑五'];
								}
							}
						}
						else if((empty($dvv['pml_pos0']) || empty($tvv['pml_pos0'])) && $dvv['pml_pos0'] != $tvv['pml_pos0'])
						{//逻辑六：变速箱一行有值一行为空，五个安装位置，某一列相同，其他列一行有值一行为空或两行相同，不让进入正式库
							$tFiled = ['pml_pos1','pml_pos6','pml_pos2','pml_pos3','pml_pos4'];
							
							//情况1：五个安装位置，某一列非空且相同，其他列一行有值一行为空）
							$tsArr = [];$ntsArr = [];
							foreach($tFiled as $tf)
							{
								if(!empty($dvv[$tf]) && $dvv[$tf] == $tvv[$tf])
								{//相同字段
									$tsArr[] = $tf;
								}
								else if((empty($dvv[$tf]) || empty($tvv[$tf])) && $dvv[$tf] != $tvv[$tf])
								{//一行有值一行为空
									$ntsArr[] = $tf;
								}
								if(count($tsArr) > 0 && count($ntsArr) > 0)
								{
									return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'有重复需排查-逻辑六'];
								}
							}
							
							//情况2：五个安装位置大于1列相同，都为空也算相同
							$tsArr = [];$ntsArr = [];
							foreach($tFiled as $tf)
							{
								if($dvv[$tf] == $tvv[$tf])
								{//相同字段
									$tsArr[] = $tf;
								}
								if(count($tsArr) > 1)
								{
									return ['code'=>0, 'table'=>'pro_model_link', 'msg'=>'GSPID:'.$dataArr['pml_mm_id'].'有重复需排查-逻辑六'];
								}
							}

						}
					}
				}
			}
		}*/
		return [];
	}
	

	
	/**
	  * @method 正式
	  * @author soul
	  */
	public function getList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$page_total = $params['page_total'] ?? 2;
		$page_records = $params['page_records'] ?? $pagesize;
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];
		$table = 'pro_model_link(pml)';
		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)', 'p_id', 'p_innum', 'p_comnum', 'p_state_main', 'mm.mm_id', 'pb_'.LG_NAME.'(pb_name)', 'pml.*'];
		
		$refiled = [
			'pb_name'=>'pb.pb_'.LG_NAME,
			'mk_name'=>'mk_'.LG_NAME,
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
			'opuser'=>'pml.opuser',
			'create_time'=>'pml.create_time',
			'update_time'=>'pml.update_time',
		];
		$this->set('othjoin', []);
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);
		$join = [
			"[><]pro(pro)" => ["pml.pml_p_id" => "p_id"],
			"[>]pro_brand(pb)" => ["pro.p_pb_id" => "pb_id"],
			"[><]p_code(cod)" => ["pro.p_id" => "pc_id"],
			"[><]pro_cate(cat)" => ["pro.p_cate" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[><]m_model(mm)" => ["pml.pml_mm_id" => "mm_id"],
			"[><]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			"[><]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"],
		];

		$this->set('carmodel', new carmodel());
		$sAreas = !empty($params['ma_id']) || stripos($filters, '"field":"areas"');
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			if($field == 'pml_sample' && $data == 1) $op = 'ge';
			if(in_array($field, ['pml_pos0','pml_pos1','pml_pos1','pml_pos2','pml_pos4','pml_pos6']))
			{
				if(in_array($op, ['cn', 'eq']))
				{
					$data = raw(sprintf("concat('/',%s,'/') like '%%/%s/%%'", $field, $data));
					$op = 'RAW_'.$field.$op;
				}
				else if(in_array($op, ['ni']))
				{
					$data = raw(sprintf("concat('/',%s,'/') not like '%%/%s/%%'", $field, $data));
					$op = 'RAW_'.$field.$op;
				}
			}
			if($field == 'tags')
			{
				$res = $this->get('carmodel')->medooAnyLink($field, 'pml_id', $op, $data, ['tl_type'=>'promodel']);
				$data = $res['data'];
				$op = $res['op'];
			}
			
			if($field == 'mms_source')
			{
				$res = $this->get('carmodel')->medooAnyLink($field, 'mm_id', $op, $data);
				$data = $res['data'];
				$op = $res['op'];
			}

			if($field == 'pml_id') $data = explode(',', $data);
			
			if($field == 'ktype_id'){
				if($op=='eq'){
					$data = raw(sprintf(" mms_source=10116 and mms_link_id = '%s'",$data));
				}else{
					$data = raw(sprintf(" mms_source=10116 and mms_link_id like '%s%%'",$data));
				}
				$op = 'RAW_'.$field.$op;
			}
			if($field == 'hmd_id'){
				if($op=='eq'){
					$data = raw(sprintf(" mms_source=10113 and mms_link_id = '%s'",$data));
				}else{
					$data = raw(sprintf(" mms_source=10113 and mms_link_id like '%s%%'",$data));
				}
				$op = 'RAW_'.$field.$op;
			}
			if($field == 'pml_para'){
				$field = 'RAW #1';
				$data =  raw("JSON_SEARCH(pml_para,'one','%{$data}%')  IS NOT NULL");
			}

        });
		if(stripos($sidx,'hmd_id')!==false)
		{
			$sidx = strtr($sidx, ['hmd_id'=>'mms_link_id']);
		}
		if(stripos($sidx,'ktype_id')!==false)
		{
			$sidx = strtr($sidx, ['ktype_id'=>'mms_link_id']);
		}
		$join = array_merge($join, $this->get('othjoin'));

		foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'numbers':
					foreach($val as $tk=>$tv)
					{
						$val[$tk] = formatNum($tv);
					}
					$where["AND #num"] = [
						"OR" => [
							'p_comnum_format'.($rules['numlike']? '[~]': '') => $val,
							'p_innum_format'.($rules['numlike']? '[~]': '') => $val
						]
					];
				break;
				case 'p_cate': $where['p_cate'] = $rules['p_cate']; break;
			}
		}
		$fields = array_unique($fields);

		if(!empty($params['srcIds']) && $params['srcType'] != -1)
		{
			$where['mms_link_id'] = explode(',', $params['srcIds']);
			$where['mms_source'] = $params['srcType'];
		}
		else if(!empty($params['srcIds']) && $params['srcType'] == -1)
		{
			$where['mm_id'] = explode(',', $params['srcIds']);
		}
		
		if(!empty($params['keys'])) $where['pml_id'] = explode(',', $params['keys']);
		if(!empty($params['pml_id'])) $where['pml_id'] = $params['pml_id'];
		
		if(isset($params['ck2'])) $where['ck2'] = $params['ck2'];
		if(!empty($params['p_lnk_p_id'])){
			$where['p_id'] = $params['p_lnk_p_id'];
			$orgPid = $params['p_id'];
		}else if(!empty($params['p_id'])){
			$where['p_id'] = $params['p_id'];
		}
		$where['p_pb_id'] = 1;
		$check = new \model\check();
		$ruleWhere = $check->getPowerWhere('pro_model_link', 'F100');
		$where = array_merge($where, $ruleWhere);

		$wherestr = $sidx.json_encode($where);

		if(stripos($wherestr, 'mms_') !== false)
		{
			$join["[>]m_model_source(mms)"] = ["mm.mm_id" => "mms_mm_id"];
		}
		$where['GROUP'] = 'pml_id';
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
        /*
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, 'pml_id',$where,$page,$pagesize, 15*60);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}*/
		$where["LIMIT"] = [($page-1) * $pagesize,$pagesize];
        $modArr = $this->db->select($table,$join,$fields, $where);
		$sql = $this->db->last();
		$dbSelect = json_encode([$table,$join,$fields, $where]);
		//dd($sql);
		if(!empty($modArr))
		{
			$modArr = $this->fillProModel($modArr);
		}
		$data = [
			'page'=> $page,
			'total'=> $page_total,
			'records' => $page_records,
			'rows' => array_values($modArr),
			'userdata'=> [
			    'sql'=>base64_encode($sql),
				'dbSelect'=>base64_encode($dbSelect),
			    'pagesize'=>$pagesize
			]
		];
		return $data;
	}
	
	public function getListCount__($dbSelect,$sql,$pagesize){
		list($table,$join,$fields, $where) = $dbSelect;
		$fields = 'pml_id';
		if(isset($where['LIMIT'])){
			unset($where['LIMIT']);
		}
		$records = $this->db->count($table,$join,$fields, $where);
	    $total = ceil($records / $pagesize);
	    return [
			'dbSelect'=> $dbSelect,
			'sql'=> $sql,
			'total'=> $total,
			'records' => $records,
	    ];
	}
	
	public function getListCount($sql,$pagesize){
	    $sql = preg_replace('/[^\(]SELECT(.*)FROM/','SELECT 1 FROM',$sql);
	    $sql = preg_replace('/LIMIT(.*)OFFSET(.*)/','',$sql);
	    $sql = preg_replace("/%\'(\d+) OR/s","%' OR",$sql);
	    $sql = preg_replace("/%\'(\d+)\)/s","%')",$sql);
	    
	    $sql = "SELECT COUNT(1) FROM (".$sql.") a";
	    $st = $this->db->query($sql);
	    $records = $st->fetchColumn() ?? 0;
	    $total = ceil($records / $pagesize);
	    return [
			'sql'=> $sql,
			'total'=> $total,
			'records' => $records,
	    ];
	}

	//初始化对应的数据
	public function fillProModel($modArr)
	{
		if(!empty($modArr))
		{
			$carmodel = new carmodel();
			$modInfoArr = $carmodel->getModelInfoByIds(array_column($modArr, 'mm_id'));
			$modInfoArr = array_column($modInfoArr, null, 'mm_id');
			
			$collocation = new collocation();
			$collArr = $collocation->getCollItems('model');

			$coll13Arr = $collocation->lrtree->getChilds(13);
			$coll13Arr = array_column($coll13Arr, LG_NAME, 'o_id');
			
			$tags = new tags();
			$areas = [];
			$tagsArr = [];

			//分批取
			$pmaids = array_column($modArr, 'pml_id');
			$chuvalids = array_chunk($pmaids, 5000);
			foreach($chuvalids as $tvalids)
			{
				$rows = $tags->getTypeValTags('promodel', $tvalids);
				foreach($rows as $v)
				{
					$tagsArr[$v['tl_value_id']] = $v['tags'];
				}
			}

			$factory = new factory();
			foreach($modArr as $k=>$v)
			{
				if(!empty($modInfoArr[$v['mm_id']])) 
					$v = array_merge($modInfoArr[$v['mm_id']], $v);
				/*$plareas = empty($areas[$v['pml_id']]) ? []: $areas[$v['pml_id']];
				$v['areas'] = [];
				foreach($plareas as $tv)
				{
					if($tv['ma_mlzy']) $v['areas'][] = $tv;
					$v['catalog_notes_'.$tv['ma_id']] = $tv['pma_catalog_notes'];
				}*/
				$v['captions'] = [
					'pml_from'=>!empty($coll13Arr[$v['pml_from']])? $coll13Arr[$v['pml_from']]: '',
				];
				$v['tags'] = empty($tagsArr[$v['pml_id']]) ? '': implode(',', array_column($tagsArr[$v['pml_id']], 't_id'));
				//$v['captions']['areas'] = implode(',', array_column($v['areas'], 'ma_name'));
				//$v['captions']['tags'] = empty($tagsArr[$v['pml_id']]) ? '': implode(',', array_column($tagsArr[$v['pml_id']], LG_NAME));
				$v['captions']['ckresult2'] = !empty($collArr[$v['ckresult2']])? $collArr[$v['ckresult2']]: '';
				$v['pml_para'] = empty($v['pml_para'])? []:json_decode($v['pml_para'], true);
				$modArr[$k] = $v;
			}
		}
		return $modArr;
	}


	/**
	  * @method 编辑正式库单字段
	  * @param  $pml_id  int  [必填] pml_id
	  * @param  $setArr  array  [必填] ['pml_pos0'=>'',....]
	  * @author soul
	  */
	public function setProModelCell($pml_id, $setArr, $act = 'set', $chkExists = true)
	{
		$canSetFiled = ['tags'=>'数据版本','pml_remark'=>'备注','pml_para'=>'参数'];
		if(!empty($pml_id) && !empty($setArr))
		{
			$list = $this->getList(['all'=>1, 'pml_id'=>$pml_id]);
			$old = $list['rows'][0];

			$pro = new pro();
			$chk = $pro->canSetPro($old['pml_p_id']);
			if(!empty($chk['msg'])) exitJson($chk['msg']);

			if(empty($old)) exitJson('记录不存在');

			//品类
			$row = $this->db->get('pro', ['p_cate', 'p_innum', 'p_comnum'], ['p_id'=>$old['pml_p_id']]);
			if(!\p::catesEdit('F100', $row['p_cate'])) exitJson('无此品名权限');

			$this->db->Begin();
			$chageceilArr = [];
			$opuser = getOpuser();
			$datetime = getNowTime();
			if(isset($setArr['areas']) && !is_array($setArr['areas']))
				$setArr['areas'] = empty($setArr['areas'])? []: explode(',', $setArr['areas']);
			
			foreach($setArr as $filed=>$val)
			{
				if(
					( stripos($filed, 'catalog_notes_') === false && empty($canSetFiled[$filed]) ) 
					|| 
					(
						$val === $old[$filed] || (isset($old['captions'][$filed]) && $val === $old['captions'][$filed])
					)
				) 
				{
					unset($setArr[$filed]);
					continue;
				}
				/*if($filed == 'tags')
				{
					$newVal = [];
					$tags = new tags();
					if(!empty($val))
					{
						$newVal = $tags->getTags(explode(',', $val));
					}
					$tagsLinkArr = [['t_id'=>$val, 'value_id'=>$pml_id]];
					$tags->changeTagsLink('promodel', 'replace', $tagsLinkArr);
					$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old['captions'][$filed], 'new'=>implode(',', array_column($newVal, LG_NAME)), 'oldval'=>$old[$filed], 'newval'=>$val];
					unset($setArr[$filed]);
				}
				else if(stripos($filed, 'catalog_notes_') !== false)
				{//区域目录备注
					$areaid = str_replace('catalog_notes_', '', $filed);
					$areaname = $this->db->get('m_area', LG_NAME, ['ma_id' =>$areaid]);
					$carmodel = new carmodel();
					$tempact = '';
					if((isset($setArr['areas']) && !in_array($areaid, $setArr['areas']))){
						$tempact = 'del';
					}else if((isset($setArr['areas']) && in_array($areaid, $setArr['areas'])) || !isset($setArr['areas'])){
						$tempact = 'add';
					}
					if($tempact){
						$carmodel->changeAreaLink('promodel', $tempact, [['pma_ma_id'=>$areaid, 'pma_pml_id'=>$pml_id,'pma_catalog_notes'=>$val]]);
						$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled['catalog_notes'].'['.$areaname.']', 'old'=>$old[$filed], 'new'=>$val];
					}
					unset($setArr[$filed]);
				}
				else if($filed == 'areas')
				{
					$oldids = array_column($old['areas'], 'ma_id');
					sort($oldids);
					$val = array_unique($val);
					sort($val);
					if($oldids != $val)
					{
						$aset = [];
						$newrows = [];
						if(!empty($val))
						{
							$newrows = $this->db->select('m_area', ['ma_id', LG_NAME.'(name)'], ['ma_id' =>$val]);
							if(!empty($newrows))
							{
								foreach($newrows as $nv)
								{
									$aset[] = ['pma_pml_id'=>$pml_id, 'pma_ma_id'=>$nv['ma_id']];
								}
							}
						}
						$carmodel = new carmodel();
						$carmodel->changeAreaLink('promodel', 'replace', $aset, $pml_id);
						$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old['captions']['areas'], 'new'=>implode(',', array_column($newrows, 'name')), 'oldval'=>implode(',', $oldids), 'newval'=>implode(',', $val)];
					}
				}
				else if($filed == 'pml_quote_pf_id')
				{
					$newShow = '';
					if(!empty($val))
					{
						$newShow = $this->db->get('pro_factory', 'pf_name', ['pf_id' =>$val]);
					}
					$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old['captions'][$filed], 'new'=>$newShow, 'oldval'=>$old[$filed], 'newval'=>$val];
				}
				else
				{
					$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old[$filed], 'new'=>$val];
				}*/
			}
			//必须放在此处，遍历里有用
			unset($setArr['areas']);

			if(!empty($setArr)){
				//合并数据不检测
				if($act == 'setmerge' || !$chkExists){
				}else{
					$chkdata = array_merge($old, $setArr);
					$exists = $this->checkExist($chkdata, $pml_id);
					if(!empty($exists)) exitJson($exists['msg']);
				}
			}

			if(!empty($setArr) || !empty($chageceilArr)){
				$setArr['opuser'] = $opuser;
				$setArr['update_time'] = $datetime;
				$this->db->update('pro_model_link', $setArr, ['pml_id'=>$pml_id]);
			}
			
			//变更库
			/*if(!empty($chageceilArr)){
				$this->saveChangeLog($act, $old, $chageceilArr);
			}*/
			$this->db->End();
		}
		return ['pml_id'=>$pml_id];
	}




	private function saveChangeLog($act, $old, $chageceilArr)
	{
		$opuser = getOpuser();
		$datetime = getNowTime();
		$addChange = [
			'pmc_act'=>$act,
			'pmc_change'=>in_array($act, ['del', 'delmerge'])? '[]':[
				[
					'opuser'=>$opuser,	
					'create_time'=>$datetime,
					'change'=>$chageceilArr
				]
			],
			'pmc_opuser'=>$opuser,
			'pmc_create_time'=>$datetime,
		];
		//快速字段
		$fashfileds = ['mm_id','mm_mk_id','mm_ms_id','mk_name','ms_name','mm_name','region_s','region_c','mms_source','mms_link_id','mm_segment','mm_vio','mm_year_from','mm_month_from','mm_year_to','mm_month_to','mm_fuel', 'mm_fuel_opt','mm_disp','mm_chassis','mm_engine','mm_turbo','mm_turbo_opt','mm_kw','mm_hp','mm_cylinders','mm_cylinders_opt','mm_values','mm_drive_type','mm_drive_type_opt','mm_body','mm_doors','mm_platform', 'mm_vehicletype', 'mm_others1', 'mm_others2','pcat_name','cat_name','p_innum','p_comnum','pml_id','pml_p_id','pml_mm_id','pml_pos0','pml_pos1','pml_pos6','pml_pos2','pml_pos3','pml_pos4','pml_pos5','pml_node1','pml_node2','pml_node3','pml_node4','catalog_notes','pml_quote_pf_id','pml_quote_pf_id_opt','pml_quote_number','pml_quote_time','ckuser2','cktime2','ckresult2','ckremark2','opuser','create_time','update_time', 'tags', 'areas'];
		foreach($fashfileds as $filed)
		{
			$optfiled = substr($filed, -4) == '_opt' && strlen($filed) > 4? substr($filed, 0, -4): null;
			if($filed == 'catalog_notes')
			{
				$tvals = [];
				foreach($old as $tfk=>$tfv)
				{
					if(stripos($tfk, 'catalog_notes_') === 0)
					{
						$tvals[$tfk] = $tfv;
					}
				}
				$addChange[$filed] = json_encode($tvals);
			}
			else if($optfiled && isset($old['captions'][$optfiled]))
			{
				$addChange[$filed] = $old['captions'][$optfiled];
			}
			else if(isset($old['captions'][$filed]) && !in_array($filed.'_opt', $fashfileds))
			{
				$addChange[$filed] = $old['captions'][$filed];
			}
			else if(isset($old[$filed]))
			{
				$addChange[$filed] = $old[$filed];
			}
		}

		if(in_array($act, ['del', 'delmerge']))
		{
			if(empty($chageceilArr['delremark'])) exitJson('删除原因必填');
			$addChange['delremark'] = $chageceilArr['delremark'];
			$this->db->insert('pro_model_change', $addChange);
			$pmc_id = $this->db->id();
		}
		else
		{
			//追加旧的变更历史
			$lastChange = $this->db->get('pro_model_change', ['pmc_id', 'pmc_change'], ['pml_id' =>$old['pml_id'], 'pmc_act' =>'set', 'ORDER'=>['pmc_id'=>'DESC']]);
			if(!empty($lastChange))
			{
				$lastChange['pmc_change'] = json_decode($lastChange['pmc_change'], true);
				foreach($lastChange['pmc_change'] as $cv)
				{
					$addChange['pmc_change'][] = $cv;
				}
			}
			$addChange['pmc_change'] = json_encode($addChange['pmc_change']);
			if(!empty($lastChange))
			{
				$pmc_id = $lastChange['pmc_id'];
				$this->db->update('pro_model_change', $addChange, ['pmc_id'=>$lastChange['pmc_id']]);
			}
			else
			{
				$this->db->insert('pro_model_change', $addChange);
				$pmc_id = $this->db->id();
			}
		}
		return ['id'=>$pmc_id];
	}
	

	/**
	  * @method 删除产品的适用车型
	  * @param  $idArr array  [必填] pml_id
	  * @param  $delremark string  [必填] 变更原因
	  * @author soul
	  */
	public function delProModel($idArr, $delremark, $act = 'del')
	{
		$rows = $this->db->select('pro_model_link', 'pml_p_id', ['pml_id'=>$idArr]);
		$check = new check();
		$proCateRule = $check->checkProRuleCate($rows, 'F100', 'delete');
		if(!empty($proCateRule['no'])) exitJson('无此品名权限');

		$list = $this->getList(['all'=>1,'pml_id'=>$idArr]);
		$dataArr = $list['rows'];
		if(empty($dataArr)) exitJson('记录不存在');

		$oldArr = $this->db->select('pro_model_link', '*',['pml_id'=>$idArr]);

		$this->db->Begin();
		/*foreach($dataArr as $old)
		{
			$this->saveChangeLog($act, $old, ['delremark'=>$delremark]);
		}*/
		$this->db->delete('pro_model_link', ['pml_id'=>$idArr]);
		$this->db->delete('tags_link', ['tl_type'=>'promodel', 'tl_value_id'=>$idArr]);

		//日志记录
		$logdata = [];
		foreach ($oldArr as $item) {
			$changeArr[$item['pml_p_id']][] = $item; 
		}
		foreach ($changeArr as $pid => $changeItem) {
			$arr['model'] = $changeItem;
			$logdata[] = [
				'cl_type'=>'pro',
				'cl_act'=>'del',
				'cl_dataid'=>$pid,
				'cl_change'=>json_encode($arr, JSON_UNESCAPED_UNICODE),
				'cl_opuser'=>getOpuser(),
				'cl_create_time'=>getNowTime(),
			];
		}
		if($logdata) $this->db->insert('change_log',$logdata);
		$this->db->End();
		return [];
	}

	/**
	 * @method 添加产品的适用车型
	* @param  $p_id  int  [必填] 产品ID
	* @param  $modArr array  [必填] [
		['pml_mod3_id'=>11, 'pml_pos0'=>'选填', ....]
	]
	* @author soul
	*/
	public function addProModelTemp($p_id, $modArr)
	{
		if(!empty($p_id) && !empty($modArr))
		{
			$pro = new pro();
			$chk = $pro->canSetPro($p_id);
			if(!empty($chk['msg'])) exitJson($chk['msg']);

			$temp = [];
			$opuser = getOpuser();
			$datetime = getNowTime();
			$addArr = [];
			foreach($modArr as $v)
			{
				$v['pmlt_p_id'] = $p_id;
				$v['opuser'] = $opuser;
				$v['create_time'] = $datetime;
				$v['update_time'] = $datetime;
				$temp[$v['pmlt_mm_id']] = $v;
			}
			$modArr = $temp;
			$rows = $this->db->select('pro_model_link_temp', ['pmlt_mm_id'], ['pmlt_p_id'=>$p_id]);
			$hasArr = array_column($rows, 'pmlt_mm_id');
			
			$this->db->Begin();
			foreach($modArr as $mmid=>$row)
			{
				if($row['pmlt_mm_id'] > 0 && !in_array($row['pmlt_mm_id'], $hasArr))
				{
					$this->db->insert('pro_model_link_temp', $row);
				}
			}
			$this->db->End();
		}
		return [];
	}

	/**
	 * @method 添加产品的国际车型
	* @param  $p_id  int  [必填] 产品ID
	* @param  $modArr array  [必填] [
		['pml_mm_id'=>11, ....]
	]
	* @author soul
	*/
	public function addProModel($p_id, $modArr)
	{
		if(!empty($p_id) && !empty($modArr))
		{
			$pro = new pro();
			$chk = $pro->canSetPro($p_id);
			if(!empty($chk['msg'])) exitJson($chk['msg']);

			$temp = [];
			$opuser = getOpuser();
			$datetime = getNowTime();
			$addArr = [];
			foreach($modArr as $v)
			{
				$v['pml_p_id'] = $p_id;
				$v['opuser'] = $opuser;
				$v['create_time'] = $datetime;
				$v['update_time'] = $datetime;
				$temp[$v['pml_mm_id']] = $v;
			}
			$modArr = $temp;
			$rows = $this->db->select('pro_model_link', ['pml_mm_id'], ['pml_p_id'=>$p_id]);
			$hasArr = array_column($rows, 'pml_mm_id');
			
			$this->db->Begin();
			foreach($modArr as $mmid=>$row)
			{
				if($row['pml_mm_id'] > 0 && !in_array($row['pml_mm_id'], $hasArr))
				{
					$this->db->insert('pro_model_link', $row);
				}
			}
			$this->db->End();
		}
		return [];
	}
}