<?php
namespace model\pack;
use \model;

use model\freyIbp;

class packs extends \model
{
	/**
     * 获取品牌包装物料编码
     * @param int $pb_id 商品品牌ID
     * @param int $pat_id 包材类型ID
     * @return ['codenum'=>$codenum, 'seqno'=>$newseq, 'msg'=>'']
     */
	function buildBrandPackInCode($pb_id, $pat_id)
	{
		$codenum = '';
		$rule = $this->db->get('pro_brand', ['pb_id', 'pb_'.LG_NAME.'(pb_name)', 'pb_code_rule'], ['pb_id'=>$pb_id]);
		if(empty($rule['pb_code_rule'])) return ['codenum'=>$codenum, 'msg'=>$rule['pb_name'].'品牌标识尚未定义'];
		$rule['pat'] = $this->db->get('pack_type', ['pat_id', 'pat_'.LG_NAME.'(pat_name)', 'pat_code', 'pat_minseq'], ['pat_id'=>$pat_id]);
		if(empty($rule['pat']['pat_code'])) return ['codenum'=>$codenum, 'msg'=>$rule['pat_name'].'包材类型代码尚未定义'];
		$codefull = ['begin'=>'0'.$rule['pat']['pat_code'], 'seq'=>'', 'end'=>$rule['pb_code_rule']];
		$codefull['seq'] = '[0-9]{5}';
		$sql = sprintf("SELECT MAX(CAST(SUBSTRING(pmb_incode, %d, LENGTH(pmb_incode)-%d) AS UNSIGNED)) AS max_seq FROM pack_material_brand WHERE pmb_incode REGEXP '^%s%s%s$'", strlen($codefull['begin'])+1 , strlen($codefull['begin'])+ strlen($codefull['end']), $codefull['begin'], $codefull['seq'], $codefull['end']);
		$row = $this->db->query($sql)->fetch(\PDO::FETCH_ASSOC);
		$newseq = $row['max_seq'] === null ? 0: $row['max_seq']+1;
		if($newseq < $rule['pat']['pat_minseq']) $newseq = $rule['pat']['pat_minseq'];
		$newseq = str_pad($newseq, 5, "0", STR_PAD_LEFT);
		$codenum = $codefull['begin'].$newseq.$codefull['end'];
		return ['codenum'=>$codenum, 'seqno'=>$newseq, 'msg'=>''];
	}

	/**
	 * @param  int $pat_id 包材类型ID
	 * @param  array  $params 参数
	 * @method 获取包材物料规格值
	 * @author zhengweihua 
	 * @copyright 2025-12-09
	 */
	public function buildMaterialSpec($pat_id, $params = []) 
	{
		if (!$pat_id) {
			return '';
		}
		// 获取 pack_type 信息
		$packType = $this->db->get('pack_type', '*', ['pat_id' => $pat_id]);
		
		if (!$packType || !$packType['pat_spec']) {
			return '';
		}
		
		// 解析规格参数
		$specParts = explode('@', $packType['pat_spec']);
		$specArray = [];
		
		// 参数映射关系
		$paramMap = [
			'L' => ['name' => '长', 'field' => 'pam_length'],
			'W' => ['name' => '宽', 'field' => 'pam_width'], 
			'H' => ['name' => '高', 'field' => 'pam_height']
		];
		
		foreach ($specParts as $part) {

			// 处理属性参数 (A开头的)
			if (strpos($part, 'A') === 0 && is_numeric(substr($part, 1))) {
				
				// 查找该属性的值
				$attrValue = '';
				if (isset($params['attributes'][$part])) {
					// 获取属性值的名称
					$attrValue = $this->db->get('pack_attributes',
						'paa_'.LG_NAME
					, [
						'paa_id' => $params['attributes'][$part]
					]);
					
				}
	
				if ($attrValue) {
					$specArray[] = $attrValue;
				} 
			} 
			// 处理普通参数 (L, W, H)
			else if (isset($paramMap[$part])) {
				$paramInfo = $paramMap[$part];
				$fieldName = $paramInfo['field'];
				$paramValue = isset($params[$fieldName]) ?(float) $params[$fieldName] : '';
				
				if ($paramValue) {
					$paramValue = round($paramValue,2);
					// 如果是数值并且小数点后都是0，则去除小数部分
					if (is_numeric($paramValue) && strpos($paramValue, '.') !== false) {
						$paramValue = rtrim(rtrim($paramValue, '0'), '.');
					}
					$specArray[] = $paramValue;
				}
			}
			// 其他参数直接使用
			else {
				$specArray[] = $part;
			}
		}
		// 组装成 pam_spec 字符串
		return implode('', $specArray);
	}

