<?php
namespace model\import;
use \model;
use \model\check;
use model\pro\pro;
use model\supplier;

/**
 * 
 */
class supplierPro  extends model
{
	public $title = '供应商产品目录'; //固定
	public $import = null;    //固定
	public $rules = null;    //规则
	public $demoData = null;  //样例数据
	public $demoremark = null;  //样例说明
    public $extSheet = null;
	
	public function __construct()
	{
		parent::__construct(); //执行父类
		$this->import = new \lib\import();
		$this->rules = [

            ['key'=>'spr_sup_id','caption'=>lg('供应商编码'),'must'=>true],
            ['key'=>'spr_cat_id','caption'=>lg('小类'),'formatCell'=>'cate'],
            ['key'=>'spr_pf_id','caption'=>lg('号码厂商'),'formatCell'=>'pf_id'],
            ['key'=>'spr_number','caption'=>lg('号码'),'must'=>true],
            ['key'=>'spr_sup_num','caption'=>lg('工厂号码')],
            ['key'=>'spr_area','caption'=>lg('区域'),'must'=>true,'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 21],null]],
            // ['key'=>'spr_brand','caption'=>lg('品牌')],
           
            ['key'=>'spr_material','caption'=>lg('属性'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 16],null]],
            ['key'=>'spr_price','caption'=>lg('含税单价')],
            ['key'=>'spr_price2','caption'=>lg('不含税价')],
            ['key'=>'spr_price3','caption'=>lg('原厂价格')],
            ['key'=>'spr_price4','caption'=>lg('指导价格')],
            ['key'=>'spr_minbuy','caption'=>lg('起订量')],
            ['key'=>'spr_delivery','caption'=>lg('交期(天)')],
            ['key'=>'spr_price_btime','caption'=>lg('工厂报价时间'),'type'=>'date'],
            ['key'=>'spr_price_etime','caption'=>lg('价格失效时间'),'type'=>'date'],
            // ['key'=>'spr_purin_time','caption'=>lg('采购入库时间'),'type'=>'date'],
            ['key'=>'spr_price_status','caption'=>lg('价格状态')],
            ['key'=>'spr_has','caption'=>lg('现货')],
            ['key'=>'spr_hasample','caption'=>lg('提供样品')],
            ['key'=>'spr_from','caption'=>lg('数据来源'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 13],null]],
            ['key'=>'spr_remark','caption'=>lg('备注')],
		];
        //扩展的sheet数据
        $objArr  = [];
        $arr = $this->db->select('object',['o_parent_id','o_id',LG_NAME.'(obj_name)'],['o_parent_id'=>[13,16,21]]);
        foreach ($arr as $key => $val) 
        {
            $objArr[$val['o_parent_id']][] = ['val'=>$val['obj_name']];
        }
        $supArr = $this->db->select('supplier',['sup_code','sup_name']);
        $this->extSheet = [
            [
                'sheetName'=>'供应商编码',
                'extData'=>array_merge(
                    [
                        'fields'=>[
                            'sup_code'=>['val'=>'供应商编码','width'=>'20'],
                            'sup_name'=>['val'=>'供应商名称','width'=>'30'],
                        ]
                    ],
                    $supArr
                )
            ],
            [
                'sheetName'=>'区域',
                'extData'=> array_merge(['fields'=>['val'=>'名称']],$objArr[21])
            ],
            [
                'sheetName'=>'属性',
                'extData'=>array_merge(['fields'=>['val'=>'名称']],$objArr[16])
            ],
            [
                'sheetName'=>'价格状态',
                'extData'=>[
                    [['val'=>'数值','width'=>'10']],['有效'],['无效']
                ]
            ],
            [
                'sheetName'=>'现货',
                'extData'=>[
                    ['数值'],['是'],['否']
                ]
            ],
            [
                'sheetName'=>'提供样品',
                'extData'=>[
                    [['val'=>'数值','width'=>'10']],['是'],['否']
                ]
            ],
            [
                'sheetName'=>'数据来源',
                'extData'=>array_merge(['fields'=>['val'=>'名称']],$objArr[13])
            ], 
        ];

