<?php
namespace model;
use \model;
use \model\pro\cate;

class projectItem extends model
{
    public $table = 'project_item';
    public $key = 'pi_id';

	public function __construct ()
    {
		parent::__construct();
	}

    function getDb(){
	    return $this->db;
	}

	/**
	 * @param  array $params
	 * @param  array  $rules
	 * @method 项目明细清单
	 * @author zhengweihua 
	 * @copyright 2025-07-28
	 */
    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 = [];
		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName()
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$workProject = [];
		if($params['pr_id'])
		{
			$prId = $params['pr_id'];
			$workProject = \mvc::$cfg['workProject'][$prId]??[];
		}

		//优先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_brand(pb)"=>["p.p_pb_id"=>"pb_id"],
		
			//关联数据单
			"[>]work_data_item(wdi)" => ["pi.pi_id" => "wdi_from_id", '1'=>'@wdi_from=1129'],
			"[>]work_data_list(wdl)" => ['pi.pi_pr_id'=>'wdlist_from_id','1'=>'@wdlist_from=1129'],
			"[>]adm_user(au)" => ["pi.pi_opuser" => "au_id"],
			//关联最新的项目跟进记录
			"[>]project_follow(prf)" => [
				"pi.pi_id" => "prf_pi_id",
				"1" => "@prf_id = (SELECT prf2.prf_id FROM project_follow prf2 WHERE prf2.prf_pi_id = pi.pi_id ORDER BY prf_update_time DESC LIMIT 1)"
			],
			"[>]adm_user(au1)" => ["prf.prf_opuser" => "au_id"],
			
		];
		$this->set('carmodel', new carmodel());

		//取配置的价格比例
		$price_rate = $workProject['price_rate'] ?? 1;
		$price2_rate = $workProject['price2_rate'] ?? 1;

        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data)use($params,$price_rate,$price2_rate){
			$field = strtr( $field, $this->get('refiled'));
			if($field == 'oe_oe'){
				$field = 'oe_oe_format';
				$data = formatNum($data);
				// $op = 'RAW_'.$field;
				// if($data == 1){
				// 	$data = raw(" oe_id > 0");
				// }else{
				// 	$data = raw(" oe_id IS NULL");
				// }
			}else if($field == 'p_oe'){

				// $field = 'p_oe_format';
				$data = formatNum($data);
				
				$op = 'RAW_'.$field;
				$data = raw(" p_oe_format like '%".$data."%' or p_innum like '%".$data."%'");
				// if($data == 1){
				// 	$data = raw(" p_id > 0");
				// }else{
				// 	$data = raw(" p_id IS NULL");
				// }
			}else if($field == 'wdlist_id'){
				$op = 'RAW_'.$field;
				if($data == 1){
					$data = raw(" wdlist_id > 0");
				}else{
					$data = raw(" wdlist_id = 0");
				}
			}else if($field == 'pic'){
				$op = 'RAW_'.$field;
				//同时搜索商品和零件的图片
				if($data==1){
					$data = raw(" (pi_p_id in (select distinct pic_p_id from pro_pic join files on pic_fileid=fileid where pic_type='img') OR pi_oe_id in (select distinct pic_oe_id from oe_pic join files on pic_fileid=fileid where pic_type='img'))");
				}else{
					$data = raw(" (pi_p_id not in (select distinct pic_p_id from pro_pic join files on pic_fileid=fileid where pic_type='img') AND pi_oe_id not in (select distinct pic_oe_id from oe_pic join files on pic_fileid=fileid where pic_type='img'))");
				}
			}else if($field == 'p_name') {
				// 处理产品名称搜索（商品或零件名称）
				$op = 'RAW_p_name';
				$data = raw(" (p.p_".LG_NAME." LIKE '%".$data."%' OR oe.oe_".LG_NAME." LIKE '%".$data."%')");
			}else if($field == 'sup_name'){
				$op = 'RAW_'.$field;
				
				$data = raw(sprintf(" (pi_p_id in (select distinct psu_p_id from pro_supplier join supplier on sup_id=psu_sup_id where sup_name like '%s%%') 
				OR 
				pi_oe_id in (select distinct spr_oe_id from supplier_pro join supplier on sup_id=spr_sup_id  where sup_name like '%s%%'))",$data,$data));
				
			}else if($field == 'p_oe_link'){
				// $op = 'RAW_'.$field;
				// $data = raw(sprintf(" pi_oe_id in (select distinct p_oe_id from pro where p_innum like '%%%s%%'))",formatNum($data)));
				$op = 'RAW_'.$field;
				$formattedNum = formatNum($data);
				$data = raw(sprintf(" EXISTS (SELECT 1 FROM pro WHERE p_oe_id = pi.pi_oe_id AND (p_innum LIKE '%%%s%%' or p_oe_format LIKE '%%%s%%'))",  $formattedNum,  $formattedNum));
			}else if($field == 'pi_sample'){
				$op = 'RAW_'.$field;
				if($data==1){
					$data = raw(" pi_id in (select distinct prs_pi_id from project_sample)");
				}else{
					$data = raw(" (pi_id not in (select distinct prs_pi_id from project_sample))");
				}
			}
			else if($field =='suppliers')
			{
				$op = 'RAW_'.$field;
				if($data==1){
					$data = raw("pi_format IN (SELECT DISTINCT spr_format FROM supplier_pro)");
				}else{
					// 处理$data!=1的情况，查询没有供应商的项目项
					$data = raw("pi_format NOT IN (SELECT DISTINCT spr_format FROM supplier_pro WHERE spr_format IS NOT NULL)");
				}
			}else if($field == 'chassis') {
				$op = 'RAW_chassis';
				$data = raw(" (p.p_chassis LIKE '%".$data."%' OR oe.oe_chassis LIKE '%".$data."%')");
			}else if($field == 'engine') {
				$op = 'RAW_engine';
				$data = raw(" (p.p_engine LIKE '%".$data."%' OR oe.oe_engine LIKE '%".$data."%')");
			}else if($field == 'cop_price'){
				$op = 'RAW_'.$field;
				$data = raw(" oe.oe_id IN (SELECT DISTINCT cop_oe_id FROM competitor_price WHERE cop_price = {$data})");
			}elseif ($field == 'pi_number') {
				
				$data = formatNum($data);
			}
        });
		foreach($rules as $field=>$val)
		{
			if(empty($val)) continue;
			switch($field)
			{
				case 'numbers':
					$tnums = [];
					foreach($val 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".($rules['numlike']? '[~]': '') => $tnums,	
						"on_formart".($rules['numlike']? '[~]': '') => $tnums,	
						"pn_formart".($rules['numlike']? '[~]': '') => $tnums,	
					];
					unset($rules['numlike']);
					unset($rules['numbers']);
					unset($rules['numberFormats']);
					$where['GROUP'] = 'pi.pi_id';
				break;
				case 'p_cate': $where['pi_cat_id'] = explode(',', $rules['p_cate']); break;
				case 'chk_prpic':
					$chk_prpic = 1;
					$tsql = "(pi.pi_oe_id > 0 AND EXISTS (SELECT 1 FROM oe_pic op JOIN files f ON op.pic_fileid = f.fileid WHERE op.pic_oe_id = pi.pi_oe_id AND op.pic_type = 'img' LIMIT 1)) OR (pi.pi_p_id > 0 AND EXISTS (SELECT 1 FROM pro_pic pp JOIN files f ON pp.pic_fileid = f.fileid WHERE pp.pic_p_id = pi.pi_p_id AND pp.pic_type = 'img' LIMIT 1))";
					$where['RAW #'.$field] = raw($tsql);
					break;
				case 'chk_jpsample':
					$where['RAW #chk_jpsample'] = raw("EXISTS (select 1 from project_sample prs where prs.prs_pi_id = pi.pi_id and prs.prs_fac != '原厂' limit 1)");
					break;
				case 'chk_ycsample':
					$where['RAW #chk_ycsample'] = raw("EXISTS (select 1 from project_sample prs where prs.prs_pi_id = pi.pi_id and prs.prs_fac = '原厂' limit 1)");
					break;
			}
		}

		if(!empty($params['supplier'])){
			$tids = [];
			foreach(explode(',', $params['supplier']) as $tid){
				$tids[] = (int) $tid;
			}
			$tids_str = implode(',', array_unique($tids));
    
			$where['RAW #supplier'] = raw(sprintf("(
				pi.pi_oe_id IN (
					SELECT DISTINCT spr_oe_id FROM supplier_pro 
					WHERE spr_sup_id IN (%s)
				)
				OR
				pi.pi_p_id IN (
					SELECT DISTINCT psu_p_id FROM pro_supplier 
					WHERE psu_sup_id IN (%s)
				)
			)", $tids_str, $tids_str));
		}

		if($params['type']=='price'){
			$where['pi_chk_status[!]'] = 2;
			$where['pi_price'] = 0;
			$where['RAW #price'] = 	raw(" pi_format IN (SELECT DISTINCT spr_format FROM supplier_pro) ");
		}elseif ($params['type']=='confirm') {
			$where['pi_chk_status'] = 2;		
		}elseif ($params['type']=='nosupplier') {
			$where['RAW #supplier'] = raw(" pi_format NOT IN (SELECT DISTINCT spr_format FROM supplier_pro WHERE spr_format IS NOT NULL) ");
		}elseif ($params['type']=='waitConfirm') {
			$where['pi_chk_status'] = [1,-1];
			$where['pi_price[>]'] = 0;
			$where['RAW #price'] = 	raw(" pi_format IN (SELECT DISTINCT spr_format FROM supplier_pro) ");
		}


		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(!\p::isAdmin() &&  !\p::has('P100','check1')){
			
			//小类
			$cates = \p::cates('P100');
			if(!\p::isAdmin() && $cates){
				$where['OR #rule_cate']['pi_cat_id']=explode(',',$cates);
			}else{
				$where['OR #rule_cate']['pi_cat_id[!]'] = -1;
			}
			//获取当前用户的角色
			$arIds = $this->db->select('adm_user_link_role','ault_ar_id',['ault_au_id'=>getOpuser()]);
			if( $arIds) $where['OR #rule_cate']['pi_ar_id'] = $arIds;
			
		}
		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];
		}
	
		$supnameField = \p::has('C500','view')? 'sup_name': 'sup_code(sup_name)';
		
		$fields = ['pi.*','fac.pf_name(pi_pf_name)','pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)','oe_id',
		'oe_oe','fac1.pf_name(oe_pf_name)','oe.oe_'.LG_NAME.'(oe_name)','oe.oe_chassis','oe.oe_engine',
		'p_oe','pb_'.LG_NAME.'(pb_name)','p.p_'.LG_NAME.'(p_name)','p_comnum','p_innum','p.p_chassis','p.p_engine',
		'wdlist_id','wdlist_seq','wdi_id','wdlist_title','wdlist_sup_id','au.au_name',
		// 跟进信息字段
		'prf_des', 'au1.au_name(prf_opuser)', 'prf_update_time'
		];

		$arr = $this->db->select($table,$join,$fields,$where);
		// dd($this->db->last());
		if(!empty($arr))
		{
			$piIds = array_unique(array_column($arr,'pi_id'));
			//统计样例
			$sampleArr = [];
			$sampleParams = [
				'pi_id'=>$piIds,
				'orderby'=>'prs_update_time',
				'sord'=>'DESC'
			];
			$res = $this->getSampleList($sampleParams);
			if($res['rows']){
				foreach ($res['rows'] as $key => $val) {
					$sampleArr[$val['prs_pi_id']][] = $val;
				}
			}
			
			//主图 - 同时处理商品和零件图片
			$picArr = [];
			//供应商
			$supplierArr = [];
			//其他品牌的商品
			$pbProArr = [];
			$pidArr = array_filter(array_unique(array_column($arr,'pi_p_id')));
			$oeidArr =array_filter(array_unique(array_column($arr,'pi_oe_id')));
			
			if($pidArr)
			{   
				//查询商品图片
				$picRes = $this->db->select('pro_pic',['[><]files'=>['pic_fileid'=>'fileid']],'*',['pic_p_id'=>$pidArr,'pic_type'=>'img']);
				foreach ($picRes as $pic) {
					if(!$picArr['p_'.$pic['pic_p_id']]||$pic['pic_ismain'])
					{
						$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'];
					}
				}
			}
			
			if($oeidArr)
			{
				//查询零件图片
				//有主图取zhutu
				$picRes = $this->db->select('oe_pic',['[><]files'=>['pic_fileid'=>'fileid']],'*',['pic_oe_id'=>$oeidArr,'pic_type'=>'img']);
				foreach ($picRes as $pic) {
					if(!$picArr['oe_'.$pic['pic_oe_id']] || $pic['pic_ismain']){
						$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'];
					}
				}
				
				//查其他品牌的商品
				$join = [
					'[><]pro_brand(pb)'=>['pro.p_pb_id'=>'pb_id']
				];
				$where = ['p_oe_id'=>$oeidArr];
			
				$res = $this->db->select('pro',$join,['p_innum','p_id','p_oe_id','pb_'.LG_NAME.'(pb_name)'],$where);	
				if($res){
					
					foreach ($res as $v) 
					{
						$pbProArr[$prId][$v['p_oe_id']][$v['p_id']] = '<div><a href="'.HOST.'/pro/detail?p_id='.$v['p_id'].'&tab=base" tab>'.$v['pb_name'].':'.$v['p_innum'].'</a></div>';
					}
				}
				//获取竞品价格
				$copPriceArr = [];
				$priceRes = $this->db->select('competitor_price',
					['[><]competitor'=>['cop_cor_id'=>'cor_id']],
					['cop_cor_id','cop_oe_id','cop_price','cor_name'],
					['cop_oe_id'=>$oeidArr]);
				foreach ($priceRes as $key => $val) 
				{
					$copPriceArr[$val['cop_oe_id']][]=$val['cop_price'].'('.$val['cor_name'].')';
				}
			}

			$arIds = array_filter(array_column($arr,'pi_ar_id'));
			if($arIds){
				$res = $this->db->select('adm_role',['ar_id','ar_name'],['ar_id'=>$arIds]);
				$arArr = array_column($res,'ar_name','ar_id');
			}
			
			$piOeIds = array_unique(array_column($arr, 'pi_oe_id'));
			
			//查零件供应商
			$supplierArr = $this->getOeSuppliersByNums($piOeIds);
			//检测供应商
			$mainSupPrice = [];
			$selectSupplier = [];
			$joinswhere = ['pru.pru_sup_id' => 'spr_sup_id','pi.pi_format'=>'spr_format'];
			$where2 = ['pru_pi_id'=>$piIds,'ORDER'=>['pru.pru_type'=>'ASC','sup.sup_id'=>'ASC']];
			// if($piFormats){
			// 	// $piFormats = array_map(function($format) {
			// 	// 	return "'" . $format . "'";
			// 	// }, $piFormats);
			// 	$where2['spr_format'] = $piFormats; 
			// 	// $joinswhere['1']= sprintf('@spr_format IN (%s)',implode(',',$piFormats));
			// }
			//确认供应商
			$existSupplier = $this->db->select('project_supplier(pru)',
			[	"[><]supplier(sup)" => ['pru.pru_sup_id' => 'sup_id'],
				"[><]project_item(pi)"=>['pru.pru_pi_id'=>'pi_id'],
				"[>]supplier_pro(spr)" => $joinswhere
			]
			,['pru.pru_pi_id','pru.pru_sup_id','pru.pru_type','sup.sup_id',$supnameField,'spr.spr_oe_id','spr.spr_minbuy','spr.spr_delivery','spr.spr_price','spr.spr_price4']
			,$where2);
			foreach ($existSupplier as $item) 
			{
				$selectSupplier[$item['pru_pi_id']][$item['pru_sup_id']] = $item['pru_type'];
				// if(in_array($item['pru_type'],[1,2,3]))
				// {
				// 	$mainSupPrice[$item['pru_pi_id']][$item['sup_id']] = [
				// 		'sup_id' => $item['sup_id'],
				// 		'pru_type'=>$item['pru_type'],
				// 		'sup_name'=>$item['sup_name'],
				// 		'cost_price' => $item['spr_price'] ? $item['spr_price'] * $price_rate : '',
				// 		// 'sale_price' => $item['spr_price4'] ? $item['spr_price4'] * $price2_rate : '',
				// 		'minbuy' => $item['spr_minbuy'] ?: '',
				// 		'delivery' => $item['spr_delivery'] ?: ''
				// 	];
				// }
			}
			//审核人员
			$checkerArr = [];
			$checker = array_column($arr,'pi_chk_u_id');
			if($checker){
				$chkres = $this->db->select('user',['u_id','u_name','u_mb'],['u_id'=>$checker,'RAW #project'=>raw(sprintf("FIND_IN_SET('%s', u_project_ids) > 0",1))]);
				if($chkres){
					foreach ($chkres as $key => $val) {
						$checkerArr[$val['u_id']] = $val['u_name']?:$val['u_mb'];
					}
					
				}
			}
			
			$statusOptions = [
				'-1'  => '请选择',
				'0' => '入选',
				'1' => '主供',
				'2' => '备用',
				'3' => '下单'
			];
			$sampleStatusDescArr = ['-1'=>'无样品','0'=>'未处理','1'=>'已出样','2'=>'已到样'];
			$statusDescArr = ['-1'=>'无法供应',0=>'待处理', 1=>'生产中',2=>'可供应',3=>'商品'];
			$chkStatus = [-1=>'有异议', 0=>'未定价', 1=>'待确认', 2=>'已确认'];
			foreach ($arr as $key => &$val) 
			{	
				$val['pic'] = [];
				$val['sale_price'] = '';
				$val['cost_price'] = '';
				$val['minbuy'] = '';
				$val['delivery'] = '';
				//根据pi_p_id或pi_oe_id获取对应图片
				if($val['pi_p_id'] )
				{
					$val['p_name'] = $val['p_name'] ?: '';
					$val['chassis'] = $val['p_chassis'] ?: '';
					$val['engine'] = $val['p_engine'] ?: '';
					
				}
				else if($val['pi_oe_id'])
				{
					$val['p_name'] = $val['oe_name'] ?: '';
					$val['chassis'] = $val['oe_chassis'] ?: '';
					$val['engine'] = $val['oe_engine'] ?: '';
				
				}
				
				//供应商
				$val['suppliersArr'] = $supplierArr[$val['pi_oe_id']]??[];
				$val['suppliers'] = '';
				//零件库存在才有这些操作
				if($val['oe_id'] && \p::has('C200','add') && !$val['suppliersArr']){
					$val['suppliers'] = '<ul><li><a href="javascript:openSupplierAdd('.$val['pi_oe_id'].',\''.($val['oe_pf_name'].':'.$val['oe_oe']).'\');">新增</a></li></ul>';
				}
				if($val['suppliersArr'] && $val['oe_id'])
				{	
					
					$val['suppliers'] .= '<div class="table table-bordered YpTable chknums supplier-grid-container" style="display: table;">
    <div class="thead Filter Sortable supplier-grid-header" style="display: table-header-group;">
        <div class="tr" style="display: table-row;">
            <div class="th" style="display: table-cell;"><a href="javascript:openSupplierAdd('.$val['pi_oe_id'].',\''.($val['oe_pf_name'].':'.$val['oe_oe']).'\');">新增</a></div>
            <div class="th Sort supplier-grid-cell" style="display: table-cell;"><span>供应商</span>&nbsp;&nbsp;&nbsp;</div>
            <div class="th Sort supplier-grid-cell" style="display: table-cell; width: 35px;"><span>成本价</span></div>
            <div class="th Sort supplier-grid-cell" style="display: table-cell; width: 35px;"><span>最小起订量</span></div>
            <div class="th Sort supplier-grid-cell" style="display: table-cell; width: 35px;" title="交期(天)"><span>交期(天)</span></div>
        </div>
    </div>
    <div class="tbody supplier-grid-body" style="display: table-row-group;">'; 

foreach ($val['suppliersArr'] as $skey => $supItem) 
{		
    $currentStatus = $selectSupplier[$val['pi_id']][$supItem['sup_id']]??'-1';
    $selecthtml = '<select class="form-control form-select supplier-status-select" 
        style="width: auto; display: inline-block;" 
        onchange="updateSupplierStatus(' . $val['pi_id'] . ', ' . $supItem['sup_id'] . ', this.value)"
        data-pi-id="' . $val['pi_id'] . '" 
        data-sup-id="' . $supItem['sup_id'] . '">';

    // 使用循环生成选项
    foreach ($statusOptions as $status => $option) {
        $selected = ($currentStatus == $status) ? 'selected' : '';
        $selecthtml .= '<option value="' . $status . '" ' . $selected . '>' . $option . '</option>';
    }
    $selecthtml .= '</select>';

    //已确认的选项
    $val['suppliers'] .= '<div class="tr supplier-grid-row" style="display: table-row;">
        <div class="td supplier-grid-cell" style="display: table-cell;">'.$selecthtml.'</div>
        <div class="td supplier-grid-cell" style="display: table-cell;" wdif-id="'.$supItem['sup_id'].'"><a '.(\p::has('C200','edit')?"href=\"javascript:openSupplierDetail({$supItem['spr_id']},{$supItem['spr_id']})\"":"").'" class="num">'.($supItem['sup_name']).'</a></div>
        <div class="td supplier-grid-cell" style="display: table-cell;">'.($supItem['cost_price']>0?$supItem['cost_price']:'').'</div>
        <div class="td supplier-grid-cell" style="display: table-cell;">'.($supItem['minbuy']?:'').'</div>
        <div class="td supplier-grid-cell" style="display: table-cell;">'.($supItem['delivery']?:'').'</div>
    </div>';
}
$val['suppliers'] .= '</div></div>';
				}

				// 获取图片
				$val['pic'] = $picArr['p_'.$val['pi_p_id']]??$picArr['oe_'.$val['pi_oe_id']]??[];
				
				//零件关联的其他品牌的商品
				$val['p_oe_link'] = '';
				if($val['pi_oe_id'] && $pbProArr[$val['pi_pr_id']][$val['pi_oe_id']]){
					$val['p_oe_link'] = implode("",$pbProArr[$val['pi_pr_id']][$val['pi_oe_id']]);
				}
				
				//样品信息
				if(\p::fieldhas('P100','sample')){
					$val['pi_sample'] = '<ul><li><a href="'.HOST.'/projectItem/sampleList?pi_id='.$val['pi_id'].'&fac='.$v['prs_fac'].'" tab><i class="fa fa-list-alt"></i></a>&nbsp;&nbsp;<a href="javascript:addProjectSample(' . $val['pi_id'] . ',\'\',\'' . $val['pi_number'] . '\');">新增</a></li>';
				}
				if(isset($sampleArr[$val['pi_id']]))
				{
					if($chk_prpic){
						$showPicTh = '<div class="th"><span>图片</span></div>';
					}
			
					$val['pi_sample'] .= '<li></ul>';
					$val['pi_sample'] .= '<div class="table table-bordered YpTable chknums supplier-grid-container" style="display: table; width: 100%;">
    <div class="thead Filter Sortable supplier-grid-header" style="display: table-header-group;">
        <div class="tr" style="display: table-row;">
            <div class="th" style="display: table-cell; width: 50px; padding: 3px 4px; font-weight: bold; background: #D8E5E6; color: #188CA6; border-bottom: 1px solid #ddd; border-right: 1px solid #ddd;"><span>供应商</span>&nbsp;&nbsp;&nbsp;</div>
            <div class="th Sort supplier-grid-cell"><span>状态</span></div>
            '.$showPicTh.'
            <div class="th Sort supplier-grid-cell"><span>出样时间</span></div>
            <div class="th Sort supplier-grid-cell"><span>到样时间</span></div>
            <div class="th Sort supplier-grid-cell" style="display: table-cell; width: 200px; padding: 3px 4px; font-weight: bold; background: #D8E5E6; color: #188CA6; border-bottom: 1px solid #ddd;"><span>要求</span></div>
        </div>
    </div>
    <div class="tbody supplier-grid-body" style="display: table-row-group;">';

foreach ($sampleArr[$val['pi_id']] as $k => $v) {
    $showPicTd = '';
    if($chk_prpic){
        $showPicTd = '<div class="td supplier-grid-cell"><div style="display:flex;flex-direction:column;max-height:100px;overflow:auto;">';
        foreach ($v['captions']['prs_fileid'] as $item) {
            $showPicTd .= '<p class="propic" style="height:75px;"><a target="_blank" href="'.(\mvc::$cfg['urls']['outfiles'].'/'.$item['filename']).'"><img style="width:100px" src='.(\mvc::$cfg['urls']['outfiles'].'/'.$item['filename']).'></a></p>';
        }
        $showPicTd .= '</div></div>';
    } 

    $val['pi_sample'] .= '<div class="tr supplier-grid-row" style="display: table-row;">
        <div class="td supplier-grid-cell"><span><a href="'.HOST.'/projectItem/sampleList?pi_id='.$val['pi_id'].'&prs_id='.$v['prs_id'].'" tab>'.($v['sup_name']).'</a></span></div>
        <div class="td supplier-grid-cell">'.($sampleStatusDescArr[$v['prs_status']]).'</div>
        '.$showPicTd.'
        <div class="td supplier-grid-cell">'.($v['prs_status1_time']).'</div>
        <div class="td supplier-grid-cell">'.($v['prs_status2_time']).'</div>
        <div class="td supplier-grid-cell"><span class="prs_need">'.($v['prs_need']).'</span></div>
    </div>';
}
$val['pi_sample'] .= '</div></div>';
				}

				$val['cop_price'] = $copPriceArr[$val['pi_oe_id']]?implode('<br>',$copPriceArr[$val['pi_oe_id']]):'';
				$val['captions'] = [
					'pi_ar_id'=>$arArr[$val['pi_ar_id']]??'',
					'pi_sample_status'=>$sampleStatusDescArr[$val['pi_sample_status']],
					'pi_status'=>$statusDescArr[$val['pi_status']],
					'pi_opuser'=>$val['au_name'],
					'pi_chk_status'=>$chkStatus[$val['pi_chk_status']]?:'',
					'pi_chk_u_id'=>$checkerArr[$val['pi_chk_u_id']]??'',
				];
			}
			unset($val);
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	/**
	 * @method 编辑单元格
	 * @author zhengweihua 
	 * @copyright 2025-07-29
	 */
	public function setCell($kid,$setArr)
	{
		if(!empty($kid) && !empty($setArr))
		{
			$old = $this->db->get('project_item', '*', ['pi_id'=>$kid]);
			if(empty($old)) exitJson('记录不存在');

			$this->db->Begin();
			foreach($setArr as $filed=>$val){
				if(stripos($filed, 'pi_') !== 0){
					unset($setArr[$filed]);
					continue;
				}
			}
			if(!empty($setArr)){
				//状态变更的话
				if(isset($setArr['pi_status']) && $old['pi_status'] != $setArr['pi_status']){
					$this->changeItemStatus($kid,$setArr['pi_status'],'手动变更状态');
				}
				if(isset($setArr['pi_price']) || isset($setArr['pi_price2']) || isset($setArr['pi_price3']) || isset($setArr['pi_price4'])){
					if(!\p::fieldhas('P100','pi_price')){
						exitJson('无权限不可编辑');
					}
					if(isset($setArr['pi_price'])){
						$exist = $this->db->get('project_supplier','pru_id',['pru_pi_id'=>$kid]);
						if(!$exist){
							exitJson('添加价格失败，请先选择供应商！');
						}
					}
					//更改供应价变更状态
					if(isset($setArr['pi_price']) && $old['pi_price'] != $setArr['pi_price']){
						$setArr['pi_chk_status'] = 1;
					}
				} 
				$opuser = getOpuser();
				$datetime = getNowTime();
				$setArr['pi_opuser'] = $opuser;
				$setArr['pi_update_time'] = $datetime;
				$this->db->update('project_item', $setArr, ['pi_id'=>$kid]);
			}
			$this->db->End();
		}
		return [];
	}

	/**
	 * @param  array $ids
	 * @method 删除数据
	 * @author zhengweihua 
	 * @copyright 2025-07-29
	 */
	public function deleteData($ids)
	{
		if(!isset($ids) || empty($ids)){
			exitJson(-1,'参数错误');
		}
		if(!is_array($ids)){
			$ids = explode(',', $ids);
		}
		$this->db->Begin();
		$this->db->delete('project_item',['pi_id'=>$ids]);
		$wdi_ids = $this->db->select('work_data_item', 'wdi_id', ['wdi_from'=>1129, 'wdi_from_id'=>$ids]);
		if($wdi_ids){
			$work = new \model\work();
			$work->delData('work_data_item', $wdi_ids);
		}
		$this->db->End();
		return [];
	}

	/**
	 * @param  array $params
	 * @param  array  $rules
	 * @method 获取样品数据
	 * @author zhengweihua 
	 * @copyright 2025-07-29
	 */
	public function getSampleList($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 = [];
		$refiled = [];
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$table = 'project_sample(prs)';
		$join = [
			"[>]supplier"=>['prs.prs_sup_id'=>'sup_id'],
			"[>]adm_user"=>['prs.prs_opuser'=>'au_id']
		];
	
		$this->set('carmodel', new carmodel());
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			if($field == 'prs_fileid'){
				$op = 'RAW_'.$field;
				if($data==1){
					$data = raw("prs_fileid!=0 AND JSON_LENGTH(prs_fileid) > 0 AND JSON_VALID(prs_fileid) = 1");
				}else{
					$data = raw(" (prs_fileid=0 OR JSON_LENGTH(prs_fileid) = 0 OR JSON_VALID(prs_fileid) = 0)");
				}
			}
        });
		$supnameField = \p::has('C500','view')? 'sup_name': 'sup_code(sup_name)';
		foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
		}

		if(!empty($params['keys'])) $where['prs_id'] = explode(',', $params['keys']);
		if(!empty($params['pi_id'])) $where['prs_pi_id'] = $params['pi_id'];
		if(!empty($params['prs_id'])) $where['prs_id'] = explode(',', $params['prs_id']);
		if(!empty($this->joinWhere)){
			$where = array_merge($where, $this->joinWhere);
		}
        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if(empty($where['ORDER']))$where['ORDER'] = ['prs_id'=>'DESC'];
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$fields = ['prs.*','au_name','sup_id',$supnameField];

		$arr = $this->db->select($table,$join,$fields,$where);
		if(!empty($arr))
		{	
			$fileIds = array_filter(array_column($arr, 'prs_fileid'));
			$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');
				}
			}
			
			$statusDescArr = [0=>'未处理',1=>'已出样',2=>'已到样'];
			foreach ($arr as $key => &$val) {

				$fileinfo = [];
				if (!empty($val['prs_fileid'])) {
					$fileIds = json_decode($val['prs_fileid'], true);
					if (is_array($fileIds) && !empty($fileIds)) {
						foreach ($fileIds as $fileId) {
							if (isset($fileInfoArr[$fileId])) {
								$fileinfo[] = $fileInfoArr[$fileId];
							}
						}
					}
				}
				
				$val['captions'] = [
					'prs_sup_id'=>$val['sup_name'],
					'prs_opuser'=>$val['au_name'],
					'prs_status'=>$statusDescArr[$val['prs_status']]??'',
					'prs_fileid'=>$fileinfo
				];
			}
			unset($val);
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	/**
	 * @param  array $ids
	 * @method 删除样品数据
	 * @author zhengweihua 
	 * @copyright 2025-07-29
	 */
	public function deleteSampleData($ids)
	{	
		if(!isset($ids) || empty($ids)){
			exitJson(-1,'参数错误');
		}
		if(!is_array($ids)){
			$ids = explode(',', $ids);
		}
		$res = $this->db->delete('project_sample',['prs_id'=>$ids]);
		return [];
	}


	/**
	  * @method 项目项转数据单
	  * @param $pi_ids array [必填]  
	  * @author soul
	  */
	public function itemToWorkOrder($pi_ids){
		$fromid = 1129;
		$where = [
			'pi_id'=>$pi_ids,
			'RAW_NOT'=>raw(" pi_id not in (SELECT distinct wdi_from_id FROM work_data_item where wdi_from=".$fromid.")")
		];
		$items = $this->db->select('project_item', ['pi_id', 'pi_pr_id', 'pi_cat_id(cat_id)', 'pi_pf_id', 'pi_number', 'pi_format', 'pi_name'], $where);
		if($items){
			$linkArr = [];
			$nums = [];
			foreach($items as $v){
				$linkArr[$v['pi_pr_id']][] = $v;
				$nums[$v['pi_id']][] = [
					'wdif_type'=>'Number',
					'wdif_val'=>$v['pi_number'],
					'wdif_search'=>$v['pi_format'],
					'wdif_pf_id'=>$v['pi_pf_id']
				];
			}
			$opuser = getOpuser();
			$datetime = getNowTime();
			$work = new \model\work();
			$this->db->Begin();
			$noCatids = [];
			foreach($linkArr as $pr_id=>$ivs){
				if(empty(\mvc::$cfg['workProject'][$pr_id])) exitJson('项目不存在');
				$wdlist_id = $this->db->get('work_data_list', 'wdlist_id', ['wdlist_from'=>$fromid, 'wdlist_from_id'=>$pr_id]);
				if(!$wdlist_id){
					$wdl = [
						'wdlist_seq'=>$work->getWorkSeqNext(),
						'wdlist_from_opuser'=>'',
						'wdlist_title'=>'项目:'.\mvc::$cfg['workProject'][$pr_id]['name'],
						'wdlist_remark'=>'',
						'wdlist_from'=>$fromid,
						'wdlist_from_id'=>$pr_id,
						'wdlist_opuser'=>$opuser,
						'wdlist_create_time'=>$datetime,
						'wdlist_update_time'=>$datetime
					];
					$wdlist_seq = $wdl['wdlist_seq'];
					$this->db->insert('work_data_list', $wdl);
					$wdlist_id = $this->db->id();
				}
				foreach($ivs as $iv){
					$toFormat = ['Number'=>$nums[$iv['pi_id']]];
					$wdli = [
						'wdi_wdlist_id'=>$wdlist_id,	
						'wdi_cat_id'=>$iv['cat_id'],
						'wdi_data'=>'{}',
						'wdi_from'=>$fromid,
						'wdi_from_id'=>$iv['pi_id'],
						'wdi_opuser'=>$opuser,
						'wdi_create_time'=>$datetime,
						'wdi_update_time'=>$datetime
					];
					if($iv['cat_id']) $wdli['wdi_cat_id'] = $iv['cat_id'];
					$this->db->insert('work_data_item', $wdli);
					$wdi_id = $this->db->id();
					if(!$iv['cat_id']) $noCatids[] = $wdi_id;
					//格式化数据
					foreach($toFormat as $type=>$vals){
						//数组本身去重
						$vals = array_map('unserialize', array_unique(array_map('serialize', $vals)));
						foreach($vals as $vk=>$wdif){
							$vals[$vk]['wdif_wdi_id'] = $wdi_id;
						}
						$this->db->insert('work_data_item_format', $vals);
					}
				}
			}
			if($noCatids) $work->autoCleanCat(['ids'=>$noCatids]);
			$this->db->End();
		}
		return [];

	}


	/**
	 * @param  array $params
	 * @method 统计
	 * @author zhengweihua 
	 * @copyright 2025-07-29
	 */
	public function getStateCount($params)
	{	
		if(!$params['pr_id']){
			return [
				'item'=>0,
				'tuijian'=>0,
				'member'=>0,
				'nosupplier'=>0,
				'price'=>0,
				'confirm'=>0,
			];
		}
		//项目清单统计
		$data['item'] = $this->db->count('project_item',['pi_pr_id'=>$params['pr_id']]);
		//推荐单统计
		$data['tuijian'] = $this->db->count('project_recommend',['prr_status'=>1]);

		//组织会员
		$data['member'] = $this->db->count('user',['RAW #project'=>raw(sprintf("FIND_IN_SET('%s', u_project_ids) > 0",$params['pr_id']))]);

		//待定价(有供应商 & 未订销售价)
		$sql = raw(" pi_format IN (SELECT DISTINCT spr_format FROM supplier_pro)");
		$data['price'] = $this->db->count('project_item',['pi_chk_status[!]'=>2,'pi_price[<=]'=>0,'pi_pr_id'=>$params['pr_id'],'RAW #supply'=>$sql]);
		//待确认 有销售价 & 有异议或者待确认
		$data['waitConfirm'] = $this->db->count('project_item',['pi_chk_status'=>[-1,1],'pi_price[>]'=>0,'pi_pr_id'=>$params['pr_id'],'RAW #supply'=>$sql]);
		//价格已确认
		$data['confirm'] = $this->db->count('project_item',['pi_chk_status'=>2,'pi_pr_id'=>$params['pr_id']]);
		//有供应商的
		$sql = raw(" pi_format NOT IN (SELECT DISTINCT spr_format FROM supplier_pro WHERE spr_format IS NOT NULL)");
		$data['nosupplier'] = $this->db->count('project_item',['pi_pr_id'=>$params['pr_id'],'RAW #supply'=>$sql]);
		return $data;
	}
	

	/**
	 * 自动绑定零件和商品  零件号码变更触发自动匹配项目项
	 * @return 变更的明细ID
	 */
	public function autoChkProjectPoe($prId = 0, $oeIds = [])
	{
		$change_ids = [];
		$sql = "SELECT pi_id, oe_id, oe_cate_id, oe_chassis, pi_pr_id FROM project_item
		JOIN oe_numidx ON pi_format=on_formart and on_pf_id=pi_pf_id
		JOIN oe_item ON on_oe_id=oe_id and (pi_cat_id = 0 or pi_cat_id = oe_cate_id)
		WHERE pi_oe_id = 0";
		if($oeIds) $sql .= sprintf(" and oe_id in (%s)", implode(',', $oeIds));
		if($prId) $sql .= sprintf(" and pi_pr_id = %d", $prId);
		$items = $this->db->query($sql)->fetchAll();
		$carmodel = new carmodel();
		$this->db->Begin();
		if($items){
			foreach($items as $v){
				$setArr = [];
				$setArr['pi_cat_id'] = $v['oe_cate_id'];
				$setArr['pi_oe_id'] = $v['oe_id'];
				$setArr['pi_model'] = $v['oe_chassis'];
				
				//提取底盘
				$tbids = \mvc::$cfg['workProject'][$v['pi_pr_id']]['tb_id'];
				if($tbids){
					$join = [
						'[><]m_model(m)'=>['oml.oml_mm_id'=>'mm_id'],
						'[><]tag_brand_make(mt)'=>['m.mm_mk_id'=>'tbm_mk_id'],
					];
					$mm_ids = $this->db->select('oe_model_link(oml)', $join, 'oml_mm_id', ['oml_oe_id'=>$v['oe_id'], 'tbm_tb_id'=>$tbids]);
					$join = [
						'[><]m_cn_model(m)'=>['oml.oml_mod3_id'=>'mod3_id'],
						'[><]tag_brand_cnbrand(mt)'=>['m.brand_id'=>'tbm_brand_id'],
					];
					$mod3_ids = $this->db->select('oe_model_cn_link(oml)', $join, 'oml_mod3_id', ['oml_oe_id'=>$v['oe_id'], 'tbm_tb_id'=>$tbids]);
					$vals = $carmodel->formatValsFromModel($mm_ids, $mod3_ids);
					if($vals['chassis']) $setArr['pi_model'] = $vals['chassis'];
				}
				$change_ids[] = $v['pi_id'];
				$this->db->update('project_item', $setArr, ['pi_id'=>$v['pi_id']]);
			}
		}

		//自有品牌的商品绑定
		$prIdArr = $prId? [(int) $prId]: array_keys(\mvc::$cfg['workProject']);
		foreach($prIdArr as $tid){
			$sql = sprintf("SELECT p_id, pi_id FROM project_item JOIN pro ON p_oe_id = pi_oe_id and p_oe_id > 0 WHERE pi_p_id = 0 and pi_pr_id = %d AND p_pb_id = %d and pi_status !=3", $tid, \mvc::$cfg['workProject'][$tid]['pb_id']);
			if($oeIds) $sql .= sprintf(" and pi_oe_id in (%s)", implode(',', $oeIds));
			$items = $this->db->query($sql)->fetchAll();
			foreach($items as $v){
				$change_ids[] = $v['pi_id'];
				$this->changeItemStatus($v['pi_id'], 3, '自动关联-商品', ['pi_p_id'=>$v['p_id']]);
			}
		}
		
		//供应商关联
		$sql = 'SELECT pi_id FROM project_item JOIN supplier_pro ON spr_oe_id = pi_oe_id WHERE pi_status IN (-1, 0, 1)';
		if($oeIds) $sql .= sprintf(" and pi_oe_id in (%s)", implode(',', $oeIds));
		$items = $this->db->query($sql)->fetchAll();
		foreach($items as $v){
			$change_ids[] = $v['pi_id'];
			$this->changeItemStatus($v['pi_id'], 2, '自动关联-有供应商');
		}

		$this->db->End();
		return array_unique($change_ids);
	}

	/**
	 * 变更项目状态并加日志
	 * @param  $othSet array 默认[] 变更project_item表的其他字段
	 * @return 
	 */
	public function changeItemStatus($pi_id, $status, $remark = '', $othSet = [])
	{
		$old = $this->db->get('project_item', 'pi_status', ['pi_id'=>$pi_id]);
		if($old !== null && $status != $old){
			$opuser = getOpuser();
			$datetime = getNowTime();
			$this->db->Begin();
			$add = [
				'pis_pi_id'=>$pi_id,
				'pis_status_old'=>$old,
				'pis_status_new'=>$status,
				'pis_remark'=>$remark,
				'pis_opuser'=>$opuser,
				'pis_change_time'=>$datetime
			];
			$this->db->insert('project_item_status', $add);
			$set = ['pi_status'=>$status, 'pi_opuser'=>$opuser, 'pi_update_time'=>$datetime];
			if(is_array($othSet)) $set = array_merge($othSet, $set);
			$this->db->update('project_item', $set, ['pi_id'=>$pi_id]);
			$this->db->End();
		}
		return [];
	}

	/**
	 * @param  Array $params
	 * @method 保存样品数据
	 * @author zhengweihua 
	 * @copyright 2025-08-06
	 */
	public function saveSample($params)
	{
		if(!\p::fieldhas('P100','sample')){
			exitJson('无样品管理权限');
		}
		$fileinfo = json_decode($params['prs_fileid'],true);
		if($fileinfo){
			$prs_fileid  = array_column($fileinfo,'fileid');
		}
		$data  = [
			'prs_sup_id'=>$params['prs_sup_id']??0,
			'prs_status'=>$params['prs_status']??0,
			'prs_pi_id'=>$params['prs_pi_id'],
			'prs_fac'=>$params['prs_fac']??'',
			'prs_fileid'=>json_encode($prs_fileid??[]),
			'prs_remark'=>$params['prs_remark']??'',
			'prs_opuser'=>getOpuser(),
			'prs_update_time'=>getNowTime(),
			'prs_status1_time'=>$params['prs_status1_time']?:Null,
			'prs_status2_time'=>$params['prs_status2_time']?:Null,
			'prs_need'=>$params['prs_need']??'',
		];
		
		$this->db->Begin();
		if($params['prs_id'])
		{
			//状态变更为2则记录时间
			$old = $this->db->get('project_sample', '*', ['prs_id'=>$params['prs_id']]);
			if(!$params['prs_status2_time'] && $params['prs_status']==2 && $old['prs_status']!=$params['prs_status'])
			{
				$data['prs_status2_time'] = getNowTime();
			}
			if(!$params['prs_status1_time'] && $params['prs_status']==1 && $old['prs_status']!=$params['prs_status'])
			{
				$data['prs_status1_time'] = getNowTime();
			}
			$this->db->update('project_sample', $data, ['prs_id'=>$params['prs_id']]);
			$id = $params['prs_id'];
		}else{
			//状态变更为2则记录时间
			if(!$params['prs_status2_time'] && $params['prs_status']==2)
			{
				$data['prs_status2_time'] = getNowTime();
			}
			//状态变更为1则记录时间
			if(!$params['prs_status1_time'] && $params['prs_status']==1){
				$data['prs_status1_time'] = getNowTime();
			}
			$data['prs_create_time'] = getNowTime();
			$this->db->insert('project_sample', $data);
			$id = $this->db->id();
		}
		//添加后，如果原状态为-1 0则自动变更为1
		$item = $this->db->get('project_item', ['pi_id','pi_sample_status'], ['pi_id'=>$params['prs_pi_id']]);
		if($item['pi_sample_status'] <=0){
			$this->db->update('project_item', ['pi_sample_status'=>1], ['pi_id'=>$item['pi_id']]);
		}
		//如果supplier表不存在就写入一条
		if($params['prs_pi_id'] && $params['prs_sup_id'])
		{
			$exist = $this->db->get('project_supplier','*',['pru_pi_id'=>$params['prs_pi_id'],'pru_sup_id'=>$params['prs_sup_id']]);
			if(!$exist){
				$this->db->insert('project_supplier',[
					'pru_pi_id' =>$params['prs_pi_id'],
					'pru_sup_id' =>$params['prs_sup_id'],
					'pru_type' => 2,
					'pru_opuser' => getOpuser(),
					'pru_create_time' => getNowTime(),
					'pru_update_time' => getNowTime()
				]);
			}
		}
		
		$this->db->End();
		return ['prs_id'=>$id];
	}

	/**
	 * @param  int $prs_id
	 * @method 获取样品数据
	 * @author zhengweihua 
	 * @copyright 2025-08-06
	 */
	public function getSampleById($prs_id)
	{	
		$supnameField = \p::has('C500','view')? 'sup_name': 'sup_code(sup_name)';
		$join = [
			'[>]supplier(sup)'=>['prs.prs_sup_id'=>'sup_id'],
		];
		$data = $this->db->get('project_sample(prs)',$join,['prs.*',$supnameField], ['prs_id'=>$prs_id]);	
		if($data)
		{
			$fileids = json_decode($data['prs_fileid'],true);
			if($data['prs_fileid'] && $fileids){
				
				$filesArr = $this->db->select('files','*',['fileid'=>$fileids]);
				foreach ($filesArr as $val) {
					$data['prs_fileinfo'][] = [
						'fileid'=>$val['fileid'],
						'filename'=>$val['filename'],
						'orgname' => $val['fileremark'].'.'.$val['fileextname']
					];
				}
			}
		}
		return $data;
	}

	/**
	 * @method 样品单元格保存
	 * @author zhengweihua 
	 * @copyright 2025-08-20
	 */
	public function setSampleCell($kid,$setArr)
	{
		if(!empty($kid) && !empty($setArr))
		{
			$old = $this->db->get('project_sample', '*', ['prs_id'=>$kid]);
			if(empty($old)) exitJson('记录不存在');

			$this->db->Begin();
			foreach($setArr as $filed=>$val){
				if(stripos($filed, 'prs_') !== 0){
					unset($setArr[$filed]);
					continue;
				}
			}
			if(!empty($setArr)){
				$opuser = getOpuser();
				$datetime = getNowTime();
				$setArr['prs_opuser'] = $opuser;
				$setArr['prs_update_time'] = $datetime;
				$this->db->update('project_sample', $setArr, ['prs_id'=>$kid]);
			}
			$this->db->End();
		}
		return [];
	}

	/**
	 * @method 项目角色保存
	 * @author zhengweihua 
	 * @copyright 2025-08-20
	 */
	public function savePrjRole($dataArr)
	{
		if(!$dataArr['id']) exitJson('参数错误');
		if(!is_array($dataArr['id'])) $dataArr['id'] = explode(',', $dataArr['id']);
		$exitsIds = $this->db->select('project_item', 'pi_id', ['pi_id'=>$dataArr['id']]);

		if($exitsIds){
			$this->db->update('project_item',['pi_ar_id'=>$dataArr['ar_id']], ['pi_id'=>$exitsIds]);
		}
		return [];
	}

	/**
	 * @param  string $pwcode
	 * @method 取有指定权限的角色
	 * @author zhengweihua 
	 * @copyright 2025-08-21
	 */
	public function getRole($pwcode = 'P100')
	{
        $arr = $this->db->select('power_role_link(pw)',['[><]adm_role(ro)'=>['pw.prl_ar_id'=>'ar_id']],'*',['prl_power_code'=>$pwcode]);
        return $arr;
	}

	/**
	 * @param  int $id
	 * @method 获取项目明细
	 * @author zhengweihua 
	 * @copyright 2025-08-21
	 */
	public function getProjectItemById($id)
	{
		$arr = $this->db->get('project_item','*',['pi_id'=>$id]);
		if(empty($arr)) return [];
		$supnameField = \p::has('C500','view')? 'sup_name': 'sup_code(sup_name)';
		$arr['supArr'] = [];
		if($arr['pi_sup_ids']){
			$supplierIds = json_decode($arr['pi_sup_ids'], true);
			$arr['supArr'] = $this->db->select('supplier',['sup_id',$supnameField],['sup_id'=>$supplierIds]);
		}
		return $arr;
	}

	/**
	 * @param  int $id
	 * @method 获取项目明细对应的供应商
	 * @author zhengweihua 
	 * @copyright 2025-08-21
	 */
	public function getProjectItemSuppliers($id)
	{		
		$arr = $this->db->get('project_item(pi)',['pi_oe_id'],['pi_id'=>$id]);
		if(empty($arr)) return [];
		$supplierArr = $this->getOeSuppliersByNums($arr['pi_oe_id']);
		return $supplierArr[$arr['pi_oe_id']]??[];
	}


	/**
	 * 更新供应商状态
	 * @param array $params 包含 pi_id, sup_id, status 的参数数组
	 * @return array 结果数组
	 */
	public function updateSupplierStatus($params) 
	{
		$pi_id = (int) $params['pi_id'];
		$sup_id = (int) $params['sup_id'];
		$status = (int) $params['status'];
		
		// 参数验证
		if (!$pi_id || !$sup_id) {
			exitJson(-1, '参数错误');
		}
		
		// 验证状态值是否有效
		$validStatuses = [-1,0, 1, 2, 3]; // 0:入选, 1:主供, 2:备用, 3:上市
		if (!in_array($status, $validStatuses)) {
			exitJson(-1, '无效的状态值');
		}
		
		$this->db->Begin();
		// 检查供应商是否已关联到项目项
		$existing = $this->db->get('project_supplier', '*', [
			'pru_pi_id' => $pi_id,
			'pru_sup_id' => $sup_id
		]);
		if($existing && $status ==-1){
			$this->db->delete('project_supplier',[
				'pru_pi_id' => $pi_id,
				'pru_sup_id' => $sup_id
			]);
		}else if ($existing) {
			// 更新状态
			$this->db->update('project_supplier', [
				'pru_type' => $status,
				'pru_opuser' => getOpuser(),
				'pru_update_time' => getNowTime()
			], [
				'pru_pi_id' => $pi_id,
				'pru_sup_id' => $sup_id
			]);

		} else {
			// 如果不存在关联记录，则创建新记录
			$this->db->insert('project_supplier', [
				'pru_pi_id' => $pi_id,
				'pru_sup_id' => $sup_id,
				'pru_type' => $status,
				'pru_opuser' => getOpuser(),
				'pru_create_time' => getNowTime(),
				'pru_update_time' => getNowTime()
			]);
		}
		$iteminfo = $this->db->get('project_item',['pi_status','pi_id'],['pi_id'=>$pi_id]);
		if($iteminfo['pi_status'] < 2){
			$this->changeItemStatus($pi_id,2,'选择供应商自动变更状态');
		}
		
		$this->db->End();
		
		// 返回成功结果
		return [];
		
	}

	/**
	 * @param  [type] $piFormats
	 * @method 根据项目明细号码获取所属零件供应商
	 * @author zhengweihua 
	 * @copyright 2025-09-13
	 */
	public function getOeSuppliersByNums($piOeIds,$piFormats = [])
	{
		$supnameField = \p::has('C500','view')? 'sup_name': 'sup_code(sup_name)';
		$supplierArr = [];
		if($piOeIds){
			$where['spr_oe_id'] = $piOeIds;
		}
		if($piFormats) $where['spr_format'] = $piFormats;
		
		$supRes = $this->db->select('supplier_pro(spr)',['[><]supplier(sup)'=>['spr.spr_sup_id'=>'sup_id']],['spr_id','spr_oe_id','spr_minbuy(minbuy)','spr_delivery(delivery)','spr_price(cost_price)','spr_price4','spr_format','spr_sup_id','sup_id',$supnameField],$where);
		foreach ($supRes as $sup) {
			
			$supplierArr[$sup['spr_oe_id']][] = $sup;
		}
		return $supplierArr;
	}
}