<?php
class vinAction extends baseAction
{
	/**
	 * @method  泽达API
	 * @author soul
	 * @copyright 2019/1/22
	 */
	function zdApiVinList()
	{
		LibRule::Check('CA12');
		$Params = mvc::$URL_PARAMS;
		$nowPage = isset($Params['page']) && $Params['page'] > 0 ? (int) $Params['page']:1;
		$perPage=isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 20;
		$where = '';
		$YpwBase = new YpwBase();
		
		$ReLike = array('*'=>'%', '?'=>'_', '？'=>'_');
		$table = 'stand_vin_zdapi';
		if(!empty($_POST['viz_vin']))
		{
			$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($_POST['viz_vin']))));		
			foreach($anyNum as $kk=>$vv)
			{
				$anyNum[$kk] = LibFc::FormatVin($vv);
			}
			$where .= sprintf(" and viz_vin IN ('%s')", implode("','", $anyNum));
			$perPage = count($anyNum);
			LibTpl::Set('hidePage', 1);
		}
		else
		{
			foreach($Params as $K=>$V)
			{
				$V = trim($V);
				if($V == '') continue;
				switch($K)
				{
					case 'viz_vin':
						$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($V))));
						if(count($anyNum) > 1)
						{
							foreach($anyNum as $kk=>$vv)
							{
								$anyNum[$kk] = LibFc::FormatVin($vv);
							}
							$where .= sprintf(" and viz_vin IN ('%s')", implode("','", $anyNum));
						}
						else
						{
							$V = LibFc::FormatNum(strtr($V, $ReLike), '%_');
							if(strlen($V) <= 8)
								$where .= sprintf(" AND viz_vin1_8 like '%s%%'", $V);
							else
								$where .= sprintf(" AND viz_vin like '%s%%'", $V);
						}
					break;
					case 'viz_gxb_code':
						$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($V))));
						if(count($anyNum) > 1)
						{
							foreach($anyNum as $kk=>$vv)
							{
								$anyNum[$kk] = LibFc::FormatNum($vv);
							}
							$where .= sprintf(" and viz_gxb_code IN ('%s')", implode("','", $anyNum));
						}
						else
						{
							$where .= sprintf(" AND viz_gxb_code like '%s'", LibFc::FormatNum(strtr($V, $ReLike), '%_'));
						}
					break;
					case 'viz_length':
					case 'viz_width':
					case 'viz_height':
					case 'viz_wheel':
						$where .= sprintf(" AND %s = '%d'", $K, $V);
					break;
					case 'viz_engine':
					case 'viz_brand':
					case 'viz_kw':
						$where .= sprintf(" AND %s like '%s'", $K, strtr($V, $ReLike));
					break;
				}
			}
		}
		$vinArr = [];
		if(!empty($where))
		{
			$Res = $YpwBase->get($table, array('count(1) as count'), $where, true);
			$Count = $Res['data']['count'];
			$Page = LibPage::show($Count, $perPage);
			if($Count > 0)
			{
				$Res = $YpwBase->get($table, ['*'], sprintf("%s order by viz_id desc LIMIT %d,%d", $where, ($nowPage-1)*$perPage,$perPage));
				foreach($Res['data'] as $tv)
				{
					$tv['viz_json'] = json_decode($tv['viz_json'], true);
					$vinArr[$tv['viz_vin']] = $tv;
				}
				if(!empty($vinArr))
				{
					$res = $YpwBase->get('stand_model_any', ['sma_id, sma_vin'], sprintf(" and sma_vin in ('%s')", implode("','", array_keys($vinArr))));
					foreach($res['data'] as $tv) 
					{
						$vinArr[$tv['sma_vin']] = array_merge($vinArr[$tv['sma_vin']], $tv);
					}
				}
			}
		}
		
		$zdtotal = 1053113;
		$res = $YpwBase->get('stand_vin_zdapi', ['count(*) count'], ' and viz_atime > 1747710251', true);
		$zdtotal -= $res['data']['count'];

		LibTpl::Set('zdtotal', $zdtotal);
		LibTpl::Set('Page', $Page);
		LibTpl::Set('vinArr', $vinArr);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('title','泽达API-VIN');
		LibTpl::Put();
	}

	

	//采集泽达车架号
	function catchZdApiVin()
	{
		LibRule::Check('CA12');
		$vinArr = [];
		foreach($_POST['vins'] as $vin)
		{
			$vin = LibFc::FormatVin($vin);
			if(strlen($vin) == 17) $vinArr[$vin] = [];
		}
		if(!empty($vinArr))
		{
			$YpwBase = new YpwBase();
			//剔除600w有的
			$hasArr = [];
			if(!empty($_POST['ignore']))
			{
				$res = $YpwBase->get('stand_model_any', ['sma_id', 'sma_vin'], sprintf(" and sma_vin in ('%s')", implode("','", array_keys($vinArr))));
				$hasArr = array_column($res['data'], null, 'sma_vin');
				$vinArr = array_merge($vinArr, $hasArr);
			}
			$needVin = array_unique(array_diff(array_keys($vinArr), array_keys($hasArr)));
			if(!empty($needVin))
			{
				if(!empty($_POST['cattype']) && $_POST['cattype'] == 'task')
				{
					$res = $YpwBase->get('stand_catch_list', ['sce_vin'], sprintf(" and sce_vin in ('%s') and sce_reg_code = 'ZDAPI'", implode("','", $needVin)));
					$hasTaskArr = array_column($res['data'], 'sce_vin');
					$needTaskVin = array_unique(array_diff($needVin, $hasTaskArr));
					if(!empty($needTaskVin))
					{
						$addTaskArr = [];
						foreach($needTaskVin as $tvin)
						{
							$addTaskArr[] = [
								'sce_vin'=>$tvin,	
								'sce_level'=>'9999',	
								'sce_reg_code'=>'ZDAPI'
							];
						}
						$YpwBase->addAny('stand_catch_list', array_keys($addTaskArr[0]), $addTaskArr);
						$YpwBase->set('stand_scqd_reg', ['reg_waitcount'=>'#@reg_waitcount+'.count($addTaskArr)], " and reg_code = 'ZDAPI'");
					}
					$YpwBase->set('stand_catch_list', ['sce_level'=>'9999'], sprintf(" and sce_vin in ('%s') and sce_reg_code = 'ZDAPI'", implode("','", $needVin)));
					LibFc::ReturnJson(true, ['task'=>'ok']);
				}
				else
				{
					$LibYpApi = new LibYpApi();
					$res = $LibYpApi->Get('vin/catchAnyVinfromZdApi', [], ['vins'=>implode(',', $needVin)]);
					$vinArr = array_merge($vinArr, $res['data']);
				}
			}
		}
		LibFc::ReturnJson(true, $vinArr);
	}


	//添加清单任务
	function addScqdTask()
	{
		LibRule::Check('CA10');
		$vinArr = [];
		foreach($_POST['vins'] as $str)
		{
			$str = str_replace(' ', '', $str);
			if(strlen($str) >= 17)
			{
				$vin = LibFc::FormatVin(substr($str, 0, 17));
				$engine6 = substr($str, 17);
				$engine6 = !empty($engine6) && strlen($engine6) >= 6 ? $engine6:'';
				$unikey = $vin.'@'.$engine6;
				$vinArr[$unikey] = ['vin'=>$vin, 'engine6'=>$engine6];
			}
		}

		$YpwBase = new YpwBase();
		//剔除600w有的
		if(!empty($vinArr))
		{
			if(!empty($_POST['ignore']))
			{
				$vins = array_unique(array_column($vinArr, 'vin'));
				$res = $YpwBase->get('stand_model_any', ['sma_vin'], sprintf(" and sma_vin in ('%s')", implode("','", $vins)));
				foreach($res['data'] as $tv)
				{
					foreach($vinArr as $unikey=>$vt)
					{
						if($vt['vin'] == $tv['sma_vin']) unset($vinArr[$unikey]);
					}
				}
			}
		}
		$addTaskArr = [];
		if(!empty($vinArr))
		{
			$res = $YpwBase->get('stand_scqd_reg', ['reg_code, reg_wmi, reg_remark']);
			$regArr = array_column($res['data'], null, 'reg_code');
			$wmiCodeArr = [];
			foreach($regArr as $site=>$reg)
			{
				foreach(explode(',', $reg['reg_wmi']) as $wmi)
				{
					if(!empty($wmi))
					{
						$wmiCodeArr[$wmi][] = $site;
					}
				}
			}
			
			$vins = array_unique(array_column($vinArr, 'vin'));
			$res = $YpwBase->get('stand_catch_list', ['sce_vin','sce_engine6','sce_reg_code'], sprintf(" and sce_vin in ('%s') and sce_level = 9999", implode("','", $vins)));
			foreach($res['data'] as $ht)
			{
				$hasArr[$ht['sce_vin'].'@'.$ht['sce_engine6']][] = $ht['sce_reg_code'];
			}
			
			foreach($vinArr as $unikey=>$vt)
			{
				$tvin = $vt['vin'];
				$wmi = substr($tvin, 0, 3);
				//是否有对应的wmi频道
				if(!empty($wmiCodeArr[$wmi]) && empty($vt['engine6']))
				{
					foreach($wmiCodeArr[$wmi] as $sc)
					{
						if(empty($hasArr[$unikey]) || !in_array($sc, $hasArr[$unikey]))
						{
							$addTaskArr[] = [
								'sce_vin'=>$tvin,	
								'sce_level'=>'9999',	
								'sce_reg_code'=>$sc,
								'sce_engine6'=>''
							];
						}
					}
				}
				if(strlen($vt['engine6']) >= 6 && (empty($hasArr[$unikey]) || !in_array('engine6', $hasArr[$unikey])))
				{
					$addTaskArr[] = [
						'sce_vin'=>$tvin,	
						'sce_level'=>'9999',	
						'sce_reg_code'=>'engine6',
						'sce_engine6'=>$vt['engine6']
					];
				}
			
			}
			if(!empty($addTaskArr))
			{
				$YpwBase->addAny('stand_catch_list', array_keys($addTaskArr[0]), $addTaskArr);
			}
		}
		LibFc::ReturnJson(true, ['task'=>'ok', 'vins'=>array_column($addTaskArr, 'sce_vin')]);
	}


	//从泽达接口获取车架号数据
	function getDataFromZeda()
	{
		LibRule::Check('CA01');
		$Params = mvc::$URL_PARAMS;
		$vinArr = [];
		$vin = LibFc::FormatVin($Params['vin']);
		if(strlen($vin) == 17)
		{
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->Get('vin/catchAnyVinfromZdApi', [], ['vins'=>$vin]);
			if(!empty($res['data'][$vin]))
			{
				$YpwBase = new YpwBase();
				$res = $YpwBase->get('stand_model_any', ['*'], sprintf(" and sma_vin='%s' limit 1", $vin), true);
				$vinArr = $res['data'];
			}
		}
		LibFc::ReturnJson(true, $vinArr);
	}

	//图片内容识别型号
	function getDataFromImgSma()
	{
		LibRule::Check('CA01');
		$Params = mvc::$URL_PARAMS;
		$Params['ocr'] = 'all';
		$arr = [];
		$LibYpApi = new LibYpApi();
		$res = $LibYpApi->Get('vin/vinImgSma', $Params);
		if(!empty($res['data']['sma']))
			$arr = $res['data']['sma'];
		else
			$arr = $res['data'];
		LibFc::ReturnJson(true, $arr);
	}


	//根据规则获取需要采集的车架号
	function getCatchVinByVinreg()
	{
		LibRule::Check('CA01');
		$Params = mvc::$URL_PARAMS;
		$ReLike = array('*'=>'%', '?'=>'_', '？'=>'_');
		$_POST['vin'] = LibFc::FormatNum(strtr($_POST['vin'], $ReLike), '%_');
		if(strlen($_POST['vin']) < 17 && substr($_POST['vin'], -1, 1) !== '%') $_POST['vin'] .= '%';
		$vinArr = [];
		if(strlen($_POST['vin']) > 3)
		{
			$YpwBase = new YpwBase();
			$where = sprintf(" and vs_vin LIKE '%s' AND (vs_vin9 = vs_checkcode OR vs_vin NOT LIKE 'L%%')
			AND vs_vin NOT IN (SELECT SMA_VIN FROM stand_model_any WHERE SMA_VIN LIKE '%s') ORDER BY LEFT(vs_vin, 8), RIGHT(vs_vin, 8)", $_POST['vin'], $_POST['vin']);
			$res = $YpwBase->get('yp_vin_search', ['vs_vin as vin'], $where);
			$vinArr = array_column($res['data'], 'vin');
		}
		LibFc::ReturnJson(true, $vinArr);
	}
	


	/**
	 * @method  随车清单规则列表
	 * @author soul
	 * @copyright 2019/1/22
	 */
	function scqdRegList()
	{
		LibRule::Check('CA10');
		$YpwBase = new YpwBase();
		$Res = $YpwBase->get('stand_scqd_reg', ['*'], ' order by reg_id');
		$regArr = [];
		foreach($Res['data'] as $k=>$v)
		{
			$v['reg_check_res'] = json_decode($v['reg_check_res'], true);
			$v['reg_jsvin_res'] = json_decode($v['reg_jsvin_res'], true);
			$regArr[$k] = $v;
		}

		$Res = $YpwBase->get('stand_catch_jsvin', ['scl_reg_code, COUNT(*) as count'], ' group by scl_reg_code');
		$regJsArr = array_column($Res['data'], 'count', 'scl_reg_code');
		LibTpl::Set('statusArr', [0=>'暂停',1=>'正常', -1=>'关闭']);
		LibTpl::Set('regJsArr', $regJsArr);
		LibTpl::Set('regArr', $regArr);
		LibTpl::Set('title','随车清单规则');
		LibTpl::Put();
	}

	/**
	 * @method  OCR规则列表
	 * @author soul
	 * @copyright 2019/1/22
	 */
	function ocrRegList()
	{
		LibRule::Check('CA10');
		$YpwBase = new YpwBase();
		$file = mvc::$cfg['PATH_CACHE'].'ocrRegList.php';
		if(!file_exists($file) || filemtime($file) < (time()-3600*2))
		{
			$Res = $YpwBase->get('stand_model_any', ['sma_vin1_3, COUNT(*) count'], sprintf(" and sma_from = 'ocr' AND sma_etime > %d GROUP BY sma_vin1_3", strtotime('-1days')));
			$countArr = array_column($Res['data'], 'count', 'sma_vin1_3');
			if(is_array($countArr)) LibFc::ArraySave($countArr, $file);
		}
		else
		{
			$countArr = include($file);
		}
		$Res = $YpwBase->get('stand_ocrimg_reg', ['*'], '');
		$regArr = [];
		foreach($Res['data'] as $k=>$v)
		{
			$v['count'] = 0;
			$v['wmis'] = explode(',', $v['reg_wmi']);
			foreach($v['wmis'] as $wmi)
			{
				if(!empty($countArr[$wmi])) $v['count'] += $countArr[$wmi];
			}
			$regArr[$k] = $v;
		}

		$Res = $YpwBase->get('stand_catch_jsvin', ['scl_reg_code, COUNT(*) as count'], ' group by scl_reg_code');
		$regJsArr = array_column($Res['data'], 'count', 'scl_reg_code');
		LibTpl::Set('statusArr', [0=>'暂停',1=>'正常', -1=>'关闭']);
		LibTpl::Set('regJsArr', $regJsArr);
		LibTpl::Set('regArr', $regArr);
		LibTpl::Set('title','OCR规则');
		LibTpl::Put();
	}
	
	/**
	 * @method  泽达规则列表
	 * @author soul
	 * @copyright 2019/1/22
	 */
	function zdApiRegList()
	{
		LibRule::Check('CA10');
		$YpwBase = new YpwBase();
		$Res = $YpwBase->get('stand_vin_zdapireg', ['*'], '');
		$regArr = $Res['data'];

		$Res = $YpwBase->get('stand_catch_jsvin', ['scl_scode, COUNT(*) as count'], " and scl_reg_code = 'ZDAPI' group by scl_scode");
		$regTjArr = array_column($Res['data'], 'count', 'scl_scode');
		LibTpl::Set('statusArr', [0=>'暂停',1=>'正常', -1=>'关闭']);
		LibTpl::Set('regTjArr', $regTjArr);
		LibTpl::Set('regArr', $regArr);
		LibTpl::Set('title','泽达规则列表');
		LibTpl::Put();
	}

	
	/**
	 * @method 根据规则创建车架号
	 * @author soul
	 * @copyright 2019/1/22
	 */
	function buildVin()
	{
		LibRule::Check('CA10');
		$Params = mvc::$URL_PARAMS;
		$vinArr = [];
		$bvin = LibFc::FormatVin($Params['bvin']);
		$evin = LibFc::FormatVin($Params['evin']);
		if(strlen($bvin) == 17 && strlen($evin) == 17
			&& substr($bvin, 0, 8).substr($bvin, 9, 2) == substr($evin, 0, 8).substr($evin, 9, 2)
			&& preg_match('/^\d{5}$/', substr($bvin, 12, 5)) && preg_match('/^\d{5}$/',substr($evin, 12, 5))
		)
		{
			$vin18 = substr($bvin, 0, 8);
			$sameEnd = substr($evin, 9, 2);
			if(substr($bvin, 11, 1) == substr($evin, 11, 1))
			{
				$sameEnd .= substr($bvin, 11, 1);
			}
			$bw = 9+strlen($sameEnd);

			$xlhArr = [substr($bvin, $bw, 17-$bw), substr($evin, $bw, 17-$bw)];
			sort($xlhArr);
			$maxCount = $xlhArr[1] - $xlhArr[0];
			
			$vincount = !empty($Params['vincount']) && $Params['vincount'] <= $maxCount ? (int) $Params['vincount']: $maxCount;
			$per = round($maxCount/$vincount);
			for($i = 1; $i <= $vincount; $i++)
			{
				$nosame = str_pad($xlhArr[0]+$per*$i, 17-$bw, '0', STR_PAD_LEFT);
				if($nosame > $xlhArr[1]) break;
				$tempVin = $vin18.'X'.$sameEnd.$nosame;
				$vin9 =	LibFc::VinCheckCode($tempVin);
				$vinArr[] = $vin18.$vin9['real'].$sameEnd.$nosame;
			}
		}
		LibTpl::Set('Params', $Params);
		LibTpl::Set('vinArr', $vinArr);
		LibTpl::Set('title','创建车架号');
		LibTpl::Put();
	}


	/**
	 * @method  型号发动机异常表
	 * @author soul
	 * @copyright 2021/1/13
	 */
	function gxbEngineTj()
	{
		LibRule::Check('CA02');
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('stand_gxb_engine', ['sge_gxb_code as gxb_code, count(*) as eng_count, group_concat(sge_engine) as engs'], ' GROUP BY sge_gxb_code HAVING COUNT(*) > 1');
		$onlineArr = []; 
		foreach($res['data'] as $tv)
		{
			$engArr = [];
			foreach(explode(',', $tv['engs']) as $te)
			{
				$te = LibFc::FormatNum($te);
				if(!empty($te) && !in_array($te, $engArr)) $engArr[] = $te;
			}
			$tv['engs'] = $engArr;
			$tv['eng_count'] = count($engArr);
			$onlineArr[$tv['gxb_code']] = $tv;
		}
		
		//本地型号的发动机数 > 1 
		 $YPCAR67Db = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$res = $YPCAR67Db->get('yp_model3 JOIN yp_model3_gxb_num ON mg_m3_id = m3_id', ['mg_code as gxb_code, count(distinct m3_engine_format) as eng_count, group_concat(distinct m3_engine_format) as engs'], sprintf(" and mg_code in ('%s') GROUP BY mg_code", implode("','", array_keys($onlineArr))));
		$localArr = array_column($res['data'], null, 'gxb_code');
		
		//比较
		foreach($onlineArr as $gxbcode=>$tv)
		{
			if(empty($localArr[$gxbcode])) continue;
			$tv['local'] = $localArr[$gxbcode];
			if($tv['eng_count'] != $tv['local']['eng_count'])
			{
				$isNotSameFlag = false;
				$tv['local']['engs'] = empty($tv['local']['engs'])? []:explode(',', $tv['local']['engs']);
				//不同的
				$tv['com_engs'] = [];
				foreach($tv['engs'] as $ek=>$ev)
				{
					$same = false;
					foreach($tv['local']['engs'] as $elv)
					{
						if($ev == $elv || (substr($tv['gxb_code'], 0, 2) == 'FV' && substr($ev, 0, 3) == substr($elv, 0, 3)))
						{
							$same = true;
							break;
						}
					}
					if(!$same && !$isNotSameFlag) $isNotSameFlag = true;
					$tv['com_engs'][$ev] = $same? $ev: '<span class="red">'.$ev.'</span>';
				}
				$tv['com_local'] = [];
				foreach($tv['local']['engs'] as $ek=>$ev)
				{
					$same = false;
					foreach($tv['engs'] as $elv)
					{
						if($ev == $elv || (substr($tv['gxb_code'], 0, 2) == 'FV' && substr($ev, 0, 3) == substr($elv, 0, 3)))
						{
							$same = true;
							break;
						}
					}
					if(!$same && !$isNotSameFlag) $isNotSameFlag = true;
					$tv['com_local'][$ev] = $same? $ev: '<span class="red">'.$ev.'</span>';
				}
				if($isNotSameFlag) $tjArr[$gxbcode] = $tv;
			}
		}
		LibTpl::Set('tjArr', $tjArr);
		LibTpl::Set('title','型号发动机异常表');
		LibTpl::Put();
	}


	/**
	 * @method  WMI和品牌的关系
	 * @author soul
	 * @copyright 2022/6/7
	 */
	public function wmiAndBrand()
    {
        LibRule::Check('CA02');
        $Params = mvc::$URL_PARAMS;
        $nowPage = isset($Params['page']) && $Params['page'] > 0 ? (int) $Params['page']:1;
        $perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 20;
        $where = '';
        $YpwBase = new YpwBase();
        foreach($Params as $K=>$V)
        {
            $V = trim($V);
            if($V == '') continue;
            switch($K)
            {
                case 'swb_wmi':
					 $where .= sprintf(" and %s like '%s%%'", $K, $V);
                break;
                case 'swb_brand':
                case 'swb_word':
                    $where .= sprintf(" and (swb_brand like '%%%s%%' or swb_word like '%%%s%%')", $V, $V);
                break;
            }
        }
        $res = $YpwBase->get('stand_wmi_brand', ['count(*) count'], $where, true);
		$Count = $res['data']['count'];
        $Page = LibPage::show($Count, $perPage);
        if($Count > 0)
        {
            $Res = $YpwBase->get('stand_wmi_brand', ['*'], sprintf("%s order by swb_wmi,swb_brand LIMIT %d,%d", $where, ($nowPage-1)*$perPage,$perPage));
            $dataArr = $Res['data'];
        }
        LibTpl::Set('Page', $Page);
        LibTpl::Set('dataArr', $dataArr);
        LibTpl::Set('Params', $Params);
        LibTpl::Set('title','WMI&品牌');
        LibTpl::Put();
    }

	/**
	 * @method  WMI和品牌的关系
	 * @author soul
	 * @copyright 2022/6/7
	 */
	public function wmiAndBrandInfo()
    {
        LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('stand_wmi_brand', ['*'], sprintf(" and swb_id =%d", $Params['swb_id']), true);
		$res['data']['swb_word'] = trim($res['data']['swb_word'], ',');
		LibFc::ajaxJsonEncode($res);
	}
	

	/**
	 * @method    删除WMI&品牌
	 * @author soul
	 * @copyright 2022/6/7
	 */
	function wmiAndBrandDel()
	{
		LibRule::Check('CA05');
		if(!empty($_POST['ids']))
		{
			$YpwBase = new YpwBase();
			$YpwBase->del('stand_wmi_brand', sprintf(" and swb_id in (%s)", implode(',', $_POST['ids'])));
		}
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>true]);
	}

	/**
	 * @method    添加编辑WMI&品牌
	 * @author soul
	 * @copyright 2022/6/7
	 */
	function setWmiAndBrand()
	{
		LibRule::Check('CA10');
		$YpwUser = new YpwUser();
		$setArr = [
			'swb_wmi'=>$_POST['swb_wmi'],
			'swb_brand'=>LibFc::reBrandName($_POST['swb_brand']),
			'swb_word'=>$_POST['swb_word'],
		];
		$res = $YpwUser->setWmiAndBrand($_POST['swb_id'], $setArr);
		LibFc::ajaxJsonEncode($res);
	}


	/**
	 * @method  发动机功率详情
	 * @author soul
	 * @copyright 2022/7/7
	 */
	public function engineKwInfo()
    {
        LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('stand_gxbengine_kw', ['*'], sprintf(" and ckw_id =%d", $Params['id']), true);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method   发动机功率
	 * @author soul
	 * @copyright 2022/7/7
	 */
	function engineKw()
	{
		LibRule::Check('CA01');
		$Params = mvc::$URL_PARAMS;
		$nowPage = isset($Params['page']) && $Params['page'] > 0 ? (int) $Params['page']:1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 20;
		$where = '';
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('stand_gxbengine_kw', ['distinct ckw_uid'], '');
		$uids = implode(',', array_column($res['data'], 'ckw_uid'));
		$B2cBase = new B2cBase();
		$res = $B2cBase->get('an_user', ['au_uid', 'au_name'], sprintf(" and au_uid in (%s) order by au_status desc, au_name asc", $uids));
		LibTpl::Set('userArr', array_column($res['data'], 'au_name', 'au_uid'));
		//if(!isset($Params['hasgxb'])) $Params['hasgxb'] = 1;
		$ReLike = ['*'=>'%', '?'=>'_', '？'=>'_'];
		$table = 'stand_gxbengine_kw';
		foreach($Params as $K=>$V)
		{
			$V = trim($V);
			if($V == '') continue;
			switch($K)
			{
				case 'ckw_gxb_format':
					$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($V))));
					if(count($anyNum) > 1)
					{
						foreach($anyNum as $kk=>$vv)
						{
							$anyNum[$kk] = LibFc::FormatNum($vv);
						}
						$where .= sprintf(" and ckw_gxb_format IN ('%s')", implode("','", $anyNum));
					}
					else
					{
						$where .= sprintf(" AND ckw_gxb_format like '%s'", LibFc::FormatNum(strtr($V, $ReLike), '%_'));
					}
				break;
				case 'ckw_brand':
				case 'ckw_engine':
				case 'ckw_txt_kw':
				case 'ckw_ed_kw':
				case 'ckw_jgl_kw':
				case 'ckw_xuhang':
				case 'ckw_dianchi':
				case 'ckw_paifang':
				case 'ckw_from':
					$where .= sprintf(" AND %s like '%s'", $K, strtr($V, $ReLike));
				break;
				case 'ckw_uid':
					$where .= sprintf(" AND ckw_uid = %d", $V);
				break;
				case 'ckw_ocr_res':
					$where .= sprintf(" AND ckw_ocr_res like '%%%s%%'", strtr($V, $ReLike));
				break;
				case 'hasedkw': 
					if($V == 1){
						$where .= " and ckw_ed_kw != 0";
					}else if($V == -1){
						$where .= " and ckw_ed_kw = 0";
					}
				break;
				case 'hasjglkw': 
					if($V == 1){
						$where .= " and ckw_jgl_kw != 0";
					}else if($V == -1){
						$where .= " and ckw_jgl_kw = 0";
					}
				break;
				case 'hasdianchi': 
					if($V == 1){
						$where .= " and ckw_dianchi != ''";
					}else if($V == -1){
						$where .= " and ckw_dianchi = ''";
					}
				break;
				case 'haspaifang': 
					if($V == 1){
						$where .= " and ckw_paifang != ''";
					}else if($V == -1){
						$where .= " and ckw_paifang = ''";
					}
				break;
				case 'addTime': $where .= sprintf(" and ckw_etime >= %d", strtotime($V)); break;
				case 'endTime': $where .= sprintf(" and ckw_etime <= %d", strtotime($V.' 23:59:59')); break;
				case 'hasgxb':
					if($V == 1){
						$where .=  " and ckw_gxb_format in (SELECT distinct smt_gxb_code FROM `stand_model_tj`)"; 
					}else if($V == -1){
						$where .=  " and ckw_gxb_format not in (SELECT distinct smt_gxb_code FROM `stand_model_tj`)"; 
					}
				break;
				case 'v10':
					$tw = [];
					foreach(str_split($V) as $tv)
					{
						if(trim($tv) != '')
						{
							$tw[] = sprintf(" smt_vin10 like '%%%s%%'", $tv);
						}
					}
					if(!empty($tw))
						$where .= sprintf(" and ckw_gxb_format in (SELECT smt_gxb_code FROM `stand_model_tj` WHERE (%s))", implode(" or ", $tw));
				break;
		
			}
		}
		$listArr = [];
		$Res = $YpwBase->get($table, array('count(1) as count'), $where, true);
		$Count = $Res['data']['count'];
		$Page = LibPage::show($Count, $perPage);
		if($Count > 0)
		{
			$Res = $YpwBase->get($table, ['*'], sprintf("%s order by ckw_gxb_format,ckw_engine LIMIT %d,%d", $where, ($nowPage-1)*$perPage,$perPage));
			$listArr = $Res['data'];
		}
		LibTpl::Set('fromArr', ['ocr'=>'OCR','manual'=>'人工', 'catch'=>'采集']);
		LibTpl::Set('listArr', $listArr);
		LibTpl::Set('Page', $Page);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('title','功率管理');
		LibTpl::Put();
	}

	/**
	 * @method 删除功率
	 * @author soul
	 * @copyright 2022/7/7
	 */
	function engineKwDel()
	{
		LibRule::Check('CA05');
		if(!empty($_POST['ids']))
		{
			$YpwBase = new YpwBase();
			$YpwBase->del('stand_gxbengine_kw', sprintf(" and ckw_id in (%s)", implode(',', $_POST['ids'])));
		}
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>true]);
	}

	/**
	 * @method  管理功率
	 * @author soul
	 * @copyright 2022/7/7
	 */
	function engineKwSet()
	{
		LibRule::Check('CA10');
		$YpwUser = new YpwUser();
		$res = $YpwUser->setEngineKw($_POST);
		LibFc::ajaxJsonEncode($res);
	}
	
	/**
	 * @method  获取功率类型
	 * @author soul
	 * @copyright 2023/3/2
	 */
	function getKwType()
	{
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$isJinkou = !in_array(substr($Params['vin'], 0, 1), ['L', 'H'])? true: false;
		$where = sprintf(" and ckw_engine='%s' and ckw_gxb_format ='%s'", LibFc::Escape($Params['engine']), LibFc::FormatNum($Params['gxbcode']));
		if($isJinkou) $where .= sprintf(" and ckw_brand='%s'", LibFc::Escape($Params['brand']));
		$res = $YpwBase->get('stand_gxbengine_kw', ['ckw_id,ckw_ed_kw','ckw_jgl_kw'], $where, true);
		$arr = $res['data'];
		LibFc::ReturnJson(true, $arr);
	}


	/**
	 * @method v8 型号品牌车系管理
	 * @author soul
	 * @copyright 2022/8/27
	 */
	public function getGxbV8Info()
    {
        LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$isJinkou = !in_array(substr($Params['vin8'], 0, 1), ['L', 'H'])? true: false;
		$where = sprintf(" and sgv_vin1_8='%s' and sgv_gxb_code ='%s'", LibFc::FormatNum($Params['vin8']), LibFc::FormatNum($Params['gxbcode']));
		if($isJinkou) $where .= sprintf(" and sgv_org_brand='%s'", LibFc::Escape($Params['brand']));
		$res = $YpwBase->get('stand_gxb_v8info', ['*'], $where, true);
		$arr = $res['data'];
		LibFc::ReturnJson(true, $arr);
	}

	/**
	 * @method   v8 型号品牌车系管理
	 * @author soul
	 * @copyright 2022/8/27
	 */
	function setGxbV8Info()
	{
		LibRule::Check('CA10');
		$YpwBase = new YpwBase();
		$setArr = [
			'sgv_vin1_8'=>LibFc::FormatNum($_POST['sgv_vin1_8']),
			'sgv_org_brand'=>LibFc::reBrandName($_POST['sgv_org_brand']),
			'sgv_gxb_code'=>LibFc::FormatNum($_POST['sgv_gxb_code_show']),
			'sgv_gxb_code_show'=>$_POST['sgv_gxb_code_show'],
			'sgv_brand'=>$_POST['sgv_brand'],
			'sgv_model'=>$_POST['sgv_model'],
			'sgv_ispxjk'=>(int)$_POST['sgv_ispxjk'],
			'sgv_drive'=>$_POST['sgv_drive'],
			'sgv_country'=>$_POST['sgv_country'],
			'sgv_company'=>LibFc::reBrandName($_POST['sgv_company']),
			'sgv_etime'=>time()
		];
		if(in_array(substr($setArr['sgv_vin1_8'], 0, 1), ['L', 'H'])) $setArr['sgv_org_brand'] = '';
		$res = $YpwBase->replace('stand_gxb_v8info', $setArr);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method   v8 型号品牌车系管理
	 * @author soul
	 * @copyright 2022/8/27
	 */
	function setAnyGxbV8Info()
	{
		LibRule::Check('CA10');
		$YpwBase = new YpwBase();
		$baseSet = [];
		if(!empty($_POST['sgv_brand'])) $baseSet['sgv_brand'] = LibFc::reBrandName($_POST['sgv_brand']);
		if(!empty($_POST['sgv_ispxjk'])) $baseSet['sgv_ispxjk'] = (int) $_POST['sgv_ispxjk'];
		if(!empty($_POST['sgv_model'])) $baseSet['sgv_model'] = $_POST['sgv_model'];
		if(!empty($_POST['sgv_drive'])) $baseSet['sgv_drive'] = $_POST['sgv_drive'];
		if(!empty($_POST['sgv_country'])) $baseSet['sgv_country'] = $_POST['sgv_country'];
		if(!empty($_POST['sgv_company'])) $baseSet['sgv_company'] = LibFc::reBrandName($_POST['sgv_company']);
		
		if(!empty($baseSet))
		{
			$baseSet['sgv_etime'] = time();
			foreach($_POST['codes'] as $tv)
			{
				$tt = explode('@', $tv);
				if(count($tt) == 3 && !empty($tt[0]) && !empty($tt[1]) && !empty($tt[2])){
					$tt[0] = LibFc::FormatNum($tt[0]);
					if(in_array(substr($tt[0], 0, 1), ['L', 'H'])) $tt[2] = '';
					$where = sprintf(" and sgv_vin1_8='%s' and sgv_org_brand='%s' and sgv_gxb_code='%s'", $tt[0], LibFc::Escape($tt[2]), LibFc::FormatNum($tt[1]));
					$res = $YpwBase->get('stand_gxb_v8info', ['sgv_vin1_8'], $where);
					if(!empty($res['data'])){
						$YpwBase->set('stand_gxb_v8info', $baseSet, $where);
					}else{
						$set = $baseSet;
						$set['sgv_vin1_8']= $tt[0];
						$set['sgv_org_brand']= LibFc::reBrandName($tt[2]);
						$set['sgv_gxb_code']= LibFc::FormatNum($tt[1]);
						$set['sgv_gxb_code_show']= $tt[1];
						$YpwBase->add('stand_gxb_v8info', $set);
					}
				}
			}
		}
		LibFc::ReturnJson(true, $arr);
	}



	/**
	 * @method v8 型号品牌车系管理
	 * @author soul
	 * @copyright 2022/8/27
	 */
	public function delGxbV8Info()
    {
        LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$isJinkou = !in_array(substr($Params['vin8'], 0, 1), ['L', 'H'])? true: false;
		$where = sprintf(" and sgv_vin1_8='%s' and sgv_gxb_code ='%s'", LibFc::FormatNum($Params['vin8']), LibFc::FormatNum($Params['gxbcode']));
		if($isJinkou) $where .= sprintf(" and sgv_org_brand='%s'", LibFc::Escape($Params['brand']));
		$res = $YpwBase->del('stand_gxb_v8info', $where);
		LibFc::ajaxJsonEncode($res);
	}

	 
	/**
	 * @method   型号报表
	 * @author soul
	 * @copyright 2022/12/14
	 */
	function gxbTj()
	{
		LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$nowPage = isset($Params['page']) && $Params['page'] > 0 ? (int) $Params['page']:1;
		$perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 20;
		$where = '';
		$YpwBase = new YpwBase();
		$ReLike = array('*'=>'%', '?'=>'_', '？'=>'_');
		$table = "stand_model_any";
		foreach($Params as $K=>$V)
		{
			$V = trim(strtr($V, ['！'=>'!', '＝'=>'=']));
			if($V == '') continue;
			switch($K)
			{
				case 'sma_gxb_code':
					$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($V))));
					if(count($anyNum) > 1)
					{
						foreach($anyNum as $kk=>$vv)
						{
							$anyNum[$kk] = LibFc::FormatNum($vv);
						}
						$where .= sprintf(" and sma_gxb_code IN ('%s')", implode("','", $anyNum));
					}
					else
					{
						$where .= sprintf(" AND sma_gxb_code like '%s'", LibFc::FormatNum(strtr($V, $ReLike), '%_'));
					}
				break;
				case 'sma_vin10':
					$where .= sprintf(" and sma_vin10 IN ('%s')", implode("','", str_split($V)));
				break;
			}
		}
		$vinArr = [];
		if(!empty($where))
		{
			$fileds = ['sma_gxb_code_show,sma_gxb_code,sma_engine,sma_length,sma_width,sma_height,sma_wheel,group_concat(distinct sma_vin10) sma_vin10,count(*) as vin_count'];
			$Res = $YpwBase->get($table, $fileds, sprintf("%s group by sma_gxb_code,sma_engine,sma_length,sma_width,sma_height,sma_wheel", $where));
			$vinArr = $Res['data'];
		}
		LibTpl::Set('vinArr', $vinArr);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('title','型号报表');
		LibTpl::Put();
	}


	//卡车VIN8规则
	public function kcReg()
    {
        LibRule::Check('CA14');
        $Params = mvc::$URL_PARAMS;
        $nowPage = isset($Params['page']) && $Params['page'] > 0 ? (int) $Params['page']:1;
        $perPage = isset($_COOKIE['perPage'])? $_COOKIE['perPage'] : 20;
        $where = '';
        $YpwBase = new YpwBase();
        $ReLike = array('*'=>'%', '?'=>'_', '？'=>'_');
        $orderBy = 'skr_vin8 asc';
        foreach($Params as $K=>$V)
        {
            $V = trim($V);
            if($V == '') continue;
            switch($K)
            {
                case 'skr_vin8':
					$V = LibFc::FormatNum(strtr($V, $ReLike), '%_');
					$where .= sprintf(" AND skr_vin8 like '%s%%'", $V);
                    break;
				case 'skr_val':
				case 'skr_gxbcode':
					if($V == '=')
						$where .= " and {$K}=''";
					else if($V == '!')
						$where .= " and {$K} !=''";
					else
						$where .= sprintf(" AND %s like '%s'", $K, strtr($V, $ReLike));
				break;
				case 'skr_field':
                    $where .= sprintf(" and %s ='%s'", $K, $V);
                break;
				case 'addTime': $where .= sprintf(" and skr_etime >= %d", strtotime($V)); break;
				case 'endTime': $where .= sprintf(" and skr_etime <= %d", strtotime($V.' 23:59:59')); break;
            }
        }
        $table = "stand_kczj_reg";
        $listArr = [];
		$Res = $YpwBase->get($table, ['count(1) as count'], $where, true);
		$Count = $Res['data']['count'];
        $Page = LibPage::show($Count, $perPage);
        if($Count > 0)
        {
            $Res = $YpwBase->get($table, ['*'], sprintf("%s order by %s LIMIT %d,%d", $where, $orderBy,($nowPage-1)*$perPage,$perPage));
            $listArr = $Res['data'];
        }
		$regFields = [
			'zwps'=>'座位',
			'drive'=>'驱动',
			'wheel'=>'轴距',
		];
        LibTpl::Set('Page', $Page);
        LibTpl::Set('regFields', $regFields);
        LibTpl::Set('listArr', $listArr);
        LibTpl::Set('Params', $Params);
        LibTpl::Set('title','卡车规则');
        LibTpl::Put();
    }

	/**
	 * @method  详情
	 * @author soul
	 * @copyright 2022/7/7
	 */
	public function kcRegInfo()
    {
        LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$res = $YpwBase->get('stand_kczj_reg', ['*'], sprintf(" and skr_id =%d", $Params['id']), true);
		LibFc::ajaxJsonEncode($res);
	}

	/**
	 * @method 删除
	 * @author soul
	 * @copyright 2022/7/7
	 */
	function kcRegDel()
	{
		LibRule::Check('CA05');
		if(!empty($_POST['ids']))
		{
			$YpwBase = new YpwBase();
			$YpwBase->del('stand_kczj_reg', sprintf(" and skr_id in (%s)", implode(',', $_POST['ids'])));
		}
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>true]);
	}

	/**
	 * @method  管理
	 * @author soul
	 * @copyright 2022/7/7
	 */
	function kcRegSet()
	{
		LibRule::Check('CA10');
		$YpwUser = new YpwUser();
		if(!empty($_POST['skr_vin8']) && !empty($_POST['skr_field']) && !empty($_POST['skr_val']))
		{
			$addArr = [
				'skr_vin8'=>$_POST['skr_vin8'],
				'skr_field'=>$_POST['skr_field'],
				'skr_val'=>$_POST['skr_val'],
				'skr_gxbcode'=>$_POST['skr_gxbcode'],
				'skr_by'=>$_SESSION['admin_userid'],
				'skr_etime'=>time()
			];
			$addArr['skr_vin8'] = preg_replace('/[^a-zA-Z0-9]/', '*', $addArr['skr_vin8']);
			if(strlen($addArr['skr_vin8']) < 8) $addArr['skr_vin8'] = str_pad($addArr['skr_vin8'], 8, '*');
			if(!empty($_POST['skr_id'])){
				$res = $YpwUser->set('stand_kczj_reg', $addArr, sprintf(" and skr_id=%d", $_POST['skr_id']));
			}else{
				$res = $YpwUser->add('stand_kczj_reg', $addArr);
			}
			LibFc::ajaxJsonEncode($res);
		}
		LibFc::ReturnJson(false, '数据不完整，请重新填写');
	}


	//型号电池规则
	function batteryReg()
	{
		LibRule::Check('CA02');
		$Params = mvc::$URL_PARAMS;
		$YpwBase= new YpwBase();
		$B2cBase = new B2cBase();
		$statusArr=[
			0=>'待处理',
			1=>'有效',
			-1=>'忽略',
		];
		LibTpl::Set('statusArr',$statusArr);

		$res = $YpwBase->get('stand_gxb_battery', ['distinct sgby_uid'], ' ');
		if($res['data']){
			$res = $B2cBase->get('an_user', ['au_uid', 'au_name'], sprintf(" and au_uid in (%s) order by au_status desc, au_name", implode(',', array_column($res['data'], 'sgby_uid'))));
			LibTpl::Set('userArr', array_column($res['data'], 'au_name', 'au_uid'));
		}

		$perPage = isset($_COOKIE['perPage']) ? $_COOKIE['perPage'] : 16;
		$page=!empty($Params['page'])?(int)$Params['page']:1;

		$where = '';
		$table = 'stand_gxb_battery';
		$urlParams = $Params;
		$ReLike = array('*'=>'%', '?'=>'_', '？'=>'_');
		foreach($Params as $k=>$v)
		{
			$v = trim($v);
			if($v == '') continue;
			switch($k)
			{
				case 'vin1_8':
					$where.=sprintf(" and sgby_vin1_8 LIKE '%s%%'", rtrim($v, '%'));
				break;
				case 'status':
					$where.=sprintf(' and sgbt_status=%d', (int) $v);
				break;
				case 'addTime': $where .= sprintf(" and sgby_etime >= %d", strtotime($v)); break;
				case 'endTime': $where .= sprintf(" and sgby_etime <= %d", strtotime($v.' 23:59:59')); break;
				case 'gxb_code':
					$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($v))));
					if(count($anyNum) > 1)
					{
						foreach($anyNum as $kk=>$vv)
						{
							$anyNum[$kk] = LibFc::FormatNum($vv);
						}
						$where .= sprintf(" and sgby_gxb_code IN ('%s')", implode("','", $anyNum));
					}
					else
					{
						$where .= sprintf(" AND sgby_gxb_code like '%s'", LibFc::FormatNum(strtr($v, $ReLike), '%_'));
					}
				break;
				case 'sgby_engine':
				case 'sgby_engine_b':
					$where .= sprintf(" AND %s like '%s'", $k, strtr($v, $ReLike));
				break;
				case 'sgby_capacity':
				case 'sgby_voltage':
					$where .= sprintf(" AND %s = '%s'", $k, $v);
				break;
				case 'sgby_uid':
					$where .= sprintf(" AND sgby_uid = %d", $v);
				break;
				case 'hasvoltage': 
					if($v == 1){
						$where .= " and sgby_voltage != 0";
					}else if($v == -1){
						$where .= " and sgby_voltage = 0";
					}
				break;
				case 'hascapacity': 
					if($v == 1){
						$where .= " and sgby_capacity != 0";
					}else if($v == -1){
						$where .= " and sgby_capacity = 0";
					}
				break;
				case 'hasengine_b': 
					if($v == 1){
						$where .= " and sgby_engine_b != ''";
					}else if($v == -1){
						$where .= " and sgby_engine_b = ''";
					}
				break;
				case 'min_vin_count':
					$where .= sprintf(" AND sgby_vin_count >= %d", $v);
				break;
				case 'max_vin_count':
					$where .= sprintf(" AND sgby_vin_count <= %d", $v);
				break;
			}
		}

		$orderArr=[
			'null'=>['order by sgby_vin_count desc', 'VIN图数倒序'],
			'gxb'=>['order by sgby_vin1_8,sgby_gxb_code,sgby_engine','V18型号'],
			'chktime'=>['order by sgby_etime desc', '处理时间'],
			'new'=>['order by sgby_id desc', '新到旧'],
			'old'=>['order by sgby_id asc', '旧到新'],
		];
		LibTpl::Set('orderArr', $orderArr);
		if(empty($orderArr[$Params['order']])) $Params['order'] = 'null';
		$res=$YpwBase->get($table,['count(1) count'], $where,true);
		$total=$res['data']['count'];
		$Page = LibPage::Show($total, $perPage);
		LibTpl::Set('Page',$Page);
		$listArr = [];
		if($total>0){
			$where.= sprintf(' %s limit %s,%s', $orderArr[$Params['order']][0], ($page-1)*$perPage,$perPage);
			$res=$YpwBase->get($table, ['*'], $where);
			$listArr = $res['data'];
			if(!empty($listArr)){
				$PjlBase= new PjlBase();
				$res = $YpwBase->get('stand_vin_imgs', ['vii_vin', 'vii_imghost', 'vii_img'], sprintf(" and vii_vin in ('%s')", implode("','", array_column($listArr, 'sgby_vin'))));
				$viiArr = [];
				foreach($res['data'] as $v){
					$v['vii_img'] = mvc::$cfg['HOST']['vinimg_'.$v['vii_imghost']].$v['vii_img'];
					$viiArr[$v['vii_vin']] = $v;
				}
				LibTpl::Set('viiArr', $viiArr);
			}

		}
		LibTpl::Set('listArr', $listArr);
		LibTpl::Set('Params',$Params);
		LibTpl::Set('urlParams',$urlParams);
		LibTpl::Set('rule', $rule);
		LibTpl::Set('title','电池规则');
		LibTpl::Put();
	}

	function batteryRegSet()
	{
		LibRule::Check('CA02');
		$Params = MVC::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$PjlBase= new PjlBase();
		$ReLike = array('*'=>'%', '?'=>'_', '？'=>'_');
		if(!empty($_POST['sgby_gxb_code_show'])){
			$YpwUser = new YpwUser();
			$res = $YpwUser->savebatteryReg($_POST);
			//VIN识别，直接跳转到下一个
			if(!empty($Params['sgby_id']))
			{
				unset($Params['last_time']);
				unset($Params['page']);
				$viiWhere = '';

				$where = '';
				$table = 'stand_gxb_battery';
				foreach($Params as $k=>$v)
				{
					$v = trim($v);
					if($v == '') continue;
					switch($k)
					{
						case 'vin1_8':
							$where.=sprintf(" and sgby_vin1_8 LIKE '%s%%'", rtrim($v, '%'));
						break;
						case 'status':
							$where.=sprintf(' and sgbt_status=%d', (int) $v);
						break;
						case 'addTime': $where .= sprintf(" and sgby_etime >= %d", strtotime($v)); break;
						case 'endTime': $where .= sprintf(" and sgby_etime <= %d", strtotime($v.' 23:59:59')); break;
						case 'gxb_code':
							$anyNum = array_unique(explode("\r\n", str_replace(';', "\r\n", trim($v))));
							if(count($anyNum) > 1)
							{
								foreach($anyNum as $kk=>$vv)
								{
									$anyNum[$kk] = LibFc::FormatNum($vv);
								}
								$where .= sprintf(" and sgby_gxb_code IN ('%s')", implode("','", $anyNum));
							}
							else
							{
								$where .= sprintf(" AND sgby_gxb_code like '%s'", LibFc::FormatNum(strtr($v, $ReLike), '%_'));
							}
						break;
						case 'sgby_engine':
						case 'sgby_engine_b':
							$where .= sprintf(" AND %s like '%s'", $k, strtr($v, $ReLike));
						break;
						case 'sgby_capacity':
						case 'sgby_voltage':
							$where .= sprintf(" AND %s = '%s'", $k, $v);
						break;
						case 'sgby_uid':
							$where .= sprintf(" AND sgby_uid = %d", $v);
						break;
						case 'hasvoltage': 
							if($v == 1){
								$where .= " and sgby_voltage != 0";
							}else if($v == -1){
								$where .= " and sgby_voltage = 0";
							}
						break;
						case 'hascapacity': 
							if($v == 1){
								$where .= " and sgby_capacity != 0";
							}else if($v == -1){
								$where .= " and sgby_capacity = 0";
							}
						break;
						case 'hasengine_b': 
							if($v == 1){
								$where .= " and sgby_engine_b != ''";
							}else if($v == -1){
								$where .= " and sgby_engine_b = ''";
							}
						break;
						case 'min_vin_count':
							$where .= sprintf(" AND sgby_vin_count >= %d", $v);
						break;
						case 'max_vin_count':
							$where .= sprintf(" AND sgby_vin_count <= %d", $v);
						break;
					}
				}

				$orderArr=[
					'null'=>['order by sgby_vin_count desc', 'VIN图数倒序'],
					'gxb'=>['order by sgby_vin1_8,sgby_gxb_code,sgby_engine','V18型号'],
					'chktime'=>['order by sgby_etime desc', '处理时间'],
					'new'=>['order by sgby_id desc', '新到旧'],
					'old'=>['order by sgby_id asc', '旧到新'],
				];
				if(empty($orderArr[$Params['order']])) $Params['order'] = 'null';
				
				//特殊情况下 limit 1慢
				$where .=sprintf(' %s limit 1', $orderArr[$Params['order']][0]);
				$res = $YpwBase->get($table, ['sgby_id'], $where, true);
				if(!empty($res['data']))
				{
					$nextParams = $Params;
					$nextParams['sgby_id'] = $res['data']['sgby_id'];
					unset($nextParams['smaId']);
					$url = mvc::$cfg['ADMIN_URI'].'vin/batteryRegSet?'.http_build_query($nextParams);
					LibFc::Go($url);
				}
			}
			LibTpl::Success('操作成功',  mvc::$cfg['ADMIN_URI'].'vin/batteryRegSet?'.http_build_query($Params));
		}
		
		$statusArr=[
			0=>'待处理',
			1=>'有效',
			-1=>'忽略',
		];
		LibTpl::Set('statusArr', $statusArr);
		
		$lasetParams = $Params;
		$data = [];
		$viiIds = [];
		if($Params['sgby_id']){
			$res = $YpwBase->get('stand_gxb_battery', ['*'], sprintf(" and sgby_id=%d", $Params['sgby_id']), true);
			$data = $res['data'];
		}else if(!empty($Params['vii_id']) || !empty($Params['vin'])){
			//单图模式
			$where = !empty($Params['vii_id'])? sprintf(" and vii_id=%d", $Params['vii_id']): sprintf(" and vii_vin='%s'", LibFc::FormatVin($Params['vin']));
			$res = $YpwBase->get('stand_vin_imgs vii LEFT JOIN stand_model_any sma ON sma_vin = vii_vin', ['sma_vin1_8 sgby_vin1_8, sma_gxb_code sgby_gxb_code, sma_gxb_code_show sgby_gxb_code_show, sma_engine sgby_engine, vii_vin sgby_vin, vii_id, vii_vin, vii_imghost, vii_img, vii_imgocr'], $where, true);
			$data = $res['data'];
		}
		
		if(empty($data['sgby_vin1_8']) || empty($data['sgby_gxb_code']) || empty($data['sgby_engine'])) LibTpl::Error('请先完善VIN型号信息');

		
		//找规则所有可能
		$comwhere = sprintf(" and sma_vin1_8='%s' AND sma_gxb_code='%s' AND sma_engine='%s'", $data['sgby_vin1_8'], $data['sgby_gxb_code'], $data['sgby_engine']);
		$table = "stand_vin_imgs_retask
		JOIN stand_vin_imgs ON vir_vii_id = vii_id AND vir_type = 'battery'
		JOIN stand_model_any sma ON sma_vin = vii_vin";
		$res = $YpwBase->get($table, ["JSON_UNQUOTE(vir_data->'$.engine_b') engine_b, JSON_UNQUOTE(vir_data->'$.voltage') voltage,JSON_UNQUOTE(vir_data->'$.capacity') capacity, COUNT(*) vin_count, vii_id"], $comwhere." AND JSON_UNQUOTE(vir_data->'$.engine_b') IS NOT NULL AND JSON_UNQUOTE(vir_data->'$.voltage') IS NOT NULL AND JSON_UNQUOTE(vir_data->'$.capacity') IS NOT NULL GROUP BY engine_b,voltage,capacity  ORDER BY COUNT(*) DESC limit 10");
		$comLikeArr = $res['data'];
		$viiIds = array_column($comLikeArr, 'vii_id');
		LibTpl::Set('comLikeArr', $comLikeArr);

		$tjArr = ['sgby_capacity'=>[], 'sgby_voltage'=>[], 'sgby_engine_b'=>[]];
		$tjFields = ['sgby_capacity'=>'capacity', 'sgby_voltage'=>'voltage', 'sgby_engine_b'=>'engine_b'];
		foreach($tjFields as $kf=>$kv){
			$res = $YpwBase->get($table, ["JSON_UNQUOTE(vir_data->'$.".$kv."') val, COUNT(*) vin_count, max(vii_id) vii_id"], $comwhere." AND JSON_UNQUOTE(vir_data->'$.".$kv."') IS NOT NULL GROUP BY val ORDER BY COUNT(*) DESC limit 20");
			$tjArr[$kf] = [];
			foreach($res['data'] as $vv){
				if(count($res['data']) > 10 && $vv['vin_count'] <= 2) break;
				//重新取更优的图
				/*$twhere = $comwhere.sprintf(" AND JSON_UNQUOTE(vir_data->'$.%s')='%s' order by ", $kv, $vv['val']);
				foreach($tjFields as $ttk=>$ttv){
					if($kf != $ttk) $twhere .= " JSON_UNQUOTE(vir_data->'$.".$ttv."') DESC,";
				}
				$twhere = trim($twhere, ',');
				$tres = $YpwBase->get($table, ["vii_id"], $twhere." limit 1", true);
				if($tres['data']['vii_id']) $vv['vii_id'] = $tres['data']['vii_id'];*/

				if(empty($tjArr[$kf][$vv['val']])) $tjArr[$kf][$vv['val']] = $vv;
				$tjArr[$kf][$vv['val']]['vin_count'] += $vv['vin_count'];
				$viiIds[] = $vv['vii_id'];
			}
		}
		
		if($data['vii_id']) $viiIds[] = $data['vii_id'];
		$viiIds = array_unique($viiIds);
		if(!empty($viiIds)){
			$res = $YpwBase->get($table, ["vii_id, vii_vin, vii_imghost, vii_img, vii_imgocr"], sprintf(" and vii_id in (%s) order by vii_id", implode(',', $viiIds)));
			$likeArr = $res['data'];

			$ocrAiArr = [];
			if(!empty($likeArr)){
				$res = $YpwBase->get('stand_vin_imgs_ocrai', ['via_vii_id, via_imgocr'], sprintf(" and via_vii_id in (%s)", implode(',', array_column($likeArr, 'vii_id'))));
				$ocrAiArr = array_column($res['data'], 'via_imgocr', 'via_vii_id');
				foreach($likeArr as $lk=>$lv){
					$likeArr[$lk]['via_imgocr'] = $ocrAiArr[$lv['vii_id']]?? '';
				}
			}
			LibTpl::Set('likeArr', $likeArr);
		}else{
			LibTpl::Set('likeArr', []);
		}
		
		foreach ($tjArr as $field => &$items) {
			uasort($items, function ($a, $b) {
				return $b['vin_count'] <=> $a['vin_count'];
			});
		}
		unset($items);
		LibTpl::Set('tjArr', $tjArr);

		//已有规则
		$res = $YpwBase->get('stand_gxb_battery', ['*'], sprintf(" and sgby_vin1_8='%s' AND sgby_gxb_code='%s' AND sgby_engine='%s'", $data['sgby_vin1_8'], $data['sgby_gxb_code'], $data['sgby_engine']));
		LibTpl::Set('hasArr', $res['data']);

		$where = sprintf(" and sgbt_status = 1 and sgby_uid=%d", $_SESSION['admin_userid']);
		$where .= empty($Params['last_time'])? '': sprintf(" and sgby_etime < %d", $Params['last_time']);
		$res = $YpwBase->get('stand_gxb_battery', ['sgby_id', 'sgby_etime'], $where.' order by sgby_etime desc limit 1', true);
		$lasetParams['sgby_id'] = $res['data']['sgby_id'];
		$lasetParams['last_time'] = $res['data']['sgby_etime'];
		unset($lasetParams['last_sgby_id']);
		LibTpl::Set('lasetParams', $lasetParams);
		LibTpl::Set('data', $data);
		LibTpl::Set('Params', $Params);
		LibTpl::Set('title','管理型号电池规则');
		LibTpl::Put();
	}

	/**
	 * @method 删除电池规则记录
	 * @author hongzhang
	 * @copyright 2026/07/17
	 */
	function batteryRegDel(){
		LibRule::Check('CA05'); 
		if(!empty($_POST['ids']))
		{
			$YpwBase = new YpwBase();
			$YpwBase->del('stand_gxb_battery', sprintf(" and sgby_id in (%s)", implode(',', $_POST['ids'])));
		}
		LibFc::ajaxJsonEncode(['status'=>true,'data'=>true]);
	}
}