<?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\pro\prodevelop as develop;

use \model\pro\factory;

/**
 * 
 */
class prodevelop  extends model
{
	public $title = '新品开发单'; //固定
	public $import = null;    //固定
	public $rules = null;    //规则
	public $demoData = null;  //样例数据
	public $demoremark = null;  //样例说明
	public $rulesUpdate = null;    //更新规则
	public $importdata = []; //固定
	public $head = []; //固定
	public $params = null; 
	
	public function __construct()
	{
		parent::__construct();

		$this->import = new \lib\import();
		$this->rules = [
			['key'=>'number','caption'=>lg('号码'),'must'=>true],
			['key'=>'cate','caption'=>lg('零件分类')],
			['key'=>'name','caption'=>lg('名称')],
			['key'=>'remark','caption'=>lg('备注')],
		];

		$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);
		
		$wdlInfo = [];
			
		//入库
		if($state && !empty($this->import->data)){
			$opuser = getOpuser();
			$datetime = getNowTime();
			$factory = new factory();
			$check = new check();
			$cate = new \model\pro\cate();
			$develop = new develop();
			$this->db->Begin();
		
			if(!$this->params['pdlist_id']){
				$exists = $check->checkExist('pdlist_title', ['pdlist_title'=>$this->params['pdlist_title']]);
				if($exists) exitJson('标题已存在');
				$wdl = [
					'pdlist_from_opuser'=>$this->params['pdlist_from_opuser']? $this->params['pdlist_from_opuser'] : '',
					'pdlist_title'=>$this->params['pdlist_title'],
					'pdlist_remark'=>$this->params['pdlist_remark']? $this->params['pdlist_remark'] : '',
					'pdlist_opuser'=>$opuser,
					'pdlist_create_time'=>$datetime,
					'pdlist_update_time'=>$datetime
				];

				$this->db->insert('pro_develop_list', $wdl);
				$pdlist_id = $this->db->id();
			}else{
				$pdlist_id = $this->params['pdlist_id'];
			}
			$noCatids = [];
			foreach($this->import->data as $line=>&$dv){
		
				$orgData = [
					$dv['number'],
					$dv['cate'],
					$dv['name'],
					$dv['remark']
				];

				$dv['cate'] =$dv['cate']? $cate->eqname($dv['cate']):'';
				
				$toFormat = [];
				if($dv['number']){
					$tnums = strtr($dv['number'], ['，'=>',',';'=>',','；'=>',',"\n"=>',', '：'=>':']);
					$tnumsArr = explode(',', $tnums);
					foreach($tnumsArr as $tnum){
							
						if(empty($tnum)) continue;
					
						$tvs = explode(':', $tnum);
						if(count($tvs) >= 2){
							$pfid = $tvs[0] == 'OE'? 1: $factory->getFacId($tvs[0], 'add');
							$tnum = $tvs[1];
						}else{
							$pfid = 1;
							$tnum = $tvs[0];
						}
						
						$tnumArr = [
							'pdif_type'=>'Number',
							'pdif_val'=>$tnum,
							'pdif_search'=>formatNum($tnum),
							'pdif_pf_id'=>$pfid? $pfid: 1,
						];
						$uniwhere = [
							'pdi_cat_id'=>$dv['cate'],
							'pdi_pdlist_id'=>$pdlist_id,
							'pdif_type'=>'Number',
							'pdif_search'=>$tnumArr['pdif_search'],
							'pdif_pf_id'=>$tnumArr['pdif_pf_id']
						];
						$chk = $this->db->get('pro_develop_item_format(pdif)', ["[><]pro_develop_item(pdi)"=>["pdif.pdif_pdi_id" =>"pdi_id"]], ['pdif_id'], $uniwhere);
						if(empty($chk)){
							$toFormat['Number'][] = $tnumArr;
						}else{
							$dv['excelInfo']['error'][] = $tnumArr['pdif_val'].'已存在';
							$state = false;
						}
						
					}
				}
			
				if(!empty($toFormat['Number'])){
					$pdli = [
						'pdi_pdlist_id'=>$pdlist_id,
						'pdi_cat_id'=>$dv['cate'],
						'pdi_data'=>json_encode($orgData, JSON_UNESCAPED_UNICODE),
						'pdi_remark'=>$dv['remark'],
						'pdi_name'=>$dv['name'],
						'pdi_opuser'=>$opuser,
						'pdi_create_time'=>$datetime,
						'pdi_update_time'=>$datetime
					];
					$this->db->insert('pro_develop_item', $pdli);
					$pdi_id = $this->db->id();
					if(!$dv['cate']){
						$noCatids[] = $pdi_id;
					}
					//格式化数据
					foreach($toFormat as $type=>$vals){
						//数组本身去重
						$vals = array_map('unserialize', array_unique(array_map('serialize', $vals)));
						foreach($vals as $vk=>$pdif){
							$vals[$vk]['pdif_pdi_id'] = $pdi_id;
						}
						$this->db->insert('pro_develop_item_format', $vals);
					}
				}
				
			}
			if($noCatids) $develop->autoCleanCat(['ids'=>$noCatids]);
			if($state){
				$this->db->End();
				$wdlInfo =  ['pdlist_id'=>$pdlist_id,'pdlist_title'=>$this->params['pdlist_title']];
			}
		}
        return $this->import->output(); //生成处理结果
	}
	
	//通过输入号码导入
    public function importByTxt()
    {
		$wdlInfo = [];
		$factory = new factory();
		$nums = [];
		$tnums = strtr($this->params['nums'], ['，'=>',',';'=>',','；'=>',',"\n"=>',', '：'=>':']);
		foreach(explode(',', $tnums) as $tnum){
			if(empty($tnum)) continue;
			$tvs = explode(':', $tnum);
			if(count($tvs) >= 2){
				$pfid = $tvs[0] == 'OE'? 1: $factory->getFacId($tvs[0], 'add');
				$tnum = $tvs[1];
			}else{
				$pfid = 1;
				$tnum = $tvs[0];
			}

			$format = formatNum($tnum);
			$nums[$pfid.$format] = [
				'pdif_type'=>'Number',
				'pdif_val'=>$tnum,
				'pdif_search'=>$format,
				'pdif_pf_id'=>$pfid? $pfid: 1,
			];
		}
		$nums = array_values($nums);
		if(empty($nums)) exitJson('号码必填');
		if($this->params['pdlist_id']){
			$wdlArr = $this->db->get('pro_develop_list', ['pdlist_id', 'pdlist_title'], ['pdlist_id'=>$this->params['pdlist_id']]);
			$pdlist_title = $wdlArr['pdlist_title'];
			$pdlist_id = $this->params['pdlist_id'];
		}

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

		$this->db->Begin();
		$check = new check();
		
		if(!$this->params['pdlist_id']){
			$exists = $check->checkExist('pdlist_title', ['pdlist_title'=>$this->params['pdlist_title']]);
			if($exists) exitJson('标题已存在');
			$wdl = [
				'pdlist_from_opuser'=>$this->params['pdlist_from_opuser']? $this->params['pdlist_from_opuser'] : '',
				'pdlist_title'=>$this->params['pdlist_title'],
				'pdlist_remark'=>$this->params['pdlist_remark']? $this->params['pdlist_remark'] : '',
				'pdlist_opuser'=>$opuser,
				'pdlist_create_time'=>$datetime,
				'pdlist_update_time'=>$datetime
			];
			$pdlist_title = $wdl['pdlist_title'];
			$this->db->insert('pro_develop_list', $wdl);
			$pdlist_id = $this->db->id();
		}else{
			$pdlist_id = $this->params['pdlist_id'];
		}
		$noCatids = [];
		foreach($nums as $dv){
		
			$uniwhere = [
				'pdi_pdlist_id'=>$pdlist_id,
				'pdif_type'=>'Number',
				'pdif_search'=>$dv['pdif_search'],
				'pdif_pf_id'=>$dv['pdif_pf_id'],
			];
			$chk = $this->db->get('pro_develop_item_format(pdif)', ["[><]pro_develop_item(pdi)"=>["pdif.pdif_pdi_id" =>"pdi_id"]], ['pdif_id'], $uniwhere);
			if(!empty($chk)) continue;
			
			
			$toFormat = ['Number'=>[$dv]];
			$wdli = [
				'pdi_pdlist_id'=>$pdlist_id,	
				'pdi_opuser'=>$opuser,
				'pdi_create_time'=>$datetime,
				'pdi_update_time'=>$datetime
			];
			$this->db->insert('pro_develop_item', $wdli);
			$pdi_id = $this->db->id();
			$noCatids[] = $pdi_id;
			//格式化数据
			foreach($toFormat as $type=>$vals){
				//数组本身去重
				$vals = array_map('unserialize', array_unique(array_map('serialize', $vals)));
				foreach($vals as $vk=>$pdif){
					$vals[$vk]['pdif_pdi_id'] = $pdi_id;
				}
				$this->db->insert('pro_develop_item_format', $vals);
			}
		}
		if($noCatids) $develop->autoCleanCat(['ids'=>$noCatids]);
		$this->db->End();
		$wdlInfo = ['pdlist_id'=>$pdlist_id, 'pdlist_title'=>$pdlist_title];
        return $wdlInfo;
	}
}