		$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);
        $data = [];
		//数据重复验证 - 自己
		if($state && !empty($this->import->data))
		{           

            $supplier = $this->db->select('supplier',['sup_id','sup_code'],['sup_code'=>array_column($this->import->data,'spr_sup_id')]);
            $supplierArr = array_column($supplier,'sup_id','sup_code');

            $uniqueArr = [];
            foreach ($this->import->data as &$mv) 
            {   
                $mv['spr_pf_id'] = $mv['spr_pf_id']?:1; 
                //价格状态
                if(isset($mv['spr_price_status']))
				{
					if(in_array($mv['spr_price_status'], ['有效', 'Y'])) $mv['spr_price_status'] = 1;
					if(in_array($mv['spr_price_status'], ['无效', 'N'])) $mv['spr_price_status'] = 0;
					$mv['spr_price_status'] = (int) $mv['spr_price_status'];
				}
                //提供样品
				if(isset($mv['spr_hasample']))
				{
					if(in_array($mv['spr_hasample'], ['是', 'Y'])) $mv['spr_hasample'] = 1;
					if(in_array($mv['spr_hasample'], ['否', 'N'])) $mv['spr_hasample'] = 0;
					$mv['spr_hasample'] = (int) $mv['spr_hasample'];
				}
                //现货
                if(isset($mv['spr_has']))
				{
					if(in_array($mv['spr_has'], ['是', 'Y'])) $mv['spr_has'] = 1;
					if(in_array($mv['spr_has'], ['否', 'N'])) $mv['spr_has'] = 0;
					$mv['spr_has'] = (int) $mv['spr_has'];
				}

                if(isset($supplierArr[$mv['spr_sup_id']])){
                    $mv['spr_sup_id'] = $supplierArr[$mv['spr_sup_id']];
                }else{
                    $state = false;
					$mv['excelInfo']['error'] = '供应商不存在，请核实编码是否正确';
                    $this->import->lineNum = $mv['excelInfo']['line'];
                    $this->import->lastError = $mv['excelInfo']['error'];
                    continue;
                }

                if($mv['spr_number'])
                {
                    $tnums = strtr($mv['spr_number'], ['，'=>',',';'=>',','；'=>',',"\n"=>',']);
                    $tnumsArr = explode(',',$tnums);
                    
                    foreach ($tnumsArr as $kk => $vv) {
                        $temp = $mv;
                        $temp['spr_number'] = trim($vv);
                        $temp['spr_format'] = trim(formatNum($vv));
                        $uniKey = $temp['spr_format'].$temp['spr_sup_id'].$temp['spr_pf_id'].$temp['spr_material'].$temp['spr_cat_id'].$temp['spr_area'];
                        if(in_array($uniKey,$uniqueArr)){
                            $state = false;
                            $mv['excelInfo']['error'] = "重复提交的数据{$vv},[ 供应商、号码、小类、属性、区域 ]<br />";
                            $this->import->lineNum = $mv['excelInfo']['line'];
                            $this->import->lastError = $mv['excelInfo']['error'];
                            continue;

                        }else{
                            $uniqueArr[] = $uniKey;   
                        }

                        $where = ['on_isborrow[!]'=>1,'on_pf_id'=>$mv['spr_pf_id'],'on_formart'=>$temp['spr_format']];
                        if(!empty($mv['spr_cat_id'])){
                            $where = ['on_isborrow[!]'=>1,'on_pf_id'=>$mv['spr_pf_id'],'on_formart'=>$temp['spr_format'],'oe_cate_Id'=>$mv['spr_cat_id']];     
                        }
                        $tempOeIdArr = $this->db->select('oe_item',['[><]oe_numidx'=>['oe_id'=>'on_oe_id']],['oe_id','oe_cate_id'],$where);
                        if(!$tempOeIdArr){
                            $state = false;
                            $mv['excelInfo']['error'] .= "零件库无此号码{$vv}<br />";
                            $this->import->lineNum = $mv['excelInfo']['line'];
                            $this->import->lastError = $mv['excelInfo']['error'];
                            continue;
                        }
                        elseif(count($tempOeIdArr) > 1)
                        {
                            $state = false;
                            $mv['excelInfo']['error'] .= "{$vv}检测到多个零件，请填写小类";
                            $this->import->lineNum = $mv['excelInfo']['line'];
                            $this->import->lastError = $mv['excelInfo']['error'];
                            continue;
                        }else{
                            $temp['spr_oe_id'] = $tempOeIdArr[0]['oe_id'];
                            $temp['spr_cat_id'] =  $temp['spr_cat_id']?:$tempOeIdArr[0]['oe_cate_id'];
                        }
                        //oe_id\sup_id\spr_material\spr_area相同只保留一条记录
                        $unikey2 = md5($temp['spr_oe_id'].$temp['spr_sup_id'].$temp['spr_material'].$temp['spr_area']);
                        if(!isset($data[$unikey2])){
                            $data[$unikey2] = $temp;
                        }
                       
                    }
                }
            }
            unset($mv);
		}

        // $this->import->data = $data;
        // $state = !$this->import->checkRepeat([
        //     ['spr_sup_id','spr_number']
        // ]);
        
        $data = array_values($data);
		//入库
		if($state && !empty($data))
		{
            $check = new check();
            $opuser = getOpuser();
			$datetime = getNowTime();
            $oe_ids = [];
            $addAnyArr = [];
			$perAdd = 1000;
			$total = count($data);
			$this->db->Begin();
        
            $supIdArr=  array_unique(array_column($data,'spr_sup_id'));
			foreach($data as $k=>$mv)
			{
				if($k > 0 && $k%1000 === 0) errorLog(__CLASS__.$this->title.':'.$k, 'import');

				$set = [
                    'spr_opuser'=>$opuser,
					'spr_update_time'=>$datetime
                ];
				foreach($mv as $mtk=>$mtv)
				{ 
					if(stripos($mtk, 'spr_') === 0) 
					{
						$set[$mtk] = $mtv;
					}
				}
                $exist = $check->checkExist('supplier_pro', $mv);
                if(!empty($exist))
                {
                    $this->db->update('supplier_pro', $set, ['spr_id'=>$exist]);
                }
                else
                {
                    $set['spr_create_time'] = $datetime;
                    $addAnyArr[] = $set;
                }
                if($set['spr_oe_id']){
                    $oe_ids[] = $set['spr_oe_id'];
                }    
				if(count($addAnyArr) == $perAdd || ($k+1) == $total)
				{
					if(!empty($addAnyArr)) $this->db->insert('supplier_pro', $addAnyArr);
                    //零件供应商价格变化或者新增记录时调取下=>自动补充询价的价格
                    if(!empty($oe_ids)){
                        $oe_ids = array_unique($oe_ids);
                        make(\model\homecn\trade::class)->autoAskItemPrice([],[], $oe_ids);
                    }
					$addAnyArr = [];
					$logArr = [
						'register'=>$k,
						'class'=>__CLASS__,
						'title'=>$this->title,
						'option'=>'importing'
					];
					errorLog($logArr, 'import');
				}
			}
            $supplier = new supplier();
            foreach ($supIdArr as $key => $val) {
                $supplier->updateSupOth($val);
            }
			$this->db->End();
		}
        return $this->import->output(); //生成处理结果
	}
}