<?php
namespace model;
use \model;
/**
 * Class 适用国家
 * @package model
 */
class country extends model
{
	public $ischkCcArr = [];
	public $ischkCcids = [];

	public function __construct()
    {
		parent::__construct();
		$rows = $this->db->select('crm_country', ['cc_id', 'cc_chkccids'], ['cc_status'=>1,'cc_isend'=>1]);
		foreach($rows as $row)
		{
			$this->ischkCcArr[$row['cc_id']] = [];
			if(!empty($row['cc_chkccids'])){
				foreach(json_decode($row['cc_chkccids'], true) as $tid){
					if(!empty($tid)) $this->ischkCcArr[$row['cc_id']][] = $tid;
				}
			}
			$this->ischkCcids = array_merge($this->ischkCcids, $this->ischkCcArr[$row['cc_id']]);
		}
	}

	public function getArea()
	{
		return $this->db->select('crm_country', '*', ['cc_isend'=>0,'cc_id[!]'=>1, 'ORDER'=>['cc_seq','cc_code']]);
	}

	/**
	  * @method 适用国家区域树
	  * @param  $type [选填] 区域类型 默认1实际区域(pdc) 2虚拟市场(smart)
	  * @author soul
	  */
	public function getTree($type = 1)
	{
		if($type == 'status1'){
			//国家勾选默认国家
			$where = ['cc_isend'=>0, 'OR'=>['cc_type'=>1, 'cc_id'=>1], 'ORDER'=>['cc_seq','cc_code']];
		}else if($type == 2){
			$where = ['cc_isend'=>0, 'ORDER'=>['cc_seq','cc_code']];
		}else{
			$where = $type == 0? ['cc_isend'=>0, 'ORDER'=>['cc_seq','cc_code']]: ['cc_isend'=>0, 'OR'=>['cc_type'=>$type, 'cc_id'=>1], 'ORDER'=>['cc_seq','cc_code']];
		}
		//区域
		$arr = $this->db->select('crm_country', ['cc_id(id)', 'name'=>raw("concat(cc_code,'-',".LG_NAME.")"), 'cc_isend', 'cc_code'], $where);
		foreach($arr as $k=>$v)
		{
			$v['pId'] = $v['id'] == 1? 0: 1;
			$arr[$k] = $v;
		}
		$join = ["[><]crm_area_country_link" => ["cc_id" => "cacl_cc_id"]];
		$where = ['cc_status'=>1,'cacl_ca_id'=>array_column($arr, 'id'),'ORDER'=>['cc_seq','cc_code']];
		//pdc 不显示默认勾选的
		if($type == 1 || $type == 2)
		{
			//2023/6/28 取消区域默认勾选
			//$where['cacl_ischk'] = 0;
			//2023/6/28 国家勾选的默认国家
			if(!empty($this->ischkCcids)) $where['cc_id[!]'] = $this->ischkCcids;
		}
		//国家
		$rows = $this->db->select('crm_country', $join, ['cc_id(id)', 'name'=>raw("concat(cc_code,'-',".LG_NAME.")"), 'cacl_ca_id(pId)', 'cc_isend', 'cc_code'], $where);
		$arr = array_merge($arr, $rows);
		return array_values($arr);
	}
	
