<?php
/*
 [
    'key'=>'rule1',                             //键名
    'caption'=>'编码规则',                      //字段名
    'must'=> true,                              //是否必须,默认false
    'mustCols'=> ['ruleA','ruleB']              //当此列存在时，必须有的其他列 ，默认空
    'minlen'=>0,                                //最小长度 默认0不判断
    'maxlen'=>50,                               //最大长度 默认0不判断
    'type'=>'number',                           //类型 number,string 默认 string
    //自定义检测
    'checkfunction'=>function($arr, $k, $v, $obj){
        $obj->lastError = '[line:'.$obj->lineNum.'] ['.$obj->rules[$k]['caption'].'] 自定义检测, 当前值为[ '.$v.' ]';
        return false;
    }
     //格式化单元格的值 [
        类, 
        类的创建参数, 默认[]
        方法, 
        参数,  ['@innum','@outnum',123,true] @表示使用导入数据中的列中的值 ,'@'表示自己 
        如果结果是数组指定返回哪个键 默认null
     ]
    'formatCell'=> [\model\collocation::class,'getRowByKey',['@'],null],   或者 config/import.php 中的配置
],
 */
 
namespace model\import;
use \model;
use \model\check;
use \model\collocation;

/**
 * 
 */
class carmodel  extends model
{
	 /**
     * 标题 (用于消息提醒)
     */
	public $title = '国际车型'; //固定
	public $import = null;    //固定
	public $rules = null;    //规则
	public $demoData = null;  //样例数据
	public $demoremark = null;  //样例说明
	
	public function __construct()
	{
		parent::__construct(); //执行父类
		$this->import = new \lib\import();
		$this->rules = [
			['key'=>'mms_source','caption'=>lg('关联类型')],
			['key'=>'mms_link_id','caption'=>lg('关联ID')],
			['key'=>'mm_segment','caption'=>lg('Segment')],
			['key'=>'mm_vio','caption'=>lg('VIO')],
			['key'=>'region_s','caption'=>lg('Region S'), 'formatCell'=>'coll22'],
			['key'=>'region_c','caption'=>lg('Region C'), 'formatCell'=>'coll25'],
			['key'=>'sale_coun','caption'=>lg('车型适用国家'),'formatCell'=>'sale_coun'],
			['key'=>'mm_year_from','caption'=>lg('Year From'),'must'=>true],
			['key'=>'mm_month_from','caption'=>lg('Month From')],
			['key'=>'mm_year_to','caption'=>lg('Year to')],
			['key'=>'mm_month_to','caption'=>lg('Month to')],
			['key'=>'mk_name','caption'=>lg('Make'),'must'=>true],
			['key'=>'ms_name','caption'=>lg('Modelrange'),'must'=>true],
			['key'=>'name','caption'=>lg('Model'),'must'=>true],
			['key'=>'mm_serie','caption'=>lg('Serie')],
			['key'=>'mm_fuel','caption'=>lg('Fuel'), 'formatCell'=>'coll17'],
			['key'=>'mm_disp','caption'=>lg('Disp.')],
			['key'=>'mm_chassis','caption'=>lg('Modelcode')],
			['key'=>'mm_engine','caption'=>lg('Enginecode')],
			['key'=>'mm_vehicletype','caption'=>lg('VehicleType')],
			['key'=>'mm_turbo','caption'=>lg('Aspiration'), 'formatCell'=>'coll15'],
			['key'=>'mm_kw','caption'=>lg('KW')],
			['key'=>'mm_hp','caption'=>lg('HP')],
			['key'=>'mm_cylinders','caption'=>lg('Cyl'), 'formatCell'=>'coll18'],
			['key'=>'mm_values','caption'=>lg('Valves')],
			['key'=>'mm_drive_type','caption'=>lg('Drive'), 'formatCell'=>'coll16'],
			['key'=>'mm_body','caption'=>lg('Body')],
			['key'=>'mm_doors','caption'=>lg('Doors')],
			['key'=>'mm_platform','caption'=>lg('Platform')],
			['key'=>'mm_others1','caption'=>lg('Others1')],
			['key'=>'mm_others2','caption'=>lg('Others2')]
		];


		//更新
		$this->rulesUpdate = [
			['key'=>'mm_id',       'caption'=>lg('GSP ID'),'must'=>true],
			['key'=>'mms_source','caption'=>lg('关联类型'),'update'=>true],
			['key'=>'mms_link_id','caption'=>lg('关联ID'),'update'=>true],
			['key'=>'mm_segment','caption'=>lg('Segment'),'update'=>true],
			['key'=>'mm_vio','caption'=>lg('VIO'),'update'=>true],
			['key'=>'region_s','caption'=>lg('Region S'), 'formatCell'=>'coll22','update'=>true],
			['key'=>'region_c','caption'=>lg('Region C'), 'formatCell'=>'coll25','update'=>true],
			['key'=>'sale_coun','caption'=>lg('车型适用国家'),'formatCell'=>'sale_coun'],
			['key'=>'mm_year_from','caption'=>lg('Year From'),'must'=>true,'update'=>true, 'type'=>'number'],
			['key'=>'mm_month_from','caption'=>lg('Month From'),'update'=>true],
			['key'=>'mm_year_to','caption'=>lg('Year to'),'update'=>true, 'type'=>'number'],
			['key'=>'mm_month_to','caption'=>lg('Month to'),'update'=>true],
			['key'=>'mk_name','caption'=>lg('Make'),'must'=>true,'update'=>true],
			['key'=>'ms_name','caption'=>lg('Modelrange'),'must'=>true,'update'=>true],
			['key'=>'name','caption'=>lg('Model'),'must'=>true,'update'=>true],
			['key'=>'mm_serie','caption'=>lg('Serie'),'update'=>true],
			['key'=>'mm_fuel','caption'=>lg('Fuel'), 'formatCell'=>'coll17','update'=>true],
			['key'=>'mm_disp','caption'=>lg('Disp.'),'update'=>true],
			['key'=>'mm_chassis','caption'=>lg('Modelcode'),'update'=>true],
			['key'=>'mm_engine','caption'=>lg('Enginecode'),'update'=>true],
			['key'=>'mm_vehicletype','caption'=>lg('VehicleType'),'update'=>true],
			['key'=>'mm_turbo','caption'=>lg('Aspiration'), 'formatCell'=>'coll15','update'=>true],
			['key'=>'mm_kw','caption'=>lg('KW'),'update'=>true],
			['key'=>'mm_hp','caption'=>lg('HP'),'update'=>true],
			['key'=>'mm_cylinders','caption'=>lg('Cyl'), 'formatCell'=>'coll18','update'=>true],
			['key'=>'mm_values','caption'=>lg('Valves'),'update'=>true],
			['key'=>'mm_drive_type','caption'=>lg('Drive'), 'formatCell'=>'coll16','update'=>true],
			['key'=>'mm_body','caption'=>lg('Body'),'update'=>true],
			['key'=>'mm_doors','caption'=>lg('Doors'),'update'=>true],
			['key'=>'mm_platform','caption'=>lg('Platform'),'update'=>true],
			['key'=>'mm_others1','caption'=>lg('Others1'),'update'=>true],
			['key'=>'mm_others2','caption'=>lg('Others2'),'update'=>true]
		];

		$this->demoData = [
			
		];

		$this->demoremark = '';
	}
	
