<?php
class gxbAction extends baseAction
{
	/**
	  * @method 采集最新公告数据并入库
	  * @author soul
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function test()
	{
		exit;
		$YpwGxb = new YpwGxb();
		/*$gxb = 'KLQ6590Q4C1';
		$site = 'cntruck';
		$url = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showdpgg&dpxh='.$gxb.'&pc='.$pici.'&cx=0';
		$html = $YpwGxb->catchSite($site, $url);
		$res = $YpwGxb->formatGgByCntruck($html, 'dipan');
		var_dump($res);exit;
		*/
		/*$run = 0;
		while(1){
			$per = 100;
			$gbres = $YpwGxb->get('(select gb_id from gxb_base where gb_id in (select a from zz_temp) and gb_etime < 1777271840 limit '.($per*200).') t', ['gb_id'], " order by rand() limit ".$per);
			foreach($gbres['data'] as $tv){
				$run++;
				echo $run.'=>'.$tv['gb_id'], "\n";
				$YpwGxb->updateGgByCache($tv['gb_id']);
			}
			if(count($gbres['data']) < $per) break;
		}
		echo 'ok';*/
		exit;
		/*$OthBase = new OthBase();
		$res = $OthBase->dailiIp('get', 'chinacar');
		var_dump($res);
		exit;*/
		
		/*$curl = curl_init();
		curl_setopt_array($curl, array(
		  CURLOPT_URL => 'http://chinacar.com.cn/Home/GonggaoSearch/GonggaoSearch/search_json?_dc=1669983096077',
		  CURLOPT_RETURNTRANSFER => true,
		  CURLOPT_ENCODING => '',
		  CURLOPT_MAXREDIRS => 10,
		  CURLOPT_TIMEOUT => 20,
		  CURLOPT_FOLLOWLOCATION => true,
		  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
		  CURLOPT_PROXY=>'180.107.125.185',
		  CURLOPT_PROXYPORT=>'4257',
		 CURLOPT_HTTPPROXYTUNNEL => true ,
			CURLOPT_PROXYAUTH => CURLAUTH_BASIC ,
			CURLOPT_PROXYTYPE => $cur['type'] ,
		  CURLOPT_CUSTOMREQUEST => 'POST',
		  CURLOPT_POSTFIELDS => 's5=L7SFCJ21&s20=1&s28=0&s29=0&s30=1&page=1&start=0&limit=400',
		  CURLOPT_HTTPHEADER => array(
			'Cookie: X_CACHE_KEY=47218064cb2c162f1c7e91f9d143c10e; Hm_lvt_6c1a81e7deb77ce536977738372f872a=1668155280,1669879245,1670046180; PHPSESSID=n0jiedm5temiajrv7ntklelrh1; Hm_lpvt_6c1a81e7deb77ce536977738372f872a=1670046499',
			'Referer:  http://www.chinacar.com.cn/ggcx_new/list.html',
			
		  ),
		));
		$response = curl_exec($curl);

		curl_close($curl);
		var_dump($response);
		exit;*/
		
		/*$res = $YpwGxb->updateGgByCatch('cn357', 1032997);
		var_dump($res);exit;*/

		$file = 'D:\www\files\htmlcntruck\363/7Y-1150D1N4.html';
		$res = $YpwGxb->formatGgByCntruck(file_get_contents($file));
		VAR_DUMP($res);
		EXIT;

