<?php
namespace model;
use \model;
use \model\tags;
use \model\check;
use \model\collocation;
use \model\pro\promodel;
use \model\ypApi;
use \model\carmodelcn;
/**
 * Class procate
 * @package model
 */
class carmodel extends model
{
	//综合导出
	public $proExpModelfields = [];

 	//通用车型库字段
    public $fieldLnkCaption = [];

	public function __construct()
    {
		 //综合导出
    	 $this->proExpModelfields = [
    		'mk_name'=>lg('Make'), 'ms_name'=>lg('Modelrange'), 'mm_name'=>lg('Model'), 'year_from'=>lg('Year From'), 'year_to'=>lg('Year to'),
            'mm_serie'=>lg('Serie'), 'mm_fuel'=>lg('Fuel'), 'mm_disp'=>lg('Disp.'), 'mm_chassis'=>lg('Modelcode'), 'mm_engine'=>lg('Enginecode'),
			'mm_vehicletype'=>lg('Vehicletype'), 'mm_turbo'=>lg('Aspiration'),
            'mm_kw'=>lg('KW'), 'mm_hp'=>lg('HP'), 'mm_cylinders'=>lg('Cyl'), 'mm_values'=>lg('Valves'), 'mm_drive_type'=>lg('Drive'),
            'mm_body'=>lg('Body'), 'mm_doors'=>lg('Doors'), 'mm_platform'=>lg('Platform'), 
    		'pml_pos0'=>lg('变速箱'), 'pml_pos1'=>lg('前/后轴'),'pml_pos6'=>lg('前/后'), 'pml_pos2'=>lg('左/右'), 
    		'pml_pos3'=>lg('外/中/内'), 'pml_pos4'=>lg('上/中/下'), 'pml_pos5'=>lg('综合'),'mm_others1'=>lg('Others1'),'mm_others2'=>lg('Others2')
        ];
    
    
    	//通用车型库字段
        $this->fieldLnkCaption = [
    		'mk_name'=>lg('品牌'), 'ms_name'=>lg('车系'), 'ms_pc'=>lg('乘用车'),'ms_cv'=>lg('商用车'), 'mm_name'=>lg('车型'), 'year_from'=>lg('开始年月'), 'year_to'=>lg('结束年月'),
            'mm_engine'=>lg('发动机'), 'mm_kw'=>lg('功率'), 'mm_hp'=>lg('马力'), 'mm_cc'=>lg('排量'), 'mm_fuel'=>lg('燃料'),
			'mm_cylinders'=>lg('缸数'), 'mm_drive'=>lg('驱动'),'mm_body'=>lg('车身'), 'mm_doors'=>lg('门数')
        ];
	    parent::__construct();
	}

	/**
     * 取车型字段对应的名称
     * @param array $row ['model_fields'=>'mm_fuel,mm_disp...']
     * @return bool
     */
	function getFiledsName($row)
	{
		$names = [];
		foreach(explode(',', $row['model_fields']) as $fk)
		{
			if(!empty($this->fieldLnkCaption[$fk]))
				$names[] = $this->fieldLnkCaption[$fk];
		}
		return $names;
    }


	/**
     * 取车型字段对应的名称
     * @param array $row ['model_fields'=>'mm_fuel,mm_disp...']
     * @return bool
     */
	function getSmallFiledsName($row)
	{
		$row['ma_fileds'] = !empty($row['ma_fileds'])? json_decode($row['ma_fileds'], true): [];
		$names = array_values($row['ma_fileds']);
		return implode(',', $names);
    }




	/**
	  * @method 通过名称匹配品牌ID
	  * @author soul
	  */
	public function getMakeIdByName($name)
	{
		$where = [
			'OR'=>[
				'cn_name'=>$name,
				'en_name'=>$name,
				'py_name'=>$name,
			]	
		];
		return $this->db->get('m_make', 'mk_id', $where);
	}

	public function chkMmid($mmid)
	{
		$id = 0;
		if(!empty($mmid))
			$id = $this->db->get('m_model', 'mm_id', ['mm_id'=>$mmid]);
		return (int) $id;
	}

	/**
	  * @method 通过名称匹配品牌ID   AUDI/VW
	  * @author soul
	  */
	public function getOeMakeIds($names)
	{
		$reArr = ['/'=>',', ';'=>','];
		$names = strtr($names, $reArr);
		$where = [
			'OR'=>[
				'mk_cn_name'=>explode(',', $names),
				'mk_en_name'=>explode(',', $names),
				'mk_py_name'=>explode(',', $names),
			]	
		];
		$rows = $this->db->select('m_make', 'mk_id', $where);
		return implode(',', $rows);
	}

	
	public function getMakeLetter()
	{
		$join = ["[><]m_series(ms)" => ["mk.mk_id" => "ms_mk_id"]];
		$rows =  $this->db->select('m_make(mk)', $join, ['mk_f'=>raw('DISTINCT UPPER(LEFT(mk_en_name, 1))')], ['ORDER'=>raw('UPPER(LEFT(mk_en_name, 1))')]);
		return array_column($rows, 'mk_f');
	}


	/**
	  * @method 获取品牌
	  * @author soul
	  */
	public function getMakeInfo($mk_id)
	{
		return $this->db->get('m_make', '*', ['mk_id'=>$mk_id]);
	}


	/**
	  * @method 获取品牌
	  * @author soul
	  */
	public function getMakes($mk_ids)
	{
		return $this->db->select('m_make', '*', ['mk_id'=>$mk_ids]);
	}

	/**
	  * @method 获取品牌
	  * @author soul
	  */
	public function getMakeNames($mk_ids)
	{
		return $this->db->select('m_make', ['mk_'.LG_NAME.'(mk_name)'], ['mk_id'=>$mk_ids]);
	}


	/**
	  * @method 新增或者编辑品牌
	  * @param  $mk_id int [必填] 0表示新增车型
	  * @author soul
	  */
	public function saveMake($mk_id, $dataArr)
	{
		$this->db->Begin();
		if(!empty($dataArr))
		{
			$opuser = getOpuser();
			$datetime = getNowTime();
			$dataArr['opuser'] = $opuser;
			$dataArr['update_time'] = $datetime;
			if($mk_id > 0)
			{
				$this->db->update('m_make', $dataArr, ['mk_id'=>$mk_id]);
			}
			else
			{
				$dataArr['create_time'] = $datetime;
				$this->db->insert('m_make', $dataArr);
				$mk_id = $this->db->id();
			}
		}
		$this->db->End();
		return ['mk_id'=>$mk_id];
	}