	/**
	 * 通过 pam_id 更新 pam_spec 字段
	 * @param int $pam_id 包材物料ID
	 * @return bool 是否更新成功
	 */
	public function updateMaterialSpec($pam_id) {
		if (!$pam_id) {
			return false;
		}
		
		// 获取包材物料信息
		$material = $this->db->get('pack_material', '*', ['pam_id' => $pam_id]);
		
		if (!$material) {
			return false;
		}
		
		// 获取包材类型信息
		$pat_id = $material['pam_pat_id'];
		if (!$pat_id) {
			return false;
		}
		
		// 获取属性信息
		$attributes = $this->db->select('pack_material_attributes(pa)', [
			'[><]pack_attributes(a)' => ['pa.pma_paa_id' => 'paa_id']
		], [
			'pa.pma_paa_id',
			'a.paa_attcat'
		], [
			'pa.pma_pam_id' => $pam_id
		]);
		
		// 构建参数数组
		$params = [];
		$params['pam_length'] = $material['pam_length'];
		$params['pam_width'] = $material['pam_width'];
		$params['pam_height'] = $material['pam_height'];
		
		// 处理属性参数
		$params['attributes'] = [];
		foreach ($attributes as $attr) {
			// 构造属性键名，格式为 A + 属性类别ID
			$attrKey = 'A' . $attr['paa_attcat'];
			$params['attributes'][$attrKey] = $attr['pma_paa_id'];
		}
		
		//新的规格
		$packs = new packs();
		$newSpec = $packs->buildMaterialSpec($pat_id, $params);
		
		// 更新数据库中的 pam_spec 字段
		$result = $this->db->update('pack_material', [
			'pam_spec' => $newSpec
		], [
			'pam_id' => $pam_id
		]);
		
		return $result->rowCount();
	}
				

