<?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\tags;
use \model\check;

/**
 * 
 */
class promodel  extends model
{
	 /**
     * 标题 (用于消息提醒)
     */
	public $title = '国际通用库'; //固定
	public $import = null;    //固定
	public $rules = null;    //规则
	public $demoData = null;  //样例数据
	public $demoremark = null;  //样例说明
	public $areaArr = null;  
	public $carmodel = null;  
	public $promodel = null;  
	
	
	public function __construct()
	{
		parent::__construct(); //执行父类
		$this->import = new \lib\import();
		$this->carmodel = new \model\carmodel();
		$this->promodel = new \model\pro\promodel();
		$this->areaArr = $this->carmodel->getArea();
		$modelFiledVals = $this->carmodel->modelFiledVals;
		$this->rules = [
		     ['key'=>'pml_mm_id',          'caption'=>lg('GSP ID'),'must'=>true, 'formatCell'=>'chkmm_id'],
		     ['key'=>'areas',          'caption'=>lg('目录专用'),'formatCell'=>'areas'],
			 ['key'=>'tags',             'caption'=>lg('数据版本'),'formatCell'=>'tags'],
		];
		foreach($this->areaArr as $v)
		{
			$this->rules[] = ['key'=>'catalog_notes_'.$v['ma_id'], 'caption'=>$v['name'].lg('备注')];
		}
		$rules2 = [
			['key'=>'pml_node2','caption'=>lg('预留备注1')],
			['key'=>'pml_node4','caption'=>lg('预留备注2')],
			['key'=>'pml_node3','caption'=>lg('压缩备注')],
			['key'=>'pml_node1','caption'=>lg('其他车型备注')],
			['key'=>'pml_pos0','caption'=>$modelFiledVals['pos0']['name']],
			['key'=>'pml_pos1','caption'=>$modelFiledVals['pos1']['name']],
			['key'=>'pml_pos6','caption'=>$modelFiledVals['pos6']['name']],
			['key'=>'pml_pos2','caption'=>$modelFiledVals['pos2']['name']],
			['key'=>'pml_pos3','caption'=>$modelFiledVals['pos3']['name']],
			['key'=>'pml_pos4','caption'=>$modelFiledVals['pos4']['name']],
			['key'=>'pml_pos5','caption'=>lg('综合')],
			['key'=>'pml_p_id','caption'=>lg('GSP型号'),'must'=>true,'formatCell'=>'p_id'],
			['key'=>'pml_quote_pf_id', 'caption'=>lg('引用品牌'),'must'=>true,'formatCell'=>'pf_id'],
		    ['key'=>'pml_quote_number','caption'=>lg('引用号码'),'must'=>true],
			['key'=>'pml_quote_time','caption'=>lg('引用时间'),'type'=>'date'],
		];
		$this->rules = array_merge($this->rules, $rules2);


		//更新
		$this->rulesUpdate = [
		    ['key'=>'pml_id',          'caption'=>lg('ID'),'must'=>true],
			['key'=>'pml_mm_id',       'caption'=>lg('GSP ID'),'must'=>true, 'formatCell'=>'chkmm_id'],
			['key'=>'pml_p_id','caption'=>lg('GSP型号'),'must'=>true,'formatCell'=>'p_id'],
			['key'=>'areas',          'caption'=>lg('目录专用'),'formatCell'=>'areas','update'=>true],
			['key'=>'tags',           'caption'=>lg('数据版本'),'formatCell'=>'tags','update'=>true],
		];

		foreach($this->areaArr as $v)
		{
			$this->rulesUpdate[] = ['key'=>'catalog_notes_'.$v['ma_id'], 'caption'=>$v['name'].lg('备注'),'update'=>true];
		}
		$rules2 = [
			['key'=>'pml_node2','caption'=>lg('预留备注1'),'update'=>true],
			['key'=>'pml_node4','caption'=>lg('预留备注2'),'update'=>true],
			['key'=>'pml_node3','caption'=>lg('压缩备注'),'update'=>true],
			['key'=>'pml_node1','caption'=>lg('其他车型备注'),'update'=>true],
			['key'=>'pml_pos0','caption'=>$modelFiledVals['pos0']['name'],'update'=>true],
			['key'=>'pml_pos1','caption'=>$modelFiledVals['pos1']['name'],'update'=>true],
			['key'=>'pml_pos6','caption'=>$modelFiledVals['pos6']['name'],'update'=>true],
			['key'=>'pml_pos2','caption'=>$modelFiledVals['pos2']['name'],'update'=>true],
			['key'=>'pml_pos3','caption'=>$modelFiledVals['pos3']['name'],'update'=>true],
			['key'=>'pml_pos4','caption'=>$modelFiledVals['pos4']['name'],'update'=>true],
			['key'=>'pml_pos5','caption'=>lg('综合'),'update'=>true],
			['key'=>'pml_quote_pf_id', 'caption'=>lg('引用品牌'),'formatCell'=>'pf_id','update'=>true],
			['key'=>'pml_quote_number','caption'=>lg('引用号码'),'update'=>true],
			['key'=>'pml_quote_time','caption'=>lg('引用时间'),'type'=>'date','update'=>true]
		];
		$this->rulesUpdate = array_merge($this->rulesUpdate, $rules2);

		$this->demoData = [
			
		];

		$this->demoremark = '';
	}
	
