<?php
namespace model\pack;
use \model;
use model\collocation;

class material extends model
{
	public function __construct ()
    {
		parent::__construct();
	}

    function getDb(){
	    return $this->db;
	}

    public function saveDetail($params)
    {    
        if($params['pmb_id']){
            $pmbinfo = $this->db->get('pack_material_brand(pmb)',['[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id']],['pmb_id','pmb_pam_id','pmb_pb_id','pam_pat_id'],['pmb_id'=>$params['pmb_id']]);
        } 
        
        $brand = $params['num']?:[];
        $packs = new packs();
		$this->db->Begin();
        if(!$pmbinfo || $pmbinfo['pmb_pb_id']==1)
        {       
            $fileinfo = json_decode($params['pam_imgs'],true);
            if($fileinfo){
                $pam_imgs  = array_column($fileinfo,'fileid');
            }
            $data = [
                'pam_status'=>$params['pam_status']??0,
                'pam_material_type'=>$params['pam_material_type']?:0,
                'pam_pat_id'=>$params['pam_pat_id'],
                'pam_length'=>$params['pam_length']?:0,
                'pam_width'=>$params['pam_width']?:0,
                'pam_height'=>$params['pam_height']?:0,
                'pam_weight'=>$params['pam_weight']?:0,
                'pam_weight_unit'=>$params['pam_weight_unit']?:0,
                'pam_invoice_unit'=>$params['pam_invoice_unit']?:0,
                'pam_imgs'=>json_encode($pam_imgs??[]),
                'pam_opuser'=>getOpuser(),
                'pam_update_time'=>getNowTime(),
                'pam_spec'=>$packs->buildMaterialSpec($params['pam_pat_id'],$params),
                'pam_hscode'=>$params['pam_hscode']?:''
            ];
            $data = langGetVals($data,$params,['pam_'=>'pam_']);
            
            //检查数据库是否唯一
            $onlyone = $this->db->get('pack_material','pam_id',['pam_id[!]'=>$pmbinfo['pmb_pam_id'],'pam_pat_id'=>$data['pam_pat_id'],'pam_spec'=>$data['pam_spec'],'pam_material_type'=>$data['pam_material_type'],'pam_length'=>$data['pam_length'],'pam_height'=>$data['pam_height'],'pam_width'=>$data['pam_width']]);
            if($onlyone){
                msgJson(1,'已存在相同物料类型、包材类型、长、宽、高、属性值的物料');
            }
            $fgioRemark = '';
            foreach ($brand as $brandItem) {
                if($brandItem['pmb_pb_id']==1){
                    $fgioRemark  = $brandItem['pmb_remark'];
                    break;
                }
            }
            
            $mainBrandArr = ['pmb_imgs'=>$data['pam_imgs'],'pmb_pb_id'=>1,'pmb_status'=>$data['pam_status'],'pmb_remark'=> $fgioRemark,'pmb_opuser'=>$data['pam_opuser'],'pmb_update_time'=>$data['pam_update_time']];
            if(!$pmbinfo){
                $codeinfo = $packs->buildBrandPackInCode(1,$data['pam_pat_id']);
                $mainBrandArr['pmb_seqno'] = $codeinfo['seqno'];
                $mainBrandArr['pmb_incode'] = $codeinfo['codenum'];
               

                $data['pam_comcode'] = $codeinfo['codenum'];
                $data['pam_create_time'] = getNowTime();
                $this->db->insert('pack_material',$data);  
                $id = $this->db->id();
                
                //加入到pack_material_brand表
                $mainBrandArr['pmb_create_time']=$data['pam_create_time'];
                $mainBrandArr['pmb_pam_id'] = $id;
                $this->db->insert('pack_material_brand',$mainBrandArr);

            }else if($pmbinfo['pmb_pam_id'] && $pmbinfo['pmb_pb_id']==1){
                $this->db->update('pack_material',$data,['pam_id'=>$pmbinfo['pmb_pam_id']]);
                $id = $pmbinfo['pmb_pam_id'];
                //pack_material_brand表
                $mainBrandArr['pmb_pam_id'] = $id;
                $this->db->update('pack_material_brand',$mainBrandArr,['pmb_id'=>$pmbinfo['pmb_id']]);
            }
           
            // 写入pack_material_attributes
            $attributes = $params['attributes'];
            $oldAttr = $this->db->select('pack_material_attributes(pma)',
            ['[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id']]
            ,['pma_id','paa_attcat','pma_paa_id'],['pma_pam_id'=>$id]);
            if($oldAttr){
                $oldcat = array_column($oldAttr,'pma_id','paa_attcat');
                $oldpaaArr = array_column($oldAttr,'pma_paa_id');
            }
            foreach ($attributes as $attcat => $val) {
                //没有值直接跳
                if(!$val) continue;
                //去掉'A'
                $attcat = strpos($attcat, 'A') === 0? substr($attcat, 1):$attcat;
                if(!isset($oldcat[$attcat])){
                    $attrData = [
                        'pma_pam_id'=>$id,
                        'pma_paa_id'=>$val,
                        'pma_opuser'=>getOpuser(),
                        'pma_create_time'=>getNowTime(),
                        'pma_update_time'=>getNowTime(),
                    ];
                    $this->db->insert('pack_material_attributes',$attrData);
                }else{
                    $attrData = [
                        'pma_paa_id'=>$val,
                        'pma_opuser'=>getOpuser(),
                        'pma_update_time'=>getNowTime(),
                    ];
                    $this->db->update('pack_material_attributes',$attrData,['pma_id'=>$oldcat[$attcat]]);  
                }
            }
            $newIds = $attributes?array_values($attributes):[];
            $delArr = array_diff($oldpaaArr,$newIds);
            if($delArr){
                $this->db->delete('pack_material_attributes',['pma_pam_id'=>$id,'pma_paa_id'=>$delArr]);
            }
            $pam_pat_id = $data['pam_pat_id'];
        }else{
            $id = $pmbinfo['pmb_pam_id'];
            $pam_pat_id = $pmbinfo['pam_pat_id'];
        }
        
        $obrandwhere = ['pmb_pam_id'=>$id,'pmb_pb_id[!]'=>1];
        $oldbrand = $this->db->select('pack_material_brand','pmb_id', $obrandwhere);
       
        foreach ($brand as $pmb_id=> $val) {
            //FGIO前面已经写入新数据了，跳过    
            if($val['pmb_pb_id']==1) continue;
            $val['pmb_status'] = $val['pmb_status'];
            $val['pmb_opuser'] = getOpuser();
            $val['pmb_update_time'] = getNowTime();
            $val['pmb_pam_id'] = $id;

            $fileinfo = json_decode($val['pmb_imgs'],true);
            if($fileinfo){
                $val['pmb_imgs'] = json_encode(array_column($fileinfo,'fileid'));
            }else{
                $val['pmb_imgs'] = json_encode([]);
            }

            if(in_array($pmb_id,$oldbrand)){
                $this->db->update('pack_material_brand',$val,['pmb_id'=>$pmb_id]);
            }else{
                if(!$val['pmb_pb_id']) continue;

                if($val['pmb_pb_id']>0 && $val['pmb_pb_id']!=1)
                {
                    $codeinfo = $packs->buildBrandPackInCode($val['pmb_pb_id'],$pam_pat_id);
                    $val['pmb_incode'] = $codeinfo['codenum'];
                    $val['pmb_seqno'] = $codeinfo['seqno'];
                }
            
                $val['pmb_create_time'] = getNowTime();
                unset($val['pmb_id']);
                $this->db->insert('pack_material_brand',$val);
            }
        }
        $newIds = array_keys($brand);
        $delArr = array_diff($oldbrand,$newIds);
        if($delArr){
            $this->db->delete('pack_material_brand',['pmb_id'=>$delArr,'pmb_pb_id[!]'=>1]);
        }
		$this->db->End();
        //有pmb_id返回pmb_id,没有的话是添加，返回pb_id的pmb_id
		return $params['pmb_id']?: $this->db->get('pack_material_brand','pmb_id',['pmb_pam_id'=>$id,'pmb_pb_id'=>1]);
    }

    public function getList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];
		$this->joinWhere = [];
	
		$table = 'pack_material_brand(pmb)';
		$join = [
            '[><]pro_brand(pb)'=>['pmb.pmb_pb_id'=>'pb_id'],
            '[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id'],
            '[><]pack_type(pat)'=>['pam.pam_pat_id'=>'pat_id'],
            '[>]adm_user(au)'=>['pmb.pmb_opuser'=>'au_id']
        ];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
            if($field=='pmb_imgs'){
                if($data=='1'){
                    $op = 'ni';
                    $data = '[]';
                }else{
                    $op = 'eq';
                    $data = '[]';
                }
            }
            if(stripos($field,'attcat')===0){
                $attid = substr($field,6);
                $op = 'RAW_'.$field;
                $data = raw(
                    sprintf('EXISTS (select 1 from pack_material_attributes 
                    join pack_attributes on paa_id= pma_paa_id 
                    where paa_id=%d and paa_attcat=%d AND pma_pam_id=pmb_pam_id)',$data,$attid)
                );

            }
        });
        
        foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'numbers':
					$tnums = [];
					foreach($val as $tk=>$tv){
						$tnums = array_merge($tnums, reSearchNum($tv));
					}
					$tnums = array_unique($tnums);
                    $where['pmb_incode'.($rules['numlike']? '[~]': '')] = $tnums;
				break;
				case 'proBrand': $where['pmb_pb_id'] = explode(',', $rules['proBrand']); break;
			}
		}

		if(!empty($params['keys'])) $where['pmb_id'] = explode(',', $params['keys']);
		if(!empty($params['pam_id'])) $where['pam_id'] = $params['pam_id'];
		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        $proBrands = \p::areas('D100');
        if(!\p::isAdmin() && !empty($proBrands)){
            $where['pmb_pb_id'] = explode(',',$proBrands);
        }

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}
        
		$fields = ['pmb.*','pam.*','pat_'.LG_NAME.'(pat_name)','pat_size_unit','pb_'.LG_NAME.'(pb_name)','au_name'];
        $arr = $this->db->select($table,$join,$fields,$where);
        if($arr)
        {   

            $fileIds = array_filter(array_column($arr, 'pmb_imgs'));
			$fileInfoArr = [];
			
			if (!empty($fileIds)) {
				// 展开所有JSON格式的文件ID数组
				$allFileIds = [];
				foreach ($fileIds as $fileIdJson) {
					$ids = json_decode($fileIdJson, true);
					if (is_array($ids) && !empty($ids)) {
						$allFileIds = array_merge($allFileIds, $ids);
					}
				}
				$allFileIds = array_unique($allFileIds);
				
				if (!empty($allFileIds)) {
					// 一次性获取所有文件信息
					$files = $this->db->select('files', 
						['fileid', 'filename', 'fileextname', 'filetype'], 
						['fileid' => $allFileIds]
					);
					$fileInfoArr = array_column($files, null, 'fileid');
				}
			}

            $objectArr = [];
            $oArr = $this->db->select('object',['o_id','o_parent_id',LG_NAME.'(o_name)','en_name'],['o_parent_id'=>[7,2,1168]]);
            if($oArr){
                foreach ($oArr as $key => $val) {
                    $objectArr[$val['o_id']] = $val;
                }
            }
            // $oArr = array_column($oArr,null,'o_id');

            //查找关联的属性
            $mattrArr = [];
            $defaultatt = [];
            $pamids = array_column($arr,'pmb_pam_id');
            $mattr = $this->db->select('pack_material_attributes(pma)',['[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id']],['pma_pam_id','paa_'.LG_NAME.'(paa_name)','paa_id','paa_attcat'],['pma.pma_pam_id'=>$pamids]);
			if($mattr){
                foreach ($mattr as $key => $val) {
                    $defaultatt['attcat'.$val['paa_attcat']] = '';
                    $mattrArr[$val['pma_pam_id']]['attcat'.$val['paa_attcat']] = $val['paa_name'];
                }
            }
            foreach($arr as &$v){
                
                $v = array_merge($v,$defaultatt,$mattrArr[$v['pmb_pam_id']]??[]);
                
                $decimalFields = ['pam_length', 'pam_width', 'pam_height','pam_weight'];
				foreach ($decimalFields as $field) {
					if (isset($v[$field]) && is_numeric($v[$field])) {
						// 如果是浮点数且小数部分为0，则转换为整数
						if (strpos($v[$field], '.') !== false) {
							$v[$field] = rtrim(rtrim($v[$field], '0'), '.');
						}
					}
				}

                $fileinfo = [];
				if (!empty($v['pmb_imgs'])) {
					$fileIds = json_decode($v['pmb_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = $fileInfoArr[$fileId];
							}
						}
					}
				}
                $v['captions']['pat_size_unit'] = $objectArr[$v['pat_size_unit']]['en_name']?:'';
                $v['captions']['pmb_imgs'] = $fileinfo;
                $v['captions']['pam_opuser'] = $v['au_name']?:'';
                $v['captions']['pam_material_type'] =  $objectArr[$v['pam_material_type']]['o_name']??'';
				$v['captions']['pam_weight_unit'] =  $objectArr[$v['pam_weight_unit']]['o_name']??'';
                $v['captions']['pam_invoice_unit'] =  $objectArr[$v['pam_invoice_unit']]['o_name']??'';
                $v['captions']['pam_pat_id'] = $v['pat_name'];
                $v['captions']['pmb_pb_id'] = $v['pb_name'];
                $v['captions']['pam_status'] = $v['pam_status']==-1 ? '停用':'启用';
    
            }
        }
		
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

    public function delData($idArr)
    {
        if(!empty($idArr)){
            $join = [
                '[><]pack_material_brand(pmb)'=>['ppm.ppm_pmb_id'=>'pmb_id'],
                '[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id']
            ];
            $exits = $this->db->select('pro_pack_material(ppm)',$join,'pam_cn_name',['ppm_pmb_id'=>$idArr,'GROUP'=>'pam_cn_name']);
            if($exits){
                exitJson(0,'包材子件中存在关联数据：'.implode(',',$exits).'，请先删除关联数据');
            }
			$this->db->Begin();
            //主要的
            $matdArr = $this->db->select('pack_material_brand','pmb_pam_id',['pmb_id'=>$idArr,'pmb_pb_id'=>1]);
			$this->db->delete('pack_material_brand', ['pmb_id'=>$idArr]);
            if($matdArr){
                $this->db->delete('pack_material', ['pam_id'=>$matdArr]);
                //如果删除了FGIO的数据，其他关联品牌也删除
                $this->db->delete('pack_material_brand', ['pmb_pam_id'=>$matdArr]);
                $this->db->delete('pack_material_attributes', ['pma_pam_id'=>$matdArr]);
            }
			$this->db->End();
		}
		return [];
    }


    public function getDetail($id)
    {
        $arr = [];
        $table = 'pack_material_brand(pmb)';
		$join = [
            '[><]pro_brand(pb)'=>['pmb.pmb_pb_id'=>'pb_id'],
            '[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id'],
            '[>]adm_user'=>['pmb.pmb_opuser'=>'au_id']
        ];
        $fields = ['pmb.*','pam.*','pb_'.LG_NAME.'(pb_name)','au_name'];

        $arr = $this->db->get($table,$join,$fields,['pmb_id'=>$id]);
        if($arr){
            //获取关联的属性
            $attrArr = $this->db->select('pack_material_attributes(pma)',
            ['[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id']],
            ['pma_id','pma_paa_id','pma_pam_id','paa_attcat'],
            ['pma_pam_id'=>$arr['pam_id']]);
            $arr['attrArr'] = $attrArr;

            //获取pack_material_brand关联的图片 pb_id=1时 pack_material_brand和pack_material的图片是一致的
            $fileids = json_decode($arr['pam_imgs'],true);
			if($arr['pam_imgs'] && $fileids){
				
				$filesArr = $this->db->select('files','*',['fileid'=>$fileids]);
				foreach ($filesArr as $val) {
					$arr['pam_imgsinfo'][] = [
						'fileid'=>$val['fileid'],
						'filename'=>$val['filename'],
						'orgname' => $val['fileremark'].'.'.$val['fileextname']
					];
				}
			}
            $oidArr = array_filter([$arr['pam_material_type'],$arr['pam_weight_unit'],$arr['pam_invoice_unit']]);
            if($oidArr){
                $oArr = $this->db->select('object',['o_id',LG_NAME.'(o_name)'],['o_id'=>$oidArr]);
                $oArr = array_column($oArr,'o_name','o_id');
            }
           
            $arr['captions']['pam_material_type'] = $oArr[$arr['pam_material_type']]??'';
            $arr['captions']['pam_weight_unit'] = $oArr[$arr['pam_weight_unit']]??'';
            $arr['captions']['pam_invoice_unit'] = $oArr[$arr['pam_invoice_unit']]??'';
            
            //权限 - 商品品牌
            $where = ['pmb_pam_id'=>$arr['pmb_pam_id'],'ORDER'=>'pmb_pb_id'];
            $proBrands = \p::areas('D100');
            if(!\p::isAdmin() && $proBrands){
                $where['AND #rule_brand'] = ['pmb.pmb_pb_id'=>explode(',',$proBrands)];
            }
            $brand = $this->db->select('pack_material_brand(pmb)',['[><]pro_brand(pb)'=>['pmb.pmb_pb_id'=>'pb_id']],['pmb.*','pb.pb_'.LG_NAME.'(pb_name)','pb.pb_id'],$where);
            $fileIds = array_filter(array_column($brand, 'pmb_imgs'));
            $fileInfoArr = [];
            
            if (!empty($fileIds)) {
                // 展开所有JSON格式的文件ID数组
                $allFileIds = [];
                foreach ($fileIds as $fileIdJson) {
                    $ids = json_decode($fileIdJson, true);
                    if (is_array($ids) && !empty($ids)) {
                        $allFileIds = array_merge($allFileIds, $ids);
                    }
                }
                $allFileIds = array_unique($allFileIds);
                
                if (!empty($allFileIds)) {
                    // 一次性获取所有文件信息
                    $files = $this->db->select('files', 
                        ['fileid', 'filename', 'fileextname', 'filetype'], 
                        ['fileid' => $allFileIds]
                    );
                    $fileInfoArr = array_column($files, null, 'fileid');
                }
            }
            foreach ($brand as $key => $val) {
                $fileinfo = [];
                if (!empty($val['pmb_imgs'])) {
                    $fileIds = json_decode($val['pmb_imgs'], true);
                    if (is_array($fileIds) && !empty($fileIds)) {
                        foreach ($fileIds as $fileId) {
                            if (isset($fileInfoArr[$fileId])) {
                                $fileinfo[] = $fileInfoArr[$fileId];
                            }
                        }
                    }
                }
                $brand[$key]['pmb_imgs'] = $fileinfo;
            }
            $arr['brandList'] = $brand; 
        }

        return $arr;
    }

	public function getBaseDetail($id)
    {
        $arr = [];
        $table = 'pack_material_brand(pmb)';
		$join = [
            '[><]pro_brand(pb)'=>['pmb.pmb_pb_id'=>'pb_id'],
            '[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id'],
            '[><]pack_type(pat)'=>['pam.pam_pat_id'=>'pat_id']
        ];
        $fields = ['pmb.*','pam.*','pam_'.LG_NAME.'(pam_name)','pb_'.LG_NAME.'(pb_name)','pat_'.LG_NAME.'(pat_name)','pat_code'];

        $arr = $this->db->get($table,$join,$fields,['pmb_id'=>$id]);
        if($arr){
            //获取关联的属性
            $attrArr = $this->db->select('pack_material_attributes(pma)',
            [
                '[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id'],
                '[><]object(o)'=>['paa.paa_attcat'=>'o_id']
            ],
            ['pma_id','pma_paa_id','pma_pam_id','paa_cn_name(paa_name)','paa_attcat','o.'.LG_NAME.'(o_name)'],
            ['pma_pam_id'=>$arr['pam_id']]);
            $arr['attrArr'] = $attrArr;

            $oidArr = array_filter([$arr['pam_material_type'],$arr['pam_weight_unit'],$arr['pam_invoice_unit']]);
            if($oidArr){
                $oArr = $this->db->select('object',['o_id',LG_NAME.'(o_name)'],['o_id'=>$oidArr]);
                $oArr = array_column($oArr,'o_name','o_id');
            }

            if(!empty($arr['pmb_imgs'])){
                $ids = json_decode($arr['pmb_imgs'],true);
                if(is_array($ids) && !empty($ids)){
                    $files = $this->db->select('files', ['fileid', 'filename', 'fileextname', 'filetype'], ['fileid' => $ids]);
                    $arr['pmb_imgs'] = $files;
                }
            }
            
            $arr['captions']['pam_material_type'] = $oArr[$arr['pam_material_type']]??'';
            $arr['captions']['pam_weight_unit'] = $oArr[$arr['pam_weight_unit']]??'';
            $arr['captions']['pam_invoice_unit'] = $oArr[$arr['pam_invoice_unit']]??'';
        }

        return $arr;
    }

    /**
     * @method 根据名称获取pat_id
     * @author zhengweihua 
     * @copyright 2025-12-19
     */
    public function getPatidByName($name)
    {
        $where['OR'] = [
            'pat_cn_name'=>$name,
            'pat_en_name'=>$name
        ];
        $patid = $this->db->get('pack_type','pat_id',$where);
        return $patid;
    }

    /**
     * @method 获取物料所有的关联属性
     * @author zhengweihua 
     * @copyright 2025-12-19
     */
    public function getAllMaterialAttributes()
    {
        $arr = [];
        $table = 'pack_material(pam)';
        $join = [
            '[><]pack_type(pat)'=>['pam.pam_pat_id'=>'pat_id']
        ];
        $specArr = $this->db->select($table,$join,'pat_spec',['GROUP'=>'pat_id']);
        foreach ($specArr as $key => $val) {
            if(!$val) continue;
            $vArr = explode('@',$val);
            foreach ($vArr as $vv) {
                if(strpos($vv,'A')===0 && $vv){
                    $oidArr[] = substr($vv,1);
                }
            }
        }

        $fields = ['o.'.LG_NAME.'(o_name)','o.o_id'];
        $where = ['ORDER'=>['o.o_sort'=>'ASC'],'GROUP'=>'o.o_id','o_id'=>$oidArr];
        $result = $this->db->select('object(o)',$fields,$where);
 
        foreach ($result as $key => $val) {
            $arr[] = [
                'field'=>'attcat'.$val['o_id'],
                'o_name'=>$val['o_name'],
                'o_id'=>$val['o_id']
            ];
        }
        return $arr;
    }

    public function setCell($kid, $setArr)
    {
        if(!empty($kid) && !empty($setArr))
		{
			$old = $this->db->get('pack_material_brand(pmb)',['[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id']], ['pmb_id','pam_id','pam_pat_id'], ['pmb_id'=>$kid]);
			if(empty($old)) exitJson('记录不存在');
            $pmbArr = [];
            $pmaArr = [];
            $attcatArr = [];
            $packs = new packs();
			$this->db->Begin();
			foreach($setArr as $field=>$val){
                if(stripos($field,'pmb_')===0){
                    $pmbArr[$field] = $val; 
                }elseif (stripos($field,'pam_')===0) {
                    $pamArr[$field] = $val;
                }elseif(stripos($field,'attcat')===0){
                    $attid = substr($field,6);
                    //先判断pack_type有没有设置规则
                    $spec = $this->db->get('pack_type','pat_spec',['pat_id'=>$old['pam_pat_id']]);
                    if(!$spec) exitJson('当前包材类型不支持规格');
                    $specArr = explode('@',$spec);
                    $flag = 0;
                    foreach ($specArr as $sval) {
                        if(strpos($sval,'A')===0 && 'A'.$attid==$sval){
                            $flag = 1;
                            break;
                        }
                    }
                    if($flag)
                    {    //通过属性分类+类型ID找老的
                        $pma_id = $this->db->get('pack_material_attributes(pma)',['[><]pack_attributes(paa)'=>['pma.pma_paa_id'=>'paa_id']],'pma_id',['pma_pam_id'=>$old['pam_id'],'paa_pat_id'=>$old['pam_pat_id'],'paa_attcat'=>$attid]);
                        if($pma_id){
                            $this->db->update('pack_material_attributes',['pma_paa_id'=>$val,'pma_opuser'=>getOpuser(),'pma_update_time'=>getNowTime()],['pma_id'=>$pma_id]);
                        }else{
                            $indata = [
                                'pma_pam_id'=>$old['pam_id'],
                                'pma_paa_id'=>$val,
                                'pma_opuser'=>getOpuser(),
                                'pma_create_time'=>getNowTime(),
                                'pma_update_time'=>getNowTime()
                            ];
                            $this->db->insert('pack_material_attributes',$indata);
                        }
                        if($old['pam_id']) $packs->updateMaterialSpec($old['pam_id']);

                    }else{
                        exitJson(0,'当前规格不支持该属性，不可修改');
                    }
                }
			}
			if(!empty($pmbArr)){
				$opuser = getOpuser();
				$datetime = getNowTime();
				$pmbArr['pmb_opuser'] = $opuser;
				$pmbArr['pmb_update_time'] = $datetime;
				$this->db->update('pack_material_brand', $pmbArr, ['pmb_id'=>$kid]);
			}
            if(!empty($pamArr)){
                $opuser = getOpuser();
				$datetime = getNowTime();
				$pamArr['pam_opuser'] = $opuser;
				$pamArr['pam_update_time'] = $datetime;
				$this->db->update('pack_material', $pamArr, ['pam_id'=>$old['pam_id']]);
            }
			
			
			$this->db->End();
		}
		return [];
    }

    /**
     * @method 物料绑定上传的图片
     * @author hongzhang
     * @copyright 2025-12-29
     */
    public function saveBatchImgs($rows)
    {
        $this->db->Begin();
        $updated = [];
        foreach($rows as $row){
            $pmbId = intval($row['pmb_id'] ?? 0);
            $pmbIncode = isset($row['pmb_incode']) ? trim($row['pmb_incode']) : '';
            $mode = $row['mode'] ?? 'add';
            $imgs = $row['imgs'] ?? [];
            if(!$imgs || !is_array($imgs)) continue;
            $brand = null;
            if($pmbId){
                $brand = $this->db->get('pack_material_brand',['pmb_id','pmb_pam_id','pmb_pb_id','pmb_imgs'],['pmb_id'=>$pmbId]);
            }elseif($pmbIncode !== ''){
                $brand = $this->db->get('pack_material_brand',['pmb_id','pmb_pam_id','pmb_pb_id','pmb_imgs'],['pmb_incode'=>$pmbIncode]);
            }
            if(!$brand) continue;
            $pmbId = intval($brand['pmb_id']);
            $oldIds = [];
            if(!empty($brand['pmb_imgs'])){
                $oldIds = json_decode($brand['pmb_imgs'],true);
                if(!is_array($oldIds)) $oldIds = [];
            }
            $newIds = [];
            foreach($imgs as $img){
                if(isset($img['fileid'])){
                    $newIds[] = $img['fileid'];
                }
            }
            if(!$newIds) continue;
            if($mode === 'add'){
                $finalIds = array_values(array_unique(array_merge($oldIds,$newIds)));
            }else{
                $finalIds = array_values(array_unique($newIds));
                $delIds = array_diff($oldIds,$finalIds);
                if(!empty($delIds)){
                    make(\model\files::class)->delete(array_values($delIds));
                }
            }
            $datetime = getNowTime();
            $opuser = getOpuser();
            $this->db->update('pack_material_brand',[
                'pmb_imgs'=>json_encode($finalIds),
                'pmb_opuser'=>$opuser,
                'pmb_update_time'=>$datetime,
            ],['pmb_id'=>$pmbId]);
            if($brand['pmb_pb_id'] == 1){
                $this->db->update('pack_material',[
                    'pam_imgs'=>json_encode($finalIds),
                    'pam_opuser'=>$opuser,
                    'pam_update_time'=>$datetime,
                ],['pam_id'=>$brand['pmb_pam_id']]);
            }
            $updated[] = $pmbId;
        }
        $this->db->End();
        return $updated;
    }

    /**
     * @method 获取简单的包材物料列表
     * @author hongzhang
     * @copyright 2025-12-29
     */
    public function getSimpleList($where)
    {
        $table = 'pack_material_brand(pmb)';
        $join = [];
        $fields = ['pmb_id','pmb_incode','pmb_imgs'];
        $rows = $this->db->select($table,$join,$fields,$where);
        if(!$rows) return [];
        $allIds = [];
        foreach($rows as $r){
            if(!empty($r['pmb_imgs'])){
                $ids = json_decode($r['pmb_imgs'],true);
                if(is_array($ids) && !empty($ids)){
                    $allIds = array_merge($allIds,$ids);
                }
            }
        }
        $allIds = array_values(array_unique($allIds));
        $filesMap = [];
        if(!empty($allIds)){
            $files = $this->db->select('files','*',['fileid'=>$allIds]);
            foreach($files as $f){
                $url = $f['filepath'].'/'.$f['filebasename'].'.'.$f['fileextname'];
                $small = $f['filepath'].'/'.$f['filebasename'].'small'.'.'.$f['fileextname'];
                $filesMap[$f['fileid']] = [
                    'fileid'=>$f['fileid'],
                    'url'=>$url,
                    'thumb'=> $small,
                    'name'=>$f['fileremark'].'.'.$f['fileextname']
                ];
            }
        }
        foreach($rows as &$r){
            $pics = [];
            if(!empty($r['pmb_imgs'])){
                $ids = json_decode($r['pmb_imgs'],true);
                if(is_array($ids) && !empty($ids)){
                    foreach($ids as $id){
                        if(isset($filesMap[$id])){
                            $pics[] = $filesMap[$id];
                        }
                    }
                }
            }
            $r['pics'] = $pics;
        }
        unset($r);
        return $rows;
    }

    /**
     * @method 根据物料编码，检验是否存在该品牌包材物料
     * @author hongzhang
     * @copyright 2025-01-05
     */
    public function checkExistByIncode($incode)
    {
        $brand = $this->db->get('pack_material_brand',['pmb_id'],['pmb_incode'=>$incode]);
        if(!$brand) return false;
        return true;
    }
}