		$file = 'http://192.168.1.116:8080/files/cn357/255/366193.html';
		$html = $YpwGxb->getCn357PageMain(file_get_contents($file));
		$res = $YpwGxb->formatGgByCn357($html);
		VAR_DUMP($res);EXIT;
		$file = "http://192.168.1.116:8080/files/cn357/323/812914.html";
		$res = $YpwGxb->formatGgByChinacar(file_get_contents($file));
		var_dump($res);
	}


	/**
	  * @method 通过现有缓存更新公告信息 http://192.168.1.116:8080/API/hub/index.php/gxb/updateGgByCache?gbid=xxx&gxb=xxx
	  * @param  gbid  int [必填] 指定ID
	  * @author soul
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function updateGgByCache()
	{
		$Params = mvc::$URL_PARAMS;
		$YpwGxb = new YpwGxb();
		$where = "";
		if(!empty($Params['gbid'])) $where .= sprintf(" and gb_id=%d", $Params['gbid']);
		if(!empty($Params['gxb'])) $where .= sprintf(" and gb_gxb_code='%s'", LibFc::FormatNum($Params['gxb']));
		if(!empty($where))
		{
			$gbres = $YpwGxb->get('gxb_base', ['gb_id'], $where);
			foreach($gbres['data'] as $tv)
			{
				$res = $YpwGxb->updateGgByCache($tv['gb_id']);
				var_dump($res);
			}
		}
		echo 'ok ';
	}
	
	/**
	  * @method 对同同型号同发动机多功率多排量的数据进行纠正 
		http://192.168.1.116:8080/API/hub/index.php/gxb/repairGgKwCc?all=1
		http://192.168.1.116:8080/API/hub/index.php/gxb/repairGgKwCc?gxb=xxx&engine=xxx
	  * @author soul
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function repairGgKwCc()
	{
		$Params = mvc::$URL_PARAMS;
		$YpwGxb = new YpwGxb();
		$where = "";
		if(!empty($Params['gxb'])) $where .= sprintf(" and gb_gxb_code='%s'", LibFc::FormatNum($Params['gxb']));
		if(!empty($Params['engine'])) $where .= sprintf(" and ge_engine_format='%s'", LibFc::FormatEng($Params['engine']));
		if($Params['all'] || !empty($where))
		{
			$where .= " and ge_engine_format != '' GROUP BY gb_gxb_code, ge_engine_format HAVING (COUNT(DISTINCT ge_kw) > 1 OR  COUNT(DISTINCT ge_cc) > 1)";
			$gbres = $YpwGxb->get('gxb_engine JOIN gxb_base ON ge_gb_id = gb_id', ['gb_gxb_code, ge_engine_format'], $where);
			foreach($gbres['data'] as $tv)
			{
				$YpwGxb->repairGgKwCc($tv['gb_gxb_code'], $tv['ge_engine_format']);
			}
		}
		echo 'ok ';
	}

	/**
	  * @method 采集最新公告数据并入库 连续30(周日:300)个没有就终止  gxb/autoCatchNewGg?site=chinacar   gxb/autoCatchNewGg?site=cn357   gxb/autoCatchNewGg?site=cntruck gxb/autoCatchNewGg?site=miitgov
	    不按批次采集新的gxb/autoCatchNewGg?site=cntruck&allnew=1
	  * @author soul 
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function autoCatchNewGg()
	{
		$Params = mvc::$URL_PARAMS;
		$type = 'gxb';
		$YpwGxb = new YpwGxb();
		$YpwVin = new YpwVin();
		$site = $Params['site']; 
		//if(!LibFc::hasFunLock(mvc::$URL_METHOD.$site, 3600)) return true;
		//连续30(周日:100)个没有就终止
		$stopCount = in_array(date('w'), ['0','6'])? 100: 30;
		$nullCount = 0;
		switch($site)
		{
			case 'cn357':
				$url = 'https://www.cn357.com/notice';
				$html = $YpwGxb->catchSite($site, $url);
				if(preg_match('/最新批次：*第 *<a *href="\/notice_(\d+)"/', $html, $match))
				{
					$newPici = $match[1];
					$res = $YpwGxb->get('gxb_base', ['max(gb_pici) gb_pici'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
					$lastPici = (int) $res['data']['gb_pici'];
					if($newPici > $lastPici) $stopCount = 100;
				
					for($pici = $lastPici; $pici <= $newPici; $pici++)
					{
						$cacheFile = mvc::$cfg['LOGS'].'gxb_catch_'.$site.'_'.$pici.'.php';
						$cacheArr = [];
						if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
						if(!is_array($cacheArr)) $cacheArr = [];
						//上一批次是否完成
						if(!empty($cacheArr['isend'])) continue;
						if(empty($cacheArr['urls']))
						{//采集批次
							$cacheArr['ids'] = [];
							for($page = 1; $page < 300; $page++)
							{
								$url = 'https://www.cn357.com/notice_'.$pici.'_'.$page;
								$html = $YpwGxb->catchSite($site, $url);
								if(preg_match('/class="current">(\d+)</', $html, $match)){
									if($page > $match[1]) break;
								}
								if(preg_match_all('/<a href="(\/notice(\d+)_[^\"]+)"/', $html, $match, PREG_SET_ORDER)){
									foreach($match as $row){
										$id = $row[2];
										if(!in_array($id, $cacheArr['ids'])){
											$cacheArr['ids'][] = $id;
											$cacheArr['urls'][] = $row[1];
										}
									}
								}
								
							}
							$cacheArr['ids'] = array_unique($cacheArr['ids']);
							LibFc::ArraySave($cacheArr, $cacheFile);
						}
						if(empty($cacheArr['ids'])) continue;

						$catchCount = 0;//最大采集数
						$res = $YpwGxb->get('gxb_base', ['gb_id', 'gb_from_id'], sprintf(" and gb_type='%s' and gb_from='%s' and gb_pici='%s'", $type, $site, $pici));
						$hasfromids = array_column($res['data'], 'gb_id', 'gb_from_id');
						foreach($cacheArr['ids'] as $gk=>$fromid)
						{
							if(!empty($hasfromids[$fromid])){
								$cacheArr['has'][] = $fromid;
								unset($cacheArr['ids'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								continue;
							}
							$gbres = $YpwGxb->updateGgByCatch($site, $fromid);
							if(!empty($gbres['data']['gbid'])){
								unset($cacheArr['ids'][$gk]);
								$nullCount = 0;
							}else if(stripos($gbres['data']['msg'], '#null#') !== false){
								$nullCount++;
								echo $fromid, '=>', $gbres['data']['msg'], '<br>';
							}else{
								echo $fromid, '=>', $gbres['data']['msg'], '<br>';
								exit;
							}
							
							if($nullCount >= $stopCount){
								echo '异常过多，终止';
								break;
							}
							sleep(1);
						}
						if(empty($cacheArr['gxbs'])) $cacheArr['isend'] = 1;
						LibFc::ArraySave($cacheArr, $cacheFile);
					}
				}
				else
				{
					echo '匹配批次出错'.$html;
				}
			break;
			case 'chinacar':
				$url = 'http://chinacar.com.cn/search.html';
				$html = $YpwGxb->catchSite($site, $url);
				if(preg_match('/<font[^<]*>\(最新(\d+)批次\)<\/font>/', $html, $match))
				{
					$newPici = $match[1];
					$res = $YpwGxb->get('gxb_base', ['max(gb_pici) gb_pici'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
					$lastPici = (int) $res['data']['gb_pici'];
					if($newPici > $lastPici) $stopCount = 100;
					
					$res = $YpwGxb->get('gxb_base', ['max(gb_from_id+0) gb_from_id'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
					$bid = (int) $res['data']['gb_from_id'] + 1;
					$endId = $bid+1000;
					for($fromid = $bid; $fromid <= $endId; $fromid++)
					{
						$gbres = $YpwGxb->updateGgByCatch($site, $fromid);
						if(!empty($gbres['data']['gbid']))
						{
							$nullCount = 0;
						}
						else if(stripos($gbres['data']['msg'], '#null#') !== false)
						{
							$nullCount++;
							echo $fromid, '=>', $gbres['data']['msg'], '<br>';
						}
						else 
						{
							echo $fromid, '=>', $gbres['data']['msg'], '<br>';
							exit;
						}
						if($nullCount >= $stopCount) break;
						sleep(rand(2,5));
					}
				}
				else
				{
					echo '匹配批次出错'.$html;
				}
			break;
			case 'cntruck':
				$siteDir = mvc::$cfg['GGDIR'].$site.'/';
				@mkdir($siteDir);
				$res = $YpwGxb->getKeyVal('gxb_catch_'.$site);
				if(empty($res['data'])){
					echo 'gxb_catch_'.$site.'最大批次设置异常';exit;
				}
				$lastPici = (int) $res['data'];
				if($Params['allnew']){//不按批次采集新的 
					$cacheFile = mvc::$cfg['LOGS'].'gxb_catch_'.$site.'_allnew.php';
					$cacheArr = [];
					if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
					if(!is_array($cacheArr)) $cacheArr = [];
					
					//更新列表 5天/次
					if(empty($cacheArr['list_end']) || (time() - $cacheArr['list_end']) >= 24*3600*5){
						//过期重新采集
						if($cacheArr['list_end'] && (time() - $cacheArr['list_end']) >= 24*3600*5) $cacheArr = [];
						$bpage = $cacheArr['last_page'] && time()-$cacheArr['last_time'] < 24*3600? $cacheArr['last_page'] + 1: 1;
						if($bpage == 1) $cacheArr = [];
						$nomatchpici = 50;
						$url = 'https://www.cn-truck.com/gonggao/listres';
						for($page = $bpage; $page < 1000; $page++){
							if($nomatchpici < 1){
								//新批次的列表已经完成
								$cacheArr['list_end'] = time();
								LibFc::ArraySave($cacheArr, $cacheFile);
								break;
							}
							$isbreak = false;
							echo $page, '<br>';
							for($run = 0; $run < 5; $run++){
								$post = ['page'=>$page, 'limit'=>100, 'pc0'=>$lastPici, 'x'=>68, 'y'=>36];
								$html = $YpwGxb->catchSite($site, $url, $post);
								$html = json_decode($html, true);
								if(isset($html['count']) && is_array($html['data'])){
									$cacheArr['last_page'] = $page; 
									$cacheArr['last_time'] = time();
									if(!empty($html['data'][0]['clxh'])){
										foreach($html['data'] as $row){
											if($row['pc'] > $lastPici){
												$nomatchpici = 50;
												$row['page'] = $page;
												$unikey = $row['clxh'].'@'.$row['pc'];
												if(!$cacheArr['urls'][$unikey]){
													$cacheArr['gxbs'][] = $unikey;
													$cacheArr['urls'][$unikey] = json_encode($row, JSON_UNESCAPED_UNICODE);
													$cacheArr['isend'] = 0;
												}
											}else{
												$nomatchpici--;
											}
										}
									}else{
										$isbreak = true;
									}
									LibFc::ArraySave($cacheArr, $cacheFile);
									break;
								}else{
									//exit($url.'=>'.$page.'采集批次错误'.$html);
								}
							}
							if($isbreak) break;
							//sleep(1);
						}
					}

					if(empty($cacheArr['isend'])){
						$catchCount = 0;//最大采集数
						$res = $YpwGxb->get('gxb_base', ['gb_id', 'gb_from_id'], sprintf(" and gb_type='%s' and gb_from='%s' and gb_pici>='%s'", $type, $site, $lastPici));
						$hasfromids = array_column($res['data'], 'gb_id', 'gb_from_id');
						foreach($cacheArr['gxbs'] as $gk=>$unikey)
						{
							$t = explode('@', $unikey);
							$gxb = $t[0];
							$pici = $t[1];
							$format = LibFc::FormatNum($gxb);
							$fromid = $pici.'_'.$format;
							if(!empty($hasfromids[$fromid])){
								$cacheArr['has'][] = $unikey;
								unset($cacheArr['gxbs'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								continue;
							}
							$url = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showgg&clxh='.$gxb.'&pc='.$pici.'&cx=0';
							$html = $YpwGxb->catchSite($site, $url);
							$res = $YpwGxb->formatGgByCntruck($html);
							$dataArr = $res['data'];
							$fromid = $dataArr['pici'].'_'.$dataArr['gxb_code'];
							if($dataArr['pici'] != $pici){
								$cacheArr['picierr'][] = $dataArr['pici'].'=>'.$unikey;
								unset($cacheArr['gxbs'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								continue;
							}
							$dataArr['from_url'] = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showgg&clxh='.$dataArr['gxb_code_show'].'&pc='.$dataArr['pici'].'&cx=0';
							$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr);
							if(!empty($gbres['data']))
							{
								$cacheArr['ok'][] = $unikey;
								$newDir = $siteDir.$dataArr['pici'].'/';
								@mkdir($newDir);
								$newFile = $newDir.$fromid.'.html';
								file_put_contents($newFile, $html);
								unset($cacheArr['gxbs'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								$catchCount++;
							}
							else
							{
								$nullCount++;
								echo $url, ' 异常<br>';
							}
							//sleep(1);
							if($nullCount >= $stopCount){
								echo '异常过多，终止';
								break;
							}
						}
						if(empty($cacheArr['gxbs'])) $cacheArr['isend'] = 1;
						LibFc::ArraySave($cacheArr, $cacheFile);
					}
				}else{
					$url = 'https://www.cn-truck.com/list_32.html';
					$html = $YpwGxb->catchSite($site, $url);
					if(preg_match('/网页版(\d+)批/', $html, $match))
					{
						$newPici = $match[1];
						if($newPici > $lastPici) $stopCount = 100;
						for($pici = $lastPici; $pici <= $newPici; $pici++)
						{
							$cacheFile = mvc::$cfg['LOGS'].'gxb_catch_'.$site.'_'.$pici.'.php';
							$cacheArr = [];
							if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
							if(!is_array($cacheArr)) $cacheArr = [];
							//上一批次是否完成
							if(!empty($cacheArr['isend'])) continue;
							if(empty($cacheArr['urls']))
							{//采集批次
								$url = $pici == $newPici? 'https://www.cn-truck.com/gonggao/listres': 'https://www.cn-truck.com/gonggao/listoldres';
								$cacheArr['gxbs'] = [];
								$nomatchpici = 50;
								for($page = 1; $page < 1000; $page++)
								{
									if($nomatchpici < 1) break;
									$isbreak = false;
									for($run = 0; $run < 5; $run++){
										$post = $pici == $newPici? ['page'=>$page, 'limit'=>100, 'pc0'=>$pici, 'pc1'=>$pici, 'x'=>68, 'y'=>36]: ['page'=>$page, 'limit'=>100, 'pc'=>$pici, 'x'=>68, 'y'=>36];
										$html = $YpwGxb->catchSite($site, $url, $post);
									
										$html = json_decode($html, true);
										if(isset($html['count']) && is_array($html['data'])){
											if(!empty($html['data'][0]['clxh'])){
												foreach($html['data'] as $row){
													if($row['pc'] == $pici){
														$nomatchpici = 50;
														$cacheArr['gxbs'][] = $row['clxh'].'@'.$row['id'];
														$cacheArr['urls'][] = json_encode($row, JSON_UNESCAPED_UNICODE);
													}else{
														$nomatchpici--;
													}
												}
											}else{
												$isbreak = true;
											}
											break;
										}else{
											//exit($url.'=>'.$page.'采集批次错误'.$html);
										}
									}
									if($isbreak) break;
									//sleep(1);
								}
								$cacheArr['gxbs'] = array_unique($cacheArr['gxbs']);
								LibFc::ArraySave($cacheArr, $cacheFile);
							}
							if(empty($cacheArr['gxbs'])) continue;

							$catchCount = 0;//最大采集数
							$res = $YpwGxb->get('gxb_base', ['gb_id', 'gb_from_id'], sprintf(" and gb_type='%s' and gb_from='%s' and gb_pici='%s'", $type, $site, $pici));
							$hasfromids = array_column($res['data'], 'gb_id', 'gb_from_id');
							foreach($cacheArr['gxbs'] as $gk=>$gv)
							{
								$t = explode('@', $gv);
								$gxb = $t[0];
								$ggid = $t[1];
								$format = LibFc::FormatNum($gxb);
								$fromid = $pici.'_'.$format;
								if(!empty($hasfromids[$fromid])){
									$cacheArr['has'][] = $gxb;
									unset($cacheArr['gxbs'][$gk]);
									LibFc::ArraySave($cacheArr, $cacheFile);
									continue;
								}
								
								if($pici == $newPici){
									$url = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showgg&clxh='.$gxb.'&pc='.$pici.'&cx=0';
								}else{
									$url = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showoldgg&id='.$ggid;
								}
								$html = $YpwGxb->catchSite($site, $url);
								$res = $YpwGxb->formatGgByCntruck($html);
								$dataArr = $res['data'];
								$fromid = $dataArr['pici'].'_'.$dataArr['gxb_code'];
								if($dataArr['pici'] != $pici){
									$cacheArr['picierr'][] = $dataArr['pici'].'=>'.$gxb;
									unset($cacheArr['gxbs'][$gk]);
									LibFc::ArraySave($cacheArr, $cacheFile);
									continue;
								}
								$dataArr['from_url'] = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showgg&clxh='.$dataArr['gxb_code_show'].'&pc='.$dataArr['pici'].'&cx=0';
								$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr);
								if(!empty($gbres['data']))
								{
									$cacheArr['ok'][] = $gxb;
									$newDir = $siteDir.$dataArr['pici'].'/';
									@mkdir($newDir);
									$newFile = $newDir.$fromid.'.html';
									file_put_contents($newFile, $html);
									unset($cacheArr['gxbs'][$gk]);
									LibFc::ArraySave($cacheArr, $cacheFile);
									$catchCount++;
								}
								else
								{
									$nullCount++;
									echo $url, ' 异常<br>';
								}
								//sleep(1);
								if($nullCount >= $stopCount){
									echo '异常过多，终止';
									break;
								}
							}
							if(empty($cacheArr['gxbs'])){
								$cacheArr['isend'] = 1;
								$YpwGxb->setKeyVal('gxb_catch_'.$site, $pici);
							}
							LibFc::ArraySave($cacheArr, $cacheFile);
						}
					}
					else
					{
						echo '匹配批次出错'.$html;
					}
				}
			break;
			case 'miitgov':
				$siteDir = mvc::$cfg['GGDIR'].$site.'/';
				@mkdir($siteDir);
				$LibHttp = new LibHttp();
				$pres = $YpwGxb->get('keyval', ['*'], " and unikey like 'miitgov_%' and unikey not like '%_ok' order by unikey");
				foreach($pres['data'] as $pv){
					$t = explode('_', $pv['unikey']);
					$pici = $t[1];
					$cacheFile = mvc::$cfg['LOGS'].'gxb_catch_'.$site.'_'.$pici.'.php';
					$cacheArr = [];
					if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
					if(!is_array($cacheArr)) $cacheArr = [];
					//上一批次是否完成
					if(!empty($cacheArr['isend'])) continue;
					if(empty($cacheArr['urls']))
					{//采集批次
						$url = $pv['val'];
						$cacheArr['urls'] = [];
						$newDir = $siteDir.$pici.'/';
						@mkdir($newDir);
						for($page = 1; $page < 200; $page++){
							$newFile = $newDir.$pici.'_page_'.$page.'.html';
							$pageurl = preg_replace('/pageNo%22%3A(\d+)%2/', 'pageNo%22%3A'.$page.'%2', $url);
							if(!file_exists($newFile)){
								$orghtml = $LibHttp->fetch($pageurl);
								sleep(1);
							}else{
								$orghtml = file_get_contents($newFile);
							}
							$html = json_decode($orghtml, true);
							if($html['success'] && isset($html['data']['html']) && stripos($html['data']['html'], '企业名称')){
								if(!file_exists($newFile)){
									file_put_contents($newFile, $orghtml);
								}
								$thtml = $html['data']['html'];
								if(preg_match_all('/<tr>\s*<td[^>]*>\s*<div[^>]*>\s*<a href=\"(\/datainfo[^"]+\.html)\"[^>]+>[^<]+<\/a>.*<\/div>\s*<\/td>\s*<td.*title="(\d{3,})">\d{3,}<\/div>/iUs', $thtml, $match, PREG_SET_ORDER)){
									foreach($match as $mv){
										if($mv[2] != $pici) continue;
										$cacheArr['urls'][$mv[1]] = ['url'=>$mv[1], 'pici'=>$mv[2]];
									}
								}else{
									echo $pageurl.'=>'.$page.' 完结'.$orghtml;
									break;
								}
							}else{
								exit($pageurl.'=>'.$page.'采集批次错误'.$orghtml);
							}
							$cacheArr['urls'] = array_values($cacheArr['urls']);
						}
						LibFc::ArraySave($cacheArr, $cacheFile);
					}
					if(empty($cacheArr['urls'])) continue;

					$catchCount = 0;//最大采集数
					$res = $YpwGxb->get('gxb_base', ['gb_id', 'gb_from_id'], sprintf(" and gb_type='%s' and gb_from='%s' and gb_pici='%s'", $type, $site, $pici));
					$hasfromids = array_column($res['data'], 'gb_id', 'gb_from_id');
					foreach($cacheArr['urls'] as $ck=>$cv)
					{
						$fromid = pathinfo($cv['url'])['filename'];
						if(!empty($hasfromids[$fromid])){
							$cacheArr['has'][] = $fromid;
							unset($cacheArr['urls'][$ck]);
							LibFc::ArraySave($cacheArr, $cacheFile);
							continue;
						}
						
						$newDir = $siteDir.$pici.'/';
						@mkdir($newDir);
						$newFile = $newDir.$fromid.'.html';
						$url = 'https://www.miit.gov.cn'.$cv['url'];
						if(!file_exists($newFile)){
							$orghtml = $LibHttp->fetch($url);
							$orghtml .= '<th>公告批次：</th><td>'.$pici.'</td>';
							$orghtml = strtr($orghtml, ['<head>'=>'<head><base href="https://www.miit.gov.cn">']);
							sleep(1);
						}else{
							$orghtml = file_get_contents($newFile);
						}
						$res = $YpwGxb->formatGgByMiitgov($orghtml);
						$dataArr = $res['data'];
						$dataArr['pici'] = $pici;
						$dataArr['from_url'] = $url;
						$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr);
						if(!empty($gbres['data']))
						{
							$cacheArr['ok'][] = $cv;
							if(!file_exists($newFile)) file_put_contents($newFile, $orghtml);
							unset($cacheArr['urls'][$ck]);
							LibFc::ArraySave($cacheArr, $cacheFile);
							$catchCount++;
						}
						else
						{
							$nullCount++;
							echo $url, ' 异常<br>';
						}
					
						if($nullCount >= $stopCount) break;
						if($catchCount > 3000) break;
					}
					if(empty($cacheArr['urls'])){
						$cacheArr['isend'] = 1;
						$YpwGxb->set('keyval', ['unikey'=>$pv['unikey'].'_ok'], sprintf(" and unikey ='%s'", LibFc::Escape($pv['unikey'])));
					}
					LibFc::ArraySave($cacheArr, $cacheFile);
				}
				
			break;
			case 'miiteidc':
				
				break;
		}
		LibFc::delFunLock(mvc::$URL_METHOD.$site);
		echo 'ok';
	}

	/**
	  * @method 采集最新底盘公告数据并入库 连续30(周日:300)个没有就终止  gxb/autoCatchNewDipan?site=chinacar   gxb/autoCatchNewDipan?site=cn357   gxb/autoCatchNewDipan?site=cntruck
	  * @author soul
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function autoCatchNewDipan()
	{
		$Params = mvc::$URL_PARAMS;
		$type = 'dipan';
		$YpwGxb = new YpwGxb();
		$YpwVin = new YpwVin();
		$site = $Params['site']; 
		//if(!LibFc::hasFunLock(mvc::$URL_METHOD.$site, 3600)) return true;
		//连续30(周日:100)个没有就终止
		$stopCount = in_array(date('w'), ['0','6'])? 100: 30;
		$nullCount = 0;
		switch($site)
		{
			/*case 'cn357':
				$url = 'https://www.cn357.com/chassis';
				$html = $YpwGxb->catchSite($site, $url);
				if(preg_match('/最新批次：*第 *<a *href="\/chassis_(\d+)"/', $html, $match))
				{
					$newPici = $match[1];
					$res = $YpwGxb->get('gxb_base', ['max(gb_pici) gb_pici'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
					$lastPici = (int) $res['data']['gb_pici'];
					if($newPici > $lastPici) $stopCount = 100;
					
					$res = $YpwGxb->get('gxb_base', ['max(gb_from_id+0) gb_from_id'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
					$bid = (int) $res['data']['gb_from_id'] + 1;
					$endId = $bid+1000;
					for($fromid = $bid; $fromid <= $endId; $fromid++)
					{
						$gbres = $YpwGxb->updateGgByCatch($site, $fromid, '', $type);
						if(!empty($gbres['data']['gbid']))
						{
							$nullCount = 0;
						}
						else if(stripos($gbres['data']['msg'], '#null#') !== false)
						{
							$nullCount++;
							echo $fromid, '=>', $gbres['data']['msg'], '<br>';
						}
						else 
						{
							echo $fromid, '=>', $gbres['data']['msg'], '<br>';
							exit;
						}
						if($nullCount >= $stopCount) break;
						sleep(rand(2,5));
					}
				}
				else
				{
					echo '匹配批次出错'.$html;
				}
			break;*/
			case 'chinacar':
				//id跳跃过大，用品牌7天一次
				$cachetime = 3600*24*7;
				$cacheFile = mvc::$cfg['LOGS'].''.$type.'_catch_'.$site.'_brand.php';
				$cacheArr = [];
				if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
				if(!is_array($cacheArr)) $cacheArr = [];

				$res = $YpwGxb->get('gxb_base', ['distinct gb_brand'], " and gb_brand != '' and gb_vtype NOT LIKE '%摩托%'");
				foreach($res['data'] as $tv){
					if(!isset($cacheArr[$tv['gb_brand']])) $cacheArr[$tv['gb_brand']] = '';
				}
				LibFc::ArraySave($cacheArr, $cacheFile);
				
				foreach($cacheArr as $brand=>$lasttime)
				{
					if(!empty($lasttime) && time() - strtotime($lasttime) > $cachetime) continue;
					for($page = 1; $page < 100; $page++){
						$picipost = [
							'dpxh'=>'',
							'dpmc'=>'',
							'dpsb'=>$brand, 
							'lts'=>'', 
							'zs'=>'', 
							'zj'=>'',  
							'pc'=>'', 
							'sbdh'=>'',  
							'fdj'=>'', 
							'fdjqy'=>'',  
							's_1'=>'',  
							'ss_1'=>1,
							's_2'=>'', 
							'ss_2'=>1,
							'page'=>$page,
							'start'=>($page-1)*400,
							'limit'=>400
						];
						$picihtml = $YpwGxb->catchSite($site, 'http://www.chinacar.com.cn/Home/GonggaoSearch/GonggaoSearch/search_dp_json?_dc='.$YpwGxb->getMilliseconds(), $picipost);
						if(preg_match_all('/tarid_nobase\'\:\'(\d+)\'/', $picihtml, $match)){
							foreach($match[1] as $fromid){
								$res = $YpwGxb->get('gxb_base', ['gb_id'], sprintf(" and gb_type='%s' and gb_from ='%s' and gb_from_id='%s'", $type, $site, $fromid), true);
								if(!empty($res['data'])) continue;
								$gbres = $YpwGxb->updateGgByCatch($site, $fromid, '', $type);
								if(!empty($gbres['data']['gbid']))
								{
									$nullCount = 0;
								}
								else if(stripos($gbres['data']['msg'], '#null#') !== false)
								{
									$nullCount++;
									echo $fromid, '=>', $gbres['data']['msg'], '<br>';
								}
								else 
								{
									echo $fromid, '=>', $gbres['data']['msg'], '<br>';
									exit;
								}
								if($nullCount >= $stopCount) break;
								sleep(rand(1,2));
							}
						}else if(stripos($picihtml, 'totalCount')){
							break;
						}else{
							exit($picihtml);
						}
					}
					$cacheArr[$brand] = date('Y-m-d H:i:s');
					LibFc::ArraySave($cacheArr, $cacheFile);
				}

				/*$res = $YpwGxb->get('gxb_base', ['max(gb_from_id+0) gb_from_id'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
				$bid = (int) $res['data']['gb_from_id'] + 1;
				if($bid < 1000000) $bid = 1000000;
				$endId = $bid+1000;
				for($fromid = $bid; $fromid <= $endId; $fromid++)
				{
					$gbres = $YpwGxb->updateGgByCatch($site, $fromid, '', $type);
					if(!empty($gbres['data']['gbid']))
					{
						$nullCount = 0;
					}
					else if(stripos($gbres['data']['msg'], '#null#') !== false)
					{
						$nullCount++;
						echo $fromid, '=>', $gbres['data']['msg'], '<br>';
					}
					else 
					{
						echo $fromid, '=>', $gbres['data']['msg'], '<br>';
						exit;
					}
					if($nullCount >= $stopCount) break;
					sleep(rand(2,5));
				}*/
			break;
			case 'cntruck':
				$siteDir = mvc::$cfg['GGDIR'].$site.'/dipan/';
				LibDir::CreateDir($siteDir);
				$url = 'https://www.cn-truck.com/list_72.html';
				$html = $YpwGxb->catchSite($site, $url);
				if(preg_match('/网页版(\d+)批/', $html, $match))
				{
					$newPici = $match[1];
					$res = $YpwGxb->get('gxb_base', ['max(gb_pici) gb_pici'], sprintf(" and gb_type='%s' and gb_from ='%s'", $type, $site), true);
					$lastPici = (int) $res['data']['gb_pici'];
					if($newPici > $lastPici) $stopCount = 100;
					for($pici = $lastPici; $pici <= $newPici; $pici++)
					{
						$cacheFile = mvc::$cfg['LOGS'].''.$type.'_catch_'.$site.'_'.$pici.'.php';
						$cacheArr = [];
						if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
						if(!is_array($cacheArr)) $cacheArr = [];
						//上一批次是否完成
						if(!empty($cacheArr['isend'])) continue;
						if(empty($cacheArr['urls']))
						{//采集批次
							$url = 'https://www.cn-truck.com/gonggao/listdpres';
							$cacheArr['gxbs'] = [];
							for($page = 1; $page < 1000; $page++)
							{
								$html = $YpwGxb->catchSite($site, $url, ['page'=>$page, 'limit'=>100, 'pc0'=>$pici, 'pc1'=>$pici, 'x'=>48, 'y'=>26]);
								$html = json_decode($html, true);
								if(isset($html['count']) && is_array($html['data'])){ 
									if(!empty($html['data'][0]['dpxh'])){
										foreach($html['data'] as $row)
										{
											$cacheArr['gxbs'][] = $row['dpxh'];
											$cacheArr['urls'][] = json_encode($row, JSON_UNESCAPED_UNICODE);
										}
									}else{
										break;
									}
								}else{
									exit($url.'=>'.$page.'采集批次错误'.$html);
								}
								sleep(1);
							}
							$cacheArr['gxbs'] = array_unique($cacheArr['gxbs']);
							LibFc::ArraySave($cacheArr, $cacheFile);
						}
						if(empty($cacheArr['gxbs'])) continue;
						$catchCount = 0;//最大采集数
						$res = $YpwGxb->get('gxb_base', ['gb_id', 'gb_from_id'], sprintf(" and gb_type='%s' and gb_from='%s' and gb_pici='%s'", $type, $site, $pici));
						$hasfromids = array_column($res['data'], 'gb_id', 'gb_from_id');
						foreach($cacheArr['gxbs'] as $gk=>$gxb)
						{
							$format = LibFc::FormatNum($gxb);
							$fromid = $pici.'_'.$format;
							if(!empty($hasfromids[$fromid])){
								unset($cacheArr['gxbs'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								continue;
							}
							$url = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showdpgg&dpxh='.$gxb;
							$html = $YpwGxb->catchSite($site, $url);
							$res = $YpwGxb->formatGgByCntruck($html, $type);
							$dataArr = $res['data'];
							$fromid = $dataArr['pici'].'_'.$dataArr['gxb_code'];
							if($dataArr['pici'] != $pici){
								unset($cacheArr['gxbs'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								continue;
							}
							$dataArr['from_url'] = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showdpgg&dpxh='.$dataArr['gxb_code_show'];
							$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr, $type);
							if(!empty($gbres['data']))
							{
								$newDir = $siteDir.$dataArr['pici'].'/';
								@mkdir($newDir);
								$newFile = $newDir.$fromid.'.html';
								file_put_contents($newFile, $html);
								unset($cacheArr['gxbs'][$gk]);
								LibFc::ArraySave($cacheArr, $cacheFile);
								$catchCount++;
							}
							else
							{
								$nullCount++;
								echo $url, ' 异常<br>';
							}
							//exit;
							//sleep(1);
							if($nullCount >= $stopCount) break;
							if($catchCount > 3000) break;
						}
						if(empty($cacheArr['gxbs'])) $cacheArr['isend'] = 1;
						LibFc::ArraySave($cacheArr, $cacheFile);
					}
				}
				else
				{
					echo '匹配批次出错'.$html;
				}
			break;
		}
		$this->initVin8RegByGg();
		LibFc::delFunLock(mvc::$URL_METHOD.$site);
		echo 'ok';
	}

	/**
	  * @method处理公告中html本身有问题的数据
	  * @author soul
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function updateAnyVals()
	{
		$YpwGxb = new YpwGxb();
		$where = " AND gb_vtype NOT LIKE '%摩托%' AND gb_vtype NOT LIKE '%三轮%' AND (ge_engine LIKE '%,%' or ge_kw LIKE '%,%' or ge_cc LIKE '%,%'  or length(ge_kw) > 5  or length(ge_cc) > 7)";
		$gbres = $YpwGxb->get('gxb_base JOIN gxb_engine ON gb_id = ge_gb_id', ['*'], $where);
		$LibHttp = new LibHttp();
		foreach($gbres['data'] as $v)
		{
			$res = $YpwGxb->updateGgByCache($v['gb_id']);
			if(count($res['data']['gbdata']['engines']) == 1)
			{
				echo $v['gb_url'], "err \r\n";
				//var_dump($res);
				//exit;
			}
			else{
				echo $v['gb_url'], "ok \r\n";
			}
		}
	}
	

	//小宋采集的数据入库
	public function initOldGg()
	{
		//exit('人工开启');
		$Params = mvc::$URL_PARAMS;
		$cfg = [
			'chinacar'=>mvc::$cfg['GGDIR'].'htmlchinacar/',	
			'cn357'=>mvc::$cfg['GGDIR'].'htmlcn357/',	
			'cntruck'=>mvc::$cfg['GGDIR'].'htmlcntruck/',	
			'miiteidc'=>mvc::$cfg['GGDIR'].'htmlmiiteidc/',	
		];
		$site = $Params['site'];
		$dir = $cfg[$site];
		if(!file_exists($dir)) exit('目录不存在');

		$siteDir = mvc::$cfg['GGDIR'].$site.'/';
		@mkdir($siteDir);
		$YpwGxb = new YpwGxb();
		$farr = scandir($dir);
		shuffle($farr);
		$count = 10000;
		foreach($farr as $v)
		{
			if(in_array($v, ['..','.']) || is_file($dir.$v)) continue;
			$tdir = $dir.$v.'/';
			$endfarr = scandir($tdir);
			shuffle($endfarr);
			foreach($endfarr as $ev)
			{
				if(stripos($ev, '.html') === false) continue;
				$oldFile = $tdir.$ev;
				$name = substr($ev, 0, -5);
				if($site == 'chinacar')
				{
					//echo $oldFile, '<br>';
					$t = explode('_', $name);
					$fromid = $t[0];
					$res = $YpwGxb->formatGgByChinacar(file_get_contents($oldFile));
					$dataArr = $res['data'];
					$dataArr['from_url'] = 'http://chinacar.com.cn/ggcx_new/search_view.html?id='.base64_encode($fromid);
					$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr);
					//var_dump($oldFile, $fromid, $dataArr);exit;
					if(!empty($gbres['data']))
					{
						$newDir = $siteDir.$dataArr['pici'].'/';
						$newFile = $newDir.$fromid.'.html';
						@mkdir($newDir);
						rename($oldFile, $newFile);
					}
					else
					{
						echo $oldFile, ' 异常<br>';
					}
				}
				else if($site == 'cn357')
				{
					$t = explode('_', $name);
					$fromid = str_replace('notice', '', $t[0]);
					$html = file_get_contents($oldFile);
					$html = $YpwGxb->getCn357PageMain($html);
					$res = $YpwGxb->formatGgByCn357($html);
					$dataArr = $res['data'];
					//var_dump($dataArr);
					$dataArr['from_url'] = 'https://www.cn357.com/notice'.$fromid.'_'.$dataArr['gxb_code'];
					$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr);
					//var_dump($oldFile, $fromid, $dataArr);exit;
					if(!empty($gbres['data']))
					{
						$newDir = $siteDir.$dataArr['pici'].'/';
						$newFile = $newDir.$fromid.'.html';
						@mkdir($newDir);
						file_put_contents($newFile, $html);
						@unlink($oldFile);
					}
					else
					{
						echo $oldFile, ' 异常<br>';
					}
				}
				else if($site == 'cntruck')
				{
					$html = file_get_contents($oldFile);
					$res = $YpwGxb->formatGgByCntruck($html);
					$dataArr = $res['data'];
					if(stripos($html, '旧库查询') !== false && preg_match('/\&id\=(\d+)"[^>]+>导出word文档<\/a>/',$html,$match)){
						$dataArr['from_url'] = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showoldgg&id='.$match[1];
					}else{
						$dataArr['from_url'] = 'https://www.cn-truck.com/index.php?m=gonggao&c=index&a=showgg&clxh='.$dataArr['gxb_code_show'].'&pc='.$dataArr['pici'].'&cx=0';
					}
					$fromid = $dataArr['pici'].'_'.$dataArr['gxb_code'];
					$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr);
					//var_dump($oldFile, $fromid, $dataArr);
					if(!empty($gbres['data']))
					{
						$newDir = $siteDir.$dataArr['pici'].'/';
						$newFile = $newDir.$fromid.'.html';
						@mkdir($newDir);
						file_put_contents($newFile, $html);
						@unlink($oldFile);
					}
					else
					{
						echo $oldFile, ' 异常<br>';
					}
					//exit;
				}else if($site == 'miiteidc'){
					$html = file_get_contents($oldFile);
					$type = stripos($html, '车辆型号')? 'gxb': 'dipan';
					$res = $YpwGxb->formatGgByMiiteidc($html, $type);
					$dataArr = $res['data'];
					$fromid = $dataArr['from_id']? $dataArr['from_id']: $name;
					$dataArr['from_url'] = 'https://service.miit-eidc.org.cn/miitxxgk/gonggao/xxgk/queryCpParamPage?dataTag='.($type == 'dipan'? 'D': 'Z').'&gid='.$fromid.'&pc='.$dataArr['pici'];
					$gbres = $YpwGxb->updateGgInfo($site, $fromid, $dataArr, $type);
					//var_dump($oldFile, $fromid, $dataArr, $gbres);exit;
					if(!empty($gbres['data'])){
						if($type == 'dipan'){
							$newDir = $siteDir.'dipan/';
							@mkdir($newDir);
							$newDir .= $dataArr['pici'].'/';
						}else{
							$newDir = $siteDir.$dataArr['pici'].'/';
						}
						$newFile = $newDir.$fromid.'.html';
						@mkdir($newDir);
						file_put_contents($newFile, $html);
						@unlink($oldFile);
					}else{
						echo $oldFile, ' 异常<br>';
					}
					//exit;
				}
				$count--;
				if($count < 1) exit('count=>'.$count);
			}
			@rmdir($tdir);
		}
		echo 'ok';
	}


	function formatDianChe()
	{
		$YpwGxb = new YpwGxb();
		$where = " and gb_gxb_code LIKE '%EV%' and gb_dianchi = '' and gr_remark !=''";
		//$where = " and gb_id = 467043";
		$lres = $YpwGxb->get('gxb_base JOIN gxb_exinfo ON gr_gb_id = gb_id', ['gb_id,gb_gxb_code,gb_gxb_code_show,gr_remark, gb_from_url'], $where);
		foreach($lres['data'] as $lv)
		{
			$res = $YpwGxb->formatRemarkInfo($lv['gr_remark']);
			$parr = $res['data'];
			if(!empty($parr['dianchi']))
			{
				$YpwGxb->set('gxb_base', ['gb_dianchi'=>$parr['dianchi']], sprintf(" and gb_id=%d", $lv['gb_id']));
			}
			else
			{
				echo $lv['gb_id'].'=>'.$lv['gb_gxb_code'].'=>'.$lv['gr_remark']."\r\n";
			}
		}
		echo 'ok';
	}


	/**
	  * @method 通过现有缓存更新公告信息
	  * @param  gbid  int [必填] 指定ID
	  * @author soul
	  * @copyright 2022/9/17
	  * @return 
	  */
	public function updateCn357GgByCache()
	{
		$YpwGxb = new YpwGxb();
		$lres = $YpwGxb->get('gxb_base', ['gb_id'], sprintf(" and gb_from='cn357' and gb_dpgxb_chk = 0 and gb_gtype != 7 order by rand() limit 2000"));
		foreach($lres['data'] as $lv)
		{
			$YpwGxb->updateGgByCache($lv['gb_id']);
		}
		echo 'ok';
	}


	//采集更新中车网底盘 每天凌晨执行一次
	public function updateGxbCodeDipan()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600*24)) return true;
		$Params = mvc::$URL_PARAMS;
		$YpwGxb = new YpwGxb();
		$site = 'chinacar';
		$siteDir = mvc::$cfg['GGDIR'].$site.'/';
		@mkdir($siteDir);
		$dipanDir = $siteDir.'dipan/';
		@mkdir($dipanDir);
		$piciDir = $dipanDir.'pici/';
		@mkdir($piciDir);
		$cachetime = 3600*24*30;
		$comwhere = " and gb_type='gxb' and gb_from ='{$site}' and gb_dpgxb_chk = 0 AND gb_gtype != 7 and gb_pici > 360";
		if(!empty($Params['pici'])) $comwhere .= sprintf(" and gb_pici=%d", $Params['pici']);
		$regArr = [
			['filed'=>['gb_pici pici', 'count(*) total'], 'where'=>$comwhere.' GROUP BY gb_pici'],
			['filed'=>['gb_gxb_code_show gxb', 'count(*) total'], 'where'=>$comwhere.' GROUP BY gb_gxb_code_show']
		];
		foreach($regArr as $reg)
		{
			$lres = $YpwGxb->get('gxb_base', $reg['filed'], $reg['where']);
			foreach($lres['data'] as $k=>$tv)
			{
				if(!empty($tv['pici']) && $tv['total'] < 100) continue;
				$per = 400;
				$brandArr = [''];
				$url = 'http://chinacar.com.cn/Home/GonggaoSearch/GonggaoSearch/search_json?_dc='.time().rand(100, 999);
				$skey = !empty($tv['pici'])? $tv['pici'] : LibFc::FormatNum($tv['gxb']);
				if(!LibFc::hasFunLock(mvc::$URL_METHOD.$skey, 3600)) return true;
				if(!empty($tv['pici']))
				{//按批次有可能超15000
					$unikey = $skey.'__1';
					$cacheFile = $piciDir.$unikey.'.html';
					if(!file_exists($cacheFile) || (time() - filemtime($cacheFile)) > $cachetime){
						$post = ['s1'=>'','s4'=>$tv['pici'], 's20'=>'1','s28'=>'0','s29'=>'0','s30'=>'1','page'=>'1','start'=>'0','limit'=>$per];
						$html = $YpwGxb->catchSite($site, $url, $post);
						if(stripos($html, '请使用准确的查询条件'))
						{
							$res = $YpwGxb->get('gxb_base', ['gb_brand'],  " and gb_type='gxb' and gb_from ='{$site}' and gb_dpgxb_chk = 0 and gb_pici = {$tv['pici']} GROUP BY gb_brand");
							$brandArr = array_column($res['data'], 'gb_brand');
						}else if(stripos($html, 'success') && stripos($html, 'clxh')){
							file_put_contents($cacheFile, $html);
						}
					}
				}
				foreach($brandArr as $brand)
				{
					for($page = 1; $page < 100; $page++)
					{
						$unikey = $skey.'_'.$brand.'_'.$page;
						$cacheFile = $piciDir.$unikey.'.html';
						echo $cacheFile, '<br>';
						$post = ['s1'=>$brand,'s2'=>'','s4'=>'', 's20'=>'1','s28'=>'0','s29'=>'0','s30'=>'1','page'=>$page,'start'=>'0','limit'=>$per];
						if(!empty($tv['pici'])) $post['s4'] = $tv['pici'];
						if(!empty($tv['gxb'])) $post['s2'] = $tv['gxb'];
						$isCatch = false;
						if(!file_exists($cacheFile) || (time() - filemtime($cacheFile)) > $cachetime){
							$html = $YpwGxb->catchSite($site, $url, $post);
							if(!stripos($html, 'success')){
								$errorCount++;
								if($errorCount > 5){
									LibFc::delFunLock(mvc::$URL_METHOD.$skey);
									exit('中车获取异常'.$html);
								}
								break;
							}else{
								$errorCount = 0;
							}
							$isCatch = true;
						}else{
							$html = file_get_contents($cacheFile);
						}
						$res = $YpwGxb->updateChinacarDipan($html);
						if(is_array($res['data'])){
							if($isCatch) file_put_contents($cacheFile, $html);
							if(count($res['data']) < $per) break;
						}
					}
				}
				LibFc::delFunLock(mvc::$URL_METHOD.$skey);
			}
		}
		echo 'ok';
	}


	public function viewHtml()
	{
		$Params = mvc::$URL_PARAMS;
		if(empty($Params['file'])) exit('参数获取异常');
		$filename = mvc::$cfg['GGDIR'].$Params['file'];
		$html = file_get_contents($filename);
		$html = preg_replace('/\<script.*\<\/script\>/iUs', '', $html);
		echo $html;
	}
	
	/**
	 * @method 修改更新文件
	 * @author zhengweihua 
	 * @copyright 2023-01-30
	 */
	public function updateHtml()
	{
		if($_SERVER['REQUEST_METHOD']=='POST' && $_POST)
		{	
			$url = LibFc::Escape($_POST['url']);
			
			$YpwGxb = new YpwGxb();
			$where = sprintf(" and gb_url like '%%%s'",$url);
			$gbres = $YpwGxb->get('gxb_base', ['gb_id'], $where,true);
			if(empty($gbres['data']['gb_id'])) exit("链接不存在");

			$gb_id = $gbres['data']['gb_id'];
			$data = parse_url($url);
		
			$filename = mvc::$cfg['GGDIR'].str_replace('/files/','',$data['path']);
			$orgHtml = file_get_contents($filename);
			similar_text($_POST['content'],$orgHtml,$percent);
			if($percent<85) exit("修改文本内容过多！");
			
			$orgfilename = str_replace('.html', '_ORG.html', $filename);
			if(!file_exists($orgfilename))
			{
				//排他创建，已有 _ORG.html 时绝不覆盖，确保始终保留最原始版本
				$orgHandle = @fopen($orgfilename, 'xb');
				if($orgHandle !== false)
				{
					$orgLength = strlen($orgHtml);
					$writeLength = fwrite($orgHandle, $orgHtml);
					fclose($orgHandle);
					if($writeLength !== $orgLength)
					{
						@unlink($orgfilename);
						exit("原文件备份失败");
					}
				}
				else
				{
					clearstatcache(true, $orgfilename);
					if(!file_exists($orgfilename)) exit("原文件备份失败");
				}
			}

			$res = file_put_contents($filename,$_POST['content']);
			if(!$res) exit("文件修改失败");

			$YpwGxb->updateGgByCache($gb_id);
			echo '<script type="text/javascript">alert("修改成功");</script>';
		}
		$Params = mvc::$URL_PARAMS;
		if(empty($Params['url'])) exit('参数获取异常');
		$data = parse_url($Params['url']);
		$filename = mvc::$cfg['GGDIR'].str_replace('/files/','',$data['path']);
		$html = file_get_contents($filename);
		$orgfilename = str_replace('.html', '_ORG.html', $filename);
		$orgHtml = file_exists($orgfilename)? file_get_contents($orgfilename): null;

		LibTpl::Set('Params',$Params);
		LibTpl::Set('documentUrl',$Params['url']);
		LibTpl::Set('html',$html);
		LibTpl::Set('orgHtml',$orgHtml);
		LibTpl::Put('gxb/updateHtml.php');
	}

	/**
	 * @method 通过清单初始化进口车 品牌+型号+发动机 的功率 排放信息
	 * @author soul
	 * @copyright 2023/3/1
	 */
	public function initJinkouGxbEngInfo()
	{
		$cacheFile = mvc::$cfg['LOGS'].'cache_initJinkouGxbEngInfo.php';
		$cacheArr = file_exists($cacheFile)? include($cacheFile): [];
		$YpwVin = new YpwVin();
		$LibHttp = new LibHttp();
		$OthPdfOcr = new OthPdfOcr();
		$YpwGxb = new YpwGxb();
		$res = $YpwVin->get('stand_model_tj', ['DISTINCT smt_gxb_code'], " and smt_vin1_8 NOT LIKE 'L%' AND smt_vin1_8 NOT LIKE 'H%'");
		$gxbArr = array_column($res['data'], 'smt_gxb_code');
		$total = count($gxbArr);
		$tgArr = [];
		foreach($gxbArr as $gk=>$gv)
		{
			$tgArr[] = $gv;
			if(count($tgArr) === 100 || ($gk+1) == $total)
			{
				$tcodes = implode("','", $tgArr);
				$where = " and sma_vyear >= 2017 AND sma_gxb_code IN ('{$tcodes}') and sma_engine != '' AND (sma_brand,sma_gxb_code,sma_engine) NOT IN (SELECT ckw_brand, ckw_gxb_format, ckw_engine FROM stand_gxbengine_kw WHERE ckw_paifang != '') GROUP BY sma_brand,sma_gxb_code,sma_engine";
				$tres = $YpwVin->get('stand_model_any', ['sma_brand,sma_gxb_code,sma_engine'], $where);
				if(empty($tres['data'])) continue;
				foreach($tres['data'] as $tvv)
				{
					$unikey = implode('@', $tvv);
					$cacheArr[$unikey] = $tvv;
					//获取有发动机编码的记录
					$paifang = '';
					$eres = $YpwVin->get('stand_model_any join stand_vin_file on vf_vin = sma_vin', ['sma_vin,vf_url'], sprintf(" and sma_brand='%s' and sma_gxb_code='%s' and sma_engine='%s' order by rand() limit 100", $tvv['sma_brand'], $tvv['sma_gxb_code'], $tvv['sma_engine']));
					$cacheArr[$unikey]['file_count'] = count($eres['data']);
					if(!empty($eres['data']))
					{
						foreach($eres['data'] as $evv)
						{
							$html = $LibHttp->fetch($evv['vf_url']);
							$pdfFile = mvc::$cfg['PATH_CACHE'].md5($evv['vf_url']).'.pdf';
							file_put_contents($pdfFile, $html);
							$res = $OthPdfOcr->getPdfTxt($pdfFile, false);
							@unlink($pdfFile);
							$html = $res['data'];
							$reArr = ["\r\n"=>"\n", '：'=>':'];
							$html = strtr($html, $reArr);
							if(preg_match('/排放阶段[^:\n]*:\s+([\S ]+)\s*/i', $html, $match))
							{
								$paifang = $match[1];
								break;
							}
						}
						$res = $YpwGxb->formatPaifang($paifang);
						$paifang = $res['data']['format'];
					}
					
					if(empty($paifang) && date('H') >= 7 && date('H') < 20)
					{
						$eres = $YpwVin->get('stand_model_any', ['sma_vin vin,sma_engine6 engine6'], sprintf(" and sma_brand='%s' and sma_gxb_code='%s' and sma_engine='%s' and length(sma_engine6) >= 6 order by rand() limit 100", $tvv['sma_brand'], $tvv['sma_gxb_code'], $tvv['sma_engine']));
						$cacheArr[$unikey]['eng6_count'] = count($eres['data']);
						if(!empty($eres['data']))
						{
							foreach($eres['data'] as $evv)
							{
								$LibYpApi = new LibYpApi(mvc::$cfg['YPAPILOC']);
								$res = $LibYpApi->Get('vin/catchVinQingdan', $evv, [], true);
								if($res['status'] && !empty($res['data']['paifang']))
								{
									$paifang = $res['data']['paifang'];
									break;
								}
							}
						}
					}

					if(!empty($paifang))
					{
						$addArr = [
							'ckw_brand'=>$tvv['sma_brand'],
							'ckw_gxb_format'=>$tvv['sma_gxb_code'],
							'ckw_engine'=>$tvv['sma_engine'],
							'ckw_paifang'=>$paifang,
							'ckw_uid'=>8,
							'ckw_etime'=>time(),
							'ckw_from'=>'catch'
						];
						$cres = $YpwVin->get('stand_gxbengine_kw', ['ckw_id, ckw_paifang'], sprintf(" and ckw_brand='%s' and ckw_gxb_format='%s' and ckw_engine='%s'", $addArr['ckw_brand'], $addArr['ckw_gxb_format'], $addArr['ckw_engine']), true);
						if(!empty($cres['data'])){
							$YpwVin->set('stand_gxbengine_kw', $addArr, sprintf(" and ckw_id=%d and (ckw_paifang='' or ckw_uid=8)", $cres['data']['ckw_id']));
						}else{
							$YpwVin->add('stand_gxbengine_kw', $addArr);
						}
					}
					$cacheArr[$unikey]['paifang'] = $paifang;
					$cacheArr[$unikey]['time'] = date('Y-m-d H:i:s');
					LibFc::ArraySave($cacheArr, $cacheFile);
				}
				$tgArr = [];
			}
		}
		echo 'ok';
	}


	/**
	 * @method 国产型号统计表赋值车系（汽车之家）
	 * @author soul
	 * @copyright 2023/3/1
	 */
	public function initGxbV8Model()
	{
		//2023/4/7 卡车有问题 只处理乘用车smt_gtype=7
		$YpwVin = new YpwVin();
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$table = "stand_model_tj 
		LEFT JOIN stand_gxb_base ON smt_gxb_code = sgb_gxb_code
		LEFT JOIN stand_model_ypgxb ON smt_gxb_code = gxb_code AND gxb_vin1_8 = smt_vin1_8
		LEFT JOIN stand_gxb_v8info ON sgv_vin1_8 = smt_vin1_8  AND smt_gxb_code = sgv_gxb_code";
		$where = " and smt_gtype=7 and (smt_vin1_8 LIKE 'L%' OR smt_vin1_8 LIKE 'H%') AND gxb_vin1_8 IS NULL AND (sgv_model IS NULL OR sgv_model = '' OR sgv_brand = '')";
		$gres = $YpwVin->get($table, ['smt_vin1_8,smt_gxb_code,smt_gxb_code_show,sgb_rname, sgv_vin1_8,sgv_gxb_code,sgv_model'], $where);
		$hasChkGxbArr = [];
		foreach($gres['data'] as $tv)
		{
			if(!empty($tv['sgb_rname']) || !empty($tv['sgv_model'])) continue;
		
			if(!isset($hasChkGxbArr[$tv['smt_gxb_code']]))
			{
				$res = $YpwVin->get("gxb_size JOIN gxb_base ON gs_gb_id = gb_id and gb_type='gxb' JOIN gxb_params ON gp_gb_id = gb_id AND gp_gl_code = 'wheel'", ['gs_length', 'gs_width', 'gs_height', 'gp_value wheel'], sprintf(" and gb_gxb_code='%s'", $tv['smt_gxb_code']));
				if(empty($res['data'])) continue;
				$where = sprintf(" and m2_length in ('%s') and m2_width in ('%s') and m2_height in ('%s') and m2_wheelbase in ('%s') group by m1_id", 
					implode("','", array_unique(array_column($res['data'], 'gs_length'))),
					implode("','", array_unique(array_column($res['data'], 'gs_width'))),
					implode("','", array_unique(array_column($res['data'], 'gs_height'))),
					implode("','", array_unique(array_column($res['data'], 'wheel')))
				);
				$res = $YPCAR67->get('model_qczj.model2 JOIN model_qczj.model1 ON m1_id = m2_m1_id join model_qczj.brand on b_id=m2_b_id', ['b_name', 'm1_name'], $where);
				$hasChkGxbArr[$tv['smt_gxb_code']] = $res['data'];
			}
			if(count($hasChkGxbArr[$tv['smt_gxb_code']]) == 1)
			{
				$m1name = str_replace($hasChkGxbArr[$tv['smt_gxb_code']][0]['b_name'], '', $hasChkGxbArr[$tv['smt_gxb_code']][0]['m1_name']);
				if(empty($tv['sgv_vin1_8']))
				{
					$addArr = [
						'sgv_vin1_8'=>$tv['smt_vin1_8'],
						'sgv_gxb_code'=>$tv['smt_gxb_code'],
						'sgv_gxb_code_show'=>$tv['smt_gxb_code_show'],
						'sgv_model'=>$m1name,
						'sgv_etime'=>time(),
						'sgv_uid'=>8
					];
					$YpwVin->add('stand_gxb_v8info', $addArr);
				}else{
					$addArr = [
						'sgv_model'=>$m1name,
						'sgv_etime'=>time()
					];
					$YpwVin->set('stand_gxb_v8info', $addArr, sprintf(" and sgv_vin1_8='%s' and sgv_gxb_code='%s'", $tv['smt_vin1_8'], $tv['smt_gxb_code']));
				}
			}
		}
		echo 'ok';
	}

	/**
	 * @method 通过公告匹配 型号 + 前8 + 轴距 的规则
	 * @author soul
	 * @copyright 2024/1/2
	 */
	public function initVin8RegByGg()
	{
		$YpwVin = new YpwVin();
		$where = " and gb_gxb_code in (select smt_gxb_code from stand_model_tj) and gr_remark REGEXP '[LH][0-9A-Z]{7}' and gr_remark like '%轴距%'";
		$cres = $YpwVin->get("gxb_base JOIN gxb_exinfo ON gb_id = gr_gb_id AND gb_type = 'dipan'", ['gb_id', 'gb_gxb_code', 'gr_remark'], $where);
		$reals = [];
		foreach($cres['data'] as $v){
			$res = $YpwVin->get('gxb_params', ['gp_gl_code','gp_value'], sprintf(" and gp_gb_id =%d and gp_gl_code in ('vin18', 'wheel')", $v['gb_id']));
			foreach($res['data'] as $tv){
				$v[$tv['gp_gl_code']][] = $tv['gp_value'];
			}
			if(count($v['wheel']) > 1 && count($v['vin18']) > 1){
			}else{
				continue;
			}
			//多轴距
			$remarktxt = $v['gr_remark'];
			$reArr =['，'=>',', '；'=>';', '：'=>':',': '=>':','、'=>',',
				'对应VIN为 '=>'对应VIN为',
				'对应车辆识别代号为'=>'对应VIN为',
				'时VIN对应为'=>'对应VIN为',
				'时VIN为:'=>'对应VIN为',
				'对应VIN:'=>'对应VIN为',
				'与VIN:'=>'对应VIN为',
				'时对应VIN为'=>'对应VIN为',
				'对应VIN号'=>'对应VIN为',
				'时,对应VIN为'=>'对应VIN为',
				'对应的车辆识别代号为'=>'对应VIN为',
				
			];
			$remarktxt = strtr($remarktxt, $reArr);
			
			//.*?任意字符 ?非贪婪  轴距:([1-9][0-9,+和m]{2,})   VIN:([LH][0-9A-Z]{7})[\*×x]{9}
			$regs = [
				'/([LH][0-9A-Z]{7})[\*×x]{9}\(轴距为?([1-9][0-9,+和m]{2,})\)/iu', //LZZABBMG×××××××××(轴距为5000mm) 
				'/([LH][0-9A-Z]{7})[\*×x]{9}\(([1-9][0-9,+和m]{2,})轴距\)/iu', //LZZ1BAGB×××××××××(3280轴距)
				'/([LH][0-9A-Z]{7})[\*×x]{9}对应轴距为?([1-9][0-9,+和m]{2,})/iu', //LFNDRUMW×××××××××对应轴距5500+1350  LZ0BDPD3×××××××××对应轴距为3800mm
				'/([LH][0-9A-Z]{7})[\*×x]{0,9} *对应([1-9][0-9,+和m]{2,})轴距/iu', //LZ0BFPD4×××××××××对应4500,4700轴距        LZ0BFPD4××××××××× 对应3900轴距   LZ0BFPD4对应4900轴距
				'/([LH][0-9A-Z]{7})[\*×x]{0,9} *对应轴距([1-9][0-9,+和m]{2,})/iu', //LFNFVXPT对应轴距1950+3100+1350  
				'/([LH][0-9A-Z]{7})[\*×x]{0,9} *对应[^驾]+驾驶室,([1-9][0-9,+和m]{2,})轴距/iu', //LZ0B4JB2×××××××××对应单排驾驶室,2850轴距;
				'/([LH][0-9A-Z]{7})[\*×x]{9}\(([1-9][0-9,+和m]{2,})[\/\)]/iu', //VIN与轴距/发动机对应关系为: LJ11R6FJ×××××××××(2100+4300+1350/YCK08350-60,CA6DK2-35E65)
				'/([LH][0-9A-Z]{7})[\*×x]{9}对应[^\,]{2,50}\,([1-9][0-9,+和m]{2,})轴距;/iu', //LZ0B9PB3×××××××××对应4DW93-84E4,3250轴距;
				
				'/轴距为?([1-9][0-9,+和m]{2,})对应([LH][0-9A-Z]{7})[\*×x]{9}/iu',//轴距1950+2900+1350对应LC1HNWBH×××××××××
				'/轴距为?([1-9][0-9,+和m]{2,})对应VIN为([LH][0-9A-Z]{7})[\*×x]{9}/iu', //轴距2600时VIN为:LC74A11E********* 轴距4350mm时VIN对应为LFNGBRKG 轴距3400对应VIN:LA71CGH3××××××××× 轴距3600mm对应VIN号LLTAG33C××××××××× 轴距3360对应车辆识别代号为L7TADJ55××××××××× 轴距3600mm对应VIN号LLTAG33C×××××××××
				
				'/([1-9][0-9,+和m]{2,})轴距[^;,:。\(]{0,20}对应VIN为([LH][0-9A-Z]{7})[\*×x]{9}/iu',//2860轴距CA4DB1-13E6对应VIN为LFNA4KC7×××××××××
				'/([1-9][0-9,+和m]{2,})轴距时?对应VIN[:号]([LH][0-9A-Z]{7})[\*×x]{9}/iu', //2720轴距对应VIN:LA71AJE4×××××××××  
				'/([1-9][0-9,+和m]{2,})轴距与VIN:([LH][0-9A-Z]{7})[\*×x]{9}对应/iu', //2910mm轴距与VIN:LA71AHF4×××××××××对应
				'/([1-9][0-9,+和m]{2,})轴距时?对应VIN前八位为([LH][0-9A-Z]{7})/iu', //3095mm轴距对应VIN前八位为LETZD2E1
				'/([1-9][0-9,+和m]{2,})轴距时?对应VIN为:?([LH][0-9A-Z]{7})/iu', //2850mm轴距对应VIN为:LZ0B9PB2×××××××××
				'/([1-9][0-9,+和m]{2,})轴距时?对应([LH][0-9A-Z]{7})/iu', //4000轴距对应LLTDG33E×××××××××

				'/对应VIN为([LH][0-9A-Z]{7})[\*×x]{9}轴距为([1-9][0-9,+和m]{2,})后/iu', //对应VIN为LFNAFR4L×××××××××轴距为5005
			];
			$ismatch = false;
			foreach($regs as $reg)
			{
				if(preg_match_all($reg, $remarktxt, $match, PREG_SET_ORDER))
				{
					/*if($v['gb_gxb_code'] == 'BJ1139VJPEKF5'){
						var_dump($reg, $remarktxt, $match);
						exit;
					}*/
					$ismatch = true;
					foreach($match as $tv){
						$tv[1] = strtr($tv[1], ['和'=>',', 'mm'=>'']);
						$tv[2] = strtr($tv[2], ['和'=>',', 'mm'=>'']);

						//默认车架号在后
						if(array_intersect(explode(',', $tv[2]), $v['wheel'])){
							$temp = $tv[2]; $tv[2] = $tv[1]; $tv[1] = $temp;
						}
						foreach(explode(',', $tv[1]) as $wval){
							if(in_array($tv[2], $v['vin18']) && in_array($wval, $v['wheel'])){
								$unikey = $v['gb_gxb_code'].'@'.$tv[2];
								if(!empty($reals[$unikey])){
									if(!in_array($wval, $reals[$unikey]['wheel'])) $reals[$unikey]['wheel'][] = $wval;
								}else{
									$reals[$unikey] = ['gxb'=>$v['gb_gxb_code'], 'vin18'=>$tv[2], 'wheel'=>[$wval]];
								}
							}
						}
					}
				}
			}
			if(!$ismatch){
				var_dump($v['gb_gxb_code'].'=>'.$remarktxt);
			}
		}
		//var_dump($reals);
		foreach($reals as $unikey=>$val){
			$add = [
				'skr_vin8'=>$val['vin18'],
				'skr_field'=>'wheel',
				'skr_val'=>implode(',', $val['wheel']),
				'skr_gxbcode'=>$val['gxb'],
				'skr_by'=>8,
				'skr_etime'=>time()
			];
			$chk = $YpwVin->get('stand_kczj_reg', ['skr_id, skr_val, skr_by'], sprintf(" and skr_vin8='%s' and skr_field='wheel' and skr_gxbcode='%s'", $add['skr_vin8'], $add['skr_gxbcode']), true);
			if(empty($chk['data'])){
				$YpwVin->add('stand_kczj_reg', $add);
			}else if(!empty($chk['data']) && $chk['data']['skr_by'] == 8 && $chk['data']['skr_val'] != $add['skr_val']){
				$YpwVin->set('stand_kczj_reg', $add, sprintf(" and skr_id=%d", $chk['data']['skr_id']));
			}
		}
		echo 'ok';
	}


	function test2()
	{
		$lines = ["发动机YCDV2561-105,YCDV2561-115发动机净功率分别为77,83kW;选装排半驾驶室,选装高顶驾驶室.该车型可选装ETC车载装置.选装无备胎.安装ABS型号为CM4XL-4S/4M,生产厂家为广州瑞立科密汽车电子股份有限公司.2660mm轴距YCDV2561-105对应VIN单排为LFNG4HB6×××××××××,排半为LFNG4JB6×××××××××.2660mm轴距YCDV2561-115对应VIN单排为LFNG4HC6×××××××××,排半为LFNG4JC6×××××××××.2860mm轴距YCDV2561-105对应VIN单排为LFNG4HB7×××××××××,排半为LFNG4JB7×××××××××.2860mm轴距YCDV2561-115对应VIN单排为LFNG4HC7×××××××××,排半为LFNG4JC7×××××××××.",
		"Q23-95E60最大净功率67kW。选装排半驾驶室,选装前面罩,前组合灯,选装后视镜,选装铝合金轮辋。选装驾驶室不带天窗。选装单排驾驶室时,2720轴距对应VIN:LA71AJE4×××××××××,2600轴距对应VIN:LA71AJD4×××××××××;选装排半驾驶室时,2720轴距对应VIN:LA71BJE4×××××××××,2600轴距对应VIN:LA71BJD4×××××××××。ABS系统型号/厂家:CM4YL/广州瑞立科密汽车电子股份有限公司,CM4XL-4S/4M/广州瑞立科密汽车电子股份有限公司。该车型可选装ETC车载装置。"];
		foreach($lines as $line){
			$pattern = '/([1-9][0-9,]{2,})m*轴距.*?对应VIN[^LH]*([LH][0-9A-Z]{7})/iu';
			preg_match_all($pattern, $line, $matches, PREG_SET_ORDER);
			echo $line, "\n";
			var_dump($matches);
		}
	}
	

	/*
	SELECT gb_gxb_code, 
	GROUP_CONCAT(DISTINCT CONCAT(ge_engine, ':', ge_kw)) ge_engines, gr_remark, 
	GROUP_CONCAT(DISTINCT IF(ge_jgl_kw IS NOT NULL AND ge_jgl_kw <> '', CONCAT(ge_engine, ':', ge_jgl_kw), NULL)) has_jgl_kw,
	GROUP_CONCAT(DISTINCT IF(ge_ed_kw IS NOT NULL AND ge_ed_kw <> '', CONCAT(ge_engine, ':', ge_ed_kw), NULL)) has_ed_kw,
	COUNT(*) gb_count FROM `gxb_base` 
	JOIN `gxb_engine` ON ge_gb_id = gb_id
	JOIN gxb_exinfo ON gr_gb_id = gb_id
	WHERE gr_remark LIKE '%功率%' GROUP BY gb_gxb_code, gr_remark LIMIT 10000000
	*/
	function formatByRemarkTest()
	{
		$orgfile = 'D:\www/gxb_remark.json';
		//$orgfile = 'D:\www/gxb_remark2.json';
		$tfile = 'D:\www/gxb_remark_notall.json';
		$noAllArr = [];
		$dataArr = json_decode(file_get_contents($orgfile), true);
		$YpwGxb = new YpwGxb();
		$tj = ['total'=>0, 'jgl'=>[], 'ed'=>[], 'null'=>0];
		foreach($dataArr as $k=>$v){
			//if($v['gb_gxb_code'] !== 'HFC1048B31K1C7S') continue;
			$tarr = [
				'remark'=>$v['gr_remark'],
				'engines'=>[],
			];
			foreach(explode(',', $v['ge_engines']) as $tv){
				$tt = explode(':', $tv);
				$tarr['engines'][] = ['engine'=>$tt[0], 'kw'=>$tt[1]];
			}
			$res = $YpwGxb->formatEngByRemark($tarr);
			$arr = $res['data'];
			if(isset($arr['needkw'])){
				if(!$arr['hasJglkw'] && !$arr['hasEdkw']) continue;
				$tj['total']++;
				$ec = count(array_column($arr['engines'], 'engine'));
				$isAdd = false;
				if($arr['hasJglkw']){
					$tj['jgl']['count']++;
					if(empty($arr['needkw']['jgl_kw'])){
						$tj['jgl']['all']++;
					}else{
						if(count(array_column($arr['needkw']['jgl_kw'], 'engine')) != $ec){
							$tj['jgl']['any']++;
						}else{
							$tj['jgl']['null']++;
							$noAllArr[] = $v;
							$isAdd = true;
							echo 'jgl=>'.$arr['remarktxt']."\n\n";
						}
					}
				}
				if($arr['hasEdkw']){
					$tj['ed']['count']++;
					if(empty($arr['needkw']['ed_kw'])){
						$tj['ed']['all']++;
					}else{
						if(count(array_column($arr['needkw']['ed_kw'], 'engine')) != $ec){
							$tj['ed']['any']++;
						}else{
							$tj['ed']['null']++;
							if(!$isAdd){
								$noAllArr[] = $v;
								echo 'ed=>'.$arr['remarktxt']."\n\n";
							}
						}
					}
				}
				if($isAdd){
					//echo $arr['remarktxt']."\n\n";
				}
				if(count(array_column($arr['needkw']['jgl_kw'], 'engine')) == $ec && count(array_column($arr['needkw']['ed_kw'], 'engine')) == $ec){
					$tj['null']++;
					//echo 'null=>'.$arr['remark']."\n\n";
				}
			}
			//if($k > 10000) break;
		}
		echo 'jgl=>all:'.$tj['jgl']['all'].'/'.$tj['jgl']['count'].'('.round($tj['jgl']['all']/$tj['jgl']['count']*100, 1).')'."\n";
		echo 'jgl=>any:'.$tj['jgl']['any'].'/'.$tj['jgl']['count'].'('.round($tj['jgl']['any']/$tj['jgl']['count']*100, 1).')'."\n";
		echo 'jgl=>null:'.$tj['jgl']['null'].'/'.$tj['jgl']['count'].'('.round($tj['jgl']['null']/$tj['jgl']['count']*100, 1).')'."\n";
		echo 'ed=>all:'.$tj['ed']['all'].'/'.$tj['ed']['count'].'('.round($tj['ed']['all']/$tj['ed']['count']*100, 1).')'."\n";
		echo 'ed=>any:'.$tj['ed']['any'].'/'.$tj['ed']['count'].'('.round($tj['ed']['any']/$tj['ed']['count']*100, 1).')'."\n";
		echo 'ed=>null:'.$tj['ed']['null'].'/'.$tj['ed']['count'].'('.round($tj['ed']['null']/$tj['ed']['count']*100, 1).')'."\n";
		echo 'null=>'.$tj['null'].'/'.$tj['total'].'('.round($tj['null']/$tj['total']*100, 1).')'."\n";
		file_put_contents($tfile, json_encode($noAllArr, JSON_UNESCAPED_UNICODE));
	}


	function testReg()
	{
		$str = '发动机净功率4DW93-84E3为62KW,XC4D25Q3U62为62.5KW,4D25F为58KW。。';
		$reg = '/(?:净功率[^0-9A-Z]*|\G[,;])([0-9A-Z]{2}[0-9A-Z\-\. ]*)\s*(?:,|为|:|\()\s*(\d{2,3}(?:\.\d+)?)\s*(?:kw)?\)?/iu';
		preg_match_all($reg, $str, $match);
		var_dump($match);
	}
}
