<?php
namespace model\import;
use \model;
use \model\check;

/**
 * 
 */
class propack  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'=>'p_id','caption'=>lg('物料编码'),'must'=>true,'formatCell'=>[\model\pro\pro::class,[],'getPidByNumber',['@'],null]],
            ['key'=>'pp_outbox','caption'=>lg('外盒')],
            ['key'=>'pp_inbox','caption'=>lg('内盒')],

            ['key'=>'ppe_tag','caption'=>lg('标签')],
            ['key'=>'ppe_inpocket','caption'=>lg('内袋')],
            ['key'=>'ppe_material','caption'=>lg('包装辅料')],

            ['key'=>'pp_inpocket_count','caption'=>lg('内袋装袋数')],
            ['key'=>'pp_inbox_count','caption'=>lg('内盒装盒数')],
            ['key'=>'pp_outbox_count','caption'=>lg('外盒装箱数')],
            ['key'=>'pp_weight_per','caption'=>lg('单个净重')],
            ['key'=>'pp_weight_box','caption'=>lg('整箱毛重')],
            ['key'=>'pp_modeltxt','caption'=>lg('打印车型')],
            ['key'=>'pp_weight_pro','caption'=>lg('单个产品毛重')],
            ['key'=>'pp_weight_unit','caption'=>lg('重量单位'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 7],null]],
            ['key'=>'pp_pack_standard','caption'=>lg('装箱标准')],
            ['key'=>'pp_pack_status','caption'=>lg('包装状态'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 8],null]],
            ['key'=>'pp_pack_style','caption'=>lg('包装方式')],
            ['key'=>'pp_outstyle_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);

		//数据重复验证 - 自己
		if($state && !empty($this->import->data))
		{
			$state = !$this->import->checkRepeat([
			    ['p_id']
		    ]);
		}
		
		//数据重复验证
		if($state && !empty($this->import->data))
		{
            $pidArr = array_column($this->import->data,'p_id');
            //物料编码对应的品牌
            $pbArr = $this->db->select('pro',['p_id','p_pb_id'],['p_id'=>$pidArr]);
            $pbArr = array_column($pbArr,'p_pb_id','p_id');
			foreach($this->import->data as &$dv)
			{   
                $pb_id = $pbArr[$dv['p_id']];
              
                //找外盒包装ID
                if($dv['pp_outbox']){
                    $pp_outbox = $this->db->get('pro_brand_ext','pbe_id',['pbe_val'=>$dv['pp_outbox'],'pbe_type'=>'outbox','pbe_pb_id'=>$pb_id]);
                    if(empty($pp_outbox)){
                        $state = false;
                        $dv['excelInfo']['error'] = '外盒属性不存在';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $dv['pp_outbox'] = $pp_outbox;
                    }
                }
                //找内盒包装ID
                if($dv['pp_inbox']){
                    $pp_inbox = $this->db->get('pro_brand_ext','pbe_id',['pbe_val'=>$dv['pp_inbox'],'pbe_type'=>'inbox','pbe_pb_id'=>$pb_id]);
                    if(empty($pp_inbox)){
                        $state = false;
                        $dv['excelInfo']['error'] = '内盒属性不存在';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $dv['pp_inbox'] = $pp_inbox;
                       
                    }
                }

                //找标签ID
                if($dv['ppe_tag']){
                    $str = strtr($dv['ppe_tag'],['，'=>',',';'=>',','；'=>',',"\n"=>',']);
                    $strArr = explode(',',$str);
                    $ppe_tag = $this->db->select('pro_brand_ext','pbe_id',['pbe_val'=>$strArr,'pbe_type'=>'tag','pbe_pb_id'=>$pb_id]);
                    if(empty($ppe_tag)){
                        $state = false;
                        $dv['excelInfo']['error'] = '标签属性不存在';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $dv['ppe_tag'] = $ppe_tag;
                    }
                }
                 //找内袋ID
                if($dv['ppe_inpocket']){
                    $str = strtr($dv['ppe_inpocket'],['，'=>',',';'=>',','；'=>',',"\n"=>',']);
                    $strArr = explode(',',$str);
                    $ppe_inpocket = $this->db->select('pro_brand_ext','pbe_id',['pbe_val'=>$strArr,'pbe_type'=>'inpocket','pbe_pb_id'=>$pb_id]);
                    if(empty($ppe_inpocket)){
                        $state = false;
                        $dv['excelInfo']['error'] = '内袋属性不存在';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $dv['ppe_inpocket'] = $ppe_inpocket;
                    }
                }

                 //找辅料ID
                if($dv['ppe_material']){
                    $str = strtr($dv['ppe_material'],['，'=>',',';'=>',','；'=>',',"\n"=>',']);
                    $strArr = explode(',',$str);
                    $ppe_material = $this->db->select('pro_brand_ext','pbe_id',['pbe_val'=>$strArr,'pbe_type'=>'material','pbe_pb_id'=>$pb_id]);
                    if(empty($ppe_material)){
                        $state = false;
                        $dv['excelInfo']['error'] = '辅料属性不存在';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $dv['ppe_material'] = $ppe_material;
                    }
                }
			}
			unset($dv);
		}
		//入库
		if($state && !empty($this->import->data))
		{   
            $opuser = getOpuser();
			$datetime = getNowTime();

            $addAnyArr = [];
			$perAdd = 1000;
			$total = count($this->import->data);

            $pidArr = array_column($this->import->data,'p_id');

            $alreayExtArr = $this->db->select('pro_pack_ext',['ppe_p_id','ukey'=>raw("CONCAT_WS('-',ppe_p_id,ppe_type,ppe_pbe_id)")],['ppe_p_id'=>$pidArr]);
            
            $alreayExtArr = $alreayExtArr?array_column($alreayExtArr,'ppe_p_id','ukey'):[];
            $this->db->Begin();
			foreach($this->import->data as $k=>$mv)
			{
				if($k > 0 && $k%1000 === 0) errorLog(__CLASS__.$this->title.':'.$k, 'import');
				$set = [
                    'pp_opuser'=>$opuser,
                    'pp_update_time'=>$datetime
                ];
                $extArr = [];
				foreach($mv as $mtk=>$mtv)
				{
					if(stripos($mtk, 'pp_') === 0) 
					{
						$set[$mtk] = $mtv;
					}
                    if(stripos($mtk, 'ppe_') === 0) 
                    {   
                        foreach (['inpocket','tag','material'] as $type) {
                            if($mtk == 'ppe_'.$type && is_array($mtv) && !$mtv){
                                foreach ($mtv as $tv) {
                                    if($alreayExtArr[$mv['p_id'].'-'.$type.'-'.$tv]){
                                        continue;
                                    } 
                                    $extArr[] = [
                                        'ppe_p_id'=>$mv['p_id'],
                                        'ppe_type'=>$type,
                                        'ppe_pbe_id'=>$tv
                                    ];
                                }  
                            }
                        }
                    }
                    
				}

                $exist =  $this->db->get('pro_pack','pp_p_id',['pp_p_id'=>$mv['p_id']]);
                if($exist){
                    $this->db->update('pro_pack',$set,['pp_p_id'=>$mv['p_id']]);     
                }else{
                    $set['pp_create_time'] = $datetime;
                    $set['pp_p_id'] = $mv['p_id'];
                    $addAnyArr[] = $set;
                }
                if($extArr)   $this->db->insert('pro_pack_ext',$extArr);
              
				if(count($addAnyArr) == $perAdd || ($k+1) == $total)
				{
					if(!empty($addAnyArr)){
                        $this->db->insert('pro_pack', $addAnyArr);
                    } 
					$addAnyArr = [];
					$logArr = [
						'register'=>$k,
						'class'=>__CLASS__,
						'title'=>$this->title,
						'option'=>'importing'
					];
					errorLog($logArr, 'import');
				}
	
			}
			$this->db->End();
		}
        return $this->import->output(); //生成处理结果
	}
}