	/*精确查名称*/
    public function mkeqname($value){
        return $this->db->get('m_make', 'mk_id', ['name'=>trim($value)]);
    }


	/*精确查名称*/
    public function mseqname($mkid, $value){
        return $this->db->get('m_series', 'ms_id', ['ms_mk_id'=>$mkid, 'name'=>trim($value)]);
    }


	/**
	  * @method 车型选择
	  * @author soul
	  */
	public function getModelMake()
	{
		$where = [
			'GROUP'=>['mk.mk_id'],
			'ORDER'=>['mk_'.LG_NAME]
		];
		return $this->db->select('m_make(mk)', ['mk_id', 'mk_'.LG_NAME.'(mk_name)'], $where);
	}

	/**
	  * @method 大车型的车型统计数据
	  * @param  $mkidArr  array  [选填] [1,2,3..]
	  * @author soul
	  */
	public function getModelMakeCount($mkidArr)
	{
		$arr = [];
		if(!empty($mkidArr))
		{
			$rows = $this->db->select('m_series', ['ms_mk_id(mk_id)', 'ms_count'=>raw('COUNT(ms_id)')], ['ms_mk_id'=>$mkidArr, 'GROUP'=>'ms_mk_id']);
			foreach($rows as $v)
			{
				$v['mm_count'] = 0;
				$arr[$v['mk_id']] = $v;
			}

			$rows = $this->db->select('m_model', ['mm_mk_id(mk_id)', 'mm_count'=>raw('COUNT(mm_id)')], ['mm_mk_id'=>$mkidArr, 'GROUP'=>'mm_mk_id']);
			foreach($rows as $v)
			{
				if(empty($arr[$v['mk_id']]))
				{
					$v['ms_count'] = 0;
					$arr[$v['mk_id']] = $v;
				}
				else
				{
					$arr[$v['mk_id']]['mm_count'] = $v['mm_count'];
				}
			}
		}
		return array_values($arr);
	}


	/**
	  * @method 小车型的车型统计数据
	  * @param  $msidArr  array  [选填] [1,2,3..]
	  * @author soul
	  */
	public function getModelSeriesCount($msidArr)
	{
		$arr = [];
		if(!empty($msidArr)){
			$arr = $this->db->select('m_model', ['mm_ms_id(ms_id)', 'mm_count'=>raw('COUNT(mm_id)')], ['mm_ms_id'=>$msidArr, 'GROUP'=>'mm_ms_id']);
		}
		return $arr;
	}


	//小车型列表
	public function getSeriesList($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'];

		$refiled = [
			'mk_name'=>'mk_'.LG_NAME
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr( $sidx, $refiled);

		$fileds = ['mk.mk_id', 'mk_'.LG_NAME.'(mk_name)','ms.*'];
		$table = 'm_series(ms)';
		$join = [
			"[><]m_make(mk)" => ["ms.ms_mk_id" => "mk_id"],
		];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr($field, $this->get('refiled'));
        });
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if(!empty($params['mk_id'])) $where['mk.mk_id'] = $params['mk_id'];

		if($page>0 && $pagesize>0){
			$fields = ['@ms.ms_id'];
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		$where['GROUP'] = ['ms.ms_id'];
		
		$modArr = $this->db->select($table,$join, $fileds,$where);
		if(!empty($modArr))
		{
			$modArr = array_column($modArr, null, 'ms_id');
			$tjArr = $this->getModelSeriesCount(array_keys($modArr), $params['ma_id']);
			foreach($tjArr as $v)
			{
				$modArr[$v['ms_id']]['mm_count'] = $v['mm_count'];
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => array_values($modArr)
		];
		return $data;
	}



	
	/**
	  * @method 查询小车型
	  * @param  $ma_id  int  [选填] 车型区域ID, 默认所有
	  * @param  $mk_id  int  [必填] 大车型ID
	  * @author soul
	  */
	public function getModelSeries($mk_id)
	{
		$where = [
			'ms_mk_id'=>$mk_id,
			'GROUP'=>['ms_id'],
			'ORDER'=>['ms_name']
		];
		$join = [
			"[><]m_make(mk)" => ["ms.ms_mk_id" => "mk_id"],
		];
		$fileds = ['mk.mk_id', 'mk_'.LG_NAME.'(mk_name)','ms.ms_id', 'ms_name'];
		return $this->db->select('m_series(ms)', $join, $fileds, $where);	
	}


	/**
	  * @method 搜索车型
	  * @param  $param  array  [
		'mm_ids'=>[1,2,3...],
		'ma_id'=>'车型区域ID',
		'mk_id'=>'大车型ID',
		'mkword'=>'大车型关键字',
		'msword'=>'小车型关键字',
		'mmword'=>'车型关键字',
		'ms_id'=>'',
		//'mcode'=>'车型代码',
	  ]
	  * @author soul
	  */
	public function getModel($param)
	{
		$arr = ['models'=>[], 'fileds'=>$this->fieldLnkCaption];
		$join = [
			"[><]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			"[><]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"],
		];
		
		if(!empty($param['typ_id'])) $where['mm_yptyp_id'] = $param['typ_id'];
		if(!empty($param['mm_ids'])) $where['mm_id'] = $param['mm_ids'];
		if(!empty($param['mk_id'])) $where['mm_mk_id'] = $param['mk_id'];
		if(!empty($param['ms_id'])) $where['mm_ms_id'] = $param['ms_id'];
		if(!empty($param['mkword'])) $where['mk_'.LG_NAME.'[~]'] = $param['mkword'];
		if(!empty($param['msword'])) $where['ms_name[~]'] = $param['msword'];
		if(!empty($param['mmword'])) $where['mm_name[~]'] = $param['mmword'];
		if(empty($where)) return $arr;
		$where['LIMIT'] = !empty($param['LIMIT']) ? $param['LIMIT'] : 2000;
		$where['ORDER'] = ['mk_'.LG_NAME,'ms_name','mm_name','mm_year_from','mm_month_from'];
		$rows = $this->db->select('m_model(mm)',$join, 'mm.mm_id',$where);
		$arr['models'] = $this->getModelInfoByIds($rows);
		return $arr;
	}


	//车型列表
	public function getModelList($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'];

		$refiled = [
			'mk_name'=>'mk_'.LG_NAME,
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr( $sidx, $refiled);

		$table = 'm_model(mm)';
		$join = [
			"[>]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			"[>]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"],
		];
		
		$this->set('carmodel', new carmodel());
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr($field, $this->get('refiled'));
			switch ($field) {
				case 'year_from':
					$field = 'RAW #1';
					if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'cn';
                   
					if($op=='cn'){
						$data =  raw(sprintf("CONCAT(mm_year_from, LPAD(mm_month_from, 2, '0')) like '%s%%'",$data));
					}else{
						$op = $this->getMedooOp($op);
						$data =  raw(sprintf("CONCAT(mm_year_from, LPAD(mm_month_from, 2, '0')) %s '%s'",$op,$data));
					}
					break; 
				case 'year_to':
					$field = 'RAW #2';
					if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'cn';
					if($op=='cn'){
						$data =  raw(sprintf("CONCAT(mm_year_to, LPAD(mm_month_to, 2, '0')) like '%s%%'",$data));
					}else{
						$op = $this->getMedooOp($op);
						$data =  raw(sprintf("CONCAT(mm_year_to, LPAD(mm_month_to, 2, '0')) %s '%s'",$op,$data));
					}
					
					break;
			}

        });

		$where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);

