<?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\pro\numidx as pronumidx;

/**
 * 
 */
class numidxInit  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'=>'pn_p_id',          'caption'=>lg('GSP型号'),'must'=>true,'formatCell'=>'p_idBygspncv'],
		     ['key'=>'pn_pf_id',         'caption'=>lg('号码品牌'),'must'=>true,'formatCell'=>'pf_id'],
		     ['key'=>'pn_number',        'caption'=>lg('号码'),'must'=>true,'minlen'=>3,'maxlen'=>50,],
		     ['key'=>'pn_mk_id',         'caption'=>lg('OE品牌'),'formatCell'=>'mk_ids'],
		     ['key'=>'tags',             'caption'=>lg('数据版本'),'formatCell'=>'tags'],
		     ['key'=>'pn_src',           'caption'=>lg('数据来源'),'formatCell'=>'coll8'],
		     ['key'=>'pn_cn_remark',     'caption'=>lg('中文描述'),'maxlen'=>512],
		     ['key'=>'pn_en_remark',     'caption'=>lg('英文描述'),'maxlen'=>512],
		     ['key'=>'pn_ref',           'caption'=>lg('参考来源'),'maxlen'=>512],
		     ['key'=>'pn_sample',        'caption'=>lg('来自样品')],
		     ['key'=>'ckuser2',          'caption'=>lg('复审人'),'must'=>true,'formatCell'=>'auser'],
		     ['key'=>'cktime2',          'caption'=>lg('复审时间'),'must'=>true,'type'=>'date'],
		     ['key'=>'ckresult2',        'caption'=>lg('复审结论'),'must'=>true,'formatCell'=>'coll24'],
		     ['key'=>'ckremark2',        'caption'=>lg('复审备注')],
		     ['key'=>'pn_formart',       'caption'=>lg('去格式号码'), 'hide'=>true],
		];

		$this->demoData = [
			
		];

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

		//数据重复验证
		if($state && !empty($this->import->data))
		{
			$pronumidx = new pronumidx();
			foreach($this->import->data as &$dv)
			{
				if($dv['pn_pf_id'] == 1 && empty($dv['pn_mk_id']))
				{
					$state = false;
					$dv['excelInfo']['error'] = 'OE品牌必填';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}
				$dv['pn_formart'] = formatNum($dv['pn_number']);
				if(isset($dv['pn_sample']))
				{
					if(in_array($dv['pn_sample'], ['是', 'Y'])) $dv['pn_sample'] = 1;
					if(in_array($dv['pn_sample'], ['否', 'N'])) $dv['pn_sample'] = 0;
					$dv['pn_sample'] = (int) $dv['pn_sample'];
				}
				$dv['cktime2'] = date('Y-m-d H:i:s', strtotime($dv['cktime2']));
			}
		}

		//数据重复验证 - 自己
		if($state && !empty($this->import->data))
		{
			$state = !$this->import->checkRepeat([
			    ['pn_p_id','pn_pf_id','pn_formart'],
		    ]);
		}


		//入库
		if($state && !empty($this->import->data))
		{
			$last_pn_id = $this->db->max('pro_numidx', 'pn_id');
			$last_pn_id = (int) $last_pn_id;

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

			$total = count($this->import->data);
			//分批入库
			$addAnyArr = [
				'base'=>[],
				'tags'=>[]	
			];
			$fashfileds = ['pn_p_id','pn_pf_id','pn_number','pn_formart','pn_mk_id','pn_src','pn_sample','pn_cn_remark','pn_en_remark','pn_ref','ckuser2','ckresult2','ckremark2','cktime2'];
			$this->db->Begin();
			foreach($this->import->data as $k=>$mv)
			{
				$baseArr = [
					'pn_type'=>'none',
					'pn_is_gsp'=>0,
					'create_time'=>$datetime,
					'update_time'=>$datetime,
					'opuser'=>$opuser
				];
				
				foreach($mv as $mtk=>$mtv)
				{
					if(stripos($mtk, 'pn_') === 0 || in_array($mtk, $fashfileds)) 
					{
						$baseArr[$mtk] = $mtv;
					}
				}
				$baseArr['pn_id'] = ++$last_pn_id;
				$addAnyArr['base'][] = $baseArr; 

				//数据版本
				if(!empty($mv['tags']))
				{
					$addAnyArr['tags'][] = [
						'tl_type'=>'number',
						'tl_t_id'=>addXor(explode(',', $mv['tags']), 0),
						'tl_value_id'=>$baseArr['pn_id']
					];
				}

				//批量入库
				if(count($addAnyArr['base']) == $perAdd || ($k+1) == $total)
				{
					if(!empty($addAnyArr['base'])) $this->db->insert('pro_numidx', $addAnyArr['base']);
					if(!empty($addAnyArr['tags'])) $this->db->insert('tags_link', $addAnyArr['tags']);

					$addAnyArr = [
						'base'=>[],
						'tags'=>[]	
					];

					$logArr = [
						'register'=>$k,
						'class'=>__CLASS__,
						'title'=>$this->title,
						'option'=>'importing'
					];
					errorLog($logArr, 'import');
				}
			}
			$this->db->End();
		}
        return $this->import->output(); //生成处理结果
	}
	
}