<?php
namespace model;
use \model;
use \model\check;
use \model\collocation;
use \model\carmodel;
use \model\pro\numidx;
use \model\pro\promodel;
use \model\pro\promodelcn;
use \model\pro\cate;
use \model\ypApi;
use \model\user;
use \model\pro\factory;

class work extends model
{
	
	public function __construct ()
    {
		parent::__construct();
		$this->proFrom = [
			'self'=>'产品库',
			'oth'=>'宜配库',
		];
		$this->proFromSelect = ':;self:产品库;oth:宜配库';
	}

	public function getDataList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? 'wdlist_id': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

		$table = 'work_data_list(wdl)';
		$join = [
			"[>]supplier(sup)" => ["wdl.wdlist_sup_id" => "sup_id"],
			"[>]adm_user(au)" => ["wdl.wdlist_from_opuser" => "au_id"]
		];
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			if($field == 'wdlist_from_opuser' && $data == 0) $data = '';
        });
		
		if(!empty($params['keys'])) $where['wdlist_id'] = explode(',', $params['keys']);
		if(!empty($params['wdlist_id'])) $where['wdlist_id'] = explode(',', $params['wdlist_id']);
		if(!empty($params['wdlist_seq'])) $where['wdlist_seq'] = explode(',', $params['wdlist_seq']);

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$fields = ['sup_name', 'sup_code', 'au_name', 'wdl.*'];
        $arr = $this->db->select($table,$join,$fields,$where);
		if($arr){
			$collocation = new collocation();
			$collArr = $collocation->getCollItems('work');

			$wdlIds = array_column($arr, 'wdlist_id');
			$rows = $this->db->select('work_data_item', ['wdi_wdlist_id', 'item_count'=>raw('count(*)'), 'clean_count'=>raw('(sum(case when wdi_clean = 1 then 1 else 0 end))'), 'clean_has_count'=>raw('(sum(case when wdi_clean_has = 1 then 1 else 0 end))'), 'chkpro_count'=>raw('(sum(case when wdi_chkpro_id > 0 then 1 else 0 end))')], ['wdi_wdlist_id'=>$wdlIds, 'GROUP'=>'wdi_wdlist_id']);
			$tj = array_column($rows, null, 'wdi_wdlist_id');

			$rows = $this->db->select('work_oe_item', ["[><]work_data_item" => ["woi_wdi_id" => "wdi_id"]], ['wdi_wdlist_id', 'oe_count'=>raw('count(*)'), 'oeck1_count'=>raw('(sum(case when ck1 = 1 then 1 else 0 end))')], ['wdi_wdlist_id'=>$wdlIds, 'GROUP'=>'wdi_wdlist_id']);
			$tj2 = array_column($rows, null, 'wdi_wdlist_id');

			$rows = $this->db->select('work_ask_item', ["[><]work_data_item" => ["wai_wdi_id" => "wdi_id"]], ['wdi_wdlist_id', 'ask_count'=>raw('count(*)'), 'askck1_count'=>raw('(sum(case when ck1 = 1 then 1 else 0 end))')], ['wdi_wdlist_id'=>$wdlIds, 'GROUP'=>'wdi_wdlist_id']);
			$tj3 = array_column($rows, null, 'wdi_wdlist_id');

			$rows = $this->db->select('work_data_item_format(wdif)', ["[><]work_data_item(wdi)" => ["wdif.wdif_wdi_id"=>"wdi_id"],"[><]pro_numidx(pn)" => ["wdif.wdif_pf_id"=>"pn_pf_id", "wdif.wdif_search"=>'pn_formart']], ['wdi_wdlist_id', 'pro_has_count'=>raw('count(distinct wdi_id)')], ['wdi_wdlist_id'=>$wdlIds, 'GROUP'=>'wdi_wdlist_id']);
			$tj4 = array_column($rows, null, 'wdi_wdlist_id');

			$rows = $this->db->select('work_data_item_format(wdif)', ["[><]work_data_item(wdi)" => ["wdif.wdif_wdi_id"=>"wdi_id"],"[><]supplier_pro(spr)" => ["wdif.wdif_pf_id"=>"spr_pf_id", "wdif.wdif_search"=>'spr_format']], ['wdi_wdlist_id', 'sup_has_count'=>raw('count(distinct wdi_id)')], ['wdi_wdlist_id'=>$wdlIds, 'GROUP'=>'wdi_wdlist_id']);
			$tj5 = array_column($rows, null, 'wdi_wdlist_id');

			foreach($arr as &$v){
				if($tj[$v['wdlist_id']]) $v = array_merge($v, $tj[$v['wdlist_id']]);
				if($tj2[$v['wdlist_id']]) $v = array_merge($v, $tj2[$v['wdlist_id']]);
				if($tj3[$v['wdlist_id']]) $v = array_merge($v, $tj3[$v['wdlist_id']]);
				if($tj4[$v['wdlist_id']]) $v = array_merge($v, $tj4[$v['wdlist_id']]);
				if($tj5[$v['wdlist_id']]) $v = array_merge($v, $tj5[$v['wdlist_id']]);

				/*$v['captions']['clean_count'] = $v['clean_count']? sprintf("%d [%d%%]", $v['clean_count'], $v['clean_count']/$v['item_count']*100): '';
				$v['captions']['clean_has_count'] = $v['clean_has_count']? sprintf("%d [%d%%]", $v['clean_has_count'], $v['clean_has_count']/$v['item_count']*100): '';
				$v['captions']['chkpro_count'] = $v['chkpro_count']? sprintf("%d [%d%%]", $v['chkpro_count'], $v['chkpro_count']/$v['item_count']*100): '';
				$v['captions']['pro_has_count'] = $v['pro_has_count']? sprintf("%d [%d%%]", $v['pro_has_count'], $v['pro_has_count']/$v['item_count']*100): '';*/
				$v['captions']['wdlist_from_opuser'] = $v['au_name'];
				$v['captions']['wdlist_type'] = !empty($collArr[$v['wdlist_type']])? $collArr[$v['wdlist_type']]: '';
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	function formatWordDataCols($wdlist_id)
	{
		$row = $this->db->get('work_data_list', '*', ['wdlist_id'=>$wdlist_id]);
		$row['cols'] = json_decode($row['wdlist_cols'], true);
		return $row;
	}

	//数据工单的明细
	public function getDataItemList($wdlist_id, $params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? 'wdi_id': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$table = 'work_data_item(wdi)';
		$join = [
			"[><]work_data_list(wdl)" => ["wdi.wdi_wdlist_id" => "wdlist_id"],
			"[>]work_oe_item(woi)" => ["wdi.wdi_id" => "woi_wdi_id"],
			"[>]work_ask_item(wai)" => ["wdi.wdi_id" => "wai_wdi_id"],
			"[>]pro_cate(cat)" => ["wdi.wdi_cat_id" => "id"],
			"[>]pro_cate(pcat)" => ["cat.parent_id" => "id"]
		];
		
		$this->set('pnumwhere', []);
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			if($field == 'chkok'){
				$op = 'RAW_'.$field;
				if($data == 1){
					$data = raw(" wdi_chkpro_id!=0");
				}else{
					$data = raw(" wdi_chkpro_id=0");
				}
			}else if($field == 'wdi_chkpro_from'){
				if($data == 'oth'){
					$op = 'RAW_'.$field;
					$data = raw(" wdi_chkpro_from not in ('', 'selft')");
				}
			}else if($field == 'chkselfpro'){
				$op = 'RAW_'.$field;
				if($data == '-1'){
					$data = raw(" wdi_id not in (select wdif_wdi_id from work_data_item_format join pro_numidx on wdif_pf_id=pn_pf_id and wdif_search=pn_formart)");
				}else{
					$data = raw(" wdi_id in (select wdif_wdi_id from work_data_item_format join pro_numidx on wdif_pf_id=pn_pf_id and wdif_search=pn_formart)");
				}
			}else if($field == 'woi_id'){
				$op = 'RAW_'.$field;
				if($data == 1){
					$data = raw(" woi_id is not null");
				}else{
					$data = raw(" woi_id is null");
				}
			}else if($field == 'wai_id'){
				$op = 'RAW_'.$field;
				if($data == 1){
					$data = raw(" wai_id is not null");
				}else{
					$data = raw(" wai_id is null");
				}
			}else if($field == 'nums'){
				if($op == 'eq'){
					$where = "wdif_search = '".formatNum($data)."'";
				}else{
					$where = "wdif_search like '".formatNum($data)."%'";
				}
				$op = 'RAW_'.$field;
				$data = raw(" wdi_id in (select wdif_wdi_id from work_data_item_format where wdif_type='Number' and ".$where.")");
			}else if($field == 'sups'){
				$op = 'RAW_'.$field;
				if($data == '-1'){
					$data = raw(" wdi_id not in (SELECT DISTINCT wdif_wdi_id FROM work_ask_item JOIN work_data_item_format ON wdif_wdi_id = wai_wdi_id AND wdif_type = 'Number' JOIN supplier_pro ON wdif_pf_id = spr_pf_id AND wdif_search = spr_format)");
				}else{
					$data = raw(" wdi_id in (SELECT DISTINCT wdif_wdi_id FROM work_ask_item JOIN work_data_item_format ON wdif_wdi_id = wai_wdi_id AND wdif_type = 'Number' JOIN supplier_pro ON wdif_pf_id = spr_pf_id AND wdif_search = spr_format)");
				}
			}
        });
		
		foreach($rules as $filed=>$val){
			if(empty($val)) continue;
			switch($filed){
				case 'p_cate': $where['wdi_cat_id'] = explode(',', $rules['p_cate']); break;
			}
		}
	
		$where['wdlist_id'] = $wdlist_id;
		if(!empty($params['keys'])) $where['wdi_id'] = explode(',', $params['keys']);
		if(!\p::isAdmin()) $where['woi_opuser'] = getOpuser();

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)', 'wdl.wdlist_id', 'wdl.wdlist_seq', 'wdi.*', 'wai_id', 'woi_id'];
        $arr = $this->db->select($table,$join,$fields,$where);
		$wdlCols = $this->formatWordDataCols($wdlist_id);

		if(!empty($arr)){
			$wdiIds = array_column($arr, 'wdi_id');
			$join = [
				"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
			];
			$rows = $this->db->select('work_data_item_format', $join, ['wdif_wdi_id', 'wdif_id', 'pf_name', 'wdif_val'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdiIds]);
			$nums = [];
			foreach($rows as $rv){
				$nums[$rv['wdif_wdi_id']][] = ['wdif_id'=>$rv['wdif_id'], 'factory'=>$rv['pf_name'], 'number'=>$rv['wdif_val'], 'ok'=>1];  
			}

			//存在的供应商
			$join = [
				"[><]work_ask_item(wai)" => ["wdif.wdif_wdi_id" =>"wai_wdi_id"],
				"[><]supplier_pro(spr)" => ["wdif.wdif_pf_id" =>"spr_pf_id", 'wdif.wdif_search'=>'spr_format'],
				"[><]supplier(sup)" => ["spr.spr_sup_id" =>"sup_id"],
			];
			$rows = $this->db->select('work_data_item_format(wdif)', $join, ['wdif_wdi_id', 'sup_id', 'sup_name', 'spr_format','spr_id'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdiIds, 'GROUP'=>['wdif_wdi_id', 'sup_id'], 'ORDER'=>['sup_name']]);
			foreach($rows as $rv){
				$sups[$rv['wdif_wdi_id']][] = $rv;  
			}
			
			foreach($arr as &$v){
				$v['nums'] = $nums[$v['wdi_id']]? $nums[$v['wdi_id']]: [];
				$v['sups'] = $sups[$v['wdi_id']]? $sups[$v['wdi_id']]: [];
				if(empty($v['wdi_chkpro_id'])) $v['wdi_chkpro_id'] = '';
				$v['chkok'] = $v['wdi_chkpro_from'] && $v['wdi_chkpro_id'] ? $v['wdi_chkpro_from'].'@'.$v['wdi_chkpro_id']: '';
				$cleanArr = empty($v['wdi_clean_result']) ? []: json_decode($v['wdi_clean_result'], true);

				//哪些号码是异常的
				if($cleanArr['errnum'] && $v['nums']){
					foreach($v['nums'] as $tk=>$tv){
						foreach($cleanArr['errnum'] as $tvv){
							if($tvv['format'] == formatNum($tv['number'])){
								$v['nums'][$tk]['ok'] = -1;
							}
						}
					}
				}

				$wdi_chkpro_info = empty($v['wdi_chkpro_info']) ? []: json_decode($v['wdi_chkpro_info'], true);
				$v['img'] = $wdi_chkpro_info['pro_img']? $wdi_chkpro_info['pro_img']: '';

				//检测产品库
				$v['chkselfpro'] = '';
				$v['chkpro_url'] = '';

				//检测产品库
				$join = [
					"[><]pro_numidx(pn)" => ["wdif.wdif_pf_id"=>"pn_pf_id", "wdif.wdif_search"=>'pn_formart'],
					"[><]pro(pro)" => ["pn.pn_p_id"=>"p_id"],
					"[><]pro_brand(pb)" => ["pro.p_pb_id"=>"pb_id"],
				];
				$has = $this->db->select('work_data_item_format(wdif)', $join, ['p_id', 'pb_'.LG_NAME.'(pb_name)', 'p_innum'], ['p_pb_id'=>1, 'wdif_wdi_id'=>$v['wdi_id'], 'GROUP'=>'pn_p_id']);
				if(!empty($has)){
					$v['chkselfpro'] = '<div class="cleandes">';
					//$v['chkselfpro'] .= '<div class="card border-success mb-3" style="margin-bottom:10px !important"><div class="card-header">产品库</div><div class="card-body">';
					$v['chkselfpro'] .= '<ul class="pro-list-self">';
					foreach($has as $tpk=>$tpv){
						$valkey = 'self@'.$tpv['p_id'];
						$tpv['pro_url'] = \mvc::$cfg['sitePath'].'/pro/detail?p_id='.$tpv['p_id'];
						$prochk = (empty($v['chkok']) && $tpk === 0) || (!empty($v['chkok']) && $v['chkok'] == $valkey)? ' checked': '';
						if($v['chkok'] == $valkey){
							$v['chkpro_url'] = $tpv['pro_url'];
							$v['captions']['chkok'] = '<a href="'.$tpv['pro_url'].'" tab>'.$tpv['pb_name'].': '.$tpv['p_innum'].'</a>';
							$prochk .= ' haschkok="1"';
						}
						$v['chkselfpro'] .= '<li><div>'.$tpv['pro_name'].'</div><label><input type="radio" name="pro['.$v['wdi_id'].']" value="'.$valkey.'"'.$prochk.'> <span>'.$tpv['pb_name'].'</span></label>: <a href="'.$tpv['pro_url'].'" tab>'.$tpv['p_innum'].'</a></li>';
					}
					//$v['chkselfpro'] .= '</ul></div></div>';
					$v['chkselfpro'] .= '</ul>';
					$v['chkselfpro'] .= '</div>';
				}
				
				
				$v['cleandes'] = '';
				$v['captions']['wdi_chkpro_from'] = $this->proFrom[$v['wdi_chkpro_from']]? $this->proFrom[$v['wdi_chkpro_from']] : ($v['wdi_chkpro_from']? $this->proFrom['oth']: ''); 
				if(!empty($cleanArr['from'])){
					$v['cleandes'] = '<div class="cleandes">';
					//$v['cleandes'] .= '<div class="card border-warning mb-3" style="margin-bottom:10px !important"><div class="card-header">宜配数据</div><div class="card-body">';
					if($cleanArr['from'] == 'tcd'){//tcd源
						$v['cleandes'] .= '<ul class="ga-list">';
						foreach($cleanArr['ga_chk'] as $ctk=>$ctv){
							$prostpl = '';
							foreach($ctv['pros'] as $tpk=>$tpv){
								$valkey = $cleanArr['from'].'@'.$tpv['pro_id'];
								$prochk = (empty($v['chkok']) && $ctk === 0 && $tpk === 0) || (!empty($v['chkok']) && $v['chkok'] == $valkey)? ' checked': '';
								if($v['chkok'] == $valkey){
									$v['chkpro_url'] = $tpv['pro_url'];
									$v['captions']['chkok'] = '<a href="'.$tpv['pro_url'].'" target="blank">'.$tpv['pro_factory'].': '.$tpv['pro_number'].'</a>';
									$prochk .= ' haschkok="1"';
								}
								$prostpl .= '<li><label><input type="radio" name="pro['.$v['wdi_id'].']" value="'.$valkey.'"'.$prochk.'> <span>'.$tpv['pro_factory'].'</span></label>: <a href="'.$tpv['pro_url'].'" target="blank">'.$tpv['pro_number'].'</a></li>';
							}
							$v['cleandes'] .= '<li class="ga-item"><div class="ga-name"><i class="fa fa-search" aria-hidden="true" /></i> '.$ctv['ga_name'].'<b title="'.$cleanArr['from'].'产品数据">['.$ctv['pro_count'].'个]</b></div><ul class="ga-items">'.$prostpl.'</ul><div class="clear"></div></li>';
						}
						$v['cleandes'] .= '</ul>';
					}else{//其他数据源
						$v['cleandes'] .= '<ul class="pro-list">';
						foreach($cleanArr['pros'] as $tpk=>$tpv){
							$valkey = $cleanArr['from'].'@'.$tpv['pro_id'];
							$prochk = (empty($v['chkok']) && $tpk === 0) || (!empty($v['chkok']) && $v['chkok'] == $valkey)? ' checked': '';
							if($v['chkok'] == $valkey){
								$v['chkpro_url'] = $tpv['pro_url'];
								$v['captions']['chkok'] = '<a href="'.$tpv['pro_url'].'" target="blank">'.$tpv['num'][0]['factory'].': '.$tpv['num'][0]['display'].'</a>';
								$prochk .= ' haschkok="1"';
							}
							if($cleanArr['from'] == 'etk') $tpv['pro_name'] = $tpv['grp1_name'].' - '.$tpv['grp2_name'].'<br>'.$tpv['pro_name'];
							$v['cleandes'] .= '<li><div>'.$tpv['pro_name'].'</div><label><input type="radio" name="pro['.$v['wdi_id'].']" value="'.$valkey.'"'.$prochk.'> <span>'.$tpv['num'][0]['factory'].'</span></label>: <a href="'.$tpv['pro_url'].'" target="blank">'.$tpv['num'][0]['display'].'</a></li>';
						}
						$v['cleandes'] .= '</ul>';
					}
					//$v['cleandes'] .= '</div></div>';
					$v['cleandes'] .= '</div>';
				}
				
				$colvals = json_decode($v['wdi_data'], true);
				foreach($wdlCols['cols'] as $colk=>$col){
					if(stripos($col['type'], 'Image') === 0 && !empty($colvals[$colk])){
						$v['col_'.$colk] = '<img src="'.\mvc::$cfg['urls']['outfiles'].'/'.$colvals[$colk].'" style="max-width:100px;max-height:50px;"/>';
					}else{
						$v['col_'.$colk] = $colvals[$colk];
					}
				}
				unset($v['wdi_data']);
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	function cleanWorkData($req)
	{
		$wdiIds = [];
		if(!empty($req['ids'])){
			$wdiIds = explode(',', $req['ids']);
		}else if(!empty($req['wdlist_id'])){
			$wdiIds = $this->db->select('work_data_item', 'wdi_id', ['wdi_wdlist_id'=>explode(',', $req['wdlist_id'])]);
		}
		foreach($wdiIds as $wdi_id){
			$this->cleanDataItem($wdi_id);
		}
		return [];
	}


	//清洗单条数据
	public function cleanDataItem($wdi_id)
	{
		$arr = [];
		$join = [
			"[>]pro_cate(cat)" => ["wdi.wdi_cat_id"=>"id"]
		];
		$wdiArr = $this->db->get('work_data_item(wdi)', $join, ['wdi.*', 'cat.cn_name(cat_cn_name)', 'cat.en_name(cat_en_name)', 'cat_tcdfac'], ['wdi_id'=>$wdi_id]);
		if(empty($wdiArr)) return $arr;
		
		$ypApi = new ypApi();
		$carmodel = new carmodel();
		$collocation = new collocation();
		
		//已有号码
		$join = [
			"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
		];
		$nums = $this->db->select('work_data_item_format', $join, ['pf_name(factory)', 'wdif_search(number)'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdi_id]);	

		//检测产品库
		$join = [
			"[><]pro_numidx(pn)" => ["wdif.wdif_pf_id"=>"pn_pf_id", "wdif.wdif_search"=>'pn_formart'],
			"[><]pro(pro)" => ["pn.pn_p_id"=>"p_id"],
		];
		$hasPro = $this->db->select('work_data_item_format(wdif)', $join, ['p_id', 'p_cate'], ['p_pb_id'=>1, 'wdif_wdi_id'=>$wdiArr['wdi_id'], 'GROUP'=>'pn_p_id']);

		//宜配检测
		$apiPost = [
			'number'=>json_encode($nums, JSON_UNESCAPED_UNICODE),
			'facseq'=>$wdiArr['cat_tcdfac'],
			'ganame'=>$wdiArr['cat_cn_name'].','.$wdiArr['cat_en_name']
		];
		
		$chkres = $ypApi->Get('tcd/checkNumberData', [], $apiPost);
		$chkdata = $chkres['status']? $chkres['data']: [];

		$setArr = [
			'wdi_clean'=>1,	
			'wdi_clean_has'=>empty($chkdata)? -1: 1,	
			'wdi_clean_result'=>json_encode($chkdata, JSON_UNESCAPED_UNICODE),
			'wdi_clean_time'=>getNowTime()
		];

		//填补分类或者确认首产品
		if(!empty($hasPro)){
			if(empty($wdiArr['wdi_cat_id'])){
				$setArr['wdi_cat_id'] = $hasPro[0]['p_cate'];
				$wdiArr['wdi_cat_id'] = $setArr['wdi_cat_id'];
			}
			if(empty($wdiArr['wdi_chkpro_id'])){
				$setArr['wdi_chkpro_from'] = 'self';
				$setArr['wdi_chkpro_id'] = $hasPro[0]['p_id'];
				$wdiArr['wdi_chkpro_id'] = $setArr['wdi_chkpro_id'];
			}
		}
		
		//确认为第一个产品
		if(!empty($chkdata)){
			if(empty($wdiArr['wdi_cat_id'])){
				$catename = $chkdata['from'] == 'tcd'? $chkdata['ga_chk'][0]['ga_name']: $chkdata['ga_chk'][0]['pro_name'];
				$cate = new cate();
				$tid = $cate->eqname($catename);
				if(!empty($tid)){
					$setArr['wdi_cat_id'] = $tid;
					$wdiArr['wdi_cat_id'] = $setArr['wdi_cat_id'];
				}
			}
			if(empty($wdiArr['wdi_chkpro_id'])){
				$setArr['wdi_chkpro_from'] = $chkdata['from'];
				if($chkdata['from'] == 'tcd'){
					$tpv = $chkdata['ga_chk'][0]['pros'][0];
					
					$tpv['from'] = 'tcd';
					$setArr['wdi_chkpro_id'] = $tpv['pro_id'];
					$setArr['wdi_chkpro_info'] = json_encode($tpv, JSON_UNESCAPED_UNICODE);

				}else{
					$tpv = $chkdata['pros'][0];
					$tpv['from'] = $chkdata['etk'];
					$setArr['wdi_chkpro_id'] = $tpv['pro_id'];
					$setArr['wdi_chkpro_info'] = json_encode($tpv, JSON_UNESCAPED_UNICODE);
				}
				$wdiArr['wdi_chkpro_id'] = $setArr['wdi_chkpro_id'];
			}
		}
		$this->db->update('work_data_item', $setArr, ['wdi_id'=>$wdiArr['wdi_id']]);
		return [];
	}


	//数据工单转产品工单
	function workItemToOeItem($req, $woe_id = 0)
	{
		if(empty($req['ar_id'])) return exitJson(0,'任务角色不存在');
		$ar_id = $req['ar_id'];
		if($req['ids']){
			$where = ['wdi_id'=>explode(',', $req['ids']), 'GROUP'=>'wdi_id'];
		}else{
			$where = ['wdi_wdlist_id'=>explode(',', $req['wdlist_id']), 'GROUP'=>'wdi_id'];
		}
		//OE、品类是否存在
		$rows = $this->db->select('work_data_item(wdi)', ["[><]work_data_list(wdl)" => ["wdi.wdi_wdlist_id" => "wdlist_id"]], ['wdi_id', 'wdi_wdlist_id', 'wdlist_seq', 'wdi_cat_id', 'wdi_oe_format', 'wdi_oe'], $where);
		$chkmsg = [];
		$items = [];
		foreach($rows as $v){
			$tmsg = [];
			if(empty($v['wdi_cat_id'])) $tmsg[] = '品名必填';
			if(empty($v['wdi_oe_format'])) $tmsg[] = 'OE必填';
			//此OE是否已经存
			$exists = $this->db->get('work_oe_item', 'woi_id', ['woi_wdi_id'=>$v['wdi_id']]);
			if($exists){
				//$tmsg[] = '产品单已存在';
				continue;
			}
			if($tmsg) $chkmsg[] = '数据单：'.$v['wdlist_seq'].' 明细ID: '.$v['wdi_id'].'=>'.implode('、', $tmsg);
			$items[$v['wdi_wdlist_id']][] = $v;
		}
		if(!empty($chkmsg)) exitJson(implode('<br>', $chkmsg));
		
		$opuser = getOpuser();
		$datetime = getNowTime();

		$this->db->Begin();
		foreach($items as $wdlist_id=>$ivs){
			//是否转过单
			$towoe_id = $woe_id;
			if(empty($towoe_id)){
				$towoe_id = $this->db->get('work_oe', 'woe_id', ['woe_wdlist_id'=>$wdlist_id]);
			}
			if(empty($towoe_id)){
				$add = [
					'woe_wdlist_id'=>$wdlist_id,
					'woe_remark'=>'',
					'woe_opuser'=>$opuser,	
					'woe_create_time'=>$datetime,	
					'woe_update_time'=>$datetime,		
				];
				$this->db->insert('work_oe', $add);
				$towoe_id = $this->db->id();
			}
			foreach($ivs as $v){
				$nums = [];
				$join = [
					"[>]pro_factory(fac)" =>["wdif.wdif_pf_id" =>"pf_id"]
				];
				$rows = $this->db->select('work_data_item_format(wdif)', $join, ['pf_name', 'wdif_val'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$v['wdi_id']]);
				foreach($rows as $vv){
					$nums[] = $vv['pf_name'].':'.$vv['wdif_val'];
				}
				$set = [
					'woi_woe_id'=>$towoe_id,
					'woi_wdi_id'=>$v['wdi_id'],
					'woi_oe'=>$v['wdi_oe'],
					'woi_oe_format'=>$v['wdi_oe_format'],
					'woi_cate_id'=>$v['wdi_cat_id'],
					'woi_idx_nums'=>implode('; ', $nums),
					'woi_ar_id'=>$ar_id,
					'woi_create_time'=>$datetime,
					'woi_update_time'=>$datetime,
					'woi_opuser'=>$opuser
				];
				$this->db->insert('work_oe_item', $set);
			}
		}
		$this->db->End();
		return [];
	}


	//数据工单转询源单
	function workItemToAskItem($req, $was_id = 0)
	{
		if(empty($req['ar_id'])) return exitJson(0,'任务角色不存在');
		$ar_id = $req['ar_id'];
		
		if($req['ids']){
			$where = ['wdi_id'=>explode(',', $req['ids'])];
		}else{
			$where = ['wdi_wdlist_id'=>explode(',', $req['wdlist_id'])];
		}
		//OE、品类是否存在
		$rows = $this->db->select('work_data_item(wdi)', ["[><]work_data_list(wdl)" => ["wdi.wdi_wdlist_id" => "wdlist_id"]], ['wdi_id', 'wdi_chkpro_from', 'wdi_chkpro_id', 'wdi_wdlist_id', 'wdlist_seq', 'wdi_cat_id', 'wdi_oe_format', 'wdi_oe', 'wdi_chkpro_from', 'wdi_chkpro_id', 'wdi_chkpro_info'], $where);
		$items = [];
		$chkmsg = [];
		foreach($rows as $v){
			$tmsg = [];
			/*if(empty($v['wdi_cat_id'])) $tmsg[] = '品名必填';
			if(empty($v['wdi_oe_format'])) $tmsg[] = 'OE必填';
			if($v['wdi_chkpro_from'] == 'self' && $v['wdi_chkpro_id']){
			}else{
				$tmsg[] = '请先确认[产品库]数据源';
			}*/
			//此OE是否已经存
			$exists = $this->db->get('work_ask_item', 'wai_id', ['wai_wdi_id'=>$v['wdi_id']]);
			if($exists){
				continue;
				//$tmsg[] = '询源单已存在';
			}
			//if($tmsg) $chkmsg[] = '数据单：'.$v['wdlist_seq'].' 明细ID: '.$v['wdi_id'].'=>'.implode('、', $tmsg);
			$items[$v['wdi_wdlist_id']][] = $v;
		}
		if(!empty($chkmsg)) exitJson(implode('<br>', $chkmsg));
		
		$opuser = getOpuser();
		$datetime = getNowTime();
		$this->db->Begin();
		foreach($items as $wdlist_id=>$ivs){
			//是否转过单
			$towas_id = $was_id;
			if(empty($towas_id)){
				$towas_id = $this->db->get('work_ask', 'was_id', ['was_wdlist_id'=>$wdlist_id]);
			}

			if(empty($towas_id)){
				$add = [
					'was_wdlist_id'=>$wdlist_id,
					'was_remark'=>'',
					'was_opuser'=>$opuser,	
					'was_create_time'=>$datetime,	
					'was_update_time'=>$datetime,		
				];
				$this->db->insert('work_ask', $add);
				$towas_id = $this->db->id();
			}
			foreach($ivs as $v){
				$nums = [];
				$join = [
					"[>]pro_factory(fac)" =>["wdif.wdif_pf_id" =>"pf_id"]
				];
				$rows = $this->db->select('work_data_item_format(wdif)', $join, ['pf_name', 'wdif_val'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$v['wdi_id']]);
				foreach($rows as $vv){
					$nums[] = $vv['pf_name'].':'.$vv['wdif_val'];
				}
				$set = [
					'wai_was_id'=>$towas_id,
					'wai_wdi_id'=>$v['wdi_id'],
					'wai_oe'=>$v['wdi_oe'],
					'wai_oe_format'=>$v['wdi_oe_format'],
					'wai_cate_id'=>$v['wdi_cat_id'],
					'wai_ar_id'=>$ar_id,
					'wai_create_time'=>$datetime,
					'wai_update_time'=>$datetime,
					'wai_opuser'=>$opuser
				];
				$this->db->insert('work_ask_item', $set);
			}
		}
		$this->db->End();
		return [];
	}



	//提取确认产品的数据
	function cleanWorkChkOkPro($req)
	{
		$wdiIds = [];
		if(!empty($req['ids'])){
			$wdiIds = explode(',', $req['ids']);
		}else if(!empty($req['wdlist_id'])){
			$wdiIds = $this->db->select('work_data_item', 'wdi_id', ['wdi_wdlist_id'=>explode(',', $req['wdlist_id'])]);
		}
		foreach($wdiIds as $wdi_id){
			$this->cleanDataItemChkOk($wdi_id);
		}
		return [];
	}

	public function setCate($table, $idArr, $cate_id)
	{
		if(empty($idArr) || !is_array($idArr)) return [];
		if($table == 'work_data_item'){
			$this->db->update('work_data_item', ['wdi_cat_id'=>$cate_id], ['wdi_id'=>$idArr]);
		}else if($table == 'work_wdi_id_item'){
			$this->db->update('work_oe_item', ['woi_cate_id'=>$cate_id], ['woi_id'=>$idArr]);
		}else if($table == 'work_ask_item'){

			$arr = $this->db->select('work_ask_item','wai_id',['wai_id'=>$idArr]);
			if($arr){
				$this->db->update('work_ask_item', ['wai_cate_id'=>$cate_id], ['wai_id'=>$arr]);
			}
			
		}
		return [];
	}

	//修改
	public function setCell($table, $kid, $setArr)
	{
		$opuser = getOpuser();
		$datetime = getNowTime();
		if($table == 'work_data_list'){
			$setArr['wdlist_opuser'] = $opuser;
			$setArr['wdlist_update_time'] = $datetime;
			$this->db->update('work_data_list', $setArr, ['wdlist_id'=>$kid]);
		}else if($table == 'work_ask_item'){
			$setArr['wai_opuser'] = $opuser;
			$setArr['wai_update_time'] = $datetime;

			//编辑OE
			if(isset($setArr['wai_oe'])){
				$join = [
					"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
				];
				$wai_wdi_id = $this->db->get('work_ask_item','wai_wdi_id',['wai_id'=>$kid]);
				if(!$wai_wdi_id) return exitJson(0,'该明细不存在');
				
				$rows = $this->db->select('work_data_item_format', $join, 'wdif_val', ['wdif_type'=>'Number', 'pf_type'=>'OE','wdif_wdi_id'=>$wai_wdi_id]);

				if(!in_array($setArr['wai_oe'],$rows)) return exitJson(0,'该OE号不存在，请填写号码列表中的OE号');

				$setArr['wai_oe_format'] = formatNum($setArr['wai_oe']);
			}
			/*if(isset($setArr['pc_innum'])){
				if($setArr['pc_innum']){
					$codeinfo = $this->db->get('p_code',['pc_id','pc_cate'],['pc_pb_id'=>1,'pc_innum'=>$setArr['pc_innum']]);

					if(!$codeinfo) return exitJson(0,'物料编码不存在');

					$setArr['wai_p_id'] = $codeinfo['pc_id'];
					$setArr['wai_cate_id'] = $codeinfo['pc_cate'];
				}else{
					$setArr['wai_p_id'] = 0;
				}
				unset($setArr['pc_innum']);
			}*/
			if(isset($setArr['sup_name'])){
				$setArr['wai_sup_id'] = $setArr['sup_name'];
				unset($setArr['sup_name']);
			}
			if(isset($setArr['sup_name2'])){
				$setArr['wai_bsup_id'] = $setArr['sup_name2'];
				unset($setArr['sup_name2']);
			}

			$this->db->update('work_ask_item', $setArr, ['wai_id'=>$kid]);
		}elseif ($table == 'work_oe') {
			$setArr['woe_opuser'] = $opuser;
			$setArr['woe_update_time'] = $datetime;
			$this->db->update('work_oe', $setArr, ['woe_id'=>$kid]);
		}elseif ($table == 'work_ask') {
			$setArr['was_opuser'] = $opuser;
			$setArr['was_update_time'] = $datetime;
			$this->db->update('work_ask', $setArr, ['was_id'=>$kid]);
		}
		return [];
	}


	//删除
	public function delData($table, $idArr)
	{
		if(empty($idArr) || !is_array($idArr)) return [];
		$delfiles = [];
		$this->db->Begin();
		if($table == 'work_data_list'){
			//删除工单
			$sonids = $this->db->select('work_data_item', 'wdi_id', ['wdi_wdlist_id'=>$idArr]);
			if($sonids){
				$rows = $this->db->select('work_data_item_format', 'wdif_val', ['wdif_wdi_id'=>$sonids,'wdif_type'=>['Image', 'Image2']]);
				foreach($rows as $img){
					$delfiles[] = \mvc::$cfg['dir']['files'].'/'.$img;
				}
				$this->db->delete('work_data_item_format', ['wdif_wdi_id'=>$sonids]);	
			}
			$this->db->delete('work_data_item', ['wdi_wdlist_id'=>$idArr]);
			$this->db->delete('work_data_list', ['wdlist_id'=>$idArr]);

		}else if($table == 'work_data_item'){
			//工单数据项
			$rows = $this->db->select('work_data_item_format', 'wdif_val', ['wdif_wdi_id'=>$idArr,'wdif_type'=>['Image', 'Image2']]);
			foreach($rows as $img){
				$delfiles[] = \mvc::$cfg['dir']['files'].'/'.$img;
			}
			$this->db->delete('work_data_item_format', ['wdif_wdi_id'=>$idArr]);
			$this->db->delete('work_data_item', ['wdi_id'=>$idArr]);
		}else if($table == 'work_data_item_format'){
			$this->db->delete('work_data_item_format', ['wdif_id'=>$idArr]);
		}else if($table == 'work_oe'){
			//产品单
			$this->db->delete('work_oe', ['woe_id'=>$idArr]);
			$this->db->delete('work_oe_item', ['woi_woe_id'=>$idArr]);
		}else if($table == 'work_oe_item'){
			//产品单数据项
			$this->db->delete('work_oe_item', ['woi_id'=>$idArr]);
		}else if($table == 'work_ask'){
			//询源单
			$this->db->delete('work_ask', ['was_id'=>$idArr]);
			$this->db->delete('work_ask_item', ['wai_was_id'=>$idArr]);
		}else if($table == 'work_ask_item'){
			//询源单数据项
			$this->db->delete('work_ask_item', ['wai_id'=>$idArr]);
		}
		$this->db->End();
		foreach($delfiles as $del){
			//@unlink($del);
		}
		return [];
	}


	function saveDataItemChkPro($dataArr)
	{
		$this->db->Begin();
		foreach($dataArr as $row){
			$t = explode('@', $row['value']);
			$setArr = [
				'wdi_chkpro_from'=>$t[0]? $t[0]: '',
				'wdi_chkpro_id'=>$t[0] && $t[1]? $t[1]: '',
				'wdi_opuser'=>getOpuser(),
				'wdi_update_time'=>getNowTime(),
			];
			if($setArr['wdi_chkpro_from'] == 'self'){
				$setArr['wdi_chkpro_info'] = '[]'; 
			}else{
				//第三方确认数据的信息
				$clean_result = $this->db->get('work_data_item', 'wdi_clean_result', ['wdi_id'=>$row['kid']]);
				$cleanArr = empty($clean_result) ? []: json_decode($clean_result, true);
				if($cleanArr['from'] == $setArr['wdi_chkpro_from']){	
					if($setArr['wdi_chkpro_from'] == 'tcd'){
						foreach($cleanArr['ga_chk'] as $ctk=>$ctv){
							foreach($ctv['pros'] as $tpk=>$tpv){
								if($tpv['pro_id'] == $setArr['wdi_chkpro_id']){
								
									$tpv['from'] = $setArr['wdi_chkpro_from'];
									$setArr['wdi_chkpro_info'] = json_encode($tpv, JSON_UNESCAPED_UNICODE);
									break;
								}
							}
						}
					}else{
						foreach($cleanArr['pros'] as $tpk=>$tpv){
							if($cleanArr['from'] == $setArr['wdi_chkpro_from'] && $tpv['pro_id'] == $setArr['wdi_chkpro_id']){
								$tpv['from'] = $setArr['wdi_chkpro_from'];
								$setArr['wdi_chkpro_info'] = json_encode($tpv, JSON_UNESCAPED_UNICODE);
								break;
							}
						}
					}
				}
			}
			$this->db->update('work_data_item', $setArr, ['wdi_id'=>$row['kid']]);
		}
		$this->db->End();
		return [];
	}



	//数据工单流水
	function getWorkSeqNext(){
        $fix = date('Ymd');
        return $this->getSeqNext('work_data_list', $fix,'wdlist_seq',4);
	}


	/**
	 * 取下一个序列号
     * @param string $fix 前缀
     * @param string $field 字段
     * @param string $lengh 流水号长度
	 * @return string
	 */
	function getSeqNext($table, $fix,$field,$lengh=4){
        $where[$field.'[=~]'] = $fix;
        $where['ORDER'][$field] ='DESC';
        $value = $this->db->get($table,$field,$where);
        if(!empty($value)){
            $value = ltrim(substr($value,-$lengh),'0') + 1;
            $value = $fix.str_pad($value,$lengh,'0',STR_PAD_LEFT);
        }else{
            $value = $fix.str_pad('1',$lengh,'0',STR_PAD_LEFT);
        }
        return $value;
	}
	
	//产品录入工单明细
	public function getOeDetail($woi_id)
	{
		$data = $this->getOeItemList(['woi_id'=>$woi_id]);
		if(empty($data['rows'])) exitJson('记录不存在');
		$arr =$data['rows'][0];
		$arr['cleans'] = empty($arr['woi_clean_result'])? []:json_decode($arr['woi_clean_result'], true);
		$arr['woi_clean_by'] = empty($arr['woi_clean_by'])? []:json_decode($arr['woi_clean_by'], true);
		$arr['cleans_chk'] = empty($arr['woi_clean_chk'])? []:json_decode($arr['woi_clean_chk'], true);
		$carmodel = new carmodel();
		foreach(['model', 'model_oknum'] as $type){
			if(!empty($arr['cleans'][$type])){
				$has = array_column($arr['cleans'][$type], null, 'mm_id');
				$res = $carmodel->getModel(['mm_ids'=>array_unique(array_column($arr['cleans'][$type], 'mm_id'))]);
				$merge = [];
				foreach($res['models'] as $k=>$v){
					if($has[$v['mm_id']]){
						$v = array_merge($v, $has[$v['mm_id']]);
					}
					$merge[] = $v;
				}
				$arr['cleans'][$type] = $merge;
			}
		}
		return $arr;
	}


	public function getOeList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? 'woe_id': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

		$table = 'work_oe(woe)';
		$join = [
			"[>]work_data_list(wdl)" => ["woe.woe_wdlist_id" => "wdlist_id"]
		];
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			switch ($field) {
				case 'ar_name':
					$field = 'RAW #ar_name';
					$data = raw(sprintf(" woe_id IN (select distinct woi_woe_id from work_oe_item join adm_role on woi_ar_id=ar_id where ar_name like '%%%s%%')",$data));
					break;
			}
        });
		if(!empty($params['keys'])) $where['woe_id'] = explode(',', $params['keys']);
		if(!empty($params['woe_id'])) $where['woe_id'] = explode(',', $params['woe_id']);
		if(isset($params['woe_status'])) $where['woe_status'] = $params['woe_status'];

		if(!\p::isAdmin()){
			$user = new user();
			$where['woi_ar_id'] = $user->getMyPowerRole('A400');
			$join["[><]work_oe_item(woi)"] = ["woe.woe_id" => "woi_woe_id"];
		}
		$where['GROUP'] = 'woe_id';
        $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];
		}
		if(!empty($params['wdlist_id'])) $where['woe_wdlist_id'] = $params['wdlist_id'];
		$fields = ['wdlist_id', 'wdlist_seq', 'woe.*'];
        $arr = $this->db->select($table,$join,$fields,$where);
		if($arr){
			$ids = array_column($arr, 'woe_id');
			$rows = $this->db->select('work_oe_item', ['woi_woe_id', 'item_count'=>raw('count(*)'), 'clean_count'=>raw('(sum(case when woi_clean = 1 then 1 else 0 end))'), 'clean_has_count'=>raw('(sum(case when woi_clean_has = 1 then 1 else 0 end))'), 'chkpro_count'=>raw('(sum(case when ck1 > 0 then 1 else 0 end))')], ['woi_woe_id'=>$ids, 'GROUP'=>'woi_woe_id']);
			$tj = array_column($rows, null, 'woi_woe_id');

			$roleArr = $this->db->select('work_oe_item',['[><]adm_role'=>['woi_ar_id'=>'ar_id']],['woi_woe_id','ar_name'=>raw('GROUP_CONCAT(DISTINCT ar_name)')],['woi_woe_id'=>$ids,'GROUP'=>'woi_woe_id']);
			$roleArr = array_column($roleArr,null,'woi_woe_id');
			foreach($arr as &$v){
				if($tj[$v['woe_id']]) $v = array_merge($v, $tj[$v['woe_id']]);

				$v['ar_name'] = $roleArr[$v['woe_id']]?$roleArr[$v['woe_id']]['ar_name']:'';
				// $v['captions']['clean_count'] = $v['clean_count']? sprintf("%d [%d%%]", $v['clean_count'], $v['clean_count']/$v['item_count']*100): '';
				// $v['captions']['clean_has_count'] = $v['clean_has_count']? sprintf("%d [%d%%]", $v['clean_has_count'], $v['clean_has_count']/$v['item_count']*100): '';
				// $v['captions']['chkpro_count'] = $v['chkpro_count']? sprintf("%d [%d%%]", $v['chkpro_count'], $v['chkpro_count']/$v['item_count']*100): '';
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	public function getOeItemList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? 'woi_id': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$table = 'work_oe_item(woi)';
		$join = [
			"[><]work_oe(woe)" => ["woi.woi_woe_id" => "woe_id"],
			"[><]pro_cate(cat)" => ["woi.woi_cate_id" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[>]m_make(mk)" => ["woi.woi_mk_id" => "mk_id"],
			"[>]work_data_item(wdi)" => ["woi.woi_wdi_id" => "wdi_id"],
			"[>]work_data_list(wdl)" => ["wdi.wdi_wdlist_id" => "wdlist_id"],
			"[>]adm_role(ar)" => ["woi.woi_ar_id" => "ar_id"],
		];
		
		$this->set('pnumwhere', []);
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
        });
		
		foreach($rules as $filed=>$val){
			if(empty($val)) continue;
			switch($filed){
				case 'p_cate': $where['woi_cate_id'] = explode(',', $rules['p_cate']); break;
			}
		}

		if(!empty($params['keys'])) $where['woi_id'] = explode(',', $params['keys']);
		if(!empty($params['woi_id'])) $where['woi_id'] = $params['woi_id'];
		if(!empty($params['woe_id'])) $where['woe_id'] = $params['woe_id'];
		if(!empty($params['wdlist_id'])) $where['woe_wdlist_id'] = $params['wdlist_id'];
		
		if(!\p::isAdmin()){
			$user = new user();
			$where['woi_ar_id'] = $user->getMyPowerRole('A400');
		}

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)', 'mk.mk_'.LG_NAME.'(mk_name)', 'wdl.wdlist_seq', 'woe.*', 'woi.*','ar.ar_name'];
        $arr = $this->db->select($table,$join,$fields,$where);
		if(!empty($arr)){
			$collocation = new collocation();
			$collArr = $collocation->getCollItems('work');

			$wdiIds = array_column($arr, 'woi_wdi_id');
			$join = [
				"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
			];
			$rows = $this->db->select('work_data_item_format', $join, ['wdif_wdi_id', 'wdif_id', 'pf_name', 'wdif_val'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdiIds]);
			$nums = [];
			foreach($rows as $rv){
				$nums[$rv['wdif_wdi_id']][] = ['wdif_id'=>$rv['wdif_id'], 'factory'=>$rv['pf_name'], 'number'=>$rv['wdif_val']];  
			}
			foreach($arr as &$v){
				$v['nums'] = $nums[$v['woi_wdi_id']]? $nums[$v['woi_wdi_id']]: [];
				$v['captions'] = [
					'woi_mk_id'=>$v['mk_name'],
					'woi_item_type'=>!empty($collArr[$v['woi_item_type']])? $collArr[$v['woi_item_type']]: '',
					'woi_unit'=>!empty($collArr[$v['woi_unit']])? $collArr[$v['woi_unit']]: '',
					'woi_fuel'=>!empty($collArr[$v['woi_fuel']])? $collArr[$v['woi_fuel']]: '',
					'woi_progroup'=>!empty($collArr[$v['woi_progroup']])? $collArr[$v['woi_progroup']]: '',
				];
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	
	//清洗数据
	public function cleanOeData($idArr, $stype)
	{
		if(!empty($idArr)){
			$join = [
				"[><]pro_cate(cat)" => ["woi_cate_id" => "id"]
			];
			$rows = $this->db->select('work_oe_item', $join, '*', ['woi_id'=>$idArr]);
			$ypApi = new ypApi();
			$carmodel = new carmodel();
			$collocation = new collocation();
			foreach($rows as $row){
				$row['woi_clean_chk'] = $row['woi_clean_chk'] ? json_decode($row['woi_clean_chk'], true): [];
				$apiPost = [
					'number'=>$row['woi_oe'],
					'facseq'=>$row['cat_tcdfac'],
					'rate_number'=>$row['cat_rate_number'],
					'rate_model'=>$row['cat_rate_model'],
				];
				//来自工单的产品单，是否有确认TCD产品
				$join = ["[><]work_data_item" => ["woi_wdi_id" => "wdi_id"]];
				$from_pro_id = $this->db->get('work_oe_item', $join, 'wdi_chkpro_id', ['wdi_chkpro_from'=>'tcd', 'woi_id'=>$row['woi_id']]);
				if($from_pro_id){
					$apiPost['art_id'] = $from_pro_id;
					unset($apiPost['number']);
				}
				$chkres = $ypApi->Get('tcd/cleanData', [], $apiPost);
				$chkdata = $chkres['status']? $chkres['data']: [];
				
				//typ_id 转 mm_id
				foreach(['model', 'model_oknum'] as $type){
					if(empty($chkdata[$type])) continue;
					$typids = array_column($chkdata[$type], 'typ_id');
					$tvals = $this->db->select('m_model', ['mm_yptyp_id', 'mm_id'], ['mm_yptyp_id'=>$typids]);
					$typTomm = array_column($tvals, 'mm_id', 'mm_yptyp_id');
					foreach($chkdata[$type] as $tk=>$tv){
						$chkdata[$type][$tk]['mm_id'] = (int) $typTomm[$tv['typ_id']];
					}
				}

				$setArr = [
					'woi_clean'=>1,	
					'woi_clean_has'=>empty($chkdata)? -1: 1,	
					'woi_clean_result'=>json_encode($chkdata, JSON_UNESCAPED_UNICODE),
					'woi_clean_by'=>json_encode($apiPost, JSON_UNESCAPED_UNICODE),
					'woi_clean_time'=>getNowTime()
				];

				//填充简单清晰的缺失数据
				if(!empty($chkdata['pro'])){
					if($row['woi_clean_chk']['art_id'] != $chkdata['pro']['art_id']){
						$setArr['woi_clean_chk'] = '[]'; 
					}

					if(empty($row['woi_cn_name']) && !empty($chkdata['pro']['ga_name_cn'])) $setArr['woi_cn_name'] = $chkdata['pro']['ga_name_cn'];
					if(empty($row['woi_en_name']) && !empty($chkdata['pro']['ga_name'])) $setArr['woi_en_name'] = $chkdata['pro']['ga_name'];
					if(empty($row['woi_py_name']) && !empty($chkdata['pro']['ga_name'])) $setArr['woi_py_name'] = $chkdata['pro']['ga_name'];
					//底盘 车型  品牌
					if(!empty($chkdata['ok_typids'])){
						$modArr = $carmodel->getModel(['typ_id'=>$chkdata['ok_typids']]);
						if(!empty($modArr['models'])){
							$uniVal = [];
							foreach($modArr['models'] as $tv){
								foreach(['mk_id', 'mm_year_from', 'year_from', 'year_to', 'mm_engine', 'mm_fuel', 'mm_cc', 'ms_chassis', 'ms_minname'] as $filed){
									$val = $tv[$filed];
									if($val === '') continue;
									if(!isset($uniVal[$filed])) $uniVal[$filed] = [];
									if($filed == 'ms_chassis'){
										$uniVal[$filed] = array_merge($uniVal[$filed], explode(',', $val));
									}else{
										$uniVal[$filed][] = $val;
									}
								}
							}
							
							foreach($uniVal as $tf=>$vals){
								$vals = array_unique($vals);
								sort($vals);
								if(in_array($tf, ['mk_id', 'year_from', 'year_to', 'mm_fuel'])){
									$uniVal[$tf] = $vals;
								}else{
									$uniVal[$tf] = implode(',', $vals);
								}
							}
							
	
							if(empty($row['woi_mk_id'])) $setArr['woi_mk_id'] = $uniVal['mk_id'][0];
							if(empty($row['woi_cn_model'])) $setArr['woi_cn_model'] = $uniVal['ms_minname'];
							if(empty($row['woi_en_model'])) $setArr['woi_en_model'] = $uniVal['ms_minname'];
							if(empty($row['woi_py_model'])) $setArr['woi_py_model'] = $uniVal['ms_minname'];
							if(empty($row['woi_chassis'])) $setArr['woi_chassis'] = $uniVal['ms_chassis'];
							if(empty($row['woi_model_year_range'])){
								$setArr['woi_model_year_range'] = (in_array(0, $uniVal['year_from'])? '': $uniVal['year_from'][0]).'-'.(in_array(0, $uniVal['year_to'])? '': $uniVal['year_to'][count($uniVal['year_to'])-1]);
							}
							//is_engine 类别是发动机相关
							if($row['cat_tcdfac']){
								if(empty($row['woi_engine'])) $setArr['woi_engine'] = $uniVal['mm_engine'];
								if(empty($row['woi_cc'])) $setArr['woi_cc'] = $uniVal['mm_cc'];
								if(empty($row['woi_fuel'])){
									foreach($uniVal['mm_fuel'] as $xvv){
										$oid = $collocation->getOidByName($xvv, 5);
										if($oid){
											$setArr['woi_fuel'] = $oid;
											break;
										}
									}
								}
							}
						}
					}
				}
				$this->db->update('work_oe_item', $setArr, ['woi_id'=>$row['woi_id']]);
			}
		}
		return [];
	}

	//产品录入工单明细修改
	public function setOeCell($kid, $setArr)
	{
		if(!empty($kid) && !empty($setArr))
		{
			$ignoreFileds = ['woi_woe_id', 'woi_oe','woi_create_time'];
			$old = $this->db->get('work_oe_item', '*', ['woi_id'=>$kid]);
			if(empty($old)) exitJson('记录不存在');

			$this->db->Begin();
			foreach($setArr as $filed=>$val){
				if(in_array($filed, $ignoreFileds) || stripos($filed, 'woi_') !== 0){
					unset($setArr[$filed]);
					continue;
				}
			}
			if(!empty($setArr)){
				$opuser = getOpuser();
				$datetime = getNowTime();
				$setArr['woi_opuser'] = $opuser;
				$setArr['woi_update_time'] = $datetime;
				$check = new \model\check();
				$exists = $check->checkExist('work_oe_item', $setArr, $kid);
				if(!empty($exists)) exitJson('记录已存在');
				$this->db->update('work_oe_item', $setArr, ['woi_id'=>$kid]);
			}
			$this->db->End();
		}
		return [];
	}

	public function saveOeDetail($woi_id, $dataArr)
	{
		$arr = [];
		$this->db->Begin();
		$setArr = [];
		if(!empty($dataArr['base'])) $setArr = $dataArr['base'];
		if(!empty($dataArr['qingxi'])) $setArr['woi_clean_chk'] = json_encode($dataArr['qingxi'], JSON_UNESCAPED_UNICODE);
		if(!empty($setArr)){
			$this->setOeCell($woi_id, $setArr);
		}
		
		$chkArr = [];
		if($dataArr['act'] == 'topro' && $dataArr['to_pid']){
			//追加到产品库
			$arr = $this->checkWorkOeToPro($woi_id, $chkArr, $dataArr['to_pid']);
		}else if($dataArr['act'] == 'oepro'){
			//新增到新增待进入库
			$arr = $this->checkWorkOeToOe($woi_id, $chkArr);
		}
		$this->db->End();
		return $arr;
	}

	//产品录入单审核预检测
	public function oePreCheck($id)
	{
		$woiArr = $this->db->get('work_oe_item', '*', ['woi_id'=>$id]);
		if(!empty($woiArr)){
			$res = $this->getWorkOeFormat($woiArr);
			$uniTempNumArr = $res['uninums'];
			$woiArr['nums'] = $uniTempNumArr;
			$woiArr['model'] = $res['unimodel'];
			if(!empty($woiArr['nums'])){
				
				$numf = array_column($woiArr['nums'], 'on_formart');
				
				$has = [];
				//正式库
				$join = ["[><]pro" => ["pn_p_id" => "p_id"]];
				$rows = $this->db->select('pro_numidx', $join, ['p_id', 'p_innum(show_num)', 'pn_pf_id(pf_id)', 'pn_formart(num_format)'], ['pn_formart'=>$numf, 'p_pb_id'=>1]);
				foreach($rows as $v){
					$has[$v['pf_id'].'@'.$v['num_format']]['pro'][$v['p_id']] = $v;
				}
				//待进入
				$join = ["[><]pro" => ["pnt_p_id" => "p_id"]];
				$rows = $this->db->select('pro_numidx_temp', $join, ['p_id', 'p_innum(show_num)', 'pnt_pf_id(pf_id)', 'pnt_formart(num_format)'], ['pnt_formart'=>$numf, 'p_pb_id'=>1]);
				foreach($rows as $v){
					$has[$v['pf_id'].'@'.$v['num_format']]['pro_temp'][$v['p_id']] = $v;
				}
				
				//OE库
				$join = ["[><]oe_item" => ["on_oe_id" => "oe_id"]];
				$rows = $this->db->select('oe_numidx', $join, ['oe_id', 'oe_oe(show_num)', 'on_pf_id(pf_id)', 'on_formart(num_format)'], ['on_formart'=>$numf]);
				foreach($rows as $v){
					$has[$v['pf_id'].'@'.$v['num_format']]['oe'][$v['oe_id']] = $v;
				}
			
				$rows = $this->db->select('pro_factory', ['pf_id', 'pf_name'], ['pf_id'=>array_unique(array_column($woiArr['nums'], 'on_pf_id'))]);
				$facs = array_column($rows, 'pf_name', 'pf_id');
				$carmodel = new carmodel();
				$sort = [];
				foreach($woiArr['nums'] as $unikey=>$v){
					$v['mk_name'] = '';
					if(!empty($v['on_mk_id'])){
						$oemake = $carmodel->getMakeNames(explode(',', $v['on_mk_id']));
						$v['mk_name'] = implode(',', array_column($oemake, 'mk_name'));
					}
					$v['pf_name'] = $facs[$v['on_pf_id']];
					$v['has'] = $has[$unikey]? $has[$unikey]: [];
					$woiArr['nums'][$unikey] = $v;
					$sort[$unikey] = $v['pf_name'].$v['on_formart']; 
				}
				array_multisort($sort, SORT_ASC, $woiArr['nums']);
			}
			$woiArr['checktype'] = [
				'pro'=>'正式库',	
				'pro_temp'=>'待进入库',	
				'oe'=>'OE库',	
			];
		}
		return $woiArr;
	}


	//审核产品录入单到OE库
	public function checkWorkOeToOe($woi_id, $chkArr = [], $oe_id = 0)
	{
		$woiArr = $this->db->get('work_oe_item', '*', ['woi_id'=>$woi_id]);
		if(empty($woiArr)) exitJson('记录不存在');

		//OE库是否存在
		if(!$oe_id)
		{
			$check = $this->db->get('oe_item', 'oe_id', ['oe_oe_format'=>$woiArr['woi_oe_format']]);
			$oe_id = $check;
		}
		

		
		$cleanArr = empty($woiArr['woi_clean_result'])? []:json_decode($woiArr['woi_clean_result'], true);
		$cleanChkArr = empty($woiArr['woi_clean_chk'])? []:json_decode($woiArr['woi_clean_chk'], true);
		
		$opuser = getOpuser();
		$datetime = getNowTime();
	
		$addbase = [
			'oe_woi_id'=>$woiArr['woi_id'],	
			'oe_oe'=>$woiArr['woi_oe'],	
			'oe_oe_format'=>$woiArr['woi_oe_format'],	
			'oe_item_type'=>$woiArr['woi_item_type'],	
			'oe_cate_id'=>$woiArr['woi_cate_id'],	
			'oe_mk_id'=>$woiArr['woi_mk_id'],	
			'oe_cn_name'=>$woiArr['woi_cn_name'],	
			'oe_en_name'=>$woiArr['woi_en_name'],	
			'oe_py_name'=>$woiArr['woi_py_name'],	
			'oe_en_guige'=>$woiArr['woi_en_guige'],	
			'oe_py_guige'=>$woiArr['woi_py_guige'],	
			'oe_chassis'=>$woiArr['woi_chassis'],	
			'oe_model_year_range'=>$woiArr['woi_model_year_range'],	
			'oe_engine'=>$woiArr['woi_engine'],	
			'oe_cc'=>$woiArr['woi_cc'],	
			'oe_fuel'=>$woiArr['woi_fuel'],	
			'oe_purc_warn'=>$woiArr['woi_purc_warn'],	
			'oe_purc_org'=>$woiArr['woi_purc_org'],	
			'oe_progroup'=>$woiArr['woi_progroup'],	
			'oe_develop_no'=>$woiArr['woi_develop_no'],	
			'oe_inter_develop'=>$woiArr['woi_inter_develop'],	
			'oe_idx_nums'=>$woiArr['woi_idx_nums'],
			'oe_opuser'=>$opuser,
			'oe_update_time'=>$datetime,
		];

		//参数
		if(!empty($cleanArr['para'])){
			$addbase['oe_para'] = json_encode($cleanArr['para'], JSON_UNESCAPED_UNICODE);
		}

		$res = $this->getWorkOeFormat($woiArr);
		$uniTempNumArr = $res['uninums'];
		$modArr = $res['unimodel'];

		//刷中国车型
		$oenums = [$woiArr['woi_oe_format']];
		foreach($uniTempNumArr as $v){
			if($v['on_pf_id'] == 1) $oenums[] = $v['on_formart'];
		}
		$ypApi = new ypApi();
		$res = $ypApi->Get('number/getModelByNumber', ['number'=>implode(',', $oenums)]);
		$mod3Ids = $res['data'];

		$this->db->Begin();

		if($oe_id>0){

			$this->db->update('oe_item', $addbase,["oe_id"=>$oe_id]);

		}else{
			
			$addbase['oe_create_time']=$datetime;
			$this->db->insert('oe_item', $addbase);
			$oe_id = $this->db->id();
		}
		
		$check = new check();

		//入库
		foreach($uniTempNumArr as $add){
			$add['on_oe_id'] = $oe_id;
			$add['on_opuser'] = $opuser;
			$add['on_create_time'] = $datetime;
			$add['on_update_time'] = $datetime;
			$exists = $check->checkExist('oe_numidx', $add);
			if(empty($exists)) $this->db->insert('oe_numidx', $add);	
		}

		foreach($modArr as $add){
			$add['oml_oe_id'] = $oe_id;
			$add['oml_opuser'] = $opuser;
			$add['oml_create_time'] = $datetime;
			$add['oml_update_time'] = $datetime;
			$exists = $check->checkExist('oe_model_link', $add);
			if(empty($exists)) $this->db->insert('oe_model_link', $add);	
		}
		//入中国车型库
		if($mod3Ids)
		{	
			foreach($mod3Ids as $mod3_id){
				$add = [];
				$add['oml_oe_id'] = $oe_id;
				$add['oml_mod3_id'] = $mod3_id;
				$add['oml_opuser'] = $opuser;
				$add['oml_from'] = 100;
				$add['oml_create_time'] = $datetime;
				$add['oml_update_time'] = $datetime;
				$exists = $check->checkExist('oe_model_cn_link', $add);
				if(empty($exists)) $this->db->insert('oe_model_cn_link', $add);	
			}
		}
		
		
		$chkArr['ck1'] = 1;
		$chkArr['ckuser1'] = $opuser;
		$chkArr['cktime1'] = $datetime;
		$chkArr['ckremark1'] = $chkArr['ckremark1']?:'进入OE库';
		$this->db->update('work_oe_item', $chkArr, ['woi_id'=>$woi_id]);

		$this->db->End();
		return ['oe_id'=>$oe_id];
	}


	//审核产品录入单到产品正式库
	public function checkWorkOeToPro($woi_id, $chkArr = [], $p_id)
	{
		$woiArr = $this->db->get('work_oe_item', '*', ['woi_id'=>$woi_id]);
		if(empty($woiArr)) exitJson('记录不存在');

		$proArr = $this->db->get('pro', ['p_id', 'p_innum'], ['p_id'=>$p_id, 'p_pb_id'=>1]);
		if(empty($proArr)) exitJson('产品库记录不存在');

		$res = $this->getWorkOeFormat($woiArr);
		$uniTempNumArr = $res['uninums'];
		$modArr = $res['unimodel'];

		//刷中国车型
		$oenums = [$woiArr['woi_oe_format']];
		foreach($uniTempNumArr as $v){
			if($v['on_pf_id'] == 1) $oenums[] = $v['on_formart'];
		}
		$ypApi = new ypApi();
		$res = $ypApi->Get('number/getModelByNumber', ['number'=>implode(',', $oenums)]);
		$mod3Ids = $res['data'];

		$this->db->Begin();
		$check = new check();
		
		$opuser = getOpuser();
		$datetime = getNowTime();

		$numidx = new numidx();
		foreach($uniTempNumArr as $add){
			$nadd = [
				'pn_p_id'=>$p_id,
				'pn_pf_id'=>$add['on_pf_id'],
				'pn_number'=>$add['on_number'],
				'pn_formart'=>$add['on_formart'],
				'pn_mk_id'=>$add['on_mk_id'],
				'pn_from'=>$add['on_from'],
				'opuser'=>$opuser,
				'create_time'=>$datetime,
				'update_time'=>$datetime
			];
			$exists = $numidx->checkExistTemp($nadd);
			if(empty($exists)) $this->db->insert('pro_numidx', $nadd);	
		}
		
		$promodel = new promodel();
		foreach($modArr as $add){
			$nadd = [
				'pml_p_id'=>$p_id,
				'pml_mm_id'=>$add['oml_mm_id'],
				'pml_para'=>$add['oml_para'],
				'pml_from'=>$add['oml_from'],
				'opuser'=>$opuser,
				'create_time'=>$datetime,
				'update_time'=>$datetime
			];
			$exists = $promodel->checkExist($nadd);
			if(empty($exists)) $this->db->insert('pro_model_link', $nadd);	
		}
		
		//入中国车型库
		if($mod3Ids){
			$promodelcn = new promodelcn();
			foreach($mod3Ids as $mod3_id){
				$nadd = [
					'pml_p_id'=>$p_id,
					'pml_mod3_id'=>$mod3_id,
					'pml_from'=>100,
					'opuser'=>$opuser,
					'create_time'=>$datetime,
					'update_time'=>$datetime
				];
				$exists = $promodelcn->checkExist($nadd);
				if(empty($exists)) $this->db->insert('pro_model_cn_link', $nadd);
			}
		}
		
		$chkArr['ck1'] = 1;
		$chkArr['ckuser1'] = $opuser;
		$chkArr['cktime1'] = $datetime;
		$chkArr['ckremark1'] = $chkArr['ckremark1']?:'进入产品库'.$proArr['p_innum'];
		$this->db->update('work_oe_item', $chkArr, ['woi_id'=>$woi_id]);

		$this->db->End();
		return ['p_id'=>$p_id];
	}

	//结合清洗数据格式化产品录入单明细
	public function getWorkOeFormat($woiArr)
	{
		$cleanArr = empty($woiArr['woi_clean_result'])? []:json_decode($woiArr['woi_clean_result'], true);
		$cleanChkArr = empty($woiArr['woi_clean_chk'])? []:json_decode($woiArr['woi_clean_chk'], true);
		
		//对照号
		$factory = new factory();
		$carmodel = new carmodel();

		$addNums = [];
		$addNums[] = [
			'on_pf_id'=>1,
			'on_number'=>$woiArr['woi_oe'],
			'on_mk_id'=>[],
		];
		
		//woi_idx_nums 格式化
		$strNumArr = [];
		if(!empty($woiArr['woi_idx_nums'])) $strNumArr['idx'] = $woiArr['woi_idx_nums'];

		//替换号
		if(!empty($cleanArr['replace'])){
			$strNumArr['replace'] = isset($cleanChkArr['replace'])? $cleanChkArr['replace']: implode(',', array_column($cleanArr['replace'], 'display'));
		}
		foreach($strNumArr as $type=>$strNums){
			$tnums = strtr($strNums, ['，'=>',',';'=>',','；'=>',',"\n"=>',', '：'=>':']);
			foreach(explode(',', $tnums) as $tv){
				if(empty($tv)) continue;
				$tvs = explode(':', $tv);
				if(count($tvs) == 1){
					$addNums[] = [
						'on_pf_id'=>1,
						'on_number'=>$tvs[0],
						'on_mk_id'=>[],
						'on_from'=>$type == 'replace'? 100: 99
					];
				}else if(count($tvs) >= 2){
					$pfid = $tvs[0] == 'OE'? 1: $factory->getFacId($tvs[0], 'add');
					$mkid = $tvs[2]? $carmodel->getOeMakeIds($tvs[2]): '';
					$addNums[] = [
						'on_pf_id'=>1,
						'on_number'=>$tvs[0],
						'on_mk_id'=>$mkid? explode(',',$mkid): [],
						'on_from'=>$type == 'replace'? 100: 99
					];
				}
			}
		}
		
		foreach(['num', 'othnum'] as $type){
			if(empty($cleanArr[$type])) continue;
			foreach($cleanArr[$type] as $row){
				if((isset($cleanChkArr[$type.'_ok_chk']) && in_array($row['unikey'], $cleanChkArr[$type.'_ok_chk'])) || (!isset($cleanChkArr[$type.'_ok_chk']) && $row['ok'])){
					$pfid = $row['oe'] == 'OE'? 1: $factory->getFacId($row['brand'], 'add');
					$mkid = $row['oe'] == 'OE'? $carmodel->getOeMakeIds($row['brand']): '';
					$addNums[] = [
						'on_pf_id'=>$pfid,
						'on_number'=>$row['display'],
						'on_mk_id'=>$mkid? explode(',',$mkid): [],
						'on_from'=>100
					];
				}
			}
		}

		//本身去重
		$uniTempNumArr = [];
		foreach($addNums as $add){
			$add['on_formart'] = formatNum($add['on_number']);
			if(empty($add['on_pf_id']) || empty($add['on_number'])) continue;
			$uniTempNumArr[$add['on_pf_id'].'@'.$add['on_formart']] = $add;
			if(!empty($add['on_mk_id'])){
				$uniTempNumArr[$add['on_pf_id'].'@'.$add['on_formart']]['on_mk_id'] = array_merge($uniTempNumArr[$add['on_pf_id'].'@'.$add['on_formart']]['on_mk_id'], $add['on_mk_id']);
			}
		}

		foreach($uniTempNumArr as $k=>$v){
			$uniTempNumArr[$k]['on_mk_id'] = implode(',', $v['on_mk_id']);
		}

		//车型
		$modArr = [];
		foreach(['model', 'model_oknum'] as $type){
			if(empty($cleanArr[$type])) continue;
			foreach($cleanArr[$type] as $row){
				if(!empty($modArr[$row['mm_id']])) continue;
				if((isset($cleanChkArr[$type.'_chk']) && in_array($row['mm_id'], $cleanChkArr[$type.'_chk'])) || (!isset($cleanChkArr[$type.'_chk']) && $row['ok'])){
					$modArr[$row['mm_id']] = [
						'oml_mm_id'=>$row['mm_id'],	
						'oml_para'=>is_array($row['para'])? json_encode($row['para'], JSON_UNESCAPED_UNICODE): '[]',
						'oml_from'=>100
					];
				}
			}
		}
		$modArr = array_values($modArr);

		return ['uninums'=>$uniTempNumArr, 'unimodel'=>$modArr];
	}

	



	//询源单
	public function getAskList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? 'was_id': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

		$table = 'work_ask(was)';
		$join = [
			"[>]work_data_list(wdl)" => ["was.was_wdlist_id" => "wdlist_id"]
		];
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			switch ($field) {
				case 'ar_name':
					$field = 'RAW #ar_name';
					$data = raw(sprintf(" was_id IN (select distinct wai_was_id from work_ask_item join adm_role on wai_ar_id=ar_id where ar_name like '%%%s%%')",$data));
					break;
			}
			
        });
		if(!empty($params['keys'])) $where['was_id'] = explode(',', $params['keys']);
		if(!empty($params['was_id'])) $where['was_id'] = explode(',', $params['was_id']);

		if(!\p::isAdmin()){
			$user = new user();
			$where['wai_ar_id'] = $user->getMyPowerRole('A300');
			$join["[><]work_ask_item(wai)"] = ["was.was_id" => "wai_was_id"];
		}
		$where['GROUP'] = 'was_id';

        $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];
		}
		if(!empty($params['wdlist_id'])) $where['was_wdlist_id'] = $params['wdlist_id'];
		$fields = ['wdlist_id', 'wdlist_seq', 'was.*'];
        $arr = $this->db->select($table,$join,$fields,$where);
		if($arr){
			$ids = array_column($arr, 'was_id');
			$rows = $this->db->select('work_ask_item', ['wai_was_id', 'item_count'=>raw('count(*)'), 'chkpro_count'=>raw('(sum(case when ck1 > 0 then 1 else 0 end))')], ['wai_was_id'=>$ids, 'GROUP'=>'wai_was_id']);
			$tj = array_column($rows, null, 'wai_was_id');

			$roleArr = $this->db->select('work_ask_item',['[><]adm_role'=>['wai_ar_id'=>'ar_id']],['wai_was_id','ar_name'=>raw('GROUP_CONCAT(DISTINCT ar_name)')],['wai_was_id'=>$ids,'GROUP'=>'wai_was_id']);
			$roleArr = array_column($roleArr,null,'wai_was_id');
			foreach($arr as &$v){
				if($tj[$v['was_id']]) $v = array_merge($v, $tj[$v['was_id']]);
				$v['ar_name'] = $roleArr[$v['was_id']]?$roleArr[$v['was_id']]['ar_name']:'';
				// $v['captions']['clean_count'] = $v['clean_count']? sprintf("%d [%d%%]", $v['clean_count'], $v['clean_count']/$v['item_count']*100): '';
				// $v['captions']['clean_has_count'] = $v['clean_has_count']? sprintf("%d [%d%%]", $v['clean_has_count'], $v['clean_has_count']/$v['item_count']*100): '';
				// $v['captions']['chkpro_count'] = $v['chkpro_count']? sprintf("%d [%d%%]", $v['chkpro_count'], $v['chkpro_count']/$v['item_count']*100): '';
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}
	
	//询源单明细
	public function getAskItemList($params, $rules = [])
	{
		$filters = $params['filters'];
		$page = $params['page'];
		$pagesize = $params['rows'];
		$sidx = empty($params['sidx'])? 'wai_id': $params['sidx'];
		$sord = empty($params['sord'])? 'asc': $params['sord'];
		$orderby = $params['orderby'];

		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
		];
		$this->set('refiled', $refiled);
		$sidx =  strtr($sidx, $refiled);

		$table = 'work_ask_item(wai)';
		$join = [
			"[><]work_ask(was)" => ["wai.wai_was_id" => "was_id"],
			"[>]pro_cate(cat)" => ["wai.wai_cate_id" => "id"],
			"[>]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[>]work_data_item(wdi)" => ["wai.wai_wdi_id" => "wdi_id"],
			"[>]work_data_list(wdl)" => ["wdi.wdi_wdlist_id" => "wdlist_id"],
			"[>]supplier(sup)" => ["wai.wai_sup_id" => "sup_id"],
			"[>]adm_role(ar)" => ["wai.wai_ar_id" => "ar_id"],
		];
		
		$this->set('pnumwhere', []);
        $where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			switch ($field) {
				case 'wai_manager':
                    $op = 'eq';
					$user = new user();
                    $data = $user->like($data,['au_name']);
                    break;
				case 'sups':
					$op = 'RAW_'.$field;
					if($data == '-1'){
						$data = raw(" wai_wdi_id not in (SELECT DISTINCT wdif_wdi_id FROM work_ask_item JOIN work_data_item_format ON wdif_wdi_id = wai_wdi_id AND wdif_type = 'Number' JOIN supplier_pro ON wdif_pf_id = spr_pf_id AND wdif_search = spr_format)");
					}else{
						$data = raw(" wai_wdi_id in (SELECT DISTINCT wdif_wdi_id FROM work_ask_item JOIN work_data_item_format ON wdif_wdi_id = wai_wdi_id AND wdif_type = 'Number' JOIN supplier_pro ON wdif_pf_id = spr_pf_id AND wdif_search = spr_format)");
					}
                  break;
			}

        });
		
		foreach($rules as $filed=>$val){
			if(empty($val)) continue;
			switch($filed){
				case 'p_cate': $where['wai_cate_id'] = explode(',', $rules['p_cate']); break;
			}
		}

		if(!empty($params['keys'])) $where['wai_id'] = explode(',', $params['keys']);
		if(!empty($params['wai_id'])) $where['wai_id'] = $params['wai_id'];
		if(!empty($params['was_id'])) $where['was_id'] = $params['was_id'];
		if(!empty($params['wdlist_id'])) $where['was_wdlist_id'] = $params['wdlist_id'];
		if(isset($params['was_status'])) $where['was_status'] = $params['was_status'];
		if(!\p::isAdmin()){
			$user = new user();
			$where['wai_ar_id'] = $user->getMyPowerRole('A300');
		}

        $where = $this->listWhere($where,$page,$pagesize,$sidx,$sord,$orderby);
		if($page>0 && $pagesize>0){
			$fields = '*';
			$pages = $this->paging($table,$join,$fields,$where,$page,$pagesize);
			$where["LIMIT"] = [$pages['limit'],$pagesize];
		}

		$fields = ['cat.id(cat_id)', 'pcat.'.cateName().'(pcat_name)', 'cat.'.cateName().'(cat_name)', 'wdl.wdlist_seq', 'was.*', 'wai.*','sup.sup_name','sup.sup_code','ar_name'];
        $arr = $this->db->select($table,$join,$fields,$where);
		if(!empty($arr)){
			$collocation = new collocation();
			$collArr = $collocation->getCollItems('work');
			
			$wdiIds = array_column($arr, 'wai_wdi_id');
			$nums = [];
			$sups = [];
			if($wdiIds)
			{
				//存在的号码
				$join = [
					"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
				];
				$rows = $this->db->select('work_data_item_format', $join, ['wdif_wdi_id', 'wdif_id', 'pf_name', 'wdif_val'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdiIds]);
				foreach($rows as $rv){
					$nums[$rv['wdif_wdi_id']][] = ['wdif_id'=>$rv['wdif_id'], 'factory'=>$rv['pf_name'], 'number'=>$rv['wdif_val']];  
				}

				//存在的供应商
				$join = [
					"[><]work_ask_item(wai)" => ["wdif.wdif_wdi_id" =>"wai_wdi_id"],
					"[><]supplier_pro(spr)" => ["wdif.wdif_pf_id" =>"spr_pf_id", 'wdif.wdif_search'=>'spr_format'],
					"[><]supplier(sup)" => ["spr.spr_sup_id" =>"sup_id"],
				];
				$rows = $this->db->select('work_data_item_format(wdif)', $join, ['wdif_wdi_id', 'sup_id', 'sup_name', 'spr_format','spr_id'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdiIds, 'GROUP'=>['wdif_wdi_id', 'sup_id'], 'ORDER'=>['sup_name']]);
				foreach($rows as $rv){
					$sups[$rv['wdif_wdi_id']][] = $rv;  
				}
			}

			$wamaArr = array_filter(array_column($arr,'wai_manager'));
			$userArr = [];
			if($wamaArr)
			{
				$userArr0 = $this->db->select('adm_user',['au_id','au_name','au_area'],['au_id'=>$wamaArr]);
				$userArr = array_column($userArr0,'au_name','au_id');
				

				$collArr = $this->db->select('object', ['o_parent_id', 'o_id', LG_NAME], ['o_parent_id'=>3]);
				$collArr = array_column($collArr, LG_NAME, 'o_id');

				$areaArr = array_column($userArr0,'au_area','au_id');
				$userAreaArr = [];
				foreach ($areaArr as $key => $val) {
					$userAreaArr[$key] = $collArr[$val];
				}
			}
			foreach($arr as &$v){
				//兼容导出
				$tvals = $nums[$v['wai_wdi_id']]? $nums[$v['wai_wdi_id']]: [];
				$tnum = [];
				foreach($tvals as $vv){
					$tnum[] = $vv['factory'].': '.$vv['number'];
				}
				$v['nums'] = $params['isExport'] ? implode("\r\n", $tnum): implode('<br>', $tnum);
				$v['sups'] = $sups[$v['wai_wdi_id']]? $sups[$v['wai_wdi_id']]: [];
				$v['captions']['wai_manager'] = $userArr[$v['wai_manager']]??'';
				$v['captions']['user_area'] = $userAreaArr[$v['wai_manager']]??'';
				if($params['isExport']){
					$v['sups'] = implode("\r\n", array_column($v['sups'], 'sup_name'));
				}
			}
		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}


	//宜配号码比较['wdi_id'=>xxx]
	public function compareNumByYiparts($params){
		$arr = [];
		if(!empty($params['wdi_id'])){
			$join = [
				"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
			];
			$nums = $this->db->select('work_data_item_format', $join, ['pf_name(factory)', 'wdif_val(number)'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$params['wdi_id']]);
			$apiPost = [
				'type'=>'out',
				'number'=>json_encode($nums, JSON_UNESCAPED_UNICODE)
			];
		}else if($params['type']){
			$nums = [];
			foreach(explode(',', $params['nums']) as $v){
				$tt = explode(':', $v);
				$nums[] = ['factory'=>$tt[0], 'number'=>$tt[1]];
			}
			if(!empty($params['artids']) || !empty($nums)){
				$apiPost = [
					'type'=>$params['type'],
					'artids'=>$params['artids'],
					'number'=>json_encode($nums, JSON_UNESCAPED_UNICODE)
				];
			}
		}
		if($apiPost){
			$ypApi = new ypApi();
			$res = $ypApi->Get('tcd/compareNum', [], $apiPost);
			$arr = $res['status']? $res['data']: [];
		}
		return $arr;
	}


	public function checkAskItem($idArr,$setArr)
	{
		if(!empty($idArr))
		{
			$tempArr = $this->db->select('work_ask_item', '*', ['wai_id'=>$idArr]);
			if(empty($tempArr)) exitJson('记录不存在');

			$opuser = getOpuser();
			$datetime = getNowTime();
			$set = [
				'ckuser1'=>$opuser,
				'cktime1'=>$datetime,
				'ck1'=>$setArr['ck1'],
				'ckremark1'=>$setArr['ckremark1'],
			];
			$this->db->update('work_ask_item', $set, ['wai_id'=>$idArr]);
			//审核通过->供应商产品目录
			if($setArr['ck1']==1 && $idArr)
			{
				$askItem = $this->db->select('work_ask_item','*',['wai_id'=>$idArr]);

				$emptySup = [];
				foreach ($askItem as $item) {
					if(!$item['wai_sup_id']){
						$emptySup[] = $item['wai_oe'];	
					}
				}
				if(!empty($emptySup))  exitJson("OE号：".implode(',',$emptySup).'所属记录未填写供应商');

				$wdiIds = array_column($askItem,'wai_wdi_id');
				//存在的号码
				$join = [
					"[>]pro_factory(fac)" => ["wdif_pf_id" =>"pf_id"]
				];
				$rows = $this->db->select('work_data_item_format', $join, ['wdif_wdi_id', 'wdif_id', 'pf_id', 'wdif_val'], ['wdif_type'=>'Number', 'wdif_wdi_id'=>$wdiIds]);
				$nums = [];
				foreach($rows as $rv){
					$nums[$rv['wdif_wdi_id']][] = ['wdif_id'=>$rv['wdif_id'], 'pf_id'=>$rv['pf_id'], 'number'=>$rv['wdif_val']];  
				}

				if(!$nums) return [];
			
				$anyAdd = [];
				foreach ($askItem as $key => $val) 
				{	
					$dataArr = [
						'spr_sup_id' => $val['wai_sup_id'],
						'spr_brand' => $val['wai_brand'],
						'spr_material' => $val['wai_material'],
						'spr_price' => $val['wai_price'],
						'spr_minbuy' => $val['wai_minbuy'],
						'spr_delivery' => $val['wai_delivery'],
						'spr_price_btime' => $val['wai_price_btime'],
						'spr_price_etime' => $val['wai_price_etime'],
						'spr_purin_time' => $val['wai_purin_time'],
						'spr_price_status' => $val['wai_price_status'],
						'spr_has' => $val['wai_has'],
						'spr_hasample' => $val['wai_hasample'],
						'spr_from' => $val['wai_form'],
						'spr_remark' => $val['wai_remark'],
						'spr_opuser' => getOpuser(),
						'spr_update_time'=>getNowTime()
					];

					foreach ($nums[$val['wai_wdi_id']] as $nval) 
					{	
						// $dataArr['spr_number'] = $nval['number'];
						// $dataArr['spr_format'] = formatNum($nval['number']);
						// $dataArr['spr_pf_id'] = $nval['pf_id'];

						$exists = $this->db->get('supplier_pro','spr_id',['spr_sup_id'=>$dataArr['spr_sup_id'],'spr_pf_id'=>$nval['pf_id'],'spr_format'=>formatNum($nval['number'])]);
						if($exists){
							$this->db->update('supplier_pro',$dataArr,['spr_id'=>$exists]);
						}else{

							$dataArr['spr_number'] = $nval['number'];
							$dataArr['spr_format'] = formatNum($nval['number']);
							$dataArr['spr_pf_id'] = $nval['pf_id'];

							$dataArr['spr_create_time'] = getNowTime();
							$anyAdd[] = $dataArr; 
						}
					}
				}
				if($anyAdd) $this->db->insert('supplier_pro',$anyAdd);
			}

		}
		return [];
	}


	function saveAskSup($dataArr)
	{
		$this->db->Begin();
		foreach($dataArr as $row){
			$spr_ids = explode(',', $row['value']);
			
			$setArr = [];
			if($spr_ids[0]){
				$info = $this->db->get('supplier_pro', '*', ['spr_id'=>$spr_ids[0]]);
				if($info){
					$setArr['wai_sup_id'] = $info['spr_sup_id'];
					$setArr['wai_material'] = $info['spr_material'];
					$setArr['wai_has'] = $info['spr_has'];
					$setArr['wai_minbuy'] = $info['spr_minbuy'];
					$setArr['wai_delivery'] = $info['spr_delivery'];
					$setArr['wai_price_btime'] = $info['spr_price_btime'];
					$setArr['wai_price_etime'] = $info['spr_price_etime'];
					$setArr['wai_purin_time'] = $info['spr_purin_time'];
					$setArr['wai_purin_level'] = '主供应商';
					$setArr['wai_from'] = $info['spr_from'];
				}
			}

			if($spr_ids[1]){
				$info = $this->db->get('supplier_pro', '*', ['spr_id'=>$spr_ids[1]]);
				if($info){
					$setArr['wai_bsup_id'] = $info['spr_sup_id'];
					$setArr['wai_bhas'] = $info['spr_has'];
					$setArr['wai_bdelivery'] = $info['spr_delivery'];
					$setArr['wai_bprice_btime'] = $info['spr_price_btime'];
					$setArr['wai_bprice_etime'] = $info['spr_price_etime'];
					$setArr['wai_bpurin_time'] = $info['spr_purin_time'];
					$setArr['wai_bpurin_level'] = '潜在供应商';
					$setArr['wai_bfrom'] = $info['spr_from'];
				}
			}
			if($setArr){
				$setArr['wai_opuser'] = getOpuser();
				$setArr['wai_update_time'] = getNowTime();
				$this->db->update('work_ask_item', $setArr, ['wai_id'=>$row['kid']]);
			}
		}
		$this->db->End();
		return [];
	}
	//基本统计
	function getBaseTj()
	{
		$arr = ['ask'=>[], 'oe'=>[]];
		$user = new user();
		$arr['ask']['role'] = $user->getPowerRole('A300');
		//询源单
		$sql = "SELECT COUNT(*) total, SUM(CASE WHEN was_status = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN was_status != 1 THEN 1 ELSE 0 END) wait_count FROM work_ask";
		$row = $this->db->query($sql)->fetch();
		$arr['ask'] = array_merge($arr['ask'], $row);
		$sql = "SELECT wai_ar_id ar_id, COUNT(*) total, SUM(CASE WHEN was_status = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN was_status != 1 THEN 1 ELSE 0 END) wait_count FROM (
		SELECT * 
		FROM work_ask JOIN work_ask_item ON was_id = wai_was_id GROUP BY was_id,wai_ar_id
		) t GROUP BY wai_ar_id";
		$rows = $this->db->query($sql)->fetchAll();
		if(!empty($rows)){
			foreach($rows as $v){
				$arr['ask']['role'.$v['ar_id']]  =$v;
			}
		}
		
		//询源单明细
		$sql = "SELECT COUNT(*) total, SUM(CASE WHEN ck1 = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN ck1 != 1 THEN 1 ELSE 0 END) wait_count FROM work_ask_item";
		$arr['ask_item'] = $this->db->query($sql)->fetch();

		$sql = "SELECT wai_ar_id ar_id, COUNT(*) total, SUM(CASE WHEN ck1 = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN ck1 != 1 THEN 1 ELSE 0 END) wait_count FROM work_ask_item GROUP BY wai_ar_id";
		$rows = $this->db->query($sql)->fetchAll();
		if(!empty($rows)){
			foreach($rows as $v){
				$arr['ask_item']['role'.$v['ar_id']]  =$v;
			}
		}


		$arr['oe']['role'] = $user->getPowerRole('A400');
		//产品单
		$sql = "SELECT COUNT(*) total, SUM(CASE WHEN woe_status = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN woe_status != 1 THEN 1 ELSE 0 END) wait_count FROM work_oe";
		$row = $this->db->query($sql)->fetch();
		$arr['oe'] = array_merge($arr['oe'], $row);
		$sql = "SELECT woi_ar_id ar_id, COUNT(*) total, SUM(CASE WHEN woe_status = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN woe_status != 1 THEN 1 ELSE 0 END) wait_count FROM (
		SELECT * 
		FROM work_oe JOIN work_oe_item ON woe_id = woi_woe_id GROUP BY woe_id,woi_ar_id
		) t GROUP BY woi_ar_id";
		$rows = $this->db->query($sql)->fetchAll();
		if(!empty($rows)){
			foreach($rows as $v){
				$arr['oe']['role'.$v['ar_id']]  =$v;
			}
		}
		
		//产品单明细
		$sql = "SELECT COUNT(*) total, SUM(CASE WHEN ck1 = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN ck1 != 1 THEN 1 ELSE 0 END) wait_count FROM work_oe_item";
		$arr['oe_item'] = $this->db->query($sql)->fetch();

		$sql = "SELECT woi_ar_id ar_id, COUNT(*) total, SUM(CASE WHEN ck1 = 1 THEN 1 ELSE 0 END) ok_count, SUM(CASE WHEN ck1 != 1 THEN 1 ELSE 0 END) wait_count FROM work_oe_item GROUP BY woi_ar_id";
		$rows = $this->db->query($sql)->fetchAll();
		if(!empty($rows)){
			foreach($rows as $v){
				$arr['oe_item']['role'.$v['ar_id']]  =$v;
			}
		}
		return $arr;
	}

	/**
	 * @param  [type] $req
	 * @param  [type] $rules
	 * @method 导出解决方案
	 * @author zhengweihua 
	 * @copyright 2024-12-13
	 */
	public function exportSolution($req, $rules)
	{
		
		$data = $this->getAskItemList($req, $rules);

		if(!$data['rows']) return exitJson(-1,'没有数据');

		$header = [
            [
                ['title'=>'序号','scell'=>'A1','ecell'=>'A2','isMerge'=>true,'width'=>'8'],
                ['title'=>'物料编码','scell'=>'B1','ecell'=>'B2','isMerge'=>true,'width'=>'14'],
                ['title'=>'OE号','scell'=>'C1','ecell'=>'C2','isMerge'=>true,'width'=>'14'],
                ['title'=>'替换号','scell'=>'D1','ecell'=>'D2','isMerge'=>true,'width'=>'40'],
                ['title'=>'搜索号','scell'=>'E1','ecell'=>'E2','isMerge'=>true,'width'=>'14'],
                ['title'=>'图片','scell'=>'F1','ecell'=>'F2','isMerge'=>true,'width'=>'14'],
				['title'=>'产品名称','scell'=>'G1','ecell'=>'G2','isMerge'=>true,'width'=>'20'],
				['title'=>'产品类型','scell'=>'H1','ecell'=>'H2','isMerge'=>true,'width'=>'20'],
				['title'=>'小类','scell'=>'I1','ecell'=>'I2','isMerge'=>true],
				['title'=>'项目负责人','scell'=>'J1','ecell'=>'J2','isMerge'=>true,'width'=>'14'],
				['title'=>'材质','scell'=>'K1','ecell'=>'K2','isMerge'=>true],
				['title'=>'车型/发动机','scell'=>'L1','ecell'=>'L2','isMerge'=>true,'width'=>'16'],
				['title'=>'所属项目','scell'=>'M1','ecell'=>'M2','isMerge'=>true],
				['title'=>'品牌','scell'=>'N1','ecell'=>'N2','isMerge'=>true],
				['title'=>'事业部','scell'=>'O1','ecell'=>'O2','isMerge'=>true,'width'=>'30'],
				['title'=>'合作供应商','scell'=>'P1','ecell'=>'AA1','color'=>'FF80FFFF','isMerge'=>true],
				['title'=>'潜在供应商','scell'=>'AB1','ecell'=>'AL1','color'=>'FFFACD91','isMerge'=>true],
            ],
            [
				'','','','','','','','','','','','','','','',
				['title'=>'供应商编码','color'=>'FF80FFFF','width'=>'20'],['title'=>'供应商名称','color'=>'FF80FFFF','width'=>'25'],['title'=>'含税单价','color'=>'FF80FFFF'],['title'=>'是否备货','color'=>'FF80FFFF'],
				['title'=>'交期','color'=>'FF80FFFF'],['title'=>'起订量','color'=>'FF80FFFF'],['title'=>'工厂报价时间','color'=>'FF80FFFF','width'=>'30'],['title'=>'价格失效时间','color'=>'FF80FFFF','width'=>'30'],
				['title'=>'采购入库时间','color'=>'FF80FFFF','width'=>'30'],['title'=>'采购优先级','color'=>'FF80FFFF','width'=>'25'],['title'=>'采购类型','color'=>'FF80FFFF'],['title'=>'数据类型','color'=>'FF80FFFF'],
				
				['title'=>'供应商编码','color'=>'FFFACD91','width'=>'20'],['title'=>'供应商名称','color'=>'FFFACD91','width'=>'25'],['title'=>'含税单价','color'=>'FFFACD91'],['title'=>'是否验厂','color'=>'FFFACD91'],
				['title'=>'初步评级','color'=>'FFFACD91'],['title'=>'是否备货','color'=>'FFFACD91'],['title'=>'交期','color'=>'FFFACD91'],['title'=>'工厂报价时间','color'=>'FFFACD91','width'=>'30'],['title'=>'价格失效时间','color'=>'FFFACD91','width'=>'30'],
				['title'=>'采购优先级','color'=>'FFFACD91','width'=>'25'],['title'=>'数据类型','color'=>'FFFACD91']
				
			]
        ];

		$fields = ['wai_id','pc_innum','wai_oe','nums','','','wai_item_name','wai_item_type','cat_name','wai_manager','wai_material',
			['name'=>['wai_model','wai_engine'],'separator'=>'/'],'wai_project','pb_name','user_area',['name'=>'sup_code','color'=>'FF80FFFF'],['name'=>'sup_name','color'=>'FF80FFFF'],
			
			['name'=>'wai_price','color'=>'FF80FFFF'],['name'=>'wai_has','color'=>'FF80FFFF'],['name'=>'wai_delivery','color'=>'FF80FFFF'],['name'=>'wai_minbuy','color'=>'FF80FFFF'],
			['name'=>'wai_price_btime','color'=>'FF80FFFF'],['name'=>'wai_price_etime','color'=>'FF80FFFF'],['name'=>'wai_purin_time','color'=>'FF80FFFF'],['name'=>'wai_purin_level','color'=>'FF80FFFF'],
			['name'=>'wai_purin_type','color'=>'FF80FFFF'],['name'=>'wai_from','color'=>'FF80FFFF'],

			['name'=>'sup_code2','color'=>'FFFACD91'],['name'=>'sup_name2','color'=>'FFFACD91'],['name'=>'wai_bprice','color'=>'FFFACD91'],['name'=>'wai_bchkfac','color'=>'FFFACD91'],['name'=>'wai_bchklevel','color'=>'FFFACD91'],['name'=>'wai_has','color'=>'FFFACD91'],['name'=>'wai_bdelivery','color'=>'FFFACD91'],
			['name'=>'wai_bprice_btime','color'=>'FFFACD91'],['name'=>'wai_bprice_etime','color'=>'FFFACD91'],['name'=>'wai_bpurin_level','color'=>'FFFACD91'],['name'=>'wai_bfrom','color'=>'FFFACD91'],
		];

		// 创建一个新的 Spreadsheet 对象
		$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
		$sheet = $spreadsheet->getActiveSheet();

		// 设置标题
		$row = 1;
		foreach ($header as $val) {
			$col = 'A';
			foreach ($val as $vv) {
				
				if(!$vv){
					$col++;
					continue;
				} 
				if(is_array($vv)){
					if($vv['isMerge']){
						$sheet->mergeCells(sprintf("%s:%s",$vv['scell'],$vv['ecell'])); // 合并单元格
					}
					if(!empty($vv['width']))
						$sheet->getColumnDimension($col)->setWidth($vv['width']);

					$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']);
						$styleArray = [
							'borders' => [
								'allBorders' => [
									'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
									'color' => ['argb' => 'FF000000'], // 黑色边框
								],
							],
						];
						$style->applyFromArray($styleArray);
					} 
				}else{
					$sheet->setCellValue($col.$row, $vv);
					$style = $sheet->getStyle($col.$row);  
				}
				$style->getAlignment()->setHorizontal('center');  
				$style->getAlignment()->setVertical('center');  
				$col++;
			}
			$row++;
		}
		 
		 foreach ($data['rows'] as $val) 
		 {
			$col = 'A';
			foreach ($fields as $field) {
				if(!is_array($field)){
					$val[$field] = $val['captions'][$field]?:$val[$field];
					if($field=='nums'){
						$val['nums'] =$val['nums']? implode(',',explode("\r\n",$val['nums'])):''; 
					}
					$sheet->setCellValue($col.$row, $val[$field]); 
					$style = $sheet->getStyle($col.$row); 
				}else{
					$fieldsVal = '';
					$nameArr = [];
					if(is_array($field['name'])){
						foreach ($field['name'] as $name) {
							if($val[$name]) $nameArr[] = $val['captions'][$name]?:$val[$name];
						}
						$fieldsVal = $nameArr ? implode($field['separator']?:',',$nameArr):'';
					}else{
						$fieldsVal =  $val['captions'][$field['name']]?:$val[$field['name']];
					}
					if(!$fieldsVal||in_Array($fieldsVal,['0','0000-00-00'])) $fieldsVal = '';
					$sheet->setCellValue($col.$row, $fieldsVal); 
					$style = $sheet->getStyle($col.$row); 
					if($field['color']){
						$style->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB($field['color']);
						$styleArray = [
							'borders' => [
								'allBorders' => [
									'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
									'color' => ['argb' => 'FF000000'], // 黑色边框
								],
							],
						];
						$style->applyFromArray($styleArray);
					}
				}
				if($field=='nums'){
					$style->getAlignment()->setWrapText(true);
				}
				$style->getAlignment()->setHorizontal('center');  
				$style->getAlignment()->setVertical('center');
				
				$col++;
			}
			$row++;
		 }
		 $dateTime = getNowTime();
		 $filename = sprintf('解决方案%s',$dateTime).'.xlsx';
		 $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
		 ob_clean();
		 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		 header('Content-Disposition: attachment;filename="'.$filename.'"');
		 header('Cache-Control: max-age=0');
		 $objWriter->save("php://output"); 

	}
}