		if(!empty($params['coutype']))
		{
			$country = new \model\country();
			$couwhere = $country->formatSearchWhere('model', $rules, $params);
			if(!empty($couwhere)) $where = array_merge($where, $couwhere);
		}
	
		if(!empty($params['letter'])) $where['mk_en_name[=~]'] = $params['letter'];
		if(!empty($params['mk_id'])) $where['mk.mk_id'] = $params['mk_id'];
		if(!empty($params['ms_id'])) $where['ms.ms_id'] = $params['ms_id'];
		if(!empty($params['keys'])) $where['mm.mm_id'] = explode(',', $params['keys']);
		$where['GROUP'] = ['mm.mm_id'];

		if($sidx=='year_to')
		{
			$sidx= '';
			$where['ORDER'] = raw(sprintf('CONCAT(mm_year_to, LPAD(mm_month_to, 2, 0)) %s',$sord));
			
		}
		if($sidx=='year_from')
		{
			$sidx= '';
			$where['ORDER'] = raw(sprintf('CONCAT(mm_year_from, LPAD(mm_month_from, 2, 0)) %s',$sord));
		}

		if(empty($where['ORDER'])) $where['ORDER'] = ['mk_'.LG_NAME,'ms_name','mm_name','mm_year_from','mm_month_from'];
		if($page>0 && $pagesize>0){
			$fields = ['mm.mm_id'];
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		$rows = $this->db->select($table,$join, 'mm.mm_id',$where);
		$modArr = $this->getModelInfoByIds($rows, 'org');

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


	//车型列表
	public function getModelGroupList($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'];
        $this->joinWhere = [];
		$refiled = [
			'mk_name'=>'mk_'.LG_NAME,
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr( $sidx, $refiled);

		$table = 'm_model(mm)';
		$join = [
			"[>]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			"[>]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"]
		];
		
		$this->set('carmodel', new carmodel());
		$whereRegi = 0;
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data)use(&$whereRegi){
            $whereRegi++;
			$field = strtr($field, $this->get('refiled'));
			switch($field){
			    case 'mms_source':
    				$res = $this->get('carmodel')->medooAnyLink($field, 'mm_id', $op, $data);
    				$data = $res['data'];
    				$op = $res['op'];
			        break;
			    case 'mm_year_from':
			    case 'mm_year_to':
                    if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'eq';
                    $op = $this->getMedooOp($op);
                    $this->joinWhere['RAW_whereRegi'.$whereRegi] = raw(sprintf("CASE WHEN %s=0 THEN YEAR(NOW()) ELSE %s END %s '%s'",$field,$field,$op,$data));
                    $op = null;
                    break;
			    case 'mm_month_from':
			    case 'mm_month_to':
                    if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'eq';
                    $op = $this->getMedooOp($op);
                    $this->joinWhere['RAW_whereRegi'.$whereRegi] = raw(sprintf("CASE WHEN %s=0 THEN MONTH(NOW()) ELSE %s END %s '%s'",$field,$field,$op,$data));
                    $op = null;
                    break;
				case 'year_from':
					$field = 'RAW #1';
					if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'cn';
					
					if($op=='cn'){
						$data =  raw(sprintf("CONCAT(mm_year_from, LPAD(mm_month_from, 2, '0')) like '%s%%'",$data));
					}else{
						$op = $this->getMedooOp($op);
						$data =  raw(sprintf("CONCAT(mm_year_from, LPAD(mm_month_from, 2, '0')) %s '%s'",$op,$data));
					}
					break; 
				case 'year_to':
					$field = 'RAW #2';
					if(!in_array($op,['ne','le','lt','ne','gt','ge'])) $op = 'cn';
					if($op=='cn'){
						$data =  raw(sprintf("CONCAT(mm_year_to, LPAD(mm_month_to, 2, '0')) like '%s%%'",$data));
					}else{
						$op = $this->getMedooOp($op);
						$data =  raw(sprintf("CONCAT(mm_year_to, LPAD(mm_month_to, 2, '0')) %s '%s'",$op,$data));
					}
					
					break;
				
				
			}
        });
		if(!empty($params['ma_id'])) 
			$where['RAW_MA'] = raw(sprintf(" mm.mm_id in (select distinct pml_mm_id from pro_model_area_link join pro_model_link on pml_id = pma_pml_id and pma_ma_id=%d)", $params['ma_id']));
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if(!empty($params['letter'])) $where['mk_'.LG_NAME.'[=~]'] = $params['letter'];
		if(!empty($params['mk_id'])) $where['mk.mk_id'] = $params['mk_id'];
		if(!empty($params['ms_id'])) $where['ms.ms_id'] = $params['ms_id'];
		
		$where['GROUP'] = ['mm.mm_id'];
		if(!empty($params['groupFields']))
		{	
			$where['GROUP'] = explode(',', strtr($params['groupFields'], $refiled));
			unset($where['GROUP']['year_from'],$where['GROUP']['year_to']);
		}

		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
		
		if($page>0 && $pagesize>0){
			$fields = ['mm.mm_id'];
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
		
		$rows = $this->db->select($table,$join, 'mm.mm_id',$where);
		$modArr = $this->getModelInfoByIds($rows, 'org');
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => array_values($modArr)
		];
		return $data;
	}


