<?php
namespace model\pro;
use \model;
use \model\pro\pro;
use \model\check;
use \model\collocation;
use \model\carmodelcn;
/**
 * Class 产品中国车型关系
 * @package model
 */
class promodelcn extends model
{
	public $canSetFiled = ['pml_pos0', 'pml_pos1', 'pml_pos2', 'pml_pos3', 'pml_pos4', 'pml_node1','pml_remark'];
	
	
	public function checkExist($dataArr, $pml_id = 0)
	{
		$uniwhere = [
			'pml_p_id'=>$dataArr['pml_p_id'],
			'pml_mod3_id'=>$dataArr['pml_mod3_id']
		];
		$chk = $this->db->get('pro_model_cn_link', ['pml_id'], $uniwhere);
		if(!empty($chk)){
			$msg = '中国车型库已存在';
			return ['code'=>0, 'table'=>'pro_model_cn_link', 'msg'=>'车型ID:'.$dataArr['pml_mod3_id'].$msg];
		}
		return [];
	}

	public function check2Temp($idArr, $setArr)
	{
		if(!empty($idArr))
		{
			//转正式，并删除待进入
			$join = [
				"[><]pro(pro)" => ["pmlt.pmlt_p_id" => "p_id"],
			];
			$tempArr = $this->db->select('pro_model_cn_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();
				$this->db->Begin();
				foreach($tempArr as $mt)
				{
					//此产品是否有合并后产品
					$mergePid = $this->db->get('pro', 'p_merge_p_id', ['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_mod3_id'])) exitJson('', '车型不存在');

					$set = [
						'pml_p_id'=>$mt['pmlt_p_id'],
						'pml_mod3_id'=>$mt['pmlt_mod3_id'],
						'pml_pos0'=>$mt['pmlt_pos0'],
						'pml_pos1'=>$mt['pmlt_pos1'],
						'pml_pos2'=>$mt['pmlt_pos2'],
						'pml_pos3'=>$mt['pmlt_pos'],
						'pml_pos4'=>$mt['pmlt_pos4'],
						'pml_node1'=>$mt['pmlt_node1'],
						'pml_remark'=>$mt['pmlt_remark'],
						'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_cn_link', $set);
					$pml_id = $this->db->id();
				}
				$this->db->delete('pro_model_cn_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_cn_link_temp', $set, ['pmlt_id'=>$idArr]);
			}else if($setArr['act'] && $setArr['act'] == 'del'){
				$this->db->delete('pro_model_cn_link_temp', $set, ['pmlt_id'=>$idArr]);
			}
		}
		return [];
	}

	public function delProModelTemp($idArr)
	{
		$this->db->delete('pro_model_cn_link_temp', ['pmlt_id'=>$idArr]);
		return [];
	}

	/**
	  * @method 产品的中国车型
	  * @author soul
	  */
	public function proModelList($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']?:'brand_initial,brand_name,make_name,mod1_name,mod2_name,mod2_start_year,mod3_name,mod3_start_year';
		$table = 'pro_model_cn_link(pml)';
			
		//通过当前p_id获取引用的p_id
		$pro = new pro();
		$params['p_id'] = $pro->getQuoteIdbyPid($params['p_id']);
		
		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
		];
		$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"],
			"[><]pro_cate(cat)" => ["pro.p_cate" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[><]m_cn_model(mod3)" => ["pml.pml_mod3_id" => "mod3_id"],
			"[>]adm_user(au)"=>["pml.opuser"=>'au_id']
		];
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
        });
		if(!empty($params['p_id'])) $where['p_id'] = $params['p_id'];
		if(!empty($params['keys'])) $where['pml_id'] = explode(',', $params['keys']);
		foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'p_cate': $where['p_cate'] = $rules['p_cate']; break;
			}
		}
		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;
		if(!empty($params['keys'])) $where['pml_id'] = explode(',', $params['keys']);
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)','p_id', 'p_innum', 'p_comnum', 'pb_'.LG_NAME.'(pb_name)', 'pml.*', 'mod3.*','au_name'];
        $modArr = $this->db->select($table,$join,$fields,$where);
		if(!empty($modArr))
		{

			$collocation = new collocation();
			$collArr = $collocation->lrtree->getChilds(13);
			$collArr = array_column($collArr, LG_NAME, 'o_id');

			foreach($modArr as $k=>&$v)
			{
				$v['captions'] = [
					'pml_from'=>!empty($collArr[$v['pml_from']])? $collArr[$v['pml_from']]: '',
					'opuser'=>$v['au_name'],
				];
			}
			unset($v);

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

	
	/**
	  * @method 添加产品的适用车型
	  * @param  $p_id  int  [必填] 产品ID
	  * @param  $modArr array  [必填] [
			['pml_mod3_id'=>11, 'pml_pos0'=>'选填', ....]
		]
	  * @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_mod3_id']] = $v;
			}
			$modArr = $temp;
			$rows = $this->db->select('pro_model_cn_link', ['pml_mod3_id'], ['pml_p_id'=>$p_id]);
			$hasArr = array_column($rows, 'pml_mod3_id');
			
			$this->db->Begin();
			foreach($modArr as $mmid=>$row)
			{
				if($row['pml_mod3_id'] > 0 && !in_array($row['pml_mod3_id'], $hasArr))
				{
					$this->db->insert('pro_model_cn_link', $row);
				}
			}
		
			$pro = new pro();
			$pro->initTagBrand($p_id);
			make(\model\pro\pro::class)->addProSynLog([$p_id], 'set', 'text');
			$this->db->End();
		}
		return [];
	}

	/**
	  * @method 编辑产品的适用车型的基本信息
	  * @param  $pml_id  int  [必填] pml_id
	  * @param  $setArr  array  [必填] ['pml_pos0'=>'',....]
	  * @author soul
	  */
	public function setProModelInfo($pml_id, $setArr)
	{
		if(!empty($pml_id) && !empty($setArr))
		{
			$old = $this->db->get('pro_model_cn_link', '*', ['pml_id'=>$pml_id]);
			if(empty($old)) exitJson('记录不存在');
			$pro = new pro();
			$chk = $pro->canSetPro($old['pml_p_id']);
			if(!empty($chk['msg'])) exitJson($chk['msg']);

			foreach($setArr as $filed=>$val)
			{
				if(!in_array($filed, $this->canSetFiled)) unset($setArr[$filed]);
			}
			if(!empty($setArr))
			{
				$opuser = getOpuser();
				$datetime = getNowTime();
				$setArr['opuser'] = $opuser;
				$setArr['update_time'] = $datetime;
				$this->db->update('pro_model_cn_link', $setArr, ['pml_id'=>$pml_id]);
			}
		}
		return [];
	}


	/**
	  * @method 删除产品的适用车型
	  * @param  $idArr array  [必填] pml_id
	  * @author soul
	  */
	public function delProModel($idArr)
	{
		$oldArr = $this->db->select('pro_model_cn_link','*',['pml_id'=>$idArr]);

		$this->db->Begin();		
	
		$this->db->delete('pro_model_cn_link', ['pml_id'=>$idArr]);

		$pidArr = array_unique(array_column($oldArr, 'pml_p_id'));
		if($pidArr){
			$pro = new pro();
			$pro->initTagBrand($pidArr);
		}
		//删除日志	
		$logdata = [];
		foreach ($oldArr as $item) {
			$changeArr[$item['pml_p_id']][] = $item; 
		}
		foreach ($changeArr as $pid => $changeItem) {
			$arr['cnmodel'] = $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);
		make(\model\pro\pro::class)->addProSynLog($pidArr, 'set', 'text');
		$this->db->End();
		return [];
	}

	
	//有产品的汽车品牌
	public function getProBrand()
	{
		$where = [
			'GROUP'=>['brand_id'],
			'ORDER'=>['brand_initial', 'brand_name']
		];
		$table = 'pro_model_cn_link(pml)';
		$join = [
			"[><]m_cn_model(mod3)" => ["pml.pml_mod3_id" => "mod3_id"]
		];
		$fileds = ['brand_id', 'brand_name', 'brand_initial'];
		return $this->db->select($table, $join, $fileds, $where);
	}

	//$type  ''|'temp'
	public function getCnModelFiled($cat_id, $p_id=0, $type = '')
	{
		$colsParam = [];
		if(empty($cat_id) && empty($p_id)){
			$posFileds = ['pml_pos0'=>'位置1', 'pml_pos1'=>'位置2', 'pml_pos2'=>'位置3', 'pml_pos3'=>'位置4', 'pml_pos4'=>'位置5'];
		}else{
			$cate = new cate();
			$posFileds = $cate->getCnModelFiled($cat_id, $p_id);
		}
		foreach($posFileds as $k=>$v){
			if($type == 'temp') $k = str_replace('pml_', 'pmlt_', $k);
			$colsParam[] = ['label'=>$v,'name'=>$k, 'editable'=>true, 'edittype'=>"text"];
		}
		return $colsParam;
	}

	/**
	 * @method 获取产品国际车型master数据
	 * @author hongzhang
	 * @copyright 2026-05-11
	 */
    public function getListMaster($params)
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = empty($params['orderby'])? '': $params['orderby'];
		$table = 'pro_model_cn_link(pml)';
		$showFileds = $params['showFileds'];
		if(empty($showFileds)) msgJson('字段尚未配置');
		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
			/*'year_from'=>'mm_year_from',
			'year_to'=>'mm_year_to',*/
		];
		$carmodel = new carmodelcn();
		$fields = $carmodel->getSmallfileds($showFileds);
		$groupFileds = $carmodel->getSmallGroupfileds($showFileds, $refiled);
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);
		
		$join = [
			"[><]pro(pro)" => ["pml.pml_p_id" => "p_id"],
			"[><]pro_cate(cat)" => ["pro.p_cate" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[><]m_cn_model(mm)" => ["pml.pml_mod3_id" => "mod3_id"],
		];
		$this->set('mod3_start_year', '');
		$this->set('mod3_end_year', '');
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			if(in_array($field, [ 'mod3_start_year', 'mod3_end_year']))
			{
				$op = null;
				$this->set($field, $data);
			}
        });

		$where['p_id'] = $params['p_id'];
		
		// 筛选的车型品牌
		if(!empty($params['tag_brand']))
		{
			$tagBrandArr = explode(',', $params['tag_brand']);
			$makeList = $this->db->select('tag_brand_cnbrand',['tbm_brand_id'], ['tbm_tb_id'=>$tagBrandArr]);
			$where['brand_id'] = array_column($makeList, 'tbm_brand_id');
		}

		//提取不连续年份使用
		if(!empty($params['years'])) $fields['years'] = raw("group_concat(mod3_start_year,'~', mod3_end_year)");
		// $check = new \model\check();
		// $ruleWhere = $check->getPowerWhere('pro_model_link', 'F200');
		// $where = array_merge($where, $ruleWhere);
		$where['GROUP'] = $groupFileds;

		if($this->get('mod3_start_year'))
			$where['HAVING']['mod3_start_year[=~]'] = $this->get('mod3_start_year'); 

		if($this->get('mod3_end_year'))
			$where['HAVING']['mod3_end_year[=~]'] = $this->get('mod3_end_year');

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$pages = $this->paging($table,$join, $fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		$modArr = $this->db->select($table,$join,$fields, $where);
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => array_values($modArr)
		];
		return $data;
	}
}