	//pdc通过国家追加默认勾选国家
	public function getPdcIsChkCcids($ccids)
	{
		foreach($ccids as $k=>$v)
		{
			if(empty($v)){
				unset($ccids[$k]);
			}else{
				$ccids[$k] = (int) $v;
			}
		}
		//全球
		if(in_array(1, $ccids)){
			$ccids = [1];
		}
		else if(!empty($ccids))
		{
			$ischkids = [];
			foreach($ccids as $id)
			{
				if(!empty($this->ischkCcArr[$id])) $ischkids = array_merge($ischkids, $this->ischkCcArr[$id]);
			}
			$ccids = array_merge($ccids, $ischkids);

			/*2023/6/28 取消区域默认勾选
			$ccidsstr = implode(',', array_unique($ccids)); 
			$sql = "SELECT cc_id FROM crm_country WHERE cc_isend = 1 AND cc_status = 1 AND (cc_id IN ($ccidsstr) OR cc_id IN (SELECT cacl_cc_id FROM crm_area_country_link WHERE cacl_ischk = 1 and cacl_ca_id IN (select cacl_ca_id from crm_area_country_link where cacl_cc_id in($ccidsstr))))";
			$rows = $this->db->query($sql)->fetchAll();
			$ccids = array_column($rows, 'cc_id');*/
		}
		return $ccids;
	}


	/**
	  * @method 变更某源的适用国家
	  * @param  $table string [必填] factory model code number _number'
	  * @param  $actType string [必填] add:只增加  del:只删除 replace:替换
	  * @param  $valids array [必填] [1,2,3...]
	  * @param  $ccids array [必填] [1,2,3...] 
	  * @author soul
	  */
	public function changeLink($table, $actType, $valids, $ccids)
	{
		$datetime = getNowTime();
		if(!empty($table) && !empty($actType) && !empty($valids) && is_array($ccids))
		{
			$valids = array_unique($valids);
			$ccids = $this->getPdcIsChkCcids($ccids);
			$isAll = in_array(1, $ccids);
			$this->db->Begin();
			switch($actType)
			{
				case 'add':
				case 'replace':
					if($actType == 'add')
					{
						if($isAll){//全球删除其他
							$this->db->delete('crm_country_link', ['cl_type'=>$table, 'cl_value_id'=>$valids, 'cl_cc_id[!]'=>$ccids]);
						}
					}else if($actType == 'replace'){
						if(empty($ccids)){
							$this->db->delete('crm_country_link', ['cl_type'=>$table, 'cl_value_id'=>$valids]);
						}else{
							$this->db->delete('crm_country_link', ['cl_type'=>$table, 'cl_value_id'=>$valids, 'cl_cc_id[!]'=>$ccids]);
						}
					}
					if(!empty($ccids))
					{
						$rows = $this->db->select('crm_country_link', ['cl_value_id', 'cl_cc_id'], ['cl_type'=>$table, 'cl_value_id'=>$valids, 'cl_cc_id'=>$ccids]);
						$haskey = [];
						foreach($rows as $row)
						{
							$haskey[$row['cl_value_id'].'@'.$row['cl_cc_id']] = $row;
						}
						$addArr = [];
						foreach($valids as $valid)
						{
							foreach($ccids as $ccid)
							{
								$key = $valid.'@'.$ccid;
								if($valid > 0 && $ccid > 0 && empty($haskey[$key]))
								{
									$addArr[$key] = ['cl_type'=>$table, 'cl_value_id'=>$valid, 'cl_cc_id'=>$ccid];
								}
							}
						}
						if(!empty($addArr)) $this->db->insert('crm_country_link', array_values($addArr));
					}
				break;
				case 'del':
					if($isAll){
						$this->db->delete('crm_country_link', ['cl_type'=>$table, 'cl_value_id'=>$valids]);
					}else{
						$this->db->delete('crm_country_link', ['cl_type'=>$table, 'cl_value_id'=>$valids, 'cl_cc_id'=>$ccids]);
					}
				break;
			}
			$this->db->End();
		}
		return [];
	}
	