	 /**处理导入
     * @param array|string $src 数组或者文件名
     * @param isInit 是否是初始化
     * @return 可返回任意值(string|array|bool)，都会到前端
     */
    public function import($src,$isInit=false) //固定
    {
		$state = $this->import->execute($src, $this->rules);

		//数据重复验证 - 自己
		if($state && !empty($this->import->data))
		{
			$unikey = ['mm_year_from','mm_month_from','mm_year_to','mm_month_to','mk_name','ms_name','name','mm_serie','mm_fuel','mm_disp','mm_chassis','mm_engine','mm_turbo','mm_kw','mm_hp','mm_cylinders','mm_values','mm_drive_type','mm_body','mm_doors','mm_platform','mm_vehicletype','mm_others1','mm_others2'];
			$state = !$this->import->checkRepeat([
			    $unikey
		    ]);
		}

		//数据重复验证
		$carmodel = new \model\carmodel();
		$check = new check();
		$this->db->Begin();
		if($state && !empty($this->import->data))
		{
			$coll23 = [];
			$trow = $this->db->select('object', ['o_id', 'cn_name', 'en_name'], ['o_parent_id'=>23]);
			foreach($trow as $v)
			{
				if(!empty($v['cn_name'])) $coll23[trim(strtoupper($v['cn_name']))] = $v['o_id'];
				if(!empty($v['en_name'])) $coll23[trim(strtoupper($v['en_name']))] = $v['o_id'];
			}

			foreach($this->import->data as &$dv)
			{
				//mms_link_id CCU:4556;YIPARTS:888,999;KTYPE:123,424
				if(isset($dv['mms_link_id'])) $dv['source'] = [];
				if(!empty($dv['mms_link_id']))
				{
					$sArr = [];
					if(!stripos($dv['mms_link_id'], ':'))
						$dv['mms_link_id'] = $dv['mms_source'].':'.$dv['mms_link_id'];
					foreach(explode(';', $dv['mms_link_id']) as $srow)
					{
						$x = explode(':', $srow);
						if(empty($x[0]) || empty($x[1])) continue;
						$reArr = ['/'=>','];
						foreach(explode(',', strtr($x[1], $reArr)) as $val)
						{
							if(!empty($val)) $sArr[] = ['name'=>$x[0], 'val'=>$val];
						}
					}
					foreach($sArr as $sv)
					{
						$name = trim(strtoupper($sv['name']));
						if(empty($coll23[$name]))
						{
							$state = false;
							$dv['excelInfo']['error'] = '[关联类型]系统未找到匹配项['.$sv['name'].']';
							$this->import->lineNum = $dv['excelInfo']['line'];
							$this->import->lastError = $dv['excelInfo']['error'];
							break;
						}
						else if(!empty($sv['val']))	
						{
							$dv['source'][] = ['mms_source'=>$coll23[$name], 'mms_link_id'=>$sv['val']];
						}
					}
				}

				//mm_mk_id
				$dv['mm_mk_id'] = $carmodel->mkeqname($dv['mk_name']);
				if(empty($dv['mm_mk_id']))
				{
					$res = $carmodel->saveMake(0, ['name'=>$dv['mk_name'], 'region_s'=>$dv['region_s']]);
					$dv['mm_mk_id'] = $res['mk_id'];
				}
				
				//mm_ms_id
				$dv['mm_ms_id'] = $carmodel->mseqname($dv['mm_mk_id'], $dv['ms_name']);
				
				if(empty($dv['mm_ms_id']))
				{
					$res = $carmodel->saveSeriesDetail(0, ['base'=>['name'=>$dv['ms_name'], 'ms_mk_id'=>$dv['mm_mk_id'], 'region_c'=>$dv['region_c']]]);
					$dv['mm_ms_id'] = $res['ms_id'];
				}
				$exist = $check->checkExist('m_model', $dv);
				if(!empty($exist))
				{
					$state = false;
					$dv['excelInfo']['error'] = '记录已存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}

				$dv['mm_name'] = $dv['name'];
				$exist = $check->checkExist('m_model_change', $dv);
				if(!empty($exist))
				{
					$state = false;
					$dv['excelInfo']['error'] = '变更库已存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}
				unset($dv['mm_name']);
			}
		}

		//入库
		if($state && !empty($this->import->data))
		{
			$opuser = getOpuser();
			$datetime = getNowTime();
			$country = new \model\country();
			foreach($this->import->data as $k=>$mv)
			{
				if($k > 0 && $k%1000 === 0) errorLog(__CLASS__.$this->title.':'.$k, 'import');
				$set = [
					'name'=>$mv['name'],
					'create_time'=>$datetime,
					'update_time'=>$datetime,
					'opuser'=>$opuser
				];
				foreach($mv as $filed=>$val)
				{
					if(stripos($filed, 'mm_') === 0)
					{
						$set[$filed] = $mv[$filed];
					}
				}
				$this->db->insert('m_model', $set);
				$mm_id = $this->db->id();
				
				if(!empty($mv['sale_coun'])) 
					$country->changeLink('model', 'replace', [$mm_id], $mv['sale_coun']);

				if(!empty($mv['source']))
				{
					foreach($mv['source'] as $sv)
					{
						$sv['mms_mm_id'] = $mm_id;
						$this->db->insert('m_model_source', $sv);
					}
				}
			}
		}
		$this->db->End();
        return $this->import->output(); //生成处理结果
	}
	

	/**批量更新
     * @param array|string $src 数组或者文件名
     * @return 可返回任意值(string|array|bool)，都会到前端
     */
    public function importUpdate($src) //固定
    {
		$state = $this->import->execute($src, $this->rulesUpdate);
		$step = 2000;
		//数据重复验证 - 自己
		if($state && !empty($this->import->data))
		{
			$unikey = ['mm_year_from','mm_month_from','mm_year_to','mm_month_to','mk_name','ms_name','name','mm_serie','mm_fuel','mm_disp','mm_chassis','mm_engine','mm_turbo','mm_kw','mm_hp','mm_cylinders','mm_values','mm_drive_type','mm_body','mm_doors','mm_platform','mm_vehicletype','mm_others1','mm_others2'];
			$state = !$this->import->checkRepeat([
			    $unikey
		    ]);
		}

		//数据重复验证
		$carmodel = new \model\carmodel();
		$check = new check();
		$this->db->Begin();
		if($state && !empty($this->import->data))
		{
			$coll23 = [];
			$trow = $this->db->select('object', ['o_id', 'cn_name', 'en_name'], ['o_parent_id'=>23]);
			foreach($trow as $v)
			{
				if(!empty($v['cn_name'])) $coll23[trim(strtoupper($v['cn_name']))] = $v['o_id'];
				if(!empty($v['en_name'])) $coll23[trim(strtoupper($v['en_name']))] = $v['o_id'];
			}

			foreach($this->import->data as $k=>&$dv)
			{
				$logArr = [
					'register'=>$k,
					'class'=>__CLASS__,
					'title'=>$this->title,
					'option'=>'checking'
				];
				if($k > 0 && $k%$step === 0) errorLog($logArr, 'importUpdate_carmodel');

				//mms_link_id CCU:4556;YIPARTS:888,999;KTYPE:123,424
				if(isset($dv['mms_link_id'])) $dv['source'] = [];
				if(!empty($dv['mms_link_id']))
				{
					$sArr = [];
					if(!stripos($dv['mms_link_id'], ':'))
						$dv['mms_link_id'] = $dv['mms_source'].':'.$dv['mms_link_id'];
					foreach(explode(';', $dv['mms_link_id']) as $srow)
					{
						$x = explode(':', $srow);
						if(empty($x[0]) || empty($x[1])) continue;
						$reArr = ['/'=>','];
						foreach(explode(',', strtr($x[1], $reArr)) as $val)
						{
							if(!empty($val)) $sArr[] = ['name'=>$x[0], 'val'=>$val];
						}
					}
					foreach($sArr as $sv)
					{
						$name = trim(strtoupper($sv['name']));
						if(empty($coll23[$name]))
						{
							$state = false;
							$dv['excelInfo']['error'] = '[关联类型]系统未找到匹配项['.$sv['name'].']';
							$this->import->lineNum = $dv['excelInfo']['line'];
							$this->import->lastError = $dv['excelInfo']['error'];
							break;
						}
						else if(!empty($sv['val']))	
						{
							$dv['source'][$coll23[$name]][] = $sv['val'];
						}
					}
				}

				//mm_mk_id
				$dv['mm_mk_id'] = $carmodel->mkeqname($dv['mk_name']);
				if(empty($dv['mm_mk_id']))
				{
					$res = $carmodel->saveMake(0, ['name'=>$dv['mk_name'], 'region_s'=>$dv['region_s']]);
					$dv['mm_mk_id'] = $res['mk_id'];
				}
				
				//mm_ms_id
				$dv['mm_ms_id'] = $carmodel->mseqname($dv['mm_mk_id'], $dv['ms_name']);
				
				if(empty($dv['mm_ms_id']))
				{
					$res = $carmodel->saveSeriesDetail(0, ['base'=>['name'=>$dv['ms_name'], 'ms_mk_id'=>$dv['mm_mk_id'], 'region_c'=>$dv['region_c']]]);
					$dv['mm_ms_id'] = $res['ms_id'];
				}

				$res = $this->db->get('m_model', ['mm_id'], ['mm_id'=>$dv['mm_id']]);
				if(empty($res))
				{
					$state = false;
					$dv['excelInfo']['error'] = 'GSP ID记录不存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}

				$exist = $check->checkExist('m_model', $dv, $dv['mm_id']);
				if(!empty($exist))
				{
					$state = false;
					$dv['excelInfo']['error'] = '记录已存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}

				$dv['mm_name'] = $dv['name'];
				$exist = $check->checkExist('m_model_change', $dv, $dv['mm_id']);
				if(!empty($exist))
				{
					$state = false;
					$dv['excelInfo']['error'] = '变更库已存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}
				unset($dv['mm_name']);
			}
		}

		//入库
		if($state && !empty($this->import->data))
		{
			$country = new \model\country();
			foreach($this->import->data as $k=>$mv)
			{
				$logArr = [
					'register'=>$k,
					'class'=>__CLASS__,
					'title'=>$this->title,
					'option'=>'importing'
				];
				if($k > 0 && $k%$step === 0) errorLog($logArr, 'importUpdate_carmodel');

				$set = [];
				foreach($mv as $filed=>$val)
				{
					if(stripos($filed, 'mm_') === 0 || $filed == 'name')
					{
						$set['base'][$filed] = $mv[$filed];
					}
				}

				if(isset($mv['sale_coun'])) $set['sale_coun'] = $mv['sale_coun'];
				if(isset($mv['source']))
				{
					$set['source'] = [];
					foreach($mv['source'] as $sk=>$sv)
					{
						$set['source'][$sk] = implode(',', $sv);
					}
				}
				$carmodel->saveModelDetail($mv['mm_id'], $set);
			}
			if($k % $step != 0){
				$logArr['option'] = 'imported';
				errorLog($logArr, 'importUpdate_carmodel');
			}
		}
		$this->db->End();
        return $this->import->output(); //生成处理结果
	}
}