<?php
namespace model\import;
use \model;
use \model\check;
use model\pack\attributes;
use model\pack\packs;
use \model\pbrand;

/**
 * 
 */
class packMaterial  extends model
{
	 /**
     * 标题 (用于消息提醒)
     */
	public $title = '包装材料'; //固定
	public $import = null;    //固定
	public $rules = null;    //规则
	public $demoData = null;  //样例数据
	public $demoremark = null;  //样例说明
	public $params = null; 
	public $attrs = null;
	
	public function __construct()
	{
		parent::__construct(); //执行父类
		$this->import = new \lib\import();
		
		$this->rulesUpdate = [
            ['key'=>'pmb_id','caption'=>lg('ID'),'must'=>true],
            ['key'=>'pam_cn_name', 'caption'=>lg('中文名')],
            ['key'=>'pam_en_name', 'caption'=>lg('英文名')],
            ['key'=>'pmb_status', 'caption'=>lg('状态')],
            ['key'=>'pam_length','caption'=>lg('长(cm)')],
            ['key'=>'pam_width','caption'=>lg('宽(cm)')],
            ['key'=>'pam_height','caption'=>lg('高(cm)')],
            ['key'=>'pam_weight','caption'=>lg('净重')],
            ['key'=>'pam_weight_unit', 'caption'=>lg('重量单位'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 7],null]],
            ['key'=>'pam_invoice_unit', 'caption'=>lg('开票单位'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 2],null]],
            ['key'=>'pmb_remark', 'caption'=>lg('备注')],
		];
        //获取所有的属性
        $this->attrs = (new attributes())->getAllAttributes();

        $this->rules = [
            ['key'=>'pam_comcode', 'caption'=>lg('集团编码')],
            ['key'=>'pmb_incode', 'caption'=>lg('物料编码')],
            ['key'=>'pmb_status', 'caption'=>lg('状态')],
            ['key'=>'pmb_pb_id', 'caption'=>lg('品牌'),'must'=>true],
            ['key'=>'pam_cn_name', 'caption'=>lg('中文名')],
            ['key'=>'pam_en_name', 'caption'=>lg('英文名')],
            ['key'=>'pam_material_type', 'caption'=>lg('物料类型'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 1168],null]],
            ['key'=>'pam_pat_id', 'caption'=>lg('包材类型'),'must'=>true,'formatCell'=>[\model\pack\material::class,[],'getPatidByName',['@'],null]],
            ['key'=>'pam_length','caption'=>lg('长(cm)')],
            ['key'=>'pam_width','caption'=>lg('宽(cm)')],
            ['key'=>'pam_height','caption'=>lg('高(cm)')],
           
        ];
        if($this->attrs){
            foreach ($this->attrs as $val) {
                $this->rules[] = ['key'=>$val['field'],'caption'=>$val['o_name']];
            }   
        }
        $lastEnd = [
            ['key'=>'pam_weight','caption'=>lg('净重')],
            ['key'=>'pam_weight_unit', 'caption'=>lg('重量单位'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 7],null]],
            ['key'=>'pam_invoice_unit', 'caption'=>lg('开票单位'),'formatCell'=>[\model\collocation::class,[],'getOidByName',['@', 2],null]],
            ['key'=>'pmb_remark', 'caption'=>lg('备注')],
        ];
        $this->rules = array_merge($this->rules, $lastEnd);
        
		
		$this->demoData = [
			
		];

		$this->demoremark = '';
	}
	
    public function import($src)
    {
        $state = $this->import->execute($src, $this->rules);
		if($state && !empty($this->import->data))
		{   
            $allBrand = $this->db->select('pro_brand',['pb_id','pb_cn_name(pn_name)','pb_code_rule']);
            $brandArr = array_column($allBrand,null,'pn_name');

            //获取所有的包材类型
            $typeArr = [];
            $patIds = array_unique(array_filter(array_column($this->import->data,'pam_pat_id')));
            if($patIds)
            {
                $allType = $this->db->select('pack_type',['pat_id','pat_spec'],['pat_id'=>$patIds]);
                $typeArr = array_column($allType,'pat_spec','pat_id');
            }
            
            $unikeyArr = [];
            $uniBrandKeyArr = [];
            $uniComnum = [];
            $uniInnum = [];
            //先把pb_id=1以及comcode存在的数据提取出来
            $fgioArr = [];
            foreach ($this->import->data as $k=>&$dv) 
            {   
                //不存在的话赋值
                if(!$dv['pam_length'])  $dv['pam_length'] = 0;
                if(!$dv['pam_width'])  $dv['pam_width'] = 0;
                if(!$dv['pam_height'])  $dv['pam_height'] = 0;

                if($dv['pmb_incode'] && mb_strlen($dv['pmb_incode'])>9){
                    $state = false;
					$dv['excelInfo']['error'] = '物料编码仅支持9位';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;  
                }
                
                if(!$brandArr[$dv['pmb_pb_id']])
				{
					$state = false;
					$dv['excelInfo']['error'] = '商品品牌不存在';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
				}
                if(!$brandArr[$dv['pmb_pb_id']]['pb_code_rule']){
                    $state = false;
					$dv['excelInfo']['error'] = '商品品牌标识不存在，请完善';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
                }
                $dv['pmb_pb_id'] = $brandArr[$dv['pmb_pb_id']]['pb_id'];

                if($dv['pam_comcode']){
                    $fgioArr[$dv['pam_comcode']][] = $k;
                }
                //pam_pat_id是生成编码的关键，少了任何一个编码都不允许pam_pat_id为空
                if((!$dv['pam_comcode']||!$dv['pmb_incode']) && !$dv['pam_pat_id']){    
                    $state = false;
					$dv['excelInfo']['error'] = '包材类型不可为空';
					$this->import->lineNum = $dv['excelInfo']['line'];
					$this->import->lastError = $dv['excelInfo']['error'];
					continue;
                }
                // 处理属性并构建规格字符串
                $params = [];
                $unikey = [$dv['pam_length'], $dv['pam_width'], $dv['pam_height'], $dv['pam_material_type'], $dv['pam_pat_id']];
                $hasAttrError = false;
                
                if (isset($this->attrs) && is_array($this->attrs)) {
                    foreach ($this->attrs as $aval) {
                        if (isset($dv[$aval['field']]) && $dv[$aval['field']] !== '') {
                            $attcat = $aval['o_id'];
                            // 判断类型是否支持该属性类别
                            if (isset($typeArr[$dv['pam_pat_id']])) {
                                $patspec = explode('@', $typeArr[$dv['pam_pat_id']]);
                                if (!$patspec || !in_array('A' . $attcat, $patspec)) {
                                    $state = false;
                                    $dv['excelInfo']['error'] = '包材类型不支持属性类别:' . $aval['o_name'];
                                    $this->import->lineNum = $dv['excelInfo']['line'];
                                    $this->import->lastError = $dv['excelInfo']['error'];
                                    $hasAttrError = true;
                                    break;
                                }
                            }
                            
                            // 查找属性ID
                            $attrId = $this->db->get('pack_attributes', 'paa_id', [
                                'paa_cn_name' => $dv[$aval['field']],
                                'paa_pat_id' => $dv['pam_pat_id'],
                                'paa_attcat' => $attcat
                            ]);

                            if ($attrId) {
                                $dv['attributes']['A' . $attcat] = $attrId;
                                $params['A' . $attcat] = $dv[$aval['field']];
                                $unikey[] = $attrId;
                            } else {
                                $state = false;
                                $dv['excelInfo']['error'] = '不存在属性值 "' . $dv[$aval['field']] . '"';
                                $this->import->lineNum = $dv['excelInfo']['line'];
                                $this->import->lastError = $dv['excelInfo']['error'];
                                $hasAttrError = true;
                                break;
                            }
                        }
                    }
                }
                
                if ($hasAttrError) continue;
                $dv['unikey'] = $unikey;

                // 构建规格字符串 pam_spec
                $specArray = [];
                $paramMap = [
                    'L' => 'pam_length',
                    'W' => 'pam_width',
                    'H' => 'pam_height'
                ];
                
                if (isset($typeArr[$dv['pam_pat_id']])) {
                    $specParts = explode('@', $typeArr[$dv['pam_pat_id']]);
                    foreach ($specParts as $part) {
                        if (strpos($part, 'A') === 0 && is_numeric(substr($part, 1))) {
                            if (isset($params[$part]) && $params[$part]) {
                                $specArray[] = $params[$part];
                            }
                        } else if (isset($paramMap[$part])) {
                            $fieldName = $paramMap[$part];
                            $paramValue = isset($dv[$fieldName]) ? $dv[$fieldName] : '';
                            if ($paramValue) {
                                if (is_numeric($paramValue) && strpos($paramValue, '.') !== false) {
                                    $paramValue = rtrim(rtrim($paramValue, '0'), '.');
                                }
                                $specArray[] = $paramValue;
                            }
                        } else {
                            $specArray[] = $part;
                        }
                    }
                    $dv['pam_spec'] = implode('', $specArray);
                } else {
                    $dv['pam_spec'] = '';
                }

                // 状态转换
                $dv['pmb_status'] = ($dv['pmb_status'] == '启用') ? 1 : 0;
                $dv['pam_status'] = $dv['pmb_status'];


            }
            unset($dv);
            foreach($this->import->data as $k=>&$dv)
			{   
                //检测FGIO品牌集团编码pam_comcode是否唯一
                if($dv['pmb_pb_id']==1 && $dv['pam_comcode']){
                    
                    if(isset($uniComnum[$dv['pam_comcode']])){
                        $state = false;
                        $dv['excelInfo']['error'] = '集团编码重复';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $uniComnum[$dv['pam_comcode']] = 1;
                    }
                    $exits = $this->db->get('pack_material','pam_id',['pam_comcode'=>$dv['pam_comcode']]);
                    if($exits){
                        $state = false;
                        $dv['excelInfo']['error'] = '集团编码重复';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }
                }

                if($dv['pmb_pb_id']!=1 && $dv['pmb_incode']){
                    
                   if (isset($uniInnum[$dv['pmb_incode']])) {
                        $state = false;
                        $dv['excelInfo']['error'] = '表单中物料编码重复';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }
                    $exits = $this->db->get('pack_material_brand', 'pmb_id', ['pmb_incode' => $dv['pmb_incode']]);
                    if ($exits) {
                        $state = false;
                        $dv['excelInfo']['error'] = '物料编码已存在';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }
                    $uniInnum[$dv['pmb_incode']] = true;
                }
                $unikey = $dv['unikey'];
                //非FGIO品牌的pmb_incode在当前表格是否有关联的数据 ||是否在数据库中存在：有的话就不用验证属性是否唯一了，
                $hasMainRecord = true;
                if($dv['pmb_pb_id']!=1){
                    //如果有集团编码，先验证集团编码是否存在关联
                    if($dv['pam_comcode'])
                    {
                        //排除掉自己后还有关联也不用验证
                        $haslink = $fgioArr[$dv['pam_comcode']] && array_diff($fgioArr[$dv['pam_comcode']],[$k]);
                        if(!$haslink){
                            $exits = $this->db->get('pack_material','pam_id',['pam_comcode'=>$dv['pam_comcode']]);
                            if(!$exits){
                                $hasMainRecord = false;
                            }
                        }
                    }
                    else
                    {
                        $unikeystr = implode('@',$unikey);
                        if(isset($uniBrandKeyArr[$dv['pmb_pb_id']][$unikeystr])){
                            $state = false;
                            $dv['excelInfo']['error'] = '相同品牌存在重复的数据：物料类型、包材类型、长、宽、高、属性值';
                            $this->import->lineNum = $dv['excelInfo']['line'];
                            $this->import->lastError = $dv['excelInfo']['error'];
                            continue;
                        }else{
                            $uniBrandKeyArr[$dv['pmb_pb_id']][$unikeystr] = 1;
                        }
                    }
                }
                //由于后续需要创建一条FGIO的material_brand记录所以需要验证是否数据库存在，否则数据库会报错
                if($dv['pmb_pb_id']==1 ||isset($hasMainRecord)&&!$hasMainRecord)
                {
                    $unikeystr = implode('@',$unikey);
                    if(isset($unikeyArr[$unikeystr])){
                        $state = false;
                        $dv['excelInfo']['error'] = '存在重复的数据：物料类型、包材类型、长、宽、高、属性值';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }else{
                        $unikeyArr[$unikeystr] = 1;
                    }
                }
    
                if($dv['pmb_pb_id']==1){ 
                    $exits = $this->db->get('pack_material','pam_id',['pam_length'=>$dv['pam_length'],'pam_width'=>$dv['pam_width'],'pam_height'=>$dv['pam_height'],'pam_material_type'=>$dv['pam_material_type'],'pam_pat_id'=>$dv['pam_pat_id'],'pam_spec'=>$dv['pam_spec']]);
                    if($exits){
                        $state = false;
                        $dv['excelInfo']['error'] = '数据库存在重复的数据：物料类型、包材类型、长、宽、高、规格值';
                        $this->import->lineNum = $dv['excelInfo']['line'];
                        $this->import->lastError = $dv['excelInfo']['error'];
                        continue;
                    }
                }
                $dv['orgIndex'] = $k;
			}
            unset($dv);
        }   
            
        /* 
        * 导入数据品牌存在多种情况，不同品牌集团编码一样则是有关联的数据
        * 集团编码和物料编码存在有、无的情况，以导入数据为准，有则原样保存，没有的通过函数构造
        * 数据库结构也有唯一性验证避免数据库报错
        */
        //入库
        if($state && !empty($this->import->data))
		{   
            //将pmb_pb_id=1的记录排在前面
            // $data = $this->import->data;
            usort($this->import->data, function($a, $b) {

                if ($a['pmb_pb_id'] == 1 && $b['pmb_pb_id'] != 1) {
                    return -1;
                }
            
                if ($b['pmb_pb_id'] == 1 && $a['pmb_pb_id'] != 1) {
                    return 1;
                }
                // 如果两者都是pmb_pb_id=1或都不是，则按pam_comcode有值的排前面
                if (!empty($a['pam_comcode']) && empty($b['pam_comcode'])) {
                    return -1;
                }
                
                if (empty($a['pam_comcode']) && !empty($b['pam_comcode'])) {
                    return 1;
                }
                
                // 如果两者的pam_comcode都有值或都为空，则按原有顺序排列
                return 0;
            });
            $packs = new packs();
            $this->db->Begin();
            foreach($this->import->data as $k=>&$dv)
            {
                if($k > 0 && $k%1000 === 0) errorLog(__CLASS__.$this->title.':'.$k, 'import');
                
                if($dv['pmb_pb_id']!=1)
                {   
                    //是否已存在主物料
                    $exists = false;
                    if($dv['pam_comcode']){
                        $pam_id = $this->db->get('pack_material','pam_id',['pam_comcode'=>$dv['pam_comcode']]);
                        if($pam_id){
                            $dv['pmb_pam_id'] = $pam_id;
                            $exists = true;
                        }
                    }else{
                        $uniwhere = [
                            'pam_material_type'=>$dv['pam_material_type'],
                            'pam_pat_id'=>$dv['pam_pat_id'],
                            'pam_length'=>$dv['pam_length'],
                            'pam_width'=>$dv['pam_width'],
                            'pam_height'=>$dv['pam_height'],
                            'pam_spec'=>$dv['pam_spec']
                        ];
                        $pam_id = $this->db->get('pack_material','pam_id',$uniwhere);
                        if($pam_id){
                            $dv['pmb_pam_id'] = $pam_id;
                            $exists = true;
                        }else{
                            $codeInfo = $packs->buildBrandPackInCode(1,$dv['pam_pat_id']);
                            $dv['pam_comcode'] = $codeInfo['codenum'];
                            $dv['pam_seqno'] = $codeInfo['seqno'];
                        }
                    }

                    if(!$dv['pmb_incode']){
                        $codeInfo = $packs->buildBrandPackInCode($dv['pmb_pb_id'],$dv['pam_pat_id']);
                        
                        $dv['pmb_incode'] = $codeInfo['codenum'];
                        $dv['pmb_seqno'] = $codeInfo['seqno'];
                    }
                    //如果不存在主物料
                    if(!$exists){
                        //插入主物料
                        $pam_data = [
                            'pam_comcode' => $dv['pam_comcode'],
                            'pam_status' => $dv['pam_status'],
                            'pam_material_type' => $dv['pam_material_type'],
                            'pam_pat_id' => $dv['pam_pat_id'],
                            'pam_length' => $dv['pam_length'] ?: 0,
                            'pam_width' => $dv['pam_width'] ?: 0,
                            'pam_height' => $dv['pam_height'] ?: 0,
                            'pam_weight' => $dv['pam_weight'] ?: 0,
                            'pam_weight_unit' => $dv['pam_weight_unit'],
                            'pam_invoice_unit' => $dv['pam_invoice_unit'],
                            'pam_spec' => $dv['pam_spec'],
                            'pam_create_time' => getNowTime(),
                            'pam_opuser' => getOpuser(),
                            'pam_update_time' => getNowTime()
                        ];
                        $pam_data = langGetVals($pam_data, $dv, ['pam_' => 'pam_']);
                        
                        $this->db->insert('pack_material', $pam_data);
                        $pam_id = $this->db->id();
                        if(!$pam_id){
                            $state = false;
                            $dv['excelInfo']['error'] = '数据库插入主品牌物料数据失败';
                            $this->import->lineNum = $dv['excelInfo']['line'];
                            $this->import->lastError = $dv['excelInfo']['error'];
                            continue;
                        }
                        //写入pack_material_attributes
                        if(isset($dv['attributes']) && is_array($dv['attributes'])) {
                            foreach($dv['attributes'] as $attrKey => $attrVal) {
                                $attrData = [
                                    'pma_pam_id' => $pam_id,
                                    'pma_paa_id' => $attrVal,
                                    'pma_opuser' => getOpuser(),
                                    'pma_create_time' => getNowTime(),
                                    'pma_update_time' => getNowTime()
                                ];
                                $this->db->insert('pack_material_attributes', $attrData);
                            }
                        }
                        
                        //再写入主品牌物料
                        $mainBrandArr = [
                            'pmb_pam_id' => $pam_id,
                            'pmb_pb_id' => 1,
                            'pmb_status' => $dv['pam_status'],
                            'pmb_incode' => $dv['pam_comcode'],
                            'pmb_seqno' => $dv['pam_seqno']?:'0000',
                            'pmb_remark'=>$dv['pmb_remark']??'',
                            'pmb_opuser' => getOpuser(),
                            'pmb_create_time' => getNowTime(),
                            'pmb_update_time' => getNowTime()
                        ];
                       
                        $this->db->insert('pack_material_brand', $mainBrandArr);
                        
                        $dv['pmb_pam_id'] = $pam_id;
                        
                        //再写入当前品牌物料
                        $pmb_data = [
                            'pmb_pam_id' => $pam_id,
                            'pmb_pb_id' => $dv['pmb_pb_id'],
                            'pmb_status' => $dv['pmb_status'],
                            'pmb_incode' => $dv['pmb_incode'],
                            'pmb_seqno' => $dv['pmb_seqno']?:'0000',
                            'pmb_remark'=>$dv['pmb_remark']??'',
                            'pmb_opuser' => getOpuser(),
                            'pmb_create_time' => getNowTime(),
                            'pmb_update_time' => getNowTime()
                        ];
                        
                        $this->db->insert('pack_material_brand', $pmb_data);
                    }else{
                        $brandExist = $this->db->get('pack_material_brand', 'pmb_incode', ['pmb_pam_id' => $dv['pmb_pam_id'],'pmb_pb_id'=>$dv['pmb_pb_id']]);
                        if($brandExist){
                            $state = false;
                            $dv['excelInfo']['error'] = '该品牌已存在相同规格的物料数据['.$brandExist.']';
                            $this->import->lineNum = $dv['excelInfo']['line'];
                            $this->import->lastError = $dv['excelInfo']['error'];
                            continue;
                        }
                        //写入当前品牌物料
                        $pmb_data = [
                            'pmb_pam_id' => $dv['pmb_pam_id'],
                            'pmb_pb_id' => $dv['pmb_pb_id'],
                            'pmb_status' => $dv['pmb_status'],
                            'pmb_incode' => $dv['pmb_incode'],
                            'pmb_seqno' => $dv['pmb_seqno']?:'0000',
                            'pmb_remark'=>$dv['pmb_remark']??'',
                            'pmb_opuser' => getOpuser(),
                            'pmb_create_time' => getNowTime(),
                            'pmb_update_time' => getNowTime()
                        ];
                        
                        $this->db->insert('pack_material_brand', $pmb_data);
                    }
                    
                    
                }else{
                    //pb_id=1且 两个都没有的
                    if(!$dv['pam_comcode'] && !$dv['pmb_incode']){
                        $codeInfo = $packs->buildBrandPackInCode(1,$dv['pam_pat_id']);
                        $dv['pam_comcode'] = $dv['pmb_incode'] =  $codeInfo['codenum'];
                        $dv['pmb_seqno'] = $codeInfo['seqno'];
                    }
                    //如果只有其中一个有
                    if($dv['pam_comcode'] && !$dv['pmb_incode']){
                        // $codeInfo = $packs->buildBrandPackInCode($dv['pmb_pb_id'],$dv['pam_pat_id']);
                        $dv['pmb_incode'] =  $dv['pam_comcode'];
                        // $dv['pmb_seqno'] = '0000';
                    }
                    
                    if(!$dv['pam_comcode'] && $dv['pmb_incode']){
                        // $codeInfo = $packs->buildBrandPackInCode($dv['pmb_pb_id'],$dv['pam_pat_id']);
                        $dv['pam_comcode'] =  $dv['pmb_incode'];
                    }
                    
                    // 插入或更新物料品牌、属性表
                    // 先插入主物料
                    $pam_data = [
                        'pam_comcode' => $dv['pam_comcode'],
                        'pam_status' => $dv['pam_status'],
                        'pam_material_type' => $dv['pam_material_type'],
                        'pam_pat_id' => $dv['pam_pat_id'],
                        'pam_length' => $dv['pam_length'] ?: 0,
                        'pam_width' => $dv['pam_width'] ?: 0,
                        'pam_height' => $dv['pam_height'] ?: 0,
                        'pam_weight' => $dv['pam_weight'] ?: 0,
                        'pam_weight_unit' => $dv['pam_weight_unit'],
                        'pam_invoice_unit' => $dv['pam_invoice_unit'],
                        'pam_spec' => $dv['pam_spec'],
                        'pam_create_time' => getNowTime(),
                        'pam_opuser' => getOpuser(),
                        'pam_update_time' => getNowTime()
                    ];
                    $pam_data = langGetVals($pam_data, $dv, ['pam_' => 'pam_']);
                    
                    // 检查是否已存在
                    $existing_pam = $this->db->get('pack_material','pam_id',['pam_comcode'=>$dv['pam_comcode']]);
                    if($existing_pam) {
                        $this->db->update('pack_material', $pam_data, ['pam_id'=>$existing_pam]);
                        $pam_id = $existing_pam;
                    } else {
                        $this->db->insert('pack_material', $pam_data);
                        $pam_id = $this->db->id();
                    }
                    
                    // 插入或更新pack_material_attributes
                    if(isset($dv['attributes']) && is_array($dv['attributes'])) {
                        // 先删除现有的属性
                        $this->db->delete('pack_material_attributes', ['pma_pam_id'=>$pam_id]);
                        
                        foreach($dv['attributes'] as $attrKey => $attrVal) {
                            $attrData = [
                                'pma_pam_id' => $pam_id,
                                'pma_paa_id' => $attrVal,
                                'pma_opuser' => getOpuser(),
                                'pma_create_time' => getNowTime(),
                                'pma_update_time' => getNowTime()
                            ];
                            $this->db->insert('pack_material_attributes', $attrData);
                        }
                    }
                    
                    // 插入或更新pack_material_brand
                    $pmb_data = [
                        'pmb_pam_id' => $pam_id,
                        'pmb_pb_id' => $dv['pmb_pb_id'],
                        'pmb_status' => $dv['pmb_status'],
                        'pmb_incode' => $dv['pmb_incode'],
                        'pmb_seqno' => $dv['pmb_seqno']?:'0000',
                        'pmb_opuser' => getOpuser(),
                        'pmb_create_time' => getNowTime(),
                        'pmb_update_time' => getNowTime()
                    ];
                    if(isset($dv['pmb_remark'])){
                        $pmb_data['pmb_remark'] = $dv['pmb_remark'];
                    }
                    
                    $existing_pmb = $this->db->get('pack_material_brand','pmb_id',['pmb_pb_id'=>$dv['pmb_pb_id'],'pmb_pam_id'=>$pam_id]);
                    if($existing_pmb) {
                        $this->db->update('pack_material_brand', $pmb_data, ['pmb_id'=>$existing_pmb]);
                    } else {
                        $this->db->insert('pack_material_brand', $pmb_data);
                    }
                }
            }

            if (!$state) {
                //根据$dv['orgIndex'] 复原原来的顺序
                usort($this->import->data, function($a, $b) {
                    $lineA = isset($a['orgIndex']) ? intval($a['orgIndex']) : 0;
                    $lineB = isset($b['orgIndex']) ? intval($b['orgIndex']) : 0;
                    return $lineA - $lineB;
                });
                $this->db->rollBack(); // 明确回滚
            } else {
                $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))
		{
            $pmbids = array_column($this->import->data,'pmb_id');
            //找pb_id=1的品牌，支持修改基础信息
            $pamArr = $this->db->select('pack_material_brand(pmb)',['[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id']],['pmb_id', 'pmb_pam_id','pam_spec'],['pmb_id'=>$pmbids,'pmb_pb_id'=>1]);
            $pamArr = array_column($pamArr,'pmb_pam_id','pmb_id');
			foreach($this->import->data as $k=>&$dv)
			{       
                //如果是pb_id=1有 pam_id
                if($pamArr[$dv['pmb_id']]){
                    $dv['pam_id'] = $pamArr[$dv['pmb_id']];
                }
                if($dv['pmb_status']=='启用'){
                    $dv['pmb_status'] = 1;
                }else {
                    $dv['pmb_status'] = 0;
                }
                $dv['pam_status'] = $dv['pmb_status'];

			}
		}

		//入库
		if($state && !empty($this->import->data))
		{   
            $packs  = new packs();
			$this->db->Begin();
			foreach($this->import->data as $k=>&$dv)
			{

                if($k > 0 && $k%1000 === 0) errorLog(__CLASS__.$this->title.':'.$k, 'import');

				$pmbArr = [];
                $pamArr = [];
				foreach ($dv as $field => $val) {
                    if(stripos($field,'pam_')===0 ){
                        $pamArr[$field] = $val;
                    }elseif (stripos($field,'pmb_')===0) {
                        $pmbArr[$field] = $val;
                    }
                }
				
                //更新品牌信息
                if($pmbArr){
                    $pmb_id = $pmbArr['pmb_id'];
                    unset($pmbArr['pmb_id']);
                    $pmbArr['pmb_opuser'] = getOpuser();
                    $pmbArr['pmb_update_time'] = getNowTime();
                    $this->db->update('pack_material_brand',$pmbArr,['pmb_id'=>$pmb_id]);
                }
                if($pamArr && $pamArr['pam_id']){
                    $pam_id = $pamArr['pam_id'];
                    unset($pamArr['pam_id']);
                    $pamArr['pam_opuser'] = getOpuser();
                    $pamArr['pam_update_time'] = getNowTime();
                    
                    //更新基础信息
                    $this->db->update('pack_material',$pamArr,['pam_id'=>$pam_id]);
                    $packs->updateMaterialSpec($pam_id);
                }
			}
			if($state) 
				$this->db->End();
			else
				$this->db->rollBack();
		}
        return $this->import->output(); //生成处理结果
	}
}