	/**
	  * @method 检测品牌和交叉索引是否允许变更适用国家
	  * @param  $table string [必填] factory model code number _number'
	  * @param  $actType string [必填] add:只增加  del:只删除 replace:替换
	  * @param  $valid int [必填] 1
	  * @param  $ccids array [必填] [1,2,3...] 
	  * @param  $facid int [必填] 交叉索引批量新增时需要
	  * @author soul
	  */
	function checkCanChange($table, $actType, $valid, $ccids, $facid = 0)
	{
		$flag = true;$facid = (int) $facid;$valid = (int) $valid;
		if($table == 'factory' && in_array($actType, ['del','replace']))
		{//品牌的国家操作减少，也要提示且不允许，操作人员要先去交叉库先把对于的号码处理掉才可以
			//替换全球
			if($actType == 'replace' && in_array(1, $ccids)) return true;
			//此品牌下的所有
			$sql = "SELECT cl_cc_id FROM pro_numidx JOIN crm_country_link ON pn_id = cl_value_id AND cl_type='number' AND pn_pf_id =".$valid."
			UNION ALL 
			SELECT cl_cc_id FROM pro_numidx_temp JOIN crm_country_link ON pnt_id = cl_value_id AND cl_type='_number' AND pnt_pf_id =".$valid;
			$rows = $this->db->query($sql)->fetchAll();
			$numCcids = array_column($rows, 'cl_cc_id');
			if(!empty($numCcids))
			{
				if($actType == 'del' && in_array(1, $ccids)) return false;
				if(in_array(1, $numCcids)) return false;
				//删除有交集
				if($actType == 'del' && array_intersect($ccids, $numCcids)) return false;
				//编辑中不含有
				if($actType == 'replace' && array_diff($numCcids, $ccids)) return false;
			}
		}
		if(in_array($table, ['_number','number']) && in_array($actType, ['add','replace']) && !empty($ccids))
		{
			if(empty($facid)){
				if($table == '_number'){
					$sql = "SELECT cl_cc_id FROM crm_country_link WHERE cl_type='factory' AND cl_value_id IN (SELECT pnt_pf_id FROM pro_numidx_temp WHERE pnt_id =".$valid.")";
				}else{
					$sql = "SELECT cl_cc_id FROM crm_country_link WHERE cl_type='factory' AND cl_value_id IN (SELECT pn_pf_id FROM pro_numidx WHERE pn_id =".$valid.")";
				}
			}else{
				$sql = "SELECT cl_cc_id FROM crm_country_link WHERE cl_type='factory' AND cl_value_id =".$facid;
			}
			$rows = $this->db->query($sql)->fetchAll();
			$facCcids = array_column($rows, 'cl_cc_id');
			//品牌国家空
			if(empty($facCcids) || (in_array(1, $ccids) && !in_array(1, $facCcids))) return false;
			if(in_array(1, $facCcids)) return true;
			//品牌不包含
			if(array_diff($ccids, $facCcids)) return false;
		}
		return $flag;
	}