	/**
	 * @param  Array $params
	 * @method 包装方案列表
	 * @author zhengweihua 
	 * @copyright 2025-12-15
	 */
	public function getList($params)
	{
		$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 = 'pro_pack(pp)';
		$join = [
			'[><]pro(p)'=>['pp.pp_p_id'=>'p_id'],
            '[>]company(com)'=>['pp.pp_com_id'=>'com_id'],
            '[>]adm_user(au)'=>['pp.pp_opuser'=>'au_id']
        ];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			if($field == 'pp_com_name'){
				$dataArr = explode(' ',$data);
				$data = count($dataArr)>1?$dataArr[1]:$dataArr[0];
				$field = 'com_cn_name';
			}
        });
		if(!empty($params['pp_p_id'])) $where['pp_p_id'] = $params['pp_p_id'];
		if(!empty($params['keys'])) $where['pp_id'] = explode(',', $params['keys']);
		if(!empty($params['pp_id'])) $where['pp_id'] = $params['pp_id'];
		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        
        $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 = ['pp.*','com_cn_name(pp_com_name)','au_name','p_weight'];
        $arr = $this->db->select($table,$join,$fields,$where);

        if($arr)
        {   		
			//附件
			$attachmentIds = array_filter(array_column($arr, 'pp_lettering_files'));
			$attachmentInfoArr = [];
			if (!empty($attachmentIds)) {
				// 展开所有JSON格式的文件ID数组
				$allAttachmentIds = [];
				foreach ($attachmentIds as $fileIdJson) {
					$ids = json_decode($fileIdJson, true);
					if (is_array($ids) && !empty($ids)) {
						$allAttachmentIds = array_merge($allAttachmentIds, $ids);
					}
				}
				$allAttachmentIds = array_unique($allAttachmentIds);
				
				if (!empty($allAttachmentIds)) {
					// 一次性获取所有文件信息
					$files = $this->db->select('files', 
						['fileid', 'filename', 'fileextname', 'fileremark','filetype'], 
						['fileid' => $allAttachmentIds]
					);
					foreach ($files as &$file) {
						$attachmentInfoArr[$file['fileid']] = [
							'fileid' => $file['fileid'],
							'orgname'=>$file['fileremark']?$file['fileremark'].'.'.$file['fileextname']:$file['filename'],
							'filename'=> $file['filename']
						];
					}
				}
			}
			//图片
			$fileIds = array_filter(array_column($arr, 'pp_lettering_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');
				}
			}
            
			
			$typeArr = ['share'=>'共享','self'=>'定制'];
            foreach($arr as &$v){
				//pp_per_pallet_volume pp_weight_carton pp_weight_bag pp_weight_box p_weight
				$decimalFields = ['pp_per_pallet_volume', 'pp_weight_carton', 'pp_weight_bag', 'pp_weight_box', 'p_weight','pp_per_pro_volume','pp_per_pro_length','pp_per_pro_width','pp_per_pro_height'];
				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'), '.');
						}
					}
				}
				//附件
				$attachmentInfo = [];
				if (!empty($v['pp_lettering_files'])) {
					$fileIds = json_decode($v['pp_lettering_files'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($attachmentInfoArr[$fileId])) {
								$attachmentInfo[] = $attachmentInfoArr[$fileId];
							}
						}
					}
				}


				$fileinfo = [];
				if (!empty($v['pp_lettering_imgs'])) {
					$fileIds = json_decode($v['pp_lettering_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = $fileInfoArr[$fileId];
							}
						}
					}
				}
				$v['captions']['pp_lettering_files'] = $attachmentInfo;
				$v['captions']['pp_opuser'] = $v['au_name'];
				$v['captions']['pp_lettering_imgs'] = $fileinfo;
                $v['captions']['pp_type'] = $typeArr[$v['pp_type']]?:'';
            }
			unset($v);
        }
		
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	/**
	 * @param  Array $params
	 * @method 保存包装数据
	 * @author zhengweihua 
	 * @copyright 2025-12-15
	 */
	public function saveDetail($params)
	{
		if($params['pp_id']){
			$exist = $this->db->get('pro_pack','pp_id',['pp_id'=>$params['pp_id']]);
		}
		$isChangeProWeight = false;
		$data = [
			'pp_opuser'=>getOpuser(),
			'pp_update_time'=>getNowTime()
		];
		foreach ($params as $field => $val) {
			if(strpos($field, 'pp_')!==false){
				$data[$field] = $val;
			}elseif($field=='p_weight'){
				$proData['p_weight'] = $val;
			}
		}
		$fileinfo = json_decode($params['pp_lettering_imgs'],true);
		if($fileinfo){
			$data['pp_lettering_imgs'] = json_encode(array_column($fileinfo,'fileid'));
		}else{
			$data['pp_lettering_imgs'] = json_encode([]);
		}

		$attachment = json_decode($params['pp_lettering_files'],true);
		if($attachment){
			$data['pp_lettering_files'] = json_encode(array_column($attachment,'fileid'));
		}else{
			$data['pp_lettering_files'] = json_encode([]);
		}

		unset($data['pp_id']);
		//只有一个产品或者没有
		$counts = $this->db->count('pro_pack',['pp_p_id'=>$data['pp_p_id'],'pp_id[!]'=>$params['pp_id']?:0]);
		if($counts==0){
			$data['pp_default'] =1;
		}
		$this->db->Begin();
		if($exist){

			$this->db->update('pro_pack',$data,['pp_id'=>$params['pp_id']]);
			$pp_id = $params['pp_id'];
		}else{
			$data['pp_create_time'] = getNowTime();
			$this->db->insert('pro_pack',$data);
			$pp_id = $this->db->id();
		}
		if($data['pp_p_id']){
			$oldPro = $this->db->get('pro','p_weight',['p_id'=>$data['pp_p_id']]);
			if($oldPro&& $oldPro['p_weight']!=$proData['p_weight']){
				//商品净重
				$isChangeProWeight = true;
				$this->db->update('pro',$proData,['p_id'=>$data['pp_p_id']]);
			}
		}
		

		//保存包材子料
		$materialArr = $params['material'];

		$oldMaterialArr = $this->db->select('pro_pack_material','ppm_id',['ppm_pp_id'=>$pp_id]);

		$newMaterialId = $materialArr?array_keys($materialArr):[];
		//来源是导入的话不检测删除
		if(!$params['is_export']){
			$delArr = array_diff($oldMaterialArr,$newMaterialId);
			if($delArr){
				$this->db->delete('pro_pack_material',['ppm_id'=>$delArr]);
			}
		}

		foreach ($materialArr as $ppm_id => $val) {
			if($val['ppm_imgs']){
				$fileinfo = json_decode($val['ppm_imgs'],true);
				if($fileinfo){
					$val['ppm_imgs'] = json_encode(array_column($fileinfo,'fileid'));
				}else{
					$val['ppm_imgs'] = json_encode([]);
				}
			}
			$val['ppm_pp_id'] = $pp_id;
			$val['ppm_update_time'] = getNowTime();
			$val['ppm_opuser'] = getOpuser();
			if(in_array($ppm_id,$oldMaterialArr)){
				$this->db->update('pro_pack_material',$val,['ppm_id'=>$ppm_id]);
			}else{
				$val['ppm_create_time'] = getNowTime();
				$this->db->insert('pro_pack_material',$val);
			}
		}
		

		//套装子零件
		$sonProArr = $params['sonpro'];
		$oldSonProArr = $this->db->select('pro_pack_sonpro','pps_id',['pps_pp_id'=>$pp_id]);

		$newSonProId = $sonProArr?array_keys($sonProArr):[];
		//来源是导入的话不检测删除
		if(!$params['is_export']){
			$delArr = array_diff($oldSonProArr,$newSonProId);
			if($delArr){
				$this->db->delete('pro_pack_sonpro',['pps_id'=>$delArr]);
			}	
		}
		

		foreach ($sonProArr as $pps_id => $val) {
			$updata = [
				'pps_update_time'=>getNowTime(),
				'pps_opuser'=>getOpuser(),
				'pps_p_id'=>$val['pps_p_id'],
				'pps_count'=>$val['pps_count'],
				'pps_remark'=>$val['pps_remark'],
				'pps_pp_id'=>$pp_id
			];

			if(in_array($pps_id,$oldSonProArr)){
				$this->db->update('pro_pack_sonpro',$updata,['pps_id'=>$pps_id]);
			}else{
				$updata['pps_create_time'] = getNowTime();
				$this->db->insert('pro_pack_sonpro',$updata);
			}
		}
		if($pp_id){
			$freyNos = $this->db->get('pro','p_innum',['p_id'=>$params['pp_p_id']]);
			$companyNos = $this->db->get('company','com_code',['com_id'=>$data['pp_com_id']]);
			$freyIbp = new freyIbp();
			$freyIbp->receivePdmProPack($freyNos,$companyNos,'pack');	
			if($isChangeProWeight){
				$freyIbp->receivePdmProBase($params['pp_p_id'],'base');
			}
		}
		
		$this->db->End();
		return $pp_id;
	}

	/**
	 * @param  Array $params
	 * @method 获取产品包装子料数据
	 * @author zhengweihua 
	 * @copyright 2025-12-15
	 */
	public function getMaterialList($params)
	{
		$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 = 'pro_pack_material(ppm)';
		$join = [
			'[><]pack_material_brand(pmb)'=>['ppm.ppm_pmb_id'=>'pmb_id'],
			'[><]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']
        ];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){

        });
		if(!empty($params['ppm_pp_id'])) $where['ppm_pp_id'] = $params['ppm_pp_id'];
		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        
        $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 = ['ppm.*','pmb.*','pam.*','pam_'.LG_NAME.'(pam_name)','pb_'.LG_NAME.'(pb_name)','pat_'.LG_NAME.'(pat_name)','pat_code'];
        $arr = $this->db->select($table,$join,$fields,$where);

        if($arr)
        {   	
			$pamids = array_column($arr,'pam_id');
			 //获取关联的属性
			$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'=>$pamids]);
			$attrObjectArr = [];
			if($attrArr){
				foreach ($attrArr as $key => $val) {
					$attrObjectArr[$val['pma_pam_id']][] = $val;
				}
			}
		

			$objectArr = [];
            $oArr = $this->db->select('object',['o_id','o_parent_id',LG_NAME.'(o_name)'],['o_parent_id'=>[7,2,1168]]);
            if($oArr){
                foreach ($oArr as $key => $val) {
                    $objectArr[$val['o_id']] = $val;
                }
            }
		 
			//图片
			$fileIds = array_filter(array_column($arr, 'ppm_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($arr as &$v){
				$decimalFields = ['pam_length', 'pam_width', 'pam_height'];
				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['ppm_imgs'])) {
					$fileIds = json_decode($v['ppm_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = $fileInfoArr[$fileId];
							}
						}
					}
				}
				$v['pmb_name'] = $v['pam_'.LG_NAME].'('.$v['pmb_incode'].')';
				$v['attrArr'] = $attrObjectArr[$v['pam_id']]??[];
				$v['ppm_imgs'] = $fileinfo;
				$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']??'';


            }
			unset($v);
        }
		
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $arr;
	}

	/**
	 * @param  Array $params
	 * @method 获取产品套件子零件数据
	 * @author zhengweihua 
	 * @copyright 2025-12-15
	 */
	public function getSonProList($params)
	{
		$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 = 'pro_pack_sonpro(pps)';
		$join = [
			'[><]pro(p)'=>['pps.pps_p_id'=>'p_id'],
			"[>]pro_brand(pb)" => ["p.p_pb_id" => "pb_id"],
			"[>]pro_cate(cat)" => ["p.p_cate" => "id"],
			
       
        ];
		
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){

        });
		if(!empty($params['pps_pp_id'])) $where['pps_pp_id'] = $params['pps_pp_id'];
		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        
        $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 = ['pps.*','p_comnum','p_innum','p_id','p_oe','p_'.LG_NAME.'(p_name)','pb_'.LG_NAME.'(pb_name)','cat.'.cateName().'(p_cate)'];
        $arr = $this->db->select($table,$join,$fields,$where);

        if($arr)
        {   		
			$pidArr = array_column($arr,'p_id');
			$imgs = [];
			$join = ["[><]files"=>["pic_fileid"=>'fileid']];
			$picrows = $this->db->select('pro_pic',$join,'*',['pic_p_id'=>$pidArr,'pic_ismain'=>1,'pic_type'=>'img']);
			foreach ($picrows as  $pic) {
				$imgs[$pic['pic_p_id']] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
			}
			
            foreach($arr as &$v){

				$v['main_pic'] = $imgs[$v['p_id']]??'';
            }
			unset($v);
		}
		return $arr;
	}

	/**
	 * @method 设置默认方案
	 * @author zhengweihua 
	 * @copyright 2025-12-15
	 */
	public function setDefault($params)
	{
		if(!$params['pp_id']) exitJson(-1,'请选择方案');
		$exist = $this->db->get('pro_pack','pp_id',['pp_id'=>$params['pp_id']]);
		if(!$exist) exitJson(-1,'方案不存在');
		$this->db->Begin();
		$this->db->update('pro_pack',['pp_default'=>0],['pp_id[!]'=>$exist]);
		$this->db->update('pro_pack',['pp_default'=>1],['pp_id'=>$exist]);
		$this->db->End();
		return [];
	}

	/**
	 * @method 删除数据
	 * @author zhengweihua 
	 * @copyright 2025-12-15
	 */
	public function delData($ids)
	{	
		$existIds = $this->db->select('pro_pack','pp_id',['pp_id'=>$ids]);
		if(!$existIds) return exitJson(-1,'请选择数据');
		$this->db->Begin();
		$this->db->delete('pro_pack',['pp_id'=>$existIds]);
		$this->db->delete('pro_pack_material',['ppm_pp_id'=>$existIds]);
		$this->db->delete('pro_pack_sonpro',['pps_pp_id'=>$existIds]);
		$this->db->End();
	}


	public function compareBox($ids,$pid='')
	{
		if(!$ids & $pid) {
			$ids = $this->db->select('pro_pack','pp_id',['pp_p_id'=>$pid]);
		}
			
		if(!is_array($ids)) $ids = explode(',',$ids);
		if(!$ids) return [];
		$where = [
			'pp_id'=>$ids,
			'pat_cn_name'=>'内盒' //内盒
		];
		$join = [
			'[><]pro_pack(pp)'=>['ppm.ppm_pp_id'=>'pp_id'],
			'[><]pack_material_brand(pmb)'=>['ppm.ppm_pmb_id'=>'pmb_id'],
			'[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id'],
			'[><]pack_type(pat)'=>['pam.pam_pat_id'=>'pat_id'],
			'[>]company(com)'=>['pp.pp_com_id'=>'com_id'],
			'[>]pro_brand(pb)'=>['pmb.pmb_pb_id'=>'pb_id'],
		];
		$field = [
			'pp.pp_name','com_cn_name','pmb.pmb_incode','pb_cn_name','pat.pat_cn_name','pam.pam_cn_name'
			,'pam.pam_length','pam.pam_width','pam.pam_height','pam_spec','ppm_count','ppm_imgs','ppm_remark','pmb_pam_id'
		];
		$arr = $this->db->select('pro_pack_material(ppm)',$join,$field,$where);
		if($arr){

			//查找关联的属性
			$mattrArr = [];
			$defaultatt = [];
			$attcatArr = [];
			$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'];
				}
				$attcatIds = array_column($mattr,'paa_attcat');
				$fields = ['o.'.LG_NAME.'(o_name)','o.o_id'];
				$where = ['ORDER'=>['o.o_sort'=>'ASC'],'GROUP'=>'o.o_id','o_id'=>$attcatIds];
				$result = $this->db->select('object(o)',$fields,$where);
		
				foreach ($result as $key => $val) {
					$attcatArr[] = [
						'field'=>'attcat'.$val['o_id'],
						'o_name'=>$val['o_name'],
						'o_id'=>$val['o_id']
					];
				}

			}

			//图片
			$fileIds = array_filter(array_column($arr, 'ppm_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');
				}
			}
			

			 // 比较字段值，标记不一致的行
			$lengthValues = array_column($arr, 'pam_length');
			$widthValues = array_column($arr, 'pam_width');
			$heightValues = array_column($arr, 'pam_height');
			$countValues = array_column($arr, 'ppm_count');
			
			// 获取o_id=1181的属性值
			$attr1181Values = [];
			foreach($arr as $item) {
				$pamId = $item['pmb_pam_id'];
				if(isset($mattrArr[$pamId]['attcat1181'])) {
					$attr1181Values[] = $mattrArr[$pamId]['attcat1181'];
				} else {
					$attr1181Values[] = '';
				}
			}
			
			// 检查每个字段是否有不一致的值
			$hasDifferentLength = count(array_unique($lengthValues)) > 1;
			$hasDifferentWidth = count(array_unique($widthValues)) > 1;
			$hasDifferentHeight = count(array_unique($heightValues)) > 1;
			$hasDifferentCount = count(array_unique($countValues)) > 1;
			$hasDifferentAttr1181 = count(array_unique($attr1181Values)) > 1;
			
			// 为每个字段计算是否与其他行不同
			$lengthUniques = array_count_values($lengthValues);
			$widthUniques = array_count_values($widthValues);
			$heightUniques = array_count_values($heightValues);
			$countUniques = array_count_values($countValues);
			$attr1181Uniques = array_count_values($attr1181Values);
			 

			
            foreach($arr as &$v){

				$v = array_merge($v,$defaultatt,$mattrArr[$v['pmb_pam_id']]??[]);

				$decimalFields = ['pam_length', 'pam_width', 'pam_height'];
				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['ppm_imgs'])) {
					$fileIds = json_decode($v['ppm_imgs'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = $fileInfoArr[$fileId];
							}
						}
					}
				}
				$v['pmb_name'] = $v['pam_'.LG_NAME].'('.$v['pmb_incode'].')';
				$v['attrArr'] = $attrObjectArr[$v['pam_id']]??[];
				$v['ppm_imgs'] = $fileinfo;

				// 添加比较标记
				$v['is_different'] = [
					'pam_length' => $lengthUniques[$v['pam_length']] < count($lengthValues) && $hasDifferentLength,
					'pam_width' => $widthUniques[$v['pam_width']] < count($widthValues) && $hasDifferentWidth,
					'pam_height' => $heightUniques[$v['pam_height']] < count($heightValues) && $hasDifferentHeight,
					'ppm_count' => $countUniques[$v['ppm_count']] < count($countValues) && $hasDifferentCount,
					'attcat1181' => isset($mattrArr[$v['pmb_pam_id']]['attcat1181']) 
						? $attr1181Uniques[$mattrArr[$v['pmb_pam_id']]['attcat1181']] < count($attr1181Values) && $hasDifferentAttr1181
						: false
				];
            }
			unset($v);
		}

		return [
			'arr'=>$arr,
			'attcatArr'=>$attcatArr
		];
	}

	/**
	 * @method 修复包装方式数据
	 * @author zhengweihua 
	 * @copyright 2026-05-18
	 */
	public function fixPackStyle()
	{
		//获取所有没有包装pp_pack_style的包装方案数据
		$where = [
			'pp_pack_style'=>''
		];
		$allIds = $this->db->select('pro_pack','pp_id',$where);
		foreach ($allIds as $ppId) {
			$res = $this->db->select('pro_pack_material(ppm)',
				[	
					'[><]pack_material_brand(pmb)'=>['ppm.ppm_pmb_id'=>'pmb_id'],
					'[><]pack_material(pam)'=>['pmb.pmb_pam_id'=>'pam_id'],
					'[><]pack_type(pat)'=>['pam.pam_pat_id'=>'pat_id']
				],
				'pat_cn_name',['ppm_pp_id'=>$ppId,'GROUP'=>'pat_id','ORDER'=>['pat_code'=>'ASC']]);
				$pp_pack_style = implode('+',$res);
			if($pp_pack_style){
				$this->db->update('pro_pack',['pp_pack_style'=>$pp_pack_style],['pp_id'=>$ppId]);
			}
			
		}
		return true;
	}

}