<?php
namespace model\homepro;
use \model;
use model\oeModel;
use model\oeModelCN;
use model\pro\pro;
use model\oeNumidx;
use model\pro\numidx;
use phpDocumentor\Reflection\Types\Array_;

/**
 * Class cate
 * @author
 * @copyright
 */
class projectItem extends \model
{
    /**
     * @param  int $pr_id 项目id
     * @method 获取项目对应的国际车型
     * @author zhengweihua 
     * @copyright 2025-08-07
     */
    public function getMakeList($pr_id)
    {   
        $projectCfg=  [];
        if($pr_id && \mvc::$cfg['workProject'][$pr_id])
        {
            $projectCfg = \mvc::$cfg['workProject'][$pr_id]; 
        }
        if($projectCfg){
            $mkids = $this->db->select('tag_brand_make','tbm_mk_id',[
                'tbm_tb_id' => $projectCfg['tb_id'],
            ]);
            if($mkids){
				$where['mk_id'] = $mkids;
			}  
        } 
		$sql = "mk_id in (
			select distinct mm_mk_id from project_item 
		join oe_model_link on oml_oe_id = pi_oe_id 
		join m_model on oml_mm_id = mm_id
		where pi_oe_id > 0 and oml_mm_id > 0 
		union 
		select distinct mm_mk_id from project_item 
		join pro_model_link on pml_p_id = pi_p_id 
		join m_model on pml_mm_id = mm_id
		where pi_p_id > 0 and pml_mm_id > 0)";
		$where['RAW_mk_id'] = raw($sql);
        $mkArr = $this->db->select('m_make(mk)',['mk_id','mk_'.LG_NAME.'(mk_name)'],$where);