	/**
	  * @method 格式化某源的适用国家 
	  * @param  $dataArr array [必填] 原始数据
	  * @param  $type [选填] 区域类型 默认1实际区域(pdc) 2虚拟市场(smart)
	  * @author soul
	  */
	public function formatDataCountry($dataArr, $type = 1)
	{
		if(empty($dataArr)) return $dataArr;
		$formatFileds = [];
		foreach(array_keys($dataArr[0]) as $key)
		{
			if(preg_match('/(sale_coun.*)ids/', $key, $match))
			{
				$formatFileds[$key] = $match[1]; 
			}
		}
		$counTree = [];
		$rows = $this->db->select('crm_country', ['cc_id','cc_code'], ['cc_isend'=>0, 'OR'=>['cc_type'=>$type, 'cc_id'=>1], 'ORDER'=>['cc_seq','cc_code']]);
		$counTree = array_column($rows, null, 'cc_id');

		$where = ['cc_status'=>1, 'cacl_ca_id'=>array_keys($counTree),'ORDER'=>['cc_seq','cc_code']];
		//pdc 不显示默认选中的
		//if($type == 1) $where['cacl_ischk'] = 0;

		$join = ["[><]crm_area_country_link" => ["cc_id" => "cacl_cc_id"]];
		$rows = $this->db->select('crm_country', $join, ['cc_id', 'cacl_ca_id(pcc_id)','cc_code'], $where);
		foreach($rows as $row)
		{
			//pdc 不显示默认选中的
			if($type == 1 && in_array($row['cc_id'], $this->ischkCcids)) continue;
			$counTree[$row['pcc_id']]['sons'][$row['cc_id']] = $row;
		}
		
		foreach($dataArr as $k=>$v)
		{
			foreach($formatFileds as $filedkey=>$namefiled)
			{
				$v[$namefiled] = '';
				//展示字段的国家ID，移除不显示部分
				$v[$filedkey.'_end'] = [];
				if(!empty($v[$filedkey]))
				{
					$ccids = $v[$filedkey];
					if(in_array(1, $ccids))
					{
						$v[$namefiled] = $counTree[1]['cc_code'];
						$v[$filedkey.'_end'][] = 1;
					}else{
						$temptree = $counTree;
						$tname = [];
						foreach($counTree as $pk=>$pv)
						{
							if(empty($pv['sons'])) continue;
							$full = true;
							foreach($pv['sons'] as $pkk=>$pvv)
							{
								if(!in_array($pvv['cc_id'], $ccids))
								{
									$full = false;
									unset($pv['sons'][$pkk]);
								}else{
									$v[$filedkey.'_end'][] = $pvv['cc_id'];
								}
							}
							if(!empty($pv['sons']))
							{
								$tname[] = $full? $pv['cc_code']:$pv['cc_code'].':'.implode('/', array_column($pv['sons'], 'cc_code'));
							}
						}
						$v[$namefiled] = implode(';    ', $tname);
						$v[$filedkey.'_end'] = array_unique($v[$filedkey.'_end']);
						sort($v[$filedkey.'_end']);
					}
				}
			}
			$dataArr[$k] = $v; 
		}
		return $dataArr;
	}