	/**
	  * @method 车型详情
	  * @param  $mm_id int [必填] 车型ID
	  * @author soul
	  */
	public function getModelInfo($mm_id)
	{
		$modArr = $this->getModelInfoByIds([$mm_id]);
		return $modArr[0];
	}


	/**
	  * @method 批量获取车型的详细信息
	  * @param  $mm_ids array [必填] 车型ID
	  * @param  $order string [选填] org:按照提供的ID顺序返回，name:按名称排序， ...自定义排序
	  * @author soul
	  * @return 按照原顺序返回 [[...],...]
	  */
	public function getModelInfoByIds($mm_ids, $order = 'name')
	{
		$arr = [];
		if(!empty($mm_ids))
		{
			$tidArr = [];
			$mm_ids = array_values(array_unique($mm_ids));
			$count = count($mm_ids);
			foreach($mm_ids as $k=>$tid)
			{
				$tidArr[] = (int) $tid;
				//分批取
				if(count($tidArr) == 1000 || ($k+1) == $count)
				{
					
					$modArr = [];
					$orderArr = [
						'name'=>['mk_'.LG_NAME,'ms_name','mm_name'],
					];
					$where = ['mm_id'=>$tidArr];
					$table = 'm_model(mm)';
					$join = [
						"[>]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
						"[>]m_make(mk)" => ["mm.mm_mk_id" => "mk_id"],
						"[>]adm_user(au)"=>["mm.opuser"=>'au_id']
					];
					$fields = ['mm.*','mk.mk_id', 'mk_'.LG_NAME.'(mk_name)', 'ms.ms_id', 'ms_name','mm_name','ms_chassis', 'ms_minname','ms_pc','ms_cv','au_name'];

					if(!empty($orderArr[$order]))
					{
						$where['ORDER'] = $orderArr[$order];
					}
					else if($order != 'org')
					{
						$where['ORDER'] = $order;
					}
					$modArr = $this->db->select($table,$join,$fields,$where);
					
					//组装固定值
					if(!empty($modArr))
					{
						$modArr = array_column($modArr, null, 'mm_id');
						$modIdArr = array_keys($modArr);

						$collocation = new collocation();
						$collArr = $collocation->getCollItems('model');
						foreach($modArr as $k=>$v)
						{
							$v['mm_full_name'] = $v['mk_name'].' '.$v['mm_name'];
							if(!empty($v['mm_month_from'])) $v['mm_month_from'] = sprintf("%02d", $v['mm_month_from']);
							if(!empty($v['mm_month_to'])) $v['mm_month_to'] = sprintf("%02d", $v['mm_month_to']);
							if(!empty($v['mm_year_from']) && !empty($v['mm_month_from'])){
								$v['year_from'] = $v['mm_year_from'].$v['mm_month_from'];
							}else if(!empty($v['mm_year_from'])){
								$v['year_from'] = $v['mm_year_from'];
							}else{
								$v['year_from'] = 0;
							}
							if(!empty($v['mm_year_to']) && !empty($v['mm_month_to'])){
								$v['year_to'] = $v['mm_year_to'].$v['mm_month_to'];
							}else if(!empty($v['mm_year_to'])){
								$v['year_to'] = $v['mm_year_to'];
							}else{
								$v['year_to'] = 0;
							}
							$v['captions'] = [
								'opuser'=>$v['au_name']
							];
							$modArr[$k] = $v;
						}
					}
					if($order == 'org')
					{
						foreach($tidArr as $id)
						{
							if(!empty($modArr[$id]))
								$arr[] = $modArr[$id];
						}
					}
					else
					{
						foreach($modArr as $mv)
						{
							$arr[] = $mv;
						}
					}
					$tidArr = [];
				}
			}
		}
		return array_values($arr);
	}



	/**
	  * @method 小车型详情
	  * @param  $ms_id int [必填] 小车型ID
	  * @author soul
	  */
	public function getSeriesInfo($ms_id)
	{
		$dataArr = ['ms'=>[]];
		$table = 'm_series(ms)';
		$join = [
			"[><]m_make(mk)" => ["ms.ms_mk_id" => "mk_id"],
		];
		$fields = ['mk.mk_id', 'mk_'.LG_NAME.'(mk_name)', 'ms.*', 'ms_name'];
		$dataArr['ms'] = $this->db->get($table,$join,$fields, ['ms_id'=>$ms_id]);
		return $dataArr;
	}

	/**
	  * @method 新增或者编辑小车型信息
	  * @param  $ms_id int [必填] 0表示新增车型
	  * @author soul
	  */
	public function saveSeriesDetail($ms_id, $setArr)
	{
		if(!empty($setArr['base']))
		{
			$check = new check();
			$exists = $check->checkExist('m_series', $setArr['base'], $ms_id);
			if($exists) exitJson('记录已存在');
			$opuser = getOpuser();
			$datetime = getNowTime();
			$setArr['base']['opuser'] = $opuser;
			$setArr['base']['update_time'] = $datetime;
			if($ms_id > 0)
			{
				$this->db->update('m_series', $setArr['base'], ['ms_id'=>$ms_id]);
			}
			else
			{
				$setArr['base']['create_time'] = $datetime;
				$this->db->insert('m_series', $setArr['base']);
				$ms_id = $this->db->id();
			}
		}
		return ['ms_id'=>$ms_id];
	}


	/**
	  * @method 编辑小车型单字段
	  * @param  $ms_id  int  [必填] ms_id
	  * @param  $setArr  array  [必填] ['pn_cn_remark'=>'',....]
	  * @author soul
	  */
	public function setSeriesCell($ms_id, $setArr)
	{
		$canSetFiled = ['ms_name','ms_minname','ms_chassis'];
		if(!empty($ms_id) && !empty($setArr))
		{
			foreach($setArr as $filed=>$val)
			{
				if(!in_array($filed, $canSetFiled)) 
				{
					unset($setArr[$filed]);
					continue;
				}
			}
			$opuser = getOpuser();
			$datetime = getNowTime();
			if(!empty($setArr))
			{
				$check = new check();
				$exists = $check->checkExist('m_series', $setArr, $ms_id);
				if($exists) exitJson('记录已存在');

				if(isset($setArr['ms_name']) && empty($setArr['ms_name'])) exitJson('名称不能为空');
				$setArr['opuser'] = $opuser;
				$setArr['update_time'] = $datetime;
				$this->db->update('m_series', $setArr, ['ms_id'=>$ms_id]);
			}
		}
		return [];
	}
	

