<?php
/*
 [
    'key'=>'rule1',                             //键名
    'caption'=>'编码规则',                      //字段名
    'must'=> true,                              //是否必须,默认false
    'mustCols'=> ['ruleA','ruleB']              //当此列存在时，必须有的其他列 ，默认空
    'minlen'=>0,                                //最小长度 默认0不判断
    'maxlen'=>50,                               //最大长度 默认0不判断
    'type'=>'number',                           //类型 number,string,date,datetime 默认 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 codeNumber  extends model
{
	 /**
     * 标题 (用于消息提醒)
     */
	public $title = '编码库区域码和本地码'; //固定
	public $import = null;    //固定
	public $rules = null;    //规则
	public $rulesUpdate = null;    //更新规则
	public $rulesDelete = null;    //删除规则
	
	public function __construct()
	{
		parent::__construct(); //执行父类
		$this->import = new \lib\import();
		$this->rules = [
		     ['key'=>'pcn_pc_id',           'caption'=>lg('GSP型号'), 'formatCell'=>'pc_id','must'=>true],
			 ['key'=>'pcn_pf_id',           'caption'=>lg('品牌'),'formatCell'=>'pf_id_gsp','must'=>true],
		     ['key'=>'pcn_number',          'caption'=>lg('品牌号码'),'minlen'=>3,'maxlen'=>50,'must'=>true],
			 ['key'=>'pcn_barcode',         'caption'=>lg('条形码')],
			 ['key'=>'pcn_ma_id',           'caption'=>lg('区域'),'formatCell'=>'ma_id'],
		];
		$this->rulesUpdate = [
		     ['key'=>'pcn_pc_id',           'caption'=>lg('GSP型号'), 'formatCell'=>'pc_id','must'=>true],
			 ['key'=>'pcn_pf_id',           'caption'=>lg('品牌'),'formatCell'=>'pf_id_gsp','must'=>true],
		     ['key'=>'pcn_number',          'caption'=>lg('品牌号码'),'minlen'=>3,'maxlen'=>50,'must'=>true],
			 ['key'=>'pcn_barcode',         'caption'=>lg('条形码'),'update'=>true],
			 ['key'=>'pcn_ma_id',           'caption'=>lg('区域'),'formatCell'=>'ma_id','update'=>true],
		];
		
		$this->rulesDelete = [
		     ['key'=>'pcn_pc_id',           'caption'=>lg('GSP型号'), 'formatCell'=>'pc_id','must'=>true],
			 ['key'=>'pcn_pf_id',           'caption'=>lg('品牌'),'formatCell'=>'pf_id_gsp','must'=>true],
		     ['key'=>'pcn_number',          'caption'=>lg('品牌号码'),'minlen'=>3,'maxlen'=>50,'must'=>true],
		     ['key'=>'force',               'caption'=>lg('强制'),'must'=>false],
		];
		
	}
	
	 /**处理导入
     * @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))
		{
			$state = !$this->import->checkRepeat([
			    ['pcn_barcode'],
			    ['pcn_pf_id','pcn_number'],
			    ['pcn_pc_id','pcn_pf_id'],
		    ]);
		}
		
		//数据重复验证 - 数据库
		if($state && !empty($this->import->data))
		{
			$check = new check();
			$proCateRule = $check->checkProRuleCate(array_column($this->import->data, 'pcn_pc_id'), 'B200', 'import', 'p_code');
			foreach($this->import->data as &$item)
			{
				if(in_array($item['pcn_pc_id'], $proCateRule['no']))
				{
					$state = false;
					$item['excelInfo']['error'] = '无此品名权限';
					$this->import->lineNum = $item['excelInfo']['line'];
					$this->import->lastError = $item['excelInfo']['error'];
					continue;
				}
			    $hasId = $this->db->get(
			        'p_code_number',
			        'pcn_id',
			        ['pcn_pf_id'=>$item['pcn_pf_id'],'pcn_number'=>$item['pcn_number'],'pcn_ma_id'=>$item['pcn_ma_id']]
			     );
				$item['checkInfo']['hasId'] = $hasId;
			    if($item['pcn_pf_id']=='2' || $item['pcn_pf_id']=='3'){
    			    if(!$hasId){
    					$state = false;
    					$item['excelInfo']['error'] = 'GSP编码和内部编码请在编码库中导入';
    					$this->import->lineNum = $item['excelInfo']['line'];
    					$this->import->lastError = $item['excelInfo']['error'];
    			    }
			    }

 			    if($state){
    				$has = $this->db->has(
    			        'p_code_number',
    			        ['pcn_pf_id'=>$item['pcn_pf_id'],'pcn_format'=>formatNum($item['pcn_number'])]
    			     );
    				if($has)
    				{
    					$state = false;
    					$item['excelInfo']['error'] = '记录已存在,[ 品牌,号码 ]';
    					$this->import->lineNum = $item['excelInfo']['line'];
    					$this->import->lastError = $item['excelInfo']['error'];
    				}
			    }
   			
			    if($state && !$hasId){
    				$has = $this->db->has(
    			        'p_code_number',
    			        ['pcn_pc_id'=>$item['pcn_pc_id'],'pcn_pf_id'=>$item['pcn_pf_id'],'pcn_ma_id'=>$item['pcn_ma_id']]
    			     );
    				if($has)
    				{
    					$state = false;
    					$item['excelInfo']['error'] = '记录已存在,[ 区域,品牌 ]';
    					$this->import->lineNum = $item['excelInfo']['line'];
    					$this->import->lastError = $item['excelInfo']['error'];
    				}
			    }
			    
			    if($state && $item['pcn_barcode']!=''){
    			    $has = $this->db->has(
    			        'p_code_number',
    			        ['pcn_barcode'=>$item['pcn_barcode']]
    			     );
    				if($has)
    				{
    					$state = false;
    					$item['excelInfo']['error'] = '记录已存在,[ 条形码 ]';
    					$this->import->lineNum = $item['excelInfo']['line'];
    					$this->import->lastError = $item['excelInfo']['error'];
    				}
			    }
			}
		}
		//入库
		if($state && !empty($this->import->data))
		{
			$this->db->begin();
			foreach($this->import->data as $k=>&$item)
			{
				if($k > 0 && $k%1000 === 0) errorLog(__CLASS__.$this->title.':'.$k, 'import');
				$hasId = $item['checkInfo']['hasId'];
			    unset($item['excelInfo']);
			    unset($item['checkInfo']);
			    $item['pcn_format'] = formatNum($item['pcn_number']);
			    if($hasId){
    			    $this->db->update('p_code_number',['pcn_barcode'=>$item['pcn_barcode']],['pcn_id'=>$hasId]);
    			    $this->db->update('pro_numidx',['pn_barcode'=>$item['pcn_barcode']],['pn_pf_id'=>$item['pcn_pf_id'], 'pn_formart'=>$item['pcn_format']]);
			    }else{
    			    //$this->db->replace('p_code_number',$item,['pcn_pc_id','pcn_pf_id','pcn_ma_id','pcn_format']);
    			    $this->db->insert('p_code_number',$item);
			    }
			}
			$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);
		//数据重复验证 - 自己
		if($state && !empty($this->import->data))
		{
			$state = !$this->import->checkRepeat([
			    ['pcn_barcode'],
			    ['pcn_pf_id','pcn_number'],
			    ['pcn_pc_id','pcn_pf_id'],
		    ]);
		}
		//数据重复验证 - 数据库
		if($state && !empty($this->import->data))
		{
			$check = new check();
			$proCateRule = $check->checkProRuleCate(array_column($this->import->data, 'pcn_pc_id'), 'B200', 'import');

			foreach($this->import->data as &$item)
			{
				if(in_array($item['pcn_pc_id'], $proCateRule['no']))
				{
					$state = false;
					$item['excelInfo']['error'] = '无此品名权限';
					$this->import->lineNum = $item['excelInfo']['line'];
					$this->import->lastError = $item['excelInfo']['error'];
					continue;
				}

			    //条形码
			    if($state && $item['pcn_barcode']!=''){
    			    $has = $this->db->has(
    			        'p_code_number',
    			        ['pcn_barcode'=>$item['pcn_barcode']]
    			     );
    				if($has)
    				{
    					$state = false;
    					$item['excelInfo']['error'] = '记录已存在,[ 条形码 ]';
    					$this->import->lineNum = $item['excelInfo']['line'];
    					$this->import->lastError = $item['excelInfo']['error'];
    				}
			    }
			}
		}
		
		//更新
		if($state && !empty($this->import->data))
		{
			$this->db->begin();
			foreach($this->import->data as $k=>&$item)
			{
				$item['pcn_format'] = formatNum($item['pcn_number']);
			    $findId = $this->db->get(
			        'p_code_number',
			        'pcn_id',
			        ['pcn_pf_id'=>$item['pcn_pf_id'],'pcn_number'=>$item['pcn_number']]
			     );
			    if($findId){
		            $data=[];
			        foreach($this->rulesUpdate as $rule){
			            if($item[$rule['key']]!='!' && $item[$rule['key']]!='！' && isset($rule['update']) && $rule['update']){
			                $data[$rule['key']] = $item[$rule['key']];
			            }
			        }
    			    $this->db->update('p_code_number',$data, ['pcn_id'=>$findId]);
					$this->db->update('pro_numidx',['pn_barcode'=>$item['pcn_barcode']],['pn_pf_id'=>$item['pcn_pf_id'], 'pn_formart'=>$item['pcn_format']]);
			    }else{
					$item['excelInfo']['error'] = lg('没有找到');
					$this->import->lineNum = $item['excelInfo']['line'];
					$this->import->lastError = $item['excelInfo']['error'];
			    }
			}
			$this->db->End();
		}
        return $this->import->output(); //生成处理结果
    }
	
	 /**批量删除
     * @param array|string $src 数组或者文件名
     * @return 可返回任意值(string|array|bool)，都会到前端
     */
    public function importDelete($src) //固定
    {
		$state = $this->import->execute($src, $this->rulesDelete);

		//数据重复验证 - 数据库
		if($state && !empty($this->import->data))
		{
			$check = new check();
			$proCateRule = $check->checkProRuleCate(array_column($this->import->data, 'pcn_pc_id'), 'B200');

			foreach($this->import->data as &$item)
			{
				if(in_array($item['pcn_pc_id'], $proCateRule['no']))
				{
					$state = false;
					$item['excelInfo']['error'] = '无此品名权限';
					$this->import->lineNum = $item['excelInfo']['line'];
					$this->import->lastError = $item['excelInfo']['error'];
					continue;
				}
			}
		}
		
		//删除
		if($state && !empty($this->import->data))
		{
			$this->db->begin();
			foreach($this->import->data as $k=>&$item)
			{
			    $where=[];
		        foreach($this->rulesDelete as $rule){
		            if($rule['key']!='force'){
		                $where[$rule['key']] = $item[$rule['key']];
		            }
		        }
			    $findRow = $this->db->get('p_code_number','*',$where);
			    if($findRow){
			        if($findRow['pcn_check2']=='0' || ($item['force']==='1' && \p::isAdmin())){
			            if($findRow['pcn_check2']!='0'){
        			        $this->db->delete('pro_numidx',
        			            [
        			                'pn_p_id'=>$findRow['pcn_pc_id'],
            			            'pn_pf_id'=>$findRow['pcn_pf_id'],
            			            'pn_formart'=>$findRow['pcn_format']
        			            ]
        			         );
			            }
    			        $this->db->delete('p_code_number',['pcn_id'=>$findRow['pcn_id']]);
			        }else{
    					$item['excelInfo']['error'] = lg('已审核号码禁止删除');
    					$this->import->lineNum = $item['excelInfo']['line'];
    					$this->import->lastError = $item['excelInfo']['error'];
			        }
			    }else{
					$item['excelInfo']['error'] = lg('没有找到');
					$this->import->lineNum = $item['excelInfo']['line'];
					$this->import->lastError = $item['excelInfo']['error'];
			    }
			}
			$this->db->End();
		}
        return $this->import->output(); //生成处理结果
    }
	
}