	/**
	  * @method 提取某源的适用国家 
	  * @param  $dataArr array [必填] 原始数据
	  * @param  $stype [必填] model code  promodel _promodel factory  _number  number  pro
	  * @author soul
	  */
	public function getDataCountryId($dataArr, $stype)
	{
		set_time_limit(0);
		if(empty($dataArr)) return $dataArr;
		
		$allcfg = [
			'model'=>['keycount'=>1, 'key1'=>'mm_id', 'table1'=>'model'],
			'promodel'=>['keycount'=>2, 'key1'=>'mm_id', 'table1'=>'model', 'key2'=>'pml_p_id', 'table2'=>'code'],
			'pro'=>['keycount'=>1, 'key1'=>'p_oe_id', 'table1'=>'poe'],
			'poe'=>['keycount'=>1, 'key1'=>'oe_id', 'table1'=>'poe'],
			'codeall'=>[],
		];
		$cfg = $allcfg[$stype];

		$hasCcArr = [];
		for($num = 1; $num <= $cfg['keycount']; $num++)
		{
			$key = $cfg['key'.$num];
			$table = $cfg['table'.$num];
			$valids = array_unique(array_column($dataArr,$key));
			$chuvalids = array_chunk($valids, 1000);
			foreach($chuvalids as $tvalids)
			{
				$rows = $this->db->select('crm_country_link', ['cl_value_id','cl_cc_id'], ['cl_type'=>$table,'cl_value_id'=>$tvalids]);
				foreach($rows as $row)
				{
					$hasCcArr[$table][$row['cl_value_id']][] = $row['cl_cc_id'];
				}
			}
		}
		switch($stype)
		{
			case 'poe':
			case 'model':
			case 'pro':
				$key = $cfg['key1'];
				$table = $cfg['table1'];
				foreach($dataArr as $k=>$v)
				{
					$dataArr[$k]['sale_counids'] = $hasCcArr[$table][$v[$key]]? : [];
				}
			break;
			case 'codeall':
				$key = 'pc_id';
				$allpids = array_unique(array_column($dataArr, $key));
				$chupids = array_chunk($allpids, 1000);
				$sqlArr = [
					//自定义
					'code'=>"SELECT cl_value_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM crm_country_link where cl_type='code' and cl_value_id in (#pidsstr#) group by cl_value_id",
					//交叉库
					'number'=>"SELECT p_id, GROUP_CONCAT(DISTINCT cc_id) cc_ids FROM (
					SELECT pn_p_id p_id, cl_cc_id cc_id FROM pro_numidx JOIN crm_country_link ON pn_id = cl_value_id AND cl_type='number' and pn_p_id in (#pidsstr#)
					UNION ALL 
					SELECT pn_p_id p_id, cl_cc_id cc_id FROM pro_numidx JOIN crm_country_link ON pn_pf_id = cl_value_id AND cl_type='factory' 
					WHERE pn_p_id in (#pidsstr#) and pn_id NOT IN (SELECT DISTINCT cl_value_id FROM crm_country_link WHERE cl_type='number' and pn_p_id in (#pidsstr#))
					) t GROUP BY p_id",
					//车型
					//"model"=>"SELECT pml_p_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM pro_model_link JOIN crm_country_link ON pml_mm_id = cl_value_id AND cl_type = 'model' and pml_p_id in (#pidsstr#) group by pml_p_id",

					//promodel 型号国家定义中型号自定义有值取国际车型和该值的交集，当型号国家定义中型号自定义无值取国际车型
					"promodel"=>"SELECT pml_p_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM pro_model_link JOIN crm_country_link ON pml_mm_id = cl_value_id AND cl_type = 'model' and pml_p_id in (#pidsstr#) group by pml_p_id",

					//订单
					//"order"=>"SELECT p_id, GROUP_CONCAT(DISTINCT slcpv_pdc_cc_id) cc_ids FROM gsp_new_saledataall_bi JOIN pro ON p_outnum = transfernewno JOIN copy_smt_link_country_pdc_vio ON country = slcpv_sale_country where p_id in (#pidsstr#) group by p_id",
					"order"=>"SELECT ssale_p_id p_id, GROUP_CONCAT(DISTINCT ssale_cc_id) cc_ids FROM copy_smt_sale where ssale_p_id in (#pidsstr#) group by ssale_p_id",
					//综合
					"pro"=>"SELECT cl_value_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM crm_country_link where cl_type='pro' and cl_value_id in (#pidsstr#) group by cl_value_id",
				];
				$pidCcArr = [];
				foreach($sqlArr as $kcode=>$sql)
				{
					foreach($chupids as $pids)
					{
						$pidsstr = implode(',', $pids);
						$tsql = str_replace('#pidsstr#', $pidsstr, $sql);
						$rows = $this->db->query($tsql)->fetchAll();
						foreach($rows as $row)
						{
							$pidCcArr[$kcode][$row['p_id']] = $row['cc_ids'];
						}
					}

					foreach($dataArr as $k=>$v)
					{
						$idfiled = 'sale_coun_'.$kcode.'ids';
						$dataArr[$k][$idfiled] = $pidCcArr[$kcode][$v[$key]]? explode(',', $pidCcArr[$kcode][$v[$key]]): [];
						if($kcode == 'promodel' && !empty($dataArr[$k][$idfiled]) && !empty($pidCcArr['code'][$v[$key]]))
						{//型号国家定义中型号自定义有值取国际车型和该值的交集，当型号国家定义中型号自定义无值取国际车型
							$codids = explode(',', $pidCcArr['code'][$v[$key]]);
							if(in_array(1, $dataArr[$k][$idfiled])){
								$dataArr[$k][$idfiled] = $codids;
							}else if(in_array(1, $codids)){
								
							}else{
								$dataArr[$k][$idfiled] = array_intersect($dataArr[$k][$idfiled], $codids);
								$dataArr[$k][$idfiled] = array_values($dataArr[$k][$idfiled]);
							}
						}
					}
				}
			break;
			case 'promodel':
				//型号国家定义中型号自定义有值取国际车型和该值的交集，当型号国家定义中型号自定义无值取国际车型
				foreach($dataArr as $k=>$v)
				{
					$ccids = [];
					if(!empty($hasCcArr[$cfg['table1']][$v[$cfg['key1']]]) && !empty($hasCcArr[$cfg['table2']][$v[$cfg['key2']]]))
					{//型号国家定义中型号自定义有值取国际车型和该值的交集
						if(in_array(1, $hasCcArr[$cfg['table1']][$v[$cfg['key1']]])){
							$ccids = $hasCcArr[$cfg['table2']][$v[$cfg['key2']]];
						}else if(in_array(1, $hasCcArr[$cfg['table2']][$v[$cfg['key2']]])){
							$ccids = $hasCcArr[$cfg['table1']][$v[$cfg['key1']]];
						}else{
							$ccids = array_intersect($hasCcArr[$cfg['table1']][$v[$cfg['key1']]], $hasCcArr[$cfg['table2']][$v[$cfg['key2']]]);
							$ccids = array_values($ccids);
						}
					}
					else if(!empty($hasCcArr[$cfg['table1']][$v[$cfg['key1']]]) && empty($hasCcArr[$cfg['table2']][$v[$cfg['key2']]]))
					{
						$ccids = $hasCcArr[$cfg['table1']][$v[$cfg['key1']]];
					}
					$dataArr[$k]['sale_counids'] = $ccids;
				}
			break;
			default:
				foreach($dataArr as $k=>$v)
				{
					$dataArr[$k]['sale_counids'] = [];
				}
			break;
		}
		return $dataArr;
	}
	
	/**
	  * @method 从文本提取适用国家 
	  * @param  $txt string [必填] EU0;AS0:AE/CN/AF;NA0:CN;GCC:AE;CIS:BY/MD/UA/RU
	  * @author soul
	  */
	public function getCountryIdsByTxt($txt)
	{
		$ids = [];
		$tarr = ['area'=>[], 'country'=>[]];
		$txt = strtr($txt, [' '=>'', "\n"=>';']);
		foreach(explode(';', $txt) as $av)
		{
			$ta = explode(':', $av);
			//BY/MD/UA/RU
			if(count($ta) == 1 && stripos($av, '/')) $ta = ['', $ta[0]];
			if(count($ta) == 1){
				$tarr['area'][] = $ta[0];
				//全球 或者 单国家
				$tarr['country'][] = $ta[0];
			}else{
				$tarr['country'] = array_merge($tarr['country'], explode('/', $ta[1]));
			}
		}
		if(!empty($tarr['area'])){
			$join = [
				"[><]crm_country(cou)" => ["cacl_cc_id" => "cc_id"],
				"[><]crm_country(pcou)" => ["cacl_ca_id" => "cc_id"]
			];
			$rows = $this->db->select('crm_area_country_link', $join, ['cou.cc_id'], ['cou.cc_status'=>1,'cou.cc_isend'=>1,'pcou.cc_code'=>$tarr['area']]);
			$ids = array_merge($ids, array_column($rows, 'cc_id'));
		}
		if(!empty($tarr['country'])){
			$rows = $this->db->select('crm_country', ['cc_id'], ['cc_status'=>1,'OR'=>['cc_isend'=>1,'cc_id'=>1],'cc_code'=>$tarr['country']]);
			$ids = array_merge($ids, array_column($rows, 'cc_id'));
		}
		if(in_array(1, $ids)) $ids = [1];
		return $ids;
	}

	/**
	  * @method  重置型号适用国家缓存
	  * @param  
	  * @author soul
	  */
	public function resetProCountryCache()
	{
		ini_set('memory_limit', \mvc::$cfg['bigtable_memory_limit']);
		set_time_limit(0);
		ignore_user_abort(true);
		//上次任务是否执行完或者当前在执行中
		$lockkey = 'resetProCountryCache';
		$row = $this->db->get('ckv', '*', ['k'=>$lockkey]);
		//if(!empty($row)) exitJson('上次任务尚未执行完，请检查。或者删除表ckv中k='.$lockkey.'的记录重新执行');
		
		$datetime = getNowTime();
		$this->db->replace('ckv', ['k'=>$lockkey, 'u'=>getOpuser(), 'remark'=>'型号适用国家缓存生成'.$datetime]);
		
		$sqlArr = [
			'oldpro'=>"SELECT cl_value_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM crm_country_link where cl_type='pro' group by cl_value_id",
			//自定义
			'code'=>"SELECT cl_value_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM crm_country_link where cl_type='code' group by cl_value_id",
			//交叉库
			'number'=>"SELECT p_id, GROUP_CONCAT(DISTINCT cc_id) cc_ids FROM (
				SELECT pn_p_id p_id, cl_cc_id cc_id FROM pro_numidx JOIN crm_country_link ON pn_id = cl_value_id AND cl_type='number'
				UNION ALL 
				SELECT pn_p_id p_id, cl_cc_id cc_id FROM pro_numidx JOIN crm_country_link ON pn_pf_id = cl_value_id AND cl_type='factory' 
				WHERE pn_id NOT IN (SELECT DISTINCT cl_value_id FROM crm_country_link WHERE cl_type='number')
			)t GROUP BY p_id",
			//车型
			"model"=>"SELECT pml_p_id p_id, GROUP_CONCAT(DISTINCT cl_cc_id) cc_ids FROM pro_model_link JOIN crm_country_link ON pml_mm_id = cl_value_id AND cl_type = 'model' group by pml_p_id",
			//订单
			//"order"=>"SELECT p_id, GROUP_CONCAT(DISTINCT slcpv_pdc_cc_id) cc_ids FROM gsp_new_saledataall_bi JOIN pro ON p_outnum = transfernewno JOIN copy_smt_link_country_pdc_vio ON country = slcpv_sale_country group by p_id",
			"order"=>"SELECT ssale_p_id p_id, GROUP_CONCAT(DISTINCT ssale_cc_id) cc_ids FROM copy_smt_sale group by ssale_p_id",
		];
		$hasCcArr = [];
		foreach($sqlArr as $kcode=>$sql)
		{
			$rows = $this->db->query($sql)->fetchAll(); 
			foreach($rows as $row)
			{
				$ids = explode(',', $row['cc_ids']);
				$hasCcArr[$row['p_id']][$kcode] = $hasCcArr[$kcode][$row['p_id']]? array_merge($hasCcArr[$kcode][$row['p_id']], $ids): $ids;
			}
		}
		
		//父子关系
		$sql = "SELECT pf_son_pid, GROUP_CONCAT(pf_father_pid) father_pids FROM `pro_fatherson` GROUP BY pf_son_pid";
		$rows = $this->db->query($sql)->fetchAll();
		$pFatherArr = array_column($rows, 'father_pids', 'pf_son_pid');
		
		foreach($hasCcArr as $pid=>$ccArr)
		{
			//4、根据品牌+品牌号定义的国家，国际通用库定义的国家，销售国家，取并集，形成该型号的适用国家范围
			$ccArr['merge'] = [];
			if(!empty($ccArr['number'])) $ccArr['merge'] = array_merge($ccArr['merge'], $ccArr['number']);
			if(!empty($ccArr['model']))
			{
				$ccids = [];
				if(empty($ccArr['code']))
				{
					$ccids = $ccArr['model'];
				}
				else
				{
					if(in_array(1, $ccArr['model'])){
						$ccids = $ccArr['code'];
					}else if(in_array(1, $ccArr['code'])){
						$ccids = $ccArr['model'];
					}else{
						$ccids = array_intersect($ccArr['model'], $ccArr['code']);
						$ccids = array_values($ccids);
					}
				}
				$ccArr['merge'] = array_merge($ccArr['merge'], $ccids);
			}
			if(!empty($ccArr['order'])) $ccArr['merge'] = array_merge($ccArr['merge'], $ccArr['order']);
			$hasCcArr[$pid] = $ccArr;
		}
		
		foreach($hasCcArr as $pid=>$ccArr)
		{
			//5、增加父
			if(!empty($pFatherArr[$pid]))
			{
				foreach(explode(',', $pFatherArr[$pid]) as $fa_p_id)
				{
					if(!empty($hasCcArr[$fa_p_id]['merge']))
					{
						$ccArr['merge'] = array_merge($ccArr['merge'], $hasCcArr[$fa_p_id]['merge']);
					}
				}
			}
			$ccArr['new_pro'] = !empty($ccArr['code'])? $ccArr['code']: $ccArr['merge'];
			$hasCcArr[$pid] = $ccArr;
		}

		$this->db->Begin();
		$tpids = [];
		foreach($hasCcArr as $pid=>$ccArr)
		{
			$tpids[] = $pid;
			$this->changeLink('pro', 'replace', [$pid], $ccArr['new_pro']);
			if(count($tpids) == 1000)
			{
				$this->db->update('p_code', ['country_time_auto'=>$datetime], ['pc_p_id'=>$tpids]);
				$tpids = [];
			}
		}
		if($tpids) $this->db->update('p_code', ['country_time_auto'=>$datetime], ['pc_p_id'=>$tpids]);
		
		$this->db->delete('ckv', ['k'=>$lockkey]);
		$this->db->End();
		return true;
	}
	