        return $mkArr;
    }

	/**
	 * @method 获取指定项目的中国车型
	 * @author zhengweihua 
	 * @copyright 2025-08-12
	 */
	public function getCnMakeList($pr_id)
	{
		$projectCfg=  [];
        if($pr_id && \mvc::$cfg['workProject'][$pr_id])
        {
            $projectCfg = \mvc::$cfg['workProject'][$pr_id]; 
        }
        if($projectCfg){
            $mkids = $this->db->select('tag_brand_cnbrand','tbm_brand_id',[
                'tbm_tb_id' => $projectCfg['tb_id'],
            ]);
            if($mkids)  $where['brand_id'] = $mkids;
        } 

		$where['ORDER'] = ['brand_initial'];
		$where['GROUP'] = 'brand_id';
        $mkArr = $this->db->select('m_cn_model(mcm)',['brand_id','brand_name'],$where);
        return $mkArr;
	}

    /**
     * @param  int $mkid
     * @method 根据品牌获取车系列表
     * @author zhengweihua 
     * @copyright 2025-08-07
     */
    public function getSeriesList($mkid)
    {
        $where = [];
        if($mkid){
            $where['ms_mk_id'] = $mkid;
        }
		//只取有数据的项
		$tsql = "select distinct mm_ms_id from project_item 
		join oe_model_link on oml_oe_id = pi_oe_id 
		join m_model on oml_mm_id = mm_id
		where pi_oe_id > 0 and oml_mm_id > 0";
		$tsql2 = "select distinct mm_ms_id from project_item 
		join pro_model_link on pml_p_id = pi_p_id 
		join m_model on pml_mm_id = mm_id
		where pi_p_id > 0 and pml_mm_id > 0";
		$where['RAW_ms_id'] = raw('ms_id in ('.$tsql.' UNION '.$tsql2.')');
        $seriesList = $this->db->select('m_series(ms)',[
            'ms_mk_id',
            'ms_id',
            'ms_name',
        ],$where);

        return $seriesList;
    }

	/**
	 * @param  array $params
	 * @method 项目列表
	 * @author zhengweihua 
	 * @copyright 2025-08-12
	 */
    public function getList($params)
    {   
        $page = $params['page']?:1;
        $pagesize = $_COOKIE['pagesize']?:10;

        $sidx = empty($params['sidx'])? '': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

       
        $where = [];
        $join = '';
        
        //优先pi_p_id =>pi_oe_id 关联的其他品牌=>pi_oe_id
		$table = 'project_item(pi)';
		$join = [
            "[>]pro_factory(fac)" => ["pi.pi_pf_id" => "pf_id"],
			"[>]pro_cate(cat)" => ["pi.pi_cat_id" => "id"],
			"[>]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			//关联零件
			"[>]oe_item(oe)" => ["pi.pi_oe_id" => "oe_id"],
			"[>]pro_factory(fac1)"=>["oe.oe_pf_id"=>"pf_id"],
			//关联商品
			"[>]pro(p)"=>['pi.pi_p_id'=>'p_id'],
			"[>]pro_factory(fac2)"=>["p.p_pf_id"=>"pf_id"],

			//主供应商的零件供应商信息
			// "[>]supplier_pro(spr)" => ["pi.pi_oe_id" => "spr_oe_id", "pi.pi_sup_id" => 'spr_sup_id'],
		];

		$workProject = [];
		if($params['pr_id'])
		{
			$prId = $params['pr_id'];
			$workProject = \mvc::$cfg['workProject'][$prId]??[];
		}

		//是否是发动机相关的搜索
		$engineSearch = false;
        foreach ($params as $field => $val) {
			if($field!='status' && empty($val)) continue;
            switch ($field) {
                case 'status':
					if(is_numeric($val)) $where['pi.pi_status'] = $val;
                    
                    break;
                case 'proname':
                    $where['RAW #proname'] = raw(" (p.p_".cateName()." LIKE '%".$val."%' OR oe.oe_".cateName()." LIKE '%".$val."%')");
                    break;
                case 'engine':
					$engineSearch = $val;
					$owhere = '';
					$mkArr = $this->getMakeList($params['pr_id']);
					if($mkArr){
						$mk_id = array_column($mkArr,'mk_id');
						$owhere = sprintf(" AND mm_mk_id IN (%s)",implode(',', $mk_id));
					}
					$owhere1 = '';
					$brandArr = $this->getCnMakeList($params['pr_id']);
					if($brandArr){
						$owhere1 =sprintf(" AND brand_id IN (%s)",implode(',',array_unique(array_column($brandArr,'brand_id'))));
					} 

                    $orArr = [
                        "p.p_engine LIKE '%{$val}%'",
                        "oe.oe_engine LIKE '%{$val}%'",
                    ];
					//找零件的中国车型/国际车型中包含指定发动机的部分
                    $sql1 = sprintf("SELECT oml_oe_id 
                    FROM oe_item oe
                    join oe_model_link  oml on oe.oe_id = oml.oml_oe_id
					join m_model mm on  oml.oml_mm_id =mm.mm_id 
                    where FIND_IN_SET('%s', mm.mm_engine) > 0 %s
					UNION 
					SELECT oml_oe_id FROM  oe_item oe1
					JOIN oe_model_cn_link omcl ON oe1.oe_id = omcl.oml_oe_id
					JOIN m_cn_model mcm ON omcl.oml_mod3_id = mcm.mod3_id
					where FIND_IN_SET('%s', mcm.mod3_engine) > 0 %s",$val,$owhere,$val,$owhere1);
                    $oeIds = $this->db->query($sql1)->fetchAll(\PDO::FETCH_COLUMN);
                    if($oeIds)
                    {
                        $orArr[] = "oe.oe_id IN (".implode(',', $oeIds).")";
                        $pIds = $this->db->select('pro','p_id',['p_oe_id'=>$oeIds,'GROUP'=>'p_id']);
                        $orArr[] = $pIds? "p.p_id IN (".implode(',', $pIds).")":'1=0';
                    }
                    $where['RAW #engine'] = raw('('.implode(' OR ', $orArr).')');
                    break;
                case 'mk_id':
                    
                    $sql1 = sprintf("SELECT DISTINCT oml_oe_id 
                    FROM oe_item oe
                    join oe_model_link  oml on oe.oe_id = oml.oml_oe_id
					join m_model mm on  oml.oml_mm_id =mm.mm_id 
                    where mm_mk_id =%d",$val);
                    $oeIds = $this->db->query($sql1)->fetchAll(\PDO::FETCH_COLUMN);
                    $orArr = [];
                    if($oeIds)
                    {
                        $orArr[] = "oe.oe_id IN (".implode(',', $oeIds).")";
                        $pIds = $this->db->select('pro','p_id',['p_oe_id'=>$oeIds,'GROUP'=>'p_id']);
                        $orArr[] = $pIds? "p.p_id IN (".implode(',', $pIds).")":'1=0';
                    }
                    if($orArr) {
                        $where['RAW #mk_id'] = raw('('.implode(' OR ', $orArr).')');
                    }else {
                        $where['RAW #mk_id'] = raw('1=0');
                    }
                    break;
                case 'ms_id':
                  	$owhere = '';
                    $sql1 = sprintf("SELECT DISTINCT oml_oe_id 
                    FROM oe_item oe
                    join oe_model_link  oml on oe.oe_id = oml.oml_oe_id
					join m_model mm on  oml.oml_mm_id =mm.mm_id 
                    where mm_ms_id =%d %s",$val,$owhere);
                    $oeIds = $this->db->query($sql1)->fetchAll(\PDO::FETCH_COLUMN);
                    $orArr = [];
                    if($oeIds)
                    {
                        $orArr[] = "oe.oe_id IN (".implode(',', $oeIds).")";
                        $pIds = $this->db->select('pro','p_id',['p_oe_id'=>$oeIds,'GROUP'=>'p_id']);
                        $orArr[] = $pIds? "p.p_id IN (".implode(',', $pIds).")":'1=0';
                    }
                    if($orArr) {
                        $where['RAW #ms_id'] = raw('('.implode(' OR ', $orArr).')');
                    }else{
                        $where['RAW #ms_id'] = raw('1=0');
                    }
                    break;
				case 'cate':
					$ids = explode(',',$val);
					if($ids){
						$where['pi_cat_id'] = $ids;
						//判断搜索的分类中是否存在发动机相关属性
						$engineSearch = $this->db->get('pro_cate','id',['id'=>$ids,'is_engine'=>1]);
						$engineSearch = $engineSearch? true: false;
					} 
					
					break;
            }
        }
        
		if(!empty($params['keys'])) $where['pi_id'] = explode(',', $params['keys']);
		if(!empty($params['pi_id'])) $where['pi_id'] = $params['pi_id'];
		if(!empty($params['pr_id'])) $where['pi_pr_id'] = $params['pr_id'];

		if(empty($where['ORDER']))$where['ORDER'] = ['pi_id'=>'DESC'];

		
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}

		if($params['number']){

            $params['number'] = strtr($params['number'],['，'=>',',';'=>',','；'=>',',"\n"=>',']);
			$numberArr = explode(',',$params['number']);
			$tnums = [];
			foreach($numberArr as $tk=>$tv){
				$tnums = array_merge($tnums, reSearchNum($tv));
			}
			$tnums = array_unique($tnums);
			$join['[>]oe_numidx(on)']=['pi.pi_oe_id'=>'on_oe_id'];
			$join['[>]pro_numidx(pn)']=['pi.pi_p_id'=>'pn_p_id'];
			$where['OR']= [
				"pi_format[~]" => $tnums,	
				"on_formart[~]" => $tnums,	
				"pn_formart[~]" => $tnums,	
			];
			$where['GROUP'] = 'pi.pi_id';
		}
		
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0 && !$params['export']){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$fields = ['pi.*','fac.pf_name(pi_pf_name)','pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)',
		'cat.cat_pos1','cat.cat_pos2','cat.cat_pos3','cat.cat_pos4','cat.cat_pos5',
		
		'oe_oe','fac1.pf_name(oe_pf_name)','oe.oe_'.cateName().'(oe_name)','oe.oe_pos1','oe.oe_pos2','oe.oe_pos3','oe.oe_pos4','oe.oe_pos5',
		
		'p_oe','fac2.pf_name(p_pf_name)','p.p_'.LG_NAME.'(p_name)','p.p_innum','p.p_pos1','p.p_pos2','p.p_pos3','p.p_pos4','p.p_pos5','p.p_oe_id','p.p_state_main',
		// 'spr.spr_minbuy','spr.spr_delivery','spr.spr_price','spr.spr_price4',
		'last_status_change_time'=>raw('(SELECT pis_change_time FROM project_item_status WHERE pis_pi_id = pi.pi_id AND pi.pi_status!=0 ORDER BY pis_id DESC LIMIT 1)')];
		
		$arr = $this->db->select($table,$join,$fields,$where);
		if(!empty($arr))
		{
			$supnameField = \p::has('C500','view')? 'sup_name': 'sup_code(sup_name)';
			//主图 - 同时处理商品和零件图片
			$picArr = [];
			//供应商
			$supplierArr = [];

			$pidArr = array_filter(array_unique(array_column($arr,'pi_p_id')));
			$oeidArr =array_filter(array_unique(array_column($arr,'pi_oe_id')));
			$paramArr = [];
			if($pidArr)
			{   
				//查询商品图片
				$picRes = $this->db->select('pro_pic',['[><]files'=>['pic_fileid'=>'fileid']],'*',['pic_p_id'=>$pidArr,'pic_type'=>'img']);
				foreach ($picRes as $pic) {
					if($pic['pic_ismain']|| !$picArr['p_'.$pic['pic_p_id']]){
						$picArr['p_'.$pic['pic_p_id']]['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
						$picArr['p_'.$pic['pic_p_id']]['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
					}
				}
				// //查商品供应商
				// $supRes = $this->db->select('pro_supplier(psu)',['[><]supplier(sup)'=>['psu.psu_sup_id'=>'sup_id']],['psu_p_id','psu_sup_id',$supnameField],['psu_p_id'=>$pidArr]);
				// foreach ($supRes as $sup) {
				// 	$supplierArr['p_'.$sup['psu_p_id']] = $sup['sup_name'];
				// }

				//取参数

				$fields = ['ppv_p_id', 'ptpa_id', 'ptpa_type', 'ptpa_unit', 'ptpa_decimal', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string', 'ptpa_col_order'];
				$fields = langSqlFields($fields, 'pa.', 'ptpa_', true);
				$fields = langSqlFields($fields, 'pps.', 'ppv_val_', true);
				$fields = langSqlFields($fields, 'ppsu.', 'ptpa_unit_', true);
				$sqltpl =sprintf("SELECT ".implode(',', $fields)."  FROM `pro_param_val` pv
				JOIN part_param pa ON ptpa_id = ppv_ptpa_id
				LEFT JOIN part_param_sche pps ON ((pps.pps_ptpa_id = ptpa_id AND ppv_val_string = pps.cn_name) or (pps.pps_ptpa_id = ptpa_pid and pps_id = ppv_val_int))
				LEFT JOIN part_param_sche ppsu ON ppsu.pps_ptpa_id = 0 and ptpa_unit = ppsu.cn_name
				WHERE ppv_p_id IN (%s) ORDER BY ptpa_pid DESC,ptpa_id ASC",implode(',',$pidArr));
				$rows = $this->db->query($sqltpl)->fetchAll();

				foreach($rows as $row){
            
					if($row['ppv_val_int']){
						$row['ppv_val'] = $row['ppv_val_'.LG_NAME].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit']);
						$paramArr['p_'.$row['ppv_p_id']][] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val']];
						continue;
					}
					if($row['ptpa_type']=='string'){
						$row['ppv_val'] = $row['ppv_val_'.LG_NAME];
					}elseif($row['ptpa_type']=='double'){
						$row['ppv_val'] = floatval(number_format($row['ppv_val_double'], $row['ptpa_decimal'],".",""));
					}
					$paramArr['p_'.$row['ppv_p_id']][] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val'].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit'])];
				}

			}
			
			if($oeidArr)
			{
				//查询零件图片
				$picRes = $this->db->select('oe_pic',['[><]files'=>['pic_fileid'=>'fileid']],'*',['pic_oe_id'=>$oeidArr,'pic_type'=>'img']);
				foreach ($picRes as $pic) {
					if($pic['pic_ismain']||!$picArr['oe_'.$pic['pic_oe_id']]){
						$picArr['oe_'.$pic['pic_oe_id']]['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
						$picArr['oe_'.$pic['pic_oe_id']]['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
					}
				}
				//查零件供应商
				$supRes = $this->db->select('supplier_pro(spr)',['[><]supplier(sup)'=>['spr.spr_sup_id'=>'sup_id']],['spr_oe_id','spr_sup_id',$supnameField],['spr_oe_id'=>$oeidArr]);
				foreach ($supRes as $sup) {
					$supplierArr['oe_'.$sup['spr_oe_id']] = $sup['sup_name'];
				}

				//查零件参数
				$fields = ['ppv_oe_id', 'ptpa_id', 'ptpa_type', 'ptpa_unit', 'ptpa_decimal', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string', 'ptpa_col_order'];
				$fields = langSqlFields($fields, 'pa.', 'ptpa_', true);
				$fields = langSqlFields($fields, 'pps.', 'ppv_val_', true);
				$fields = langSqlFields($fields, 'ppsu.', 'ptpa_unit_', true);
				$sqltpl =sprintf("SELECT ".implode(',', $fields)."  FROM `oe_param_val` ov
				JOIN part_param pa ON ptpa_id = ppv_ptpa_id
				LEFT JOIN part_param_sche pps ON ((pps.pps_ptpa_id = ptpa_id AND ppv_val_string = pps.cn_name) or (pps.pps_ptpa_id = ptpa_pid and pps_id = ppv_val_int))
				LEFT JOIN part_param_sche ppsu ON ppsu.pps_ptpa_id = 0 and ptpa_unit = ppsu.cn_name
				WHERE ppv_oe_id IN (%s) ORDER BY ptpa_pid DESC,ptpa_id ASC",implode(',',$oeidArr));
				$rows = $this->db->query($sqltpl)->fetchAll();
				foreach($rows as $row){
					if($row['ppv_val_int']){
						$row['ppv_val'] = $row['ppv_val_'.LG_NAME].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit']);
						$paramArr['oe_'.$row['ppv_oe_id']][] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val']];
						continue;
					}
					if($row['ptpa_type']=='string'){
						$row['ppv_val'] = $row['ppv_val_'.LG_NAME];
					}elseif($row['ptpa_type']=='double'){
						$row['ppv_val'] = floatval(number_format($row['ppv_val_double'], $row['ptpa_decimal'],".",""));
					}
					$paramArr['oe_'.$row['ppv_oe_id']][] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val'].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit'])];
				}
				
				//查其他品牌的商品
				//只取FGIO
				$where = ['p_oe_id'=>$oeidArr,'p_pb_id'=>1];
				$join = [
					'[><]pro_brand(pb)'=>['pro.p_pb_id'=>'pb_id'],
					'[><]pro_cate(cat)' => ['p_cate' => 'id'],
				];
				$res = $this->db->select('pro',$join,['p_id','p_state_main','p_oe','p_innum','p_'.LG_NAME.'(p_name)','p_oe_id','pb_'.LG_NAME.'(pb_name)','cat.'.cateName().'(cat_name)','p_pos1','p_pos2','p_pos3','p_pos4','p_pos5'],$where);	
				if($res){
					$linkPidArr = array_column($res,'p_id');
					//取其它品牌的图片
					$linkPicArr = [];
					$picRes = $this->db->select('pro_pic',['[><]files'=>['pic_fileid'=>'fileid']],'*',['pic_p_id'=>$linkPidArr,'pic_type'=>'img']);
					foreach ($picRes as $pic) {
						if($pic['pic_ismain']|| !$linkPicArr['p_'.$pic['pic_p_id']]){
							$linkPicArr['p_'.$pic['pic_p_id']]['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
							$linkPicArr['p_'.$pic['pic_p_id']]['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
						}
					}
					foreach ($res as $v) {
						$pbProArr[$v['p_oe_id']] =$v;
						$pbProArr[$v['p_oe_id']]['pic'] = $linkPicArr['p_'.$v['p_id']] ?? [];
					}
					//取其它品牌的参数
					$fields = ['ppv_p_id', 'ptpa_id', 'ptpa_type', 'ptpa_unit', 'ptpa_decimal', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string', 'ptpa_col_order'];
					$fields = langSqlFields($fields, 'pa.', 'ptpa_', true);
					$fields = langSqlFields($fields, 'pps.', 'ppv_val_', true);
					$fields = langSqlFields($fields, 'ppsu.', 'ptpa_unit_', true);
					$sqltpl =sprintf("SELECT ".implode(',', $fields)."  FROM `pro_param_val` pv
					JOIN part_param pa ON ptpa_id = ppv_ptpa_id
					LEFT JOIN part_param_sche pps ON ((pps.pps_ptpa_id = ptpa_id AND ppv_val_string = pps.cn_name) or (pps.pps_ptpa_id = ptpa_pid and pps_id = ppv_val_int))
					LEFT JOIN part_param_sche ppsu ON ppsu.pps_ptpa_id = 0 and ptpa_unit = ppsu.cn_name
					WHERE ppv_p_id IN (%s) ORDER BY ptpa_pid DESC,ptpa_id ASC",implode(',',$linkPidArr));
					$rows = $this->db->query($sqltpl)->fetchAll();

					foreach($rows as $row){
				
						if($row['ppv_val_int']){
							$row['ppv_val'] = $row['ppv_val_'.LG_NAME].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit']);
							$paramArr['p_'.$row['ppv_p_id']][] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val']];
							continue;
						}
						if($row['ptpa_type']=='string'){
							$row['ppv_val'] = $row['ppv_val_'.LG_NAME];
						}elseif($row['ptpa_type']=='double'){
							$row['ppv_val'] = floatval(number_format($row['ppv_val_double'], $row['ptpa_decimal'],".",""));
						}
						$paramArr['p_'.$row['ppv_p_id']][] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val'].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit'])];
					}
				}

				//查下单的零件供应商
				$join = [
					'[><]supplier_pro(spr)'=>['pru.pru_sup_id'=>'spr_sup_id'],
				];
				$field = ['pru_pi_id','spr_oe_id','spr.spr_minbuy','spr.spr_delivery','spr.spr_price','spr.spr_price4'];
				$where = ['spr_oe_id'=>$oeidArr,'pru_type'=>3];
				$res = $this->db->select('project_supplier(pru)',$join,$field,$where);
				$supplierPrice = [];
				//取配置的价格比例
				$price_rate = $workProject['price_rate'] ?? 1;
				$price2_rate = $workProject['price2_rate'] ?? 1;

				foreach ($res as $key => $item) {
					$supplierPrice[$item['pru_pi_id']][$item['spr_oe_id']]['cost_price'] = $item['spr_price']?$item['spr_price'] * $price_rate:'';
					$supplierPrice[$item['pru_pi_id']][$item['spr_oe_id']]['sale_price'] = $item['spr_price4']?$item['spr_price4'] * $price2_rate:'';
					$supplierPrice[$item['pru_pi_id']][$item['spr_oe_id']]['minbuy'] = $item['spr_minbuy']?:'';
					$supplierPrice[$item['pru_pi_id']][$item['spr_oe_id']]['delivery'] = $item['spr_delivery']?:'';
				}
			}
			
			$allPos = (new \model\pro\pro())->allPos;

			
       
			$sampleStatusDescArr = ['-1'=>'无样品','1'=>'采样中','2'=>'已有'];
			$statusDescArr = ['-1'=>'无法供应',0=>'待处理', 1=>'开发中',2=>'可供应',3=>'商品'];
			$mainStateArr = ['01'=>'开发中','02'=>'国内不做外贸订做','03'=>'上市','04'=>'退市','99'=>'删除','05'=>'升级中','06'=>'可研发生产','07'=>'新品在途可预定'];
			foreach ($arr as $key => &$val) 
			{	
				//位置参数
				$paramArr2 = [];
				$val['pic'] = [];
				$val['item_url'] = 'javascript:void(0);';

				$val['sale_price'] = '';
				$val['cost_price'] = '';
				$val['minbuy'] ='';
				$val['delivery'] = '';
				//根据pi_p_id或pi_oe_id获取对应图片
				if($val['pi_p_id'] )
				{
					// $val['pic'] = $picArr['p_'.$val['pi_p_id']]??[];
					$val['p_name'] = $val['p_name'] ?: '';
					$val['sup_name'] = $supplierArr['p_'.$val['pi_p_id']] ?? '';
					$val['item_url'] = \mvc::$cfg['SELF_URI'].'index/item?id='.$val['pi_p_id'].'&type=pro&pr_id='.$val['pi_pr_id'].'&pi_id='.$val['pi_id'];

					//如果没有关联零件，则用商品关联的零件取车型信息
					if(!$val['pi_oe_id']) $val['pi_oe_id'] = $val['p_oe_id'];
					//位置参数
					foreach ($allPos as $pos => $v) {
						if($val['cat_'.$pos] && $val['p_'.$pos]) {
							$pos = array_intersect(explode('/',$val['p_'.$pos]),explode(',',$val['cat_'.$pos]));
							if($pos) $paramArr2[] = ['name'=>$v['name'],'value'=>implode('/',$pos)];
						}
					}
				}
				else if($val['pi_oe_id'])
				{
					//如果存在零件关联的其它品牌
					if($pbProArr[$val['pi_oe_id']])
					{	
						$linkItem = $pbProArr[$val['pi_oe_id']];
						$val = array_merge($val,$linkItem);
						$val['item_url'] = \mvc::$cfg['SELF_URI'].'index/item?id='.$linkItem['p_id'].'&type=pro&pr_id='.$val['pi_pr_id'].'&pi_id='.$val['pi_id'];
						
						//关联FGIO的位置参数
						foreach ($allPos as $pos => $v) {
							if($val['cat_'.$pos] && $val['p_'.$pos]) {
								$pos = array_intersect(explode('/',$val['p_'.$pos]),explode(',',$val['cat_'.$pos]));
								if($pos) $paramArr2[] = ['name'=>$v['name'],'value'=>implode('/',$pos)];
							}
						}
	
					}
					else
					{
						$val['p_name'] = $val['oe_name'] ?: '';
						$val['sup_name'] = $supplierArr['oe_'.$val['pi_oe_id']] ?? '';
						$val['item_url'] = \mvc::$cfg['SELF_URI'].'index/item?id='.$val['pi_oe_id'].'&type=oe&pr_id='.$val['pi_pr_id'].'&pi_id='.$val['pi_id'];
						
						//零件的位置参数
						foreach ($allPos as $pos => $v) {
							if($val['cat_'.$pos] && $val['oe_'.$pos]) {
								$pos = array_intersect(explode('/',$val['oe_'.$pos]),explode(',',$val['cat_'.$pos]));
								if($pos) $paramArr2[] = ['name'=>$v['name'],'value'=>implode('/',$pos)];
							}
						}
					}
				}
				$val = array_merge($val,$supplierPrice[$val['pi_id']][$val['pi_oe_id']]??[]);
				$val['param'] = array_merge($paramArr2,($paramArr['p_'.$val['pi_p_id']]??($paramArr['p_'.$val['p_id']]??$paramArr['oe_'.$val['pi_oe_id']]??[])));
				$val['show_oe'] = $val['pi_number'];
				$val['pic'] = $picArr['p_'.$val['pi_p_id']]??($linkPicArr['p_'.$val['p_id']]??$picArr['oe_'.$val['pi_oe_id']]??[]);

				if($val['last_status_change_time']){
					$val['last_status_change_time'] = date('Y-m-d',strtotime($val['last_status_change_time']));
				}

				$val['model'] = $this->getPrjItemModel($val['pi_oe_id'],$val['pi_pr_id'],$engineSearch);
				$val['cnmodel'] = $this->getPrjItemCnModel($val['pi_oe_id'],$val['pi_pr_id'],$engineSearch);
				$val['union_model_series'] = [];
				// 获取国际和国内车系不重复的集合
				$modelData = is_array($val['model']) ? $val['model'] : [];
				$cnmodelData = is_array($val['cnmodel']) ? $val['cnmodel'] : [];
				$maxCount = max(count($modelData), count($cnmodelData));
				
				if ($maxCount > 0) {
					$modelValues = array_values($modelData);
					$cnmodelValues = array_values($cnmodelData);
					
					for($i = 0; $i < $maxCount; $i++){
						$modelSeries = isset($modelValues[$i]['uniSeries']) && is_array($modelValues[$i]['uniSeries']) ? $modelValues[$i]['uniSeries'] : [];
						$cnmodelSeries = isset($cnmodelValues[$i]['uniSeries']) && is_array($cnmodelValues[$i]['uniSeries']) ? $cnmodelValues[$i]['uniSeries'] : [];
						$unionSeriesTemp = array_merge($modelSeries, $cnmodelSeries);
						
						$val['union_model_series'][$i]['unionSeries'] = implode(',', $unionSeriesTemp);
						$val['union_model_series'][$i]['modelKey'] = !empty($modelData) ? key($modelData) : '';
						$val['union_model_series'][$i]['cnmodelKey'] = !empty($cnmodelData) ? key($cnmodelData) : '';
					}
				}
				$val['captions'] = [
					'pi_sample_status'=>$sampleStatusDescArr[$val['pi_sample_status']],
					'pi_status'=>$statusDescArr[$val['pi_status']] . ($val['p_state_main']!='00' && $mainStateArr[$val['p_state_main']] ?'('.$mainStateArr[$val['p_state_main']].')':''),
					'pi_opuser'=>$val['au_name']
				];
			}
			unset($val);
		}

		if($params['export']) $this->export($arr);
        return  [
            'page'=>$page,
            'pagesize'=>$pagesize,
            'recordCount'=>$pages['records'],
            'list'=>$arr?:[]
        ];
    }

	/**
	 * @param  int $oe_id
	 * @method 获取指定oe的国际车型列表
	 * @author zhengweihua 
	 * @copyright 2025-08-12
	 */
	public function getPrjItemModel($oe_id,$pr_id = 0,$engineSearch = null)
	{	
		if(!$oe_id) return [];
		$join = [
			"[><]m_model(mm)" => ["oml.oml_mm_id" => "mm_id"],
			"[><]m_series(ms)" => ["mm.mm_ms_id" => "ms_id"],
			"[><]m_make(mk)"=> ["mm.mm_mk_id" => "mk_id"],
		];
		$where = [
			"oml.oml_oe_id" => $oe_id,
			"ORDER" => ["mk_".LG_NAME,'ms_name'],
		];
		if(is_string($engineSearch)){
			$where['mm.mm_engine[~]'] = $engineSearch;
		}
		if($pr_id>0){
			$mkArr = $this->getMakeList($pr_id);
			if($mkArr) $mk_id = array_column($mkArr,'mk_id');
			$where["mk_id"] = $mk_id;
		}
		$modelData = $this->db->select('oe_model_link(oml)',$join,['mk_'.LG_NAME.'(mk_name)','ms_name','mm_engine'],$where);

		$modelArr = [];
		foreach ($modelData as $key => $row) {
			if($engineSearch && $row['mm_engine']){
				$modelArr[$row['mk_name']][$row['mm_engine']] = $row['mm_engine'];
				continue;
			}
			if(!empty($row['mm_year_from']) && !empty($row['mm_month_from'])){
				$row['year_from'] = $row['mm_year_from'].$row['mm_month_from'];
			}else if(!empty($row['mm_year_from'])){
				$row['year_from'] = $row['mm_year_from'];
			}else{
				$row['year_from'] = 0;
			}
			if(!empty($row['mm_year_to']) && !empty($row['mm_month_to'])){
				$row['year_to'] = $row['mm_year_to'].$row['mm_month_to'];
			}else if(!empty($row['mm_year_to'])){
				$row['year_to'] = $row['mm_year_to'];
			}else{
				$row['year_to'] = 0;
			}
			$modelArr[$row['mk_name']][$row['ms_name']][] = $row;
		}
		// 国际车型头部内容综合
		if(!$engineSearch){
				foreach($modelArr as $k=>$v){
				$modelArr[$k]['uniSeries'] = $this->getUniSeries($v);
			}
		}
		return $modelArr;

	}

	public function getPrjItemCnModel($oe_id,$pr_id = 0,$engineSearch = null)
	{
		if(!$oe_id) return [];
		$join = [
			"[><]m_cn_model(mod3)" => ["oml.oml_mod3_id" => "mod3_id"],
		];
		$where = [
			"oml.oml_oe_id" => $oe_id,
			"ORDER" => ["brand_initial","brand_name","make_name","mod1_name","mod2_name","mod2_start_year","mod3_name","mod3_start_year"]
		];
		if(is_string($engineSearch)){
			$where['mod3_engine[~]'] = $engineSearch;
		}
		if($pr_id>0){
			$brandArr = $this->getCnMakeList($pr_id);
			if($brandArr) $where["brand_id"] = array_unique(array_column($brandArr,'brand_id'));
		}
		$modelData = $this->db->select('oe_model_cn_link(oml)',$join,['mod3.*'],$where);
		
		foreach ($modelData as $key => $row) {
			if($engineSearch && $row['mod3_engine']){
				$cnmodelArr[$row['brand_name']][$row['mod3_engine']] = $row['mod3_engine'];
				continue;
			}
			$cnmodelArr[$row['brand_name']][$row['brand_name'].' '.$row['mod2_name']] = $row['brand_name'].$row['mod2_name'];
			
			// 综合不重复的车系信息
			if(!$engineSearch && !in_array($row['mod1_name'], (Array)$cnmodelArr[$row['brand_name']]['uniSeries'])){
				$cnmodelArr[$row['brand_name']]['uniSeries'][] = $row['mod1_name'];
			}
		}
		return $cnmodelArr;
	}

	
	/**
	 * @param  int $p_id
	 * @method 获取商品信息
	 * @author zhengweihua 
	 * @copyright 2025-08-12
	 */
    public function getProInfo($p_id,$params = [])
    {
        $item = [];
		
		$table = 'pro(p)';
		$join = [
			"[><]pro_cate(cat)" => ["p.p_cate" => "id"],
			"[>]pro_factory(fac)" => ["p.p_pf_id" => "pf_id"],
			"[>]pro_brand(pb)" => ["p.p_pb_id" => "pb_id"],
			// "[>]project_item(pi)" => ["p.p_id" => "pi_p_id"],
		];

		$fields = ['cat.id(cat_id)', 'cat.cat_pos1','cat.cat_pos2','cat.cat_pos3','cat.cat_pos4','cat.cat_pos5','cat.'.cateName().'(cat_name)', 'cat.cn_name(cat_name_cn)','cat.en_name(cat_name_en)', 'p.*','fac.pf_name','pb.pb_'.LG_NAME.'(pb_name)'];
		$where = ['p_id'=>$p_id];
		$base = $this->db->get($table,$join,$fields,$where);
		$base['pro_name'] = $base['p_'.LG_NAME];
		$base['main_oe'] = $base['p_oe'];
		$base['main_oe_format'] = $base['p_oe_format'];
		$base['imgs'] = [];
		$join = ["[><]files"=>["pic_fileid"=>'fileid']];
		$picrows = $this->db->select('pro_pic',$join,'*',['pic_p_id'=>$p_id,'ORDER'=>['pic_ismain'=>'DESC','pic_type'=>'img','pic_sort'=>'ASC']]);
		foreach ($picrows as  $pic) {
			$pic['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
			$pic['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
			$base['imgs'][] = $pic;
		}
		$base['type']='pro';
		$base['id']=$p_id;
		if($params['pi_id']){
			$piarr = $this->db->get('project_item',['pi_number','pi_format'],['pi_id'=>$params['pi_id']]);	
			$base = array_merge($base,$piarr);
		}
		$allPos = (new pro())->allPos;
        $paramArr2 = [];
        foreach ($allPos as $pos => $v) {
            if($base['cat_'.$pos] && $base['p_'.$pos]) {
                $pos = array_intersect(explode('/',$base['p_'.$pos]),explode(',',$base['cat_'.$pos]));
                if($pos) $paramArr2[] = ['name'=>$v['name'],'value'=>implode('/',$pos)];
            }
        }

        //查参数
        $paramArr = [];

        //参数
        $fields = ['ppv_p_id', 'ptpa_id', 'ptpa_type', 'ptpa_unit', 'ptpa_decimal', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string', 'ptpa_col_order'];
        $fields = langSqlFields($fields, 'pa.', 'ptpa_', true);
        $fields = langSqlFields($fields, 'pps.', 'ppv_val_', true);
        $fields = langSqlFields($fields, 'ppsu.', 'ptpa_unit_', true);
        $sqltpl =sprintf("SELECT ".implode(',', $fields)."  FROM `pro_param_val` pv
        JOIN part_param pa ON ptpa_id = ppv_ptpa_id
        LEFT JOIN part_param_sche pps ON ((pps.pps_ptpa_id = ptpa_id AND ppv_val_string = pps.cn_name) or (pps.pps_ptpa_id = ptpa_pid and pps_id = ppv_val_int))
        LEFT JOIN part_param_sche ppsu ON ppsu.pps_ptpa_id = 0 and ptpa_unit = ppsu.cn_name
        WHERE ppv_p_id=%d ORDER BY ptpa_pid DESC,ptpa_id ASC",$p_id);
        $rows = $this->db->query($sqltpl)->fetchAll();
		foreach($rows as $row){
            
            if($row['ppv_val_int']){
                $row['ppv_val'] = $row['ppv_val_'.LG_NAME].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit']);
                $paramArr[] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val']];
                continue;
            }
            if($row['ptpa_type']=='string'){
                $row['ppv_val'] = $row['ppv_val_'.LG_NAME];
            }elseif($row['ptpa_type']=='double'){
                $row['ppv_val'] = floatval(number_format($row['ppv_val_double'], $row['ptpa_decimal'],".",""));
            }
            $paramArr[] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val'].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit'])];
        }
        $item['param']  = array_merge($paramArr2,$paramArr??[]);
        //取主图
        $join = [
            "[><]files(file)"=>["pic.pic_fileid"=>"fileid"]
        ];
        $pic = $this->db->get('pro_pic(pic)',$join,'*',['pic_p_id'=>$p_id,'pic_ismain'=>1,'pic_type'=>'img']);
        if($pic){
            $item['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
            $item['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
        }
		//通过关联的oe_id获取车型和中国车型
		
		$cnmodelWhere = ['oe_id'=>$base['p_oe_id'],'orderby'=>'brand_initial,brand_name,make_name,mod1_name,mod2_name,mod2_start_year,mod3_name,mod3_start_year'];
		$modelWhere = ['oe_id'=>$base['p_oe_id'],'orderby'=>'mk_'.LG_NAME.',ms_name,mm_name'];
		if($params['pr_id'])
		{
			//限定中国车型取项目指定品牌
			$brandArr = $this->getCnMakeList($params['pr_id']);
			if($brandArr) {
				$cnmodelWhere['brand_id'] = array_unique(array_column($brandArr,'brand_id'));
			}
			//限定国际车型取项目指定品牌
			$mkArr = $this->getMakeList($params['pr_id']);
			if($mkArr){
				$modelWhere['mk_id'] = array_column($mkArr,'mk_id');
			}  
			//
			$projectCfg=  [];
			if(\mvc::$cfg['workProject'][$params['pr_id']])
			{
				$projectCfg = \mvc::$cfg['workProject'][$params['pr_id']]; 
			}
			$onlyTbid = $projectCfg['tb_id']?:0;
		}
		if($base['p_oe_id'])
		{
			//查中国车型   
			$oeModelCN = new oeModelCN();
			$cnmodelData = $oeModelCN->getModelList($cnmodelWhere);
			$cnmodelArr = [];
			foreach ($cnmodelData['rows'] as $key => $row) {
				
				$cnmodelArr[$row['brand_name']][$row['make_name'].$row['mod2_name']][] = $row;
			}
			$item['cnmodel'] = $cnmodelArr;
			//车型
			$oeModel = new oeModel();
			$modelData = $oeModel->getModelList($modelWhere);
			
			$modelArr = [];
			foreach ($modelData['rows'] as $key => $row) {
				
				$modelArr[$row['mk_name']][$row['ms_name']][] = $row;
			}
			$item['model'] = $modelArr;
		}
		
        //找对应的厂商和品牌
		$join = [
			'[><]pro_factory(fac)'=>['pn_pf_id'=>'pf_id'],
			'[>]pro_numidx_tag_brand(pntb)'=>['pn_id'=>'pntb_pn_id'],
			'[>]tag_brand(tb)'=>['pntb.pntb_tb_id'=>'tb_id']
		];
		$where = ['pn_p_id'=>$p_id];
		if($onlyTbid) $where['pntb_tb_id'] = $onlyTbid;
		$item['numData'] = $this->db->select('pro_numidx',$join,['pn_p_id','pn_number','fac.pf_name','tb_'.LG_NAME.'(tb_name)'],$where);
        $item = array_merge($base,$item);
        return $item;
    }

	/**
	 * @param  int $oe_id
	 * @method 获取零件信息
	 * @author zhengweihua 
	 * @copyright 2025-08-12
	 */
    public function getOeInfo($oe_id,$params = [])
    {   
        $item = [];

		$table = 'oe_item(oi)';
		$join = [
			"[><]pro_factory(pf)" => ["oi.oe_pf_id" => "pf_id"],
			"[><]pro_cate(cat)" => ["oi.oe_cate_id" => "id"],

		];	
		if($params['isRecommend'] == 'Y'){
			$fields = ['cat.id(cat_id)', 'cat.cat_pos1','cat.cat_pos2','cat.cat_pos3','cat.cat_pos4','cat.cat_pos5','cat.'.cateName().'(cat_name)', 'pf.pf_name', 'oi.*','oi.oe_'.cateName().'(oe_name)'];
		}else{
			$fields = ['cat.id(cat_id)', 'cat.cat_pos1','cat.cat_pos2','cat.cat_pos3','cat.cat_pos4','cat.cat_pos5','cat.'.cateName().'(cat_name)', 'pf.pf_name', 'oi.*','oi.oe_'.cateName().'(oe_name)'];
		}
		$where = ['oe_id'=>$oe_id];
		$base = $this->db->get($table,$join,$fields,$where);
		$base['pro_name'] = $base['oe_'.LG_NAME];
		$base['main_oe'] = $base['oe_oe'];
		$base['main_oe_format'] = $base['oe_oe_format'];
		$base['imgs'] = [];
		$join = ["[><]files"=>["pic_fileid"=>'fileid'],"[>]supplier"=>["pic_sup_id"=>"sup_id"]];
		$picrows = $this->db->select('oe_pic',$join,'*',['pic_oe_id'=>$oe_id,'ORDER'=>['pic_ismain'=>'DESC','pic_type'=>'img', 'pic_sort'=>'ASC']]);
		foreach ($picrows as  $pic) {
			$pic['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
			$pic['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
			$base['imgs'][] = $pic;
		}
		$base['type']='oe';
		$base['id']=$oe_id;
		//获取项目信息
		if($params['pi_id']){
			$piarr = $this->db->get('project_item',['pi_number','pi_format'],['pi_id'=>$params['pi_id']]);	
			$base = array_merge($base,$piarr);
		}
		$allPos = (new pro())->allPos;
        $paramArr2 = [];
        foreach ($allPos as $pos => $v) {
            if($base['cat_'.$pos] && $base['oe_'.$pos]) {
                $pos = array_intersect(explode('/',$base['oe_'.$pos]),explode(',',$base['cat_'.$pos]));
                if($pos) $paramArr2[] = ['name'=>$v['name'],'value'=>implode('/',$pos)];
            }
        }
        //查参数
        $paramArr = [];
        $fields = ['ppv_oe_id', 'ptpa_id', 'ptpa_type', 'ptpa_unit', 'ptpa_decimal', 'ppv_val_int', 'ppv_val_double', 'ppv_val_string', 'ptpa_col_order'];
        $fields = langSqlFields($fields, 'pa.', 'ptpa_', true);
        $fields = langSqlFields($fields, 'pps.', 'ppv_val_', true);
        $fields = langSqlFields($fields, 'ppsu.', 'ptpa_unit_', true);
        $sqltpl =sprintf("SELECT ".implode(',', $fields)."  FROM `oe_param_val` ov
        JOIN part_param pa ON ptpa_id = ppv_ptpa_id
        LEFT JOIN part_param_sche pps ON ((pps.pps_ptpa_id = ptpa_id AND ppv_val_string = pps.cn_name) or (pps.pps_ptpa_id = ptpa_pid and pps_id = ppv_val_int))
        LEFT JOIN part_param_sche ppsu ON ppsu.pps_ptpa_id = 0 and ptpa_unit = ppsu.cn_name
        WHERE ppv_oe_id=%d ORDER BY ptpa_pid DESC,ptpa_id ASC",$oe_id);
        $rows = $this->db->query($sqltpl)->fetchAll();
        foreach($rows as $row){
            if($row['ppv_val_int']){
                $row['ppv_val'] = $row['ppv_val_'.LG_NAME].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit']);
                $paramArr[] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val']];
                continue;
            }
            if($row['ptpa_type']=='string'){
                $row['ppv_val'] = $row['ppv_val_'.LG_NAME];
            }elseif($row['ptpa_type']=='double'){
                $row['ppv_val'] = floatval(number_format($row['ppv_val_double'], $row['ptpa_decimal'],".",""));
            }
            $paramArr[] = ['name'=>$row['ptpa_'.LG_NAME],'value'=>$row['ppv_val'].($row['ptpa_unit_'.LG_NAME]?:$row['ptpa_unit'])];
        }

        $item['param']  = array_merge($paramArr2,$paramArr??[]);
        //查图片
        $join = [
            "[><]files(file)"=>["pic.pic_fileid"=>"fileid"]
        ];
        $pic = $this->db->get('oe_pic(pic)',$join,'*',['pic_oe_id'=>$oe_id,'pic_ismain'=>1,'pic_type'=>'img']);
        if($pic){
            $item['bigImg'] = $pic['filepath'].'/'.$pic['filebasename'].'big.'.$pic['fileextname'];
            $item['smallImg'] = $pic['filepath'].'/'.$pic['filebasename'].'small.'.$pic['fileextname'];
        }
		$cnmodelWhere = ['oe_id'=>$oe_id,'orderby'=>'brand_initial,brand_name,make_name,mod1_name,mod2_name,mod2_start_year,mod3_name,mod3_start_year'];
		$modelWhere = ['oe_id'=>$oe_id,'orderby'=>'mk_'.LG_NAME.',ms_name,mm_name'];
		if($params['pr_id']){
			//限定中国车型取项目指定品牌
			$brandArr = $this->getCnMakeList($params['pr_id']);
			if($brandArr) {
				$cnmodelWhere['brand_id'] = array_unique(array_column($brandArr,'brand_id'));
			}
			//限定国际车型取项目指定品牌
			$mkArr = $this->getMakeList($params['pr_id']);
			if($mkArr){
				$modelWhere['mk_id'] = array_column($mkArr,'mk_id');
			}  
			//
			$projectCfg=  [];
			if(\mvc::$cfg['workProject'][$params['pr_id']])
			{
				$projectCfg = \mvc::$cfg['workProject'][$params['pr_id']]; 
			}
			$onlyTbid = $projectCfg['tb_id']?:0;
		}
        
        //查中国车型   
        $oeModelCN = new oeModelCN();
        $cnmodelData = $oeModelCN->getModelList($cnmodelWhere);
        $cnmodelArr = [];
        foreach ($cnmodelData['rows'] as $key => $row) {
            
            $cnmodelArr[$row['brand_name']][$row['make_name'].$row['mod2_name']][] = $row;
        }
        $item['cnmodel'] = $cnmodelArr;
        //车型
        $oeModel = new oeModel();
        $modelData = $oeModel->getModelList($modelWhere);
      
        $modelArr = [];
        foreach ($modelData['rows'] as $key => $row) {
            
            $modelArr[$row['mk_name']][$row['ms_name']][] = $row;
        }
        $item['model'] = $modelArr;
		//获取号码
		$join = [
			'[><]pro_factory(fac)'=>['on_pf_id'=>'pf_id'],
			'[>]oe_numidx_tag_brand(ontb)'=>['on_id'=>'ontb_on_id'],
			'[>]tag_brand(tb)'=>['ontb.ontb_tb_id'=>'tb_id']
		];
		$where = ['on_oe_id'=>$oe_id];
		if($onlyTbid) $where['ontb_tb_id'] = $onlyTbid;
		$item['numData'] = $this->db->select('oe_numidx',$join,['on_oe_id','on_number','fac.pf_name','tb_'.LG_NAME.'(tb_name)'],$where);
		
		$item = array_merge($item,$base);

        return $item;
    }


	/**
	 * @param  int $was_id
	 * @method 导出列表
	 * @author zhengweihua 
	 * @copyright 2025-07-07
	 */
	public function export($dataArr)
	{	
		function processBatchData($data,$fields,&$drawImgRanges, &$wrapTextRanges, &$brow){
			foreach ($data as $v) {
				$row = [];
				$col = 0;
				$bcol = 'A';
				// 写入主数据
				foreach ($fields as $fk => $fv) {
					
					if($fk=='smallImg'){
						$val = $v['pic']['smallImg']?:'';
					}
					elseif($fk=='desc'){
						$val = [$v['cat_name'],$v['p_name']];
					}elseif ($fk=='model') {
						$val = [];
						foreach ($v['model'] as $mk => $mv) {
							foreach ($mv as $ms => $mmA) {
								if ($ms != 'uniSeries') {
                                    $val[] = $mk . ' ' . $ms;
                                }
							}
						}
					}
					elseif($fk=='cnmodel'){
						$val = [];
						foreach ($v['cnmodel'] as $bn => $bv) {
							foreach ($bv as $m2name => $mmA) {
								if ($m2name != 'uniSeries') {
                                    $val[] = $bn . ' ' . $m2name;
                                }
							}
						}
					}
					else{
						$val = isset($v['captions'][$fk]) ?$v['captions'][$fk]: (isset($v[$fk]) && !empty($v[$fk])  ? $v[$fk]: '');
						if($val===0) $val = '';
					}

					$val = is_array($val) ? implode("\n", $val) : $val;
					$row[$col] = $val;

					// 如果值中包含 \n，记录单元格范围
					if (stripos($val, "\n") !== false) {
						$wrapTextRanges[] = $bcol . $brow;
					}
		
					if(($fk=='smallImg'||$fv['type']=='Image') && $val){
						$imgPath = tempnam(sys_get_temp_dir(), 'excel_img_'.md5($val));
						$filePath = \mvc::$cfg['urls']['outfiles'].'/'.str_replace('small','',$val);

						// 检查文件是否存在且可访问
						$headers = @get_headers($filePath);
						if($headers && strpos($headers[0], '200') !== false) {

							$contents = file_get_contents($filePath);
							if($imgPath && file_exists($imgPath) && $contents){
								file_put_contents($imgPath,$contents);
								$drawImgRanges[$bcol . $brow] = $imgPath;
							}
							$row[$col] = '';
						}
					}
					

					$bcol++;
					$col++;
				}

				$brow++; // 更新行号
				yield $row; // 使用 yield 返回当前行
			}
		}
        // 创建一个新的 Spreadsheet 对象
		$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
		$sheet = $spreadsheet->getActiveSheet();		


		$fieldsArr = [
			[
				'show_oe'=>['title'=>'OE',  'bold'=>true,'color'=>'ff7cded7'],
				'p_innum'=>[ 'title'=>'商品编码', 'bold'=>true, 'color'=>'ff7cded7'],
				'smallImg'=>[ 'title'=>'图片',  'bold'=>true,'color'=>'ff7cded7'],
				'desc'=>['title'=>'描述', 'bold'=>true, 'color'=>'ff7cded7'],
				'model'=>[ 'title'=>'国际车型', 'bold'=>true, 'color'=>'ff7cded7'],
				'cnmodel'=>[ 'title'=>'中国车型', 'bold'=>true, 'color'=>'ff7cded7'],
				'pi_status'=>['title'=>'状态', 'bold'=>true, 'color'=>'ff7cded7'],
			]
		];
		
		// 设置标题
		$row = 1;
      
		$defaultColumnWidth = 15;
		
		$this->formatFields($fieldsArr,$defaultColumnWidth,$sheet,$row);
	

		$batchSize = 1000; // 每次处理 1000 条数据
		$totalRows = count($dataArr);

		for ($i = 0; $i < $totalRows; $i += $batchSize) {
			$batchData = array_slice($dataArr, $i, $batchSize); // 获取当前批次数据
			$data = [];
			$wrapTextRanges = [];
			$startRow = $row; // 记录当前批次的起始行号
			$drawImgRanges = [];
			
			// 使用生成器逐行处理数据
			foreach (processBatchData($batchData,$fieldsArr[0],$drawImgRanges, $wrapTextRanges, $row) as $item) {
				$data[] = $item;
			}

			// 批量写入数据到表格
			if (!empty($data)) {
				$sheet->fromArray($data, null, 'A' . $startRow);
			}

			// 批量设置换行样式
			if (!empty($wrapTextRanges)) {
				foreach ($wrapTextRanges as $cell) {
					$sheet->getStyle($cell)->getAlignment()->setWrapText(true);
				}
			}

			//批量插入图片
			if(!empty($drawImgRanges)){
				foreach ($drawImgRanges as $cell => $img) {
					// 插入图片
					$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
					$drawing->setPath($img); // 图片路径
					$drawing->setHeight(50); // 设置图片高度
					$drawing->setCoordinates($cell); // 设置图片插入的单元格
					$drawing->setWorksheet($sheet);

					// 设置图片所在行的高度
					$rowIndex = preg_replace('/[^0-9]/', '', $cell); // 提取行号
					$sheet->getRowDimension($rowIndex)->setRowHeight(40); // 设置行高为 80，可根据需求调整
				}
			}

		}
		
		// 输出文件
		ob_clean();
		if (empty($filename)) {
			$filename = sprintf('%d.xlsx', time());
		}
		header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		header('Content-Disposition: attachment;filename="' . $filename . '"');
		header('Cache-Control: max-age=0');
		$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
		$writer->save('php://output');

		// 释放内存
		$spreadsheet->disconnectWorksheets();
		unset($spreadsheet);

	}

	/**
	 * @param  Array $fieldsArr 表头数组
	 * @param  int $defaultColumnWidth 默认列宽
	 * @param object $sheet phpspreadsheet对象
	 * @param  int $row 行
	 * @method 设置表格头、尾
	 * @author zhengweihua 
	 * @copyright 2025-07-07
	 */
	public function formatFields($fieldsArr,$defaultColumnWidth,&$sheet,&$row)
	{
		foreach ($fieldsArr as $key => $fields) 
		{	
			$col = 'A';
			foreach ($fields as $vv) 
			{
				if(!$vv){
					$col++;
					continue;
				} 
				 // 设置列宽（如果未单独指定宽度，则使用默认宽度）
				if (is_array($vv) && !empty($vv['width'])) {
					$sheet->getColumnDimension($col)->setWidth($vv['width']);
				} else {
					$sheet->getColumnDimension($col)->setWidth($defaultColumnWidth);
				}
				if(is_array($vv)){
					if($vv['isMerge']){
						$sheet->mergeCells(sprintf("%s:%s",$vv['scell'],$vv['ecell'])); // 合并单元格
					}
	
					$sheet->setCellValue($vv['scell']??$col.$row, $vv['title']); 
	
					$cell = $vv['isMerge']?sprintf("%s:%s",$vv['scell'],$vv['ecell']):$col.$row;
					$style = $sheet->getStyle($cell);
	
					if($vv['color']){
						$style->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB($vv['color']);
					} 
					// 设置字体颜色和加粗
					if (!empty($vv['fontColor']) || !empty($vv['bold'])) {
						$font = $style->getFont();
						if (!empty($vv['fontColor'])) {
							$font->getColor()->setARGB($vv['fontColor']); // 设置字体颜色
						}
						if (!empty($vv['bold'])) {
							$font->setBold(true); // 设置加粗
						}
					}
					// 设置字体大小
					if (!empty($vv['fontSize'])) {
						$style->getFont()->setSize($vv['fontSize']); // 设置字体大小
					}
					//设置行高
					if($vv['height']){
						$sheet->getRowDimension($row)->setRowHeight($vv['height']); // 设置行高为 80，可根据需求调整
					}
					
				}else{
					$sheet->setCellValue($col.$row, $vv);
					$style = $sheet->getStyle($col.$row);  
				}

				$styleArray = [
					'borders' => [
						'allBorders' => [
							'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
							'color' => ['argb' => 'FF000000'], // 黑色边框
						],
					],
				];
				$style->applyFromArray($styleArray);
				if($vv['align']){
					$style->getAlignment()->setHorizontal($vv['align']);  
					$style->getAlignment()->setVertical($vv['align']);
				}
				$col++;
			}
			$row++;
		}
	}

	/**
	 * @method 获取项目分类
	 * @author zhengweihua 
	 * @copyright 2025-08-13
	 */
	public function getProjectCate($pr_id=1)
	{
		$arr = $this->db->select('project_item','pi_cat_id',['pi_pr_id'=>$pr_id,'pi_cat_id[>]'=>0,'GROUP'=>'pi_cat_id']);
		return $arr;
	}

	private function getUniSeries($arr){
		$uniSeries = [];
		foreach($arr as $k=>$v){
			$seriesName = explode(' ',$k)[0];
			// 维护uniSeries非重复集合
			if (!in_array($seriesName, $uniSeries)) {
				$uniSeries[] = $seriesName;
			}
		}
		return $uniSeries;
	}
}