	 /**处理导入
     * @param array|string $src 数组或者文件名
     * @param isInit 是否是初始化
     * @return 可返回任意值(string|array|bool)，都会到前端
     */
    public function import($src,$isInit=false) //固定
    {
		$step = 2000;
		$state = $this->import->execute($src, $this->rules);
		//数据重复验证
		if($state && !empty($this->import->data))
		{
			$check = new check();
			$proCateRule = $check->checkProRuleCate(array_column($this->import->data, 'pml_p_id'), 'F100', 'import');

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

				if(in_array($dv['pml_p_id'], $proCateRule['no']))
				{
					$state = false;
					$dv['excelInfo']['error'] = '无此品名权限';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}

				if(empty($dv['pml_mm_id']))
				{
					$state = false;
					$dv['excelInfo']['error'] = '[GSP ID]无法匹配';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}

				$exist = $check->checkExist('pro_model_change', $dv);
				if(!empty($exist))
				{
					$state = false;
					$dv['excelInfo']['error'] = '变更车型库已存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}
				else
				{
					$exist = $check->checkExist('pro_model_link', $dv);
					if(!empty($exist))
					{
						$state = false;
						$dv['excelInfo']['error'] = '国际通用库已存在';
						$this->import->lineNum = $dv['excelInfo']['line'];
						$this->import->lastError = $dv['excelInfo']['error'];
						continue;
					}
				}
				
				foreach($modelFiledVals as $fk=>$fv)
				{
					if(isset($dv['pml_'.$fk]))
					{
						$vals = explode('/', $dv['pml_'.$fk]);
						foreach($vals as $tvv)
						{
							if(!empty($tvv) && !in_array($tvv, $fv['gd']))
							{
								$state = false;
								$dv['excelInfo']['error'] = '['.$tvv.']不存在';
								$this->import->lineNum = $dv['excelInfo']['line'];
								$this->import->lastError = $dv['excelInfo']['error'];
								break;
							}
						}
					}
					if(!$state) break;
				}
			}
		}
		if($k % $step != 0){
			$logArr['option'] = 'checked';
			errorLog($logArr, 'import_promodel');
		}

		//入库
		if($state && !empty($this->import->data))
		{
			$opuser = getOpuser();
			$datetime = getNowTime();
			$tags = new tags();
			foreach($this->import->data as $k=>$mv)
			{
				$this->db->Begin();
				$logArr = [
					'register'=>$k,
					'class'=>__CLASS__,
					'title'=>$this->title,
					'option'=>'importing'
				];
				if($k > 0 && $k%$step === 0) errorLog($logArr, 'import_promodel');
				$set = [
					'opuser'=>$opuser,
					'create_time'=>$datetime,
					'update_time'=>$datetime
				];
				$fashfileds = array_column($this->rules, 'key');
				foreach($fashfileds as $filed)
				{
					if(isset($mv[$filed]) && stripos($filed, 'pml_') === 0) 
					{
						$set[$filed] = $mv[$filed];
					}
				}

				$expArr = $this->promodel->expProModelPos($mv);
				foreach($expArr as $exp)
				{
					$baseArr = array_merge($set, $exp);

					$exist = $check->checkExist('pro_model_link', $baseArr);
					if(!empty($exist)) continue;

					$this->db->insert('pro_model_link', $baseArr);
					$pml_id = $this->db->id();
					
					$tarea = [];
					$newmlzyids = explode(',', $mv['areas']);
					foreach($this->areaArr as $ma)
					{
						if($ma['ma_mlzy'] && in_array($ma['ma_id'], $newmlzyids)){
							$t = ['pma_pml_id'=>$pml_id,'pma_ma_id'=>$ma['ma_id']];
							if(isset($mv['catalog_notes_'.$ma['ma_id']])) $t['pma_catalog_notes'] = $mv['catalog_notes_'.$ma['ma_id']];
							$tarea[] = $t;
						}else if(!empty($mv['catalog_notes_'.$ma['ma_id']])){
							$tarea[] = ['pma_pml_id'=>$pml_id, 'pma_ma_id'=>$ma['ma_id'], 'pma_catalog_notes'=>$mv['catalog_notes_'.$ma['ma_id']]];
						}
					}
					if(!empty($tarea))
						$this->carmodel->changeAreaLink('promodel', 'add', $tarea);
				
					//数据版本
					if(isset($mv['tags']))
					{
						$tags->changeTagsLink('promodel', 'replace', ['t_id'=>$mv['tags'], 'value_id'=>$pml_id]);
					}
				}
				$this->db->End();
			}
			if($k % $step != 0){
				$logArr['option'] = 'imported';
				errorLog($logArr, 'import_promodel');
			}
			
		}
        return $this->import->output(); //生成处理结果
	}


	/**批量更新
     * @param array|string $src 数组或者文件名
     * @return 可返回任意值(string|array|bool)，都会到前端
     */
    public function importUpdate($src) //固定
    {
		$state = $this->import->execute($src, $this->rulesUpdate);
		//数据重复验证
		if($state && !empty($this->import->data))
		{
			$check = new check();
			$proCateRule = $check->checkProRuleCate(array_column($this->import->data, 'pml_p_id'), 'F100', 'import');

			$modelFiledVals = $this->carmodel->modelFiledVals;
			foreach($this->import->data as $k=>&$dv)
			{
				if(in_array($dv['pml_p_id'], $proCateRule['no']))
				{
					$state = false;
					$dv['excelInfo']['error'] = '无此品名权限';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}

				foreach($modelFiledVals as $fk=>$fv)
				{
					if(isset($dv['pml_'.$fk]))
					{
						$vals = explode('/', $dv['pml_'.$fk]);
						foreach($vals as $tvv)
						{
							if(!empty($tvv) && !in_array($tvv, $fv['gd']))
							{
								$state = false;
								$dv['excelInfo']['error'] = '['.$tvv.']不存在';
								$this->import->lineNum = $dv['excelInfo']['line'];
								$this->import->lastError = $dv['excelInfo']['error'];
								break;
							}
						}
					}
					if(!$state) break;
				}
			}
		}
		
		//入库
		if($state && !empty($this->import->data))
		{
			$msg = [
				'amsg_title'=> '国际通用库 批量更新',
				'amsg_body'=> '共'.count($this->import->data).'行',
				'amsg_url'=> '',
				'amsg_urltitle'=>'',
			];
			$msgid = makeOne(\model\message::class)->send([getOpuser()],$msg);
			foreach($this->import->data as $k=>$mv)
			{
				$this->db->Begin();
				$set = [];
				foreach($this->rulesUpdate as $fv)
				{
					if($fv['update'])
					{
						if($fv['key'] == 'areas') $mv[$fv['key']] = !empty($mv[$fv['key']])? explode(',', $mv[$fv['key']]): [];
						$set[$fv['key']] = $mv[$fv['key']];
					}
				}
				if(!empty($set))
					$this->promodel->setProModelCell($mv['pml_id'], $set, 'set', false);
				$this->db->End();
				$this->db->update('adm_message',['amsg_body'=>'已完成第'.($k+1).'行'],['amsg_id'=>$msgid]);
			}
			$this->db->update('adm_message',['amsg_body'=>'执行完成'],['amsg_id'=>$msgid]);
		}
        return $this->import->output(); //生成处理结果
	}
}