	//'number', ['country'=>1,2,3,], ['coutype'=>'and|or|null', 'backtype'=>'raw|sql']
	public function formatSearchWhere($stype, $rules, $params)
	{
		$where = [];
		if(empty($params['coutype'])) return $where;
		$rawWhere = '';
		switch($stype)
		{	
			case 'poe':
			case 'model': 
			case 'pro': 
				if($stype == 'model') $rawreArr = [];
				if($stype == 'poe') $rawreArr = ['mm.mm_id'=>'oe_id', "'model'"=>"'poe'"];
				if($stype == 'pro') $rawreArr = ['mm.mm_id'=>'p_oe_id', "'model'"=>"'poe'"];
				if($params['coutype'] == 'and' && !empty($rules['country']))
				{
					$twhere = ["mm.mm_id in (select distinct cl_value_id from crm_country_link where cl_type='model' and cl_cc_id = 1)"];
					if($rules['country'] != 1){
						$total = count(explode(',', $rules['country']));
						$twhere[] = sprintf("mm.mm_id in (select distinct cl_value_id from crm_country_link where cl_type='model' and cl_cc_id in (0,%s) group by cl_value_id having count(*)= %d)", $rules['country'], $total);
					}
					$rawWhere = "(".implode(" or ", $twhere).")";
				}
				else if($params['coutype'] == 'or' && !empty($rules['country']))
				{
					if($rules['country'] == 1){
						$rawWhere = " mm.mm_id in (select distinct cl_value_id from crm_country_link where cl_type='model')";
					}else{
						$rawWhere = sprintf(" mm.mm_id in (select distinct cl_value_id from crm_country_link where cl_type='model' and cl_cc_id in (1,%s))", $rules['country']);
					}
				}
				else if($params['coutype'] == 'null')
				{
					$rawWhere = " mm.mm_id not in (select distinct cl_value_id from crm_country_link where cl_type='model')";
				}
			break;
			
		}
		if(!empty($rawWhere)){
			$rawWhere = strtr($rawWhere, $rawreArr);
			if($params['backtype'] == 'sql'){
				$where['SQL_COUNTRY'] = $rawWhere;
			}else{
				$where['RAW_COUNTRY'] = raw($rawWhere);
			}
		}
		return $where;
	}
}