	/**
	  * @method 新增或者编辑车型信息
	  * @param  $mm_id int [必填] 0表示新增车型
	  * @author soul
	  */
	public function saveModelDetail($mm_id, $setArr)
	{
		$canSetFiled = ['mm_mk_id'=>'品牌','mm_ms_id'=>'车系','mk_name'=>'品牌','ms_name'=>'车系', 'mm_name'=>'车型',
        'mm_engine'=>'发动机', 'mm_kw'=>'功率','mm_hp'=>'马力','mm_fuel'=>'燃料','mm_cc'=>'排量','mm_cylinders'=> '缸数',
        'mm_drive'=>'驱动','mm_body'=>'车身','mm_doors'=>'车门','mm_year_from'=>'开始年','mm_month_from'=>'开始月', 'mm_year_to'=>'结束年','mm_month_to'=>'结束月'];

		$this->db->Begin();
		$opuser = getOpuser();
		$datetime = getNowTime();

		if($mm_id > 0)
		{
			$old = $this->getModelInfo($mm_id);
			if(empty($old)) exitJson($mm_id.'记录不存在');
			$chageceilArr = [];
		}

		$collocation = new collocation();
		$collArr = $collocation->getCollItems('model');

		if(!empty($setArr['base']))
		{
			$setArr['base']['opuser'] = $opuser;
			$setArr['base']['update_time'] = $datetime;
			if(!empty($setArr['base']['mm_year_from']) && ($setArr['base']['mm_year_from'] < 1900 || $setArr['base']['mm_year_from'] > date('Y')+2)) exitJson('开始年份1900~'.(date('Y')+2));
			if(!empty($setArr['base']['mm_year_to']) && ($setArr['base']['mm_year_to'] < 1900 || $setArr['base']['mm_year_to'] > date('Y')+2)) exitJson('结束年份1900~'.(date('Y')+2));

			if(isset($setArr['base']['mm_month_from']) && ($setArr['base']['mm_month_from'] < 0 || $setArr['base']['mm_month_from'] > 12)) exitJson('开始月份错误');
			if(isset($setArr['base']['mm_month_to']) && ($setArr['base']['mm_month_to'] < 0 || $setArr['base']['mm_month_to'] > 12)) exitJson('结束月份错误');
			
			$check = new check();
			$exists = $check->checkExist('m_model', $setArr['base'], $mm_id);
			if($exists) exitJson('FREAY ID：'.$mm_id.'，国际车型'.$exists.'已有记录，禁止添加');
			
			$t = $setArr['base'];
			$t['mm_name'] = $t['mm_name'];
			$exists = $check->checkExist('m_model_change', $t);
			if($exists) exitJson('车型变更记录已有记录，禁止添加');
			
			if($mm_id > 0)
			{
				$act = 'set';
				$old = $this->getModelInfo($mm_id);
				if(empty($old)) exitJson('记录不存在');
				
				//变更信息
				foreach($setArr['base'] as $filed=>$val)
				{
					if(empty($canSetFiled[$filed])) continue;
					if($val == $old[$filed] || (isset($old['captions'][$filed]) && $val == $old['captions'][$filed])) continue;
					if(in_array($filed, ['mm_fuel', 'mm_turbo', 'mm_cylinders', 'mm_drive_type']))
					{
						$newShow = '';
						if(!empty($val)) $newShow = $collArr[$val];

						$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old['captions'][$filed], 'new'=>$newShow];
					}
					else if($filed == 'mm_mk_id')
					{
						$newShow = '';
						if(!empty($val))
						{
							$newShow = $this->db->get('m_make', 'mk_'.LG_NAME, ['mk_id' =>$val]);
						}
						$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old['mk_name'], 'new'=>$newShow];
					}
					else if($filed == 'mm_ms_id')
					{
						$newShow = '';
						if(!empty($val))
						{
							$newShow = $this->db->get('m_series', 'ms_name', ['ms_id' =>$val]);
						}
						$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old['ms_name'], 'new'=>$newShow];
					}
					else
					{
						$chageceilArr[$filed] = ['filed'=>$filed, 'name'=>$canSetFiled[$filed], 'old'=>$old[$filed], 'new'=>$val];
					}
				}
				$this->db->update('m_model', $setArr['base'], ['mm_id'=>$mm_id]);
			}
			else
			{
				$act = 'add';
				$setArr['base']['create_time'] = $datetime;
				$this->db->insert('m_model', $setArr['base']);
				$mm_id = $this->db->id();
			}
		}
		$this->db->End();
		return ['mm_id'=>$mm_id];
	}


	/**
	  * @method 删除大车型
	  * @param  $mkid int [必填] 大车型ID
	  * @author soul
	  */
	public function delModelMake($mkid)
	{
		if(!empty($mkid))
		{
			$msArr = $this->db->select('m_series', ['ms_id'], ['ms_mk_id'=>$mkid]);
			if(!empty($msArr))
				exitJson('402', '此品牌已绑定车系，请先删除车系！');

			$this->db->Begin();
			$this->db->delete('m_make', ['mk_id'=>$mkid]);
			$this->db->End();
		}
		return [];
	}

	

	/**
	  * @method 删除小车型
	  * @param  $msidArr int [必填] 小车型ID
	  * @author soul
	  */
	public function delSeries($msidArr)
	{
		if(!empty($msidArr))
		{
			//检测车型
			$modArr = $this->db->select('m_model', ['mm_id'], ['mm_ms_id'=>$msidArr]);
			if(!empty($modArr)) 
				exitJson('402', '所选车系下有车型，请先删除车型！');
			$this->db->Begin();

			//基本信息
			$this->db->delete('m_series', ['ms_id'=>$msidArr]);

			$this->db->End();
		}
		return [];
	}


	/**
	  * @method 删除车型
	  * @param  $mmidArr array [必填] [1,2,3,...]
	  * @param  $delremark string  [必填] 变更原因
	  * @author soul
	  */
	public function delModels($mmidArr, $delremark)
	{
		if(!empty($mmidArr))
		{
			$dataArr = $this->getModelInfoByIds($mmidArr);
			if(empty($dataArr)) exitJson('记录不存在');

			$this->db->Begin();
			foreach($dataArr as $old)
			{
				$this->saveChangeLog('del', $old, ['delremark'=>$delremark]);
			}

			//变更车型库
			$pmlIdArr = $this->db->select('pro_model_link', 'pml_id', ['pml_mm_id'=>$mmidArr]);
			if(!empty($pmlIdArr))
			{
				$promodel = new promodel();
				$promodel->delProModel($pmlIdArr, $delremark);
			}

			$pmlIdArr = $this->db->select('pro_model_link_temp', 'pmlt_id', ['pmlt_mm_id'=>$mmidArr]);
			if(!empty($pmlIdArr)){
				$this->db->delete('pro_model_link_temp', ['pmlt_id'=>$pmlIdArr]);
			}

			//基本信息
			$this->db->delete('m_model', ['mm_id'=>$mmidArr]);

			$this->db->End();
		}
		return [];
	}

	/**
	  * @method 检测是否可以删除车型
	  * @param  $mmidArr array [必填] [1,2,3,...]
	  * @author soul
	  */
	public function chkdelModels($mmidArr)
	{
		$has = $this->db->select('pro_model_link', 'pml_mm_id', ['pml_mm_id'=>$mmidArr, 'GROUP'=>'pml_mm_id']);
		if(empty($has)) $has = [];
		return $has;
	}

	
	/**
	  * @method 获取和车型有关的属性列表
	  * @author soul
	  * @return ['id'=>'name'....]
	  */
	public function getModelCollItems()
	{
		$collocation = new collocation();
		return $collocation->getCollItems('model');
	}

	public function getChkIdsByParams($param)
	{	
		$rows  = [];
		$fromid = (int)$param['fromid'];
		if(!$fromid && !$param['mod']) return [];
		if($param['mod']=='oe'){
			$rows = $this->db->select('oe_model_link','oml_mm_id',['oml_oe_id'=>(int)$param['fromid']]);
		}elseif ($param['mod']=='pro') {
			$rows = $this->db->select('pro_model_link','pml_mm_id',['pml_p_id'=>(int)$param['fromid']]);
		}elseif ($param['mod']=='protemp') {
			$rows = $this->db->select('pro_model_link_temp','pmlt_mm_id',['pmlt_p_id'=>(int)$param['fromid']]);
		}
		return $rows;
	}

	public function medooAnyLink($type, $keyfiled, $op, $data, $othArr = [])
	{
		$orgdata = $data;
		switch($type)
		{
			case 'tags': 
				if(!empty($data)){
					if($op == 'ne'){
						$data= raw(sprintf("%s not in (select tl_value_id from tags_link where tl_type='%s' and tl_t_id > tl_t_id ^ %d)", $keyfiled, $othArr['tl_type'], $data));
					}else{
						$data= raw(sprintf("%s in (select tl_value_id from tags_link where tl_type='%s' and tl_t_id > tl_t_id ^ %d)", $keyfiled, $othArr['tl_type'], $data));
					}
				}else{
					if($op == 'ne'){
						$data= raw(sprintf("%s in (select tl_value_id from tags_link where tl_type='%s')", $keyfiled, $othArr['tl_type']));
					}else{
						$data= raw(sprintf("%s not in (select tl_value_id from tags_link where tl_type='%s')", $keyfiled, $othArr['tl_type']));
					}
				}
				$op = 'RAW_'.$field.$op.$orgdata;	
			break;
		}
		return ['op'=>$op, 'data'=>$data];
	}

	/**
	  * @method 同步国际车型
	  * @author soul
	  */
	public function uploadModel()
	{
		ini_set('memory_limit', \mvc::$cfg['bigtable_memory_limit']);
		set_time_limit(0);
		$table = 'm_cn_model';
		$ypApi = new ypApi();
		$orgTypArr = $ypApi->Get('client/getTcdModel');
		$comfileds = [];
		$mkArr = [];
		$serArr = [];
		$modArr = [];
		foreach($orgTypArr as $k=>$v)
		{
			if(empty($mkArr[$v['mfa_id']])){
				$mkArr[$v['mfa_id']] = [
					'mk_cn_name'=>$v['mfa_brand_cn'],
					'mk_en_name'=>$v['mfa_brand'],
					'mk_py_name'=>$v['mfa_brand'],
					'mk_ypmfa_id'=>$v['mfa_id'],
				];
			}

			if(empty($serArr[$v['mod_id']])){
				$serArr[$v['mod_id']] = [
					'mfa_id'=>$v['mfa_id'],
					'ms_name'=>$v['mod_name'],
					'ms_minname'=>$v['mod_minname'],
					'ms_chassis'=>$v['mod_chassis'],
					'ms_yptcd_id'=>$v['mod_id']
				];
			}

			$modArr[] = [
				'mfa_id'=>$v['mfa_id'],
				'mod_id'=>$v['mod_id'],
				'mm_from'=>$v['typid_type'],
				'mm_from_id'=>$v['typ_id_org'],
				'mm_name'=>$v['typ_name'],
				'mm_year_from'=>$v['typ_start']? substr($v['typ_start'], 0, 4): 0,
				'mm_month_from'=>$v['typ_start']? substr($v['typ_start'], -2): 0,
				'mm_year_to'=>$v['typ_end']? substr($v['typ_end'], 0, 4): 0,
				'mm_month_to'=>$v['typ_end']? substr($v['typ_end'], -2): 0,
				'mm_engine'=>$v['typ_engine'],
				'mm_kw'=>$v['typ_kw'],
				'mm_hp'=>$v['typ_hp'],
				'mm_cc'=>$v['typ_cc'],
				'mm_cylinders'=>$v['typ_cylinder'],
				'mm_doors'=>$v['typ_doors'],
				'mm_body'=>$v['typ_body'],
				'mm_drive'=>$v['typ_drive'],
				'mm_fuel'=>$v['typ_fuel'],
				'mm_yptyp_id'=>$v['typ_id']
			];
		}

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

		$this->db->Begin();
		
		//生产商
		$rows = $this->db->select('m_make', '*', []);
		$oldArr = array_column($rows, null, 'mk_ypmfa_id');
		foreach($mkArr as $ypid=>$v){
			if(!empty($oldArr[$ypid])){
				$mkArr[$ypid]['mk_id'] = $oldArr[$ypid]['mk_id'];
			}else{
				$v['opuser'] = $opuser;
				$v['create_time'] = $datetime;
				$v['update_time'] = $datetime;
				$this->db->insert('m_make', $v);
				$mkArr[$ypid]['mk_id'] = $this->db->id();
			}
		}
		
		//车系
		$rows = $this->db->select('m_series', '*', []);
		$oldArr = array_column($rows, null, 'ms_yptcd_id');
		foreach($serArr as $ypid=>$v){
			if(!empty($oldArr[$ypid])){
				$serArr[$ypid]['ms_id'] = $oldArr[$ypid]['ms_id'];
			}else{
				$v['ms_mk_id'] = $mkArr[$v['mfa_id']]['mk_id'];
				unset($v['mfa_id']);
				$v['opuser'] = $opuser;
				$v['create_time'] = $datetime;
				$v['update_time'] = $datetime;
				$this->db->insert('m_series', $v);
				$serArr[$ypid]['ms_id'] = $this->db->id();
			}
		}

		//车型
		$rows = $this->db->select('m_model', '*', []);
		$oldArr = array_column($rows, null, 'mm_yptyp_id');
		foreach($modArr as $ypid=>$v){
			if(!empty($oldArr[$ypid])){
				
			}else{
				$v['mm_mk_id'] = $mkArr[$v['mfa_id']]['mk_id'];
				$v['mm_ms_id'] = $serArr[$v['mod_id']]['ms_id'];
				unset($v['mfa_id']);
				unset($v['mod_id']);
				$v['opuser'] = $opuser;
				$v['create_time'] = $datetime;
				$v['update_time'] = $datetime;
				$this->db->insert('m_model', $v);
				$modArr[$ypid]['mm_id'] = $this->db->id();
			}
		}
		make(\model\sys::class)->formatTagBrand();
		make(\model\pro\pro::class)->initTagBrand([]);
		make(\model\oe::class)->initTagBrand([]);
		$this->db->End();
		return [];
	}


	/**
	 * @method 获取车型选项
	 * @author zhengweihua 
	 * @copyright 2025-02-10
	 */
	public function getSelectData($param)
	{		
		$cartypeArr = $param['cartype']?explode(',', $param['cartype']):['cnmodel','model']; //车型类型
		$dtypeArr =$param['dtype']? explode(',', $param['dtype']):['mk_id','ms_id','brand_id','make_id','mod2_id']; //数据类型
		$data = ['model'=>[],'cnmodel'=>[]];
		$ckv = new \model\ckv();

		
		//国际车型
		
		if(in_array('model',$cartypeArr))
		{	$hotdata = $ckv->getKV('hot_brands');
			$hotstr =$hotdata? implode(',',$hotdata):[];
			foreach ($dtypeArr as $dtype) {
				switch ($dtype) {
					case 'mk_id':
						
						$where = ['ORDER'=>['mk_'.LG_NAME]];
						if($hotstr){
							$where['ORDER'] = raw(sprintf('CASE WHEN mk_id IN (%s) THEN 0 ELSE 1 END ASC, 
							CASE WHEN mk_id IN (%s) THEN mk_cn_name ELSE NULL  END ASC,
							mk_cn_name ASC',$hotstr,$hotstr));
						}
						$where["LIMIT"] = 10;
						if($param['keyword']){
							$where['OR'] = [
								'mk_cn_name[~]'=>$param['keyword'],
								'mk_en_name[~]'=>$param['keyword'],
								'mk_py_name[~]'=>$param['keyword'],
							];
						}
						
						$data['model']['mk_id'] = $this->db->select('m_make', ['mk_id(value)', 'mk_cn_name(name)'], $where);

						break;
					case 'ms_id':
						$where =  ['ORDER'=>['ms_name']];
						$where["LIMIT"] = 10;
						if($param['mk_id']){
							$mk_id = explode(',', $param['mk_id']);
							$where = ['ms_mk_id'=>$mk_id, 'ORDER'=>['ms_name']];
							unset($where["LIMIT"]);
						}
						if($param['keyword']){
							$where['OR'] = [
								'ms_name[~]'=>$param['keyword'],
							];
						}
							
						$data['model']['ms_id'] = $this->db->select('m_series',['ms_id(value)', 'ms_name(name)'], $where);
						break;
				}
			}
		}
		//中国车型
		if(in_array('cnmodel',$cartypeArr))
		{
			$hotdata = $ckv->getKV('hot_cnbrands');
			$hotstr =$hotdata? implode(',',$hotdata):[];
			foreach ($dtypeArr as $dtype) {
				
				switch ($dtype) {
					case 'brand_id':
						
						$where = ['ORDER'=>['brand_name'],'GROUP'=>['brand_id']];
						if($hotstr){
							$where['ORDER'] = raw(sprintf('CASE WHEN brand_id IN (%s) THEN 0 ELSE 1 END ASC,
							CASE WHEN brand_id IN (%s) THEN left(brand_initial, 1) ELSE NULL END ASC,
							left(brand_initial, 1) ASC,brand_name',$hotstr,$hotstr));
						}
						if($param['keyword']){
							$where['OR'] = [
								'brand_name[~]'=>$param['keyword'],
							];
						}
						$where["LIMIT"] = 10;	
						$data['cnmodel']['brand_id'] = $this->db->select('m_cn_model',['brand_id(value)','brand_name(name)'],$where);
						break;
					case 'make_id':
						$makeWhere = ['ORDER'=>['brand_initial'],'GROUP'=>['make_id']];
						if($param['brand_id']){
							$brandId = explode(',', $param['brand_id']);
							$makeWhere = ['brand_id'=>$brandId,'ORDER'=>['brand_initial'],'GROUP'=>['make_id']];
						}
						if($hotstr){
							$makeWhere['ORDER'] = raw(sprintf('CASE WHEN brand_id IN (%s) THEN 0 ELSE 1 END ASC,
							CASE WHEN brand_id IN (%s) THEN brand_initial ELSE NULL END ASC,
							brand_initial ASC',$hotstr,$hotstr));
						}
						if($param['keyword']){
							$makeWhere['OR'] = [
								'make_name[~]'=>$param['keyword'],
							];
						}
						$makeWhere['LIMIT'] = 10;
						$data['cnmodel']['make_id'] = $this->db->select('m_cn_model',['make_id(value)','make_name(name)'],$makeWhere);
						break;
					case 'mod2_id':
						$seriesWhere = ['ORDER'=>['mod2_name'],'GROUP'=>['mod2_name']];
						$seriesWhere['LIMIT'] = 10;
						if($param['brand_id']){
							$brandId = explode(',', $param['brand_id']);
							$seriesWhere['brand_id'] = $brandId;
							unset($seriesWhere['LIMIT']);
						}
						if($param['make_id']){
							$makeId = explode(',', $param['make_id']);
							$seriesWhere['make_id'] = $makeId;	
							unset($seriesWhere['LIMIT']);
						}
						if($param['keyword']){
							$seriesWhere['OR'] = [
								'mod2_name[~]'=>$param['keyword'],
							];
						}
						
						$data['cnmodel']['mod2_id'] = $this->db->select('m_cn_model',['mod2_id(value)','mod2_name(name)'],$seriesWhere);
						break;
				}

			}
		}
		return $data;
	}

	/**
	 * @method 从国际车型或者中国车型提取车型相关字段用于产品
	 */
	public function formatValsFromModel($mm_ids = [], $mod3_ids = [])
	{
		$arr = [];
		if($mm_ids){
			$modArr = $this->getModelInfoByIds($mm_ids);
			if(!empty($modArr)){
				$uniVal = [];
				foreach($modArr as $tv){
					foreach(['mm_year_from', 'year_from', 'year_to', 'mm_engine', 'mm_fuel', 'mm_cc', 'ms_chassis', 'ms_minname'] as $filed){
						$val = $tv[$filed];
						if(!isset($uniVal[$filed])) $uniVal[$filed] = [];
						if($val === '') continue;
						if($filed == 'ms_chassis'){
							$uniVal[$filed] = array_merge($uniVal[$filed], explode(',', $val));
						}else{
							$uniVal[$filed][] = $val;
						}
					}
				}
				foreach($uniVal as $tf=>$vals){
					$vals = array_unique($vals);
					sort($vals);
					if(in_array($tf, ['year_from', 'year_to'])){
						$uniVal[$tf] = $vals;
					}else{
						$uniVal[$tf] = implode(',', $vals);
					}
				}
				
				$arr['minname'] = $uniVal['ms_minname'];
				$arr['chassis'] = $uniVal['ms_chassis'];
				$arr['model_byear'] = in_array(0, $uniVal['year_from'])? 0: $uniVal['year_from'][0];
				$arr['model_eyear'] = in_array(0, $uniVal['year_to'])? 0: $uniVal['year_to'][count($uniVal['year_to'])-1];
				$arr['model_year'] = ($arr['model_byear']? : '').'-'.($arr['model_eyear']? : '');
				$engine = [];
				foreach(explode(',', $uniVal['mm_engine']) as $tval){
					if($tval && !in_array($tval, $engine)) $engine[] = trim($tval);
				}
				$arr['engine'] = implode(',', $engine);
				$arr['cc'] = $uniVal['mm_cc'];
				$arr['fuel'] = $uniVal['mm_fuel'];
				$fueltxt = $arr['fuel'];
				if(stripos($fueltxt, 'Petrol') !== false && stripos($fueltxt, 'Diesel') !== false){
					$arr['fuel_type'] = 1009;
				}else if(stripos($fueltxt, 'Petrol') !== false){
					$arr['fuel_type'] = 1007;
				}else if(stripos($fueltxt, 'Diesel') !== false){
					$arr['fuel_type'] = 1008;
				}
			}
		}else if($mod3_ids){
			$modArr = $this->db->select('m_cn_model', ['mod1_name(ms_minname)', 'mod3_start_year(year_from)', 'mod3_end_year(year_to)', 'mod3_cc(mm_cc)', 'mod3_engine(mm_engine)', 'mod3_fuel(mm_fuel)', 'mod3_chassis(ms_chassis)'], ['mod3_id'=>$mod3_ids]);
			if(!empty($modArr)){
				$uniVal = [];
				foreach($modArr as $tv){
					foreach(['ms_minname', 'year_from', 'year_to', 'mod3_cc', 'mm_cc', 'mm_engine', 'mm_fuel', 'ms_chassis'] as $filed){
						$val = $tv[$filed];
						if(!isset($uniVal[$filed])) $uniVal[$filed] = [];
						if($val === '') continue;
						if($filed == 'ms_chassis'){
							$uniVal[$filed] = array_merge($uniVal[$filed], explode(',', $val));
						}else{
							$uniVal[$filed][] = $val;
						}
					}
				}
				foreach($uniVal as $tf=>$vals){
					$vals = array_unique($vals);
					sort($vals);
					if(in_array($tf, ['year_from', 'year_to'])){
						$uniVal[$tf] = $vals;
					}else{
						$uniVal[$tf] = implode(' ', $vals);
					}
				}
				
				$arr['minname'] = $uniVal['ms_minname'];
				$arr['chassis'] = $uniVal['ms_chassis'];
				$arr['model_byear'] = in_array(0, $uniVal['year_from'])? 0: $uniVal['year_from'][0];
				$arr['model_eyear'] = in_array(0, $uniVal['year_to'])? 0: $uniVal['year_to'][count($uniVal['year_to'])-1];
				$arr['model_year'] = ($arr['model_byear']? : '').'-'.($arr['model_eyear']? : '');
				$engine = [];
				foreach(explode(',', $uniVal['mm_engine']) as $tval){
					if($tval && !in_array($tval, $engine)) $engine[] = trim($tval);
				}
				$arr['engine'] = implode(',', $engine);
				$arr['cc'] = $uniVal['mm_cc'];
				$arr['fuel'] = $uniVal['mm_fuel'];
				$fueltxt = $arr['fuel'];
				if(stripos($fueltxt, '汽油') !== false && stripos($fueltxt, '柴油') !== false){
					$arr['fuel_type'] = 1009;
				}else if(stripos($fueltxt, '汽油') !== false){
					$arr['fuel_type'] = 1007;
				}else if(stripos($fueltxt, '柴油') !== false){
					$arr['fuel_type'] = 1008;
				}
			}
		}
		return $arr;
	}
}