<?php
namespace model;
use \model;
use \model\check;
use \model\collocation;
use \model\carmodel;
use \model\pro\factory;
use \model\pro\pro;
use \model\homecn\trade;
class oeNumidx extends model
{
	public function __construct ()
    {
		parent::__construct();
		$this->factory = new factory();
		
	}

	public function getDetail($oe_id)
	{
		$data = $this->getList(['oe_id'=>$oe_id]);
		if(empty($data['rows'])) exitJson('记录不存在');
		$arr =$data['rows'][0];
		$arr['oe_para'] = empty($arr['oe_para'])? []:json_decode($arr['oe_para'], true);
		return $arr;
	}

	/**
	  * @method 交叉库 数据  
	  * @method ['next'=>1表示取下一条]
	  * @author soul
	  */
	public function getNumList($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'];

		if(!empty($params['next']) && !empty($params['ckact']))
		{
			$page = 1;
			$pagesize = 1;
		}
		
		$refiled = [
			'cat_name'=>'cat.'.cateName(),
			'pcat_name'=>'pcat.'.cateName(),
			'on_number'=>'on_formart',
			'opuser'=>'num.on_opuser',
			'create_time'=>'num.on_create_time',
			'update_time'=>'num.on_update_time'
		];
		$this->set('refiled', $refiled);
		// $sidx =  strtr($sidx, $refiled);

		$table = 'oe_numidx(num)';
		$join = [
			"[><]oe_item(oi)" => ["num.on_oe_id" => "oe_id"],
			"[><]pro_cate(cat)" => ["oi.oe_cate_id" => "id"],
			"[><]pro_cate(pcat)" => ["cat.parent_id" => "id"],
			"[>]pro_factory(fac)" => ["num.on_pf_id" => "pf_id"],
			"[>]adm_user(au)"=>['num.on_opuser'=>'au_id']
		];
		$this->set('sTags', false);
		$this->set('pnumwhere', []);
		$this->set('carmodel', new carmodel());
		$where = $this->filter2medoo($filters,function(&$field,&$op,&$data){
			$field = strtr( $field, $this->get('refiled'));
			if($field == 'on_pf_id') $data = $this->factory->like($data);
		
			if($field == 'on_formart') $data = formatNum($data);
	
			if($field == 'on_mk_id'){
				if(in_array($op,['cn','bw','eq'])){
					$data = $this->db->select('m_make','mk_id',['name['.$this->getMedooOp($op).']'=>$data]);
					if(!$data) $data = [-1];
					$op = 'eq';
				}
			}
		});
		
		foreach($rules as $filed=>$val)
		{
			if(empty($val)) continue;
			switch($filed)
			{
				case 'numbers':
					
					foreach($val as $tk=>$tv)
					{
						$val[$tk] = formatNum($tv);
					}
					if($rules['numfac'] == 1)
					{
						$where['on_formart'.($rules['numlike']? '[~]': '')] = $val;
					}
					else
					{
						$where["AND #num"] = [
							"OR" => [
								'on_formart'.($rules['numlike']? '[~]': '') => $val,
								'oe_oe'.($rules['numlike']? '[~]': '') => $val,
							]
						];
					}
				break;
				case 'p_cate': $where['oe_cate_id'] = explode(',', $rules['p_cate']); break;
				break;
			}
		}
	
		if(!empty($params['keys'])) $where['on_id'] = explode(',', $params['keys']);
		if(!empty($params['on_id'])) $where['on_id'] = $params['on_id'];
		
		if(!empty($params['oe_id'])){
			$where['on_oe_id'] = $params['oe_id'];
		}

		if(empty($where['ORDER']))$where['ORDER'] = ['pcat.'.cateName(), 'cat.'.cateName(), 'oe_oe', 'pf_name', 'on_formart'];

		$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)', 'oe_id', 'oe_oe', 'fac.pf_id', 'fac.pf_name', 'num.*','au_name'];

		$arr = $this->db->select($table,$join,$fields,$where);
		//dd($this->db->last());
		if(!empty($this->get('pnumwhere'))) $arr = $this->getSearchOutnum($arr, $this->get('pnumwhere'));
		

		if(!empty($arr))
		{
			$arr = $this->fillProNumidxTemp($arr);

		}
		$data = [
			'page'=> $page,
			'total'=> $pages['total'],
			'records' => $pages['records'],
			'rows' => $arr
		];
		return $data;
	}

	public function fillProNumidxTemp($arr)
	{
		if(!empty($arr))
		{
			$onIds = array_unique(array_column($arr, 'on_id'));
			$carmodel = new carmodel();
			$collocation = new collocation();
			$collArr = $collocation->lrtree->getChilds(13);
			$collArr = array_column($collArr, LG_NAME, 'o_id');
			$oetbRes = $this->db->select('oe_numidx_tag_brand(ontb)',['[><]tag_brand(tb)'=>['ontb.ontb_tb_id'=>'tb_id']],['ontb_on_id','tb_ids'=>raw("GROUP_CONCAT(tb_id)"),'tb_names'=>raw(sprintf("GROUP_CONCAT(tb_%s)",cateName()))],['ontb_on_id'=>$onIds,'GROUP'=>'ontb_on_id']);
			if($oetbRes){
				$oetbArr = array_column($oetbRes, null, 'ontb_on_id');
			}
			foreach($arr as &$v)
			{
				$oemake = [];
				if(!empty($v['on_mk_id'])) $oemake = $carmodel->getMakes(explode(',', $v['on_mk_id']));
				$v['on_tb_ids'] = $oetbArr[$v['on_id']]['tb_ids'];
				$v['captions'] = [
					'on_pf_id'=>$v['pf_name'],
					'on_mk_id'=>implode(',', array_column($oemake, 'mk_'.LG_NAME)),
					'on_from'=>!empty($collArr[$v['on_from']])? $collArr[$v['on_from']]: '',
					'opuser'=>$v['au_name'],
					'on_tag_brand'=>$oetbArr[$v['on_id']]?$oetbArr[$v['on_id']]['tb_names']:'',
				];
			}
		}
		return $arr;
	}


	public function delData($idArr)
	{
		if(!empty($idArr)){
			$main = $this->db->get('oe_numidx', 'on_id', ['on_ismain'=>'Y', 'on_id'=>$idArr]);
			if($main) exitJson('主号不允许删除，可以先变更主号再删除！');
			$oeid  = $this->db->select('oe_numidx','on_oe_id',['on_id'=>$idArr]);
			$arr = array_unique($oeid);
			$this->db->delete('oe_numidx', ['on_id'=>$idArr]);
			$pro = new pro();
			foreach ($arr as $key => $val) {
				$pro->synProByOe($val,['nums']);
			}
			

		}
		return [];
	}
	
	public function setCell($kid, $setArr)
	{
		if(!empty($kid) && !empty($setArr))
		{
			$ignoreFileds = ['on_oe_id','on_create_time'];
			$old = $this->db->get('oe_numidx',['[><]oe_item'=>['on_oe_id'=>'oe_id']],'*', ['on_id'=>$kid]);
			if(empty($old)) exitJson('记录不存在');

			if(isset($setArr['on_number'])){
				$setArr['on_formart'] = formatNum($setArr['on_number']);
			}
			

			$this->db->Begin();
			

			foreach($setArr as $filed=>$val){
				if(in_array($filed, $ignoreFileds) || stripos($filed, 'on_') !== 0){
					unset($setArr[$filed]);
					continue;
				}
			}
			if(!empty($setArr)){


				if(isset($setArr['on_tag_brand'])){
					$otbArr = $setArr['on_tag_brand'];
					$this->saveOeNumTb($old['on_oe_id'], $kid, $otbArr); 
					unset($setArr['on_tag_brand']);
				}
				
				$opuser = getOpuser();
				$datetime = getNowTime();
				$setArr['on_opuser'] = $opuser;
				$setArr['on_update_time'] = $datetime;
				$check = new \model\check();
				// 借用修改不参与唯一性判断
				if(!isset($setArr['on_isborrow']) || $setArr['on_isborrow'] != 1){
					$exists = $check->checkExist('oe_numidx', $setArr, $kid);
					if(!empty($exists)) exitJson('记录已存在');
				}
				$this->db->update('oe_numidx', $setArr, ['on_id'=>$kid]);
				//如果变更了OE号码!==Oe表的oe，更新OE表
				if(isset($setArr['on_number']) && $old['on_ismain'] == 'Y' && $setArr['on_number'] != $old['oe_oe']){
					$oeArr = [
						'oe_oe'=>$setArr['on_number'],
						'oe_oe_format'=>formatNum($setArr['on_number']),
						'oe_update_time'=>$datetime
					];
					$this->db->update('oe_item', $oeArr, ['oe_id'=>$old['on_oe_id']]);
				}
				$pro = new pro();
				$pro->synProByOe($old['on_oe_id'],['nums']);

				$trade = new trade();
				$trade->autoChkAskByPoeChange([$old['on_oe_id']]);
			}
			$this->db->End();
		}
		return [];
	}

	public function saveDetail($kid, $dataArr)
	{
		$this->db->Begin();
		$setArr = [];
		if(!empty($dataArr['base'])) $setArr = $dataArr['base'];
		if(!empty($dataArr['qingxi'])) $setArr['oe_clean_chk'] = json_encode($dataArr['qingxi'], JSON_UNESCAPED_UNICODE);
		if(!empty($setArr)){
			$this->setCell($kid, $setArr);
		}
		$this->db->End();
		return [];
	}


	public function addNumidx($dataArr)
	{
		$fileds = ['on_pf_id', 'on_number', 'on_mk_id','on_isborrow'];
		$baseArr = [];
		$othArr = [];
		foreach($dataArr as $filed=>$v)
		{
			if(in_array($filed, $fileds))
			{
				$baseArr[$filed] = $v;
			}
			else
			{
				$othArr[$filed] = $v;
			}
		}

		//确认产品ID
		if(empty($dataArr['on_oe_id']))
		{
			$oe = new oe();
			$oeid = $oe->getPidByNumber($dataArr['on_oe']);
			if(empty($oeid)) exitJson('', 'OE不存在');
			$baseArr['on_oe_id'] = $oeid;
		}else{
			$baseArr['on_oe_id'] = $dataArr['on_oe_id'];
		}

		// $row = $this->db->get('pro', ['oe_cate_id', 'oe_oe', 'p_outnum'], ['oe_id'=>$baseArr['on_oe_id']]);
		// if(!\p::catesAdd('E100', $row['p_cate'])) exitJson('无此小类权限');

	
		$baseArr['on_formart'] = formatNum($baseArr['on_number']);
		if(empty($baseArr['on_pf_id'])) exitJson('号码厂商必填');
		if(empty($baseArr['on_formart'])) exitJson('号码必填');
		//如果勾选了借用，则跳过唯一性校验
		if(!isset($baseArr['on_isborrow']) || $baseArr['on_isborrow'] != 1){
			$exists = $this->checkExistTemp($baseArr);
			if(!empty($exists)) exitJson($exists['msg']);
		}else{
			// 只有号码厂商为OE才能借用
			if($baseArr['on_pf_id'] != "1") exitJson('只有号码厂商为OE才能借用');
		}

		$opuser = getOpuser();
		$datetime = getNowTime();
		$baseArr['on_opuser'] = $opuser;
		$baseArr['on_create_time'] = $datetime;
		$baseArr['on_update_time'] = $datetime;
		
		$this->db->Begin();
		$this->db->insert('oe_numidx', $baseArr);
		$on_id = $this->db->id();
		//新增到oe_numidx oe_numidx_tag_brand
		$this->saveOeNumTb($baseArr['on_oe_id'], $on_id, $othArr['on_tag_brand']??[]);
		$pro = new pro();
		$pro->synProByOe($dataArr['on_oe_id'],['nums']);
		$trade = new trade();
		$trade->autoChkAskByPoeChange([$baseArr['on_oe_id']]);
		$this->db->End();
		return ['on_id'=>$on_id];
	}

	public function checkExistTemp($dataArr, $on_id = 0)
	{
		$uniwhere = [
			'on_id[!]'=>$on_id,
			'on_pf_id'=>$dataArr['on_pf_id'],
			'on_formart'=>$dataArr['on_formart']
		];
		$chk = $this->db->get('oe_numidx', ['on_id'], $uniwhere);
		if(!empty($chk)){
			return ['code'=>0, 'table'=>'oe_numidx', 'msg'=>'oe参考号已有记录，禁止添加'];
		}

		return [];
	}

	public function saveNumToOe($oe_id,$numArr)
	{	
		if(!$oe_id||!$numArr) exitJson('参数错误');
		foreach ($numArr as $val) {
			$arr = explode(":",$val);
			if(count($arr)>=2){
				$pf_id = $this->db->get('pro_factory','pf_id',['pf_name'=>$arr[0]]);
				$num = $arr[1];
				$data = [
					'on_oe_id'=>$oe_id,
					'on_pf_id'=>$pf_id,
					'on_number'=>$num,
				];
				$this->addNumidx($data);
			}
			
		}
		
		return [];
		
	}

	/**
	 * @param  int $oe_id
	 * @param  int $on_id
	 * @param  array  $tbIds 为空的话则会删除
	 * @method 保存oe_numidx_tag_brand
	 * @author zhengweihua 
	 * @copyright 2025-07-31
	 */
	public function saveOeNumTb($oe_id,$on_id,$tbIds)
	{	
		if(empty($oe_id) || empty($on_id)) exitJson('参数错误');	
		if (empty($tbIds)) {
			$tbIds = [];
		} elseif (!is_array($tbIds)) {
			$tbIds = explode(',', $tbIds);
		}
		if($oe_id && $on_id)
		{
			$tbIds = array_unique($tbIds);
			$oldTbIds = $this->db->select('oe_numidx_tag_brand', 'ontb_tb_id', ['ontb_oe_id'=>$oe_id,'ontb_on_id'=>$on_id]);
			if(!is_array($oldTbIds)) $oldTbIds = [];
			$delTbIds = array_diff($oldTbIds, $tbIds);

			$this->db->Begin();
			if(!empty($delTbIds)){
				$this->db->delete('oe_numidx_tag_brand', ['ontb_oe_id'=>$oe_id,'ontb_on_id'=>$on_id, 'ontb_tb_id'=>$delTbIds]);
			}
			$newTbIds = array_diff($tbIds, $oldTbIds);
			foreach ($newTbIds as $tbId) {
				$this->db->insert('oe_numidx_tag_brand', [
					'ontb_oe_id'=>$oe_id,
					'ontb_on_id'=>$on_id,
					'ontb_tb_id'=>$tbId,
					'ontb_opuser'=>getOpuser(),
					'ontb_update_time'=>getNowTime()
				]);
			}
			$this->db->End();
			
		}
		return [];
	}
	
}