<?php
/**
*采集接口
*/
class catchAction extends baseAction
{
	/**
	  * @method 保存Partslink24的vin数据
	  * @http  post
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  vin        int [必填] VIN
	  * @param  html       string [必填] 页面内容信息
	  * @author soul
	  * @copyright 
	  */
	public function saveVinPartslink24()
	{
		$YpwVin = new YpwVin();
		$res = $YpwVin->saveVinPartslink24($_POST);
		LibFc::EchoJson($res);
	}

	//设置账号一个月的任务安排  $type: -1:停用 1:蓄养 2:已养活 3:养不活
	public function getPartslink24TaskCofig($account, $type)
	{
		$cacheArr = [];
		$cacheFile = mvc::$cfg['PATH_CACHE'].'partslink24AccountTask.php';
		if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
		$today = date('Y-m-d');
		if(empty($cacheArr[$account]) || $cacheArr[$account]['type'] != $type || empty($cacheArr[$account][''][$today]))
		{
			$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
			$res = $YPCAR67->get('catch_vin_temp', ["COUNT(DISTINCT FROM_UNIXTIME(vt_atime,'%Y-%m-%d')) as run_date"], sprintf(" and vt_account='%s' limit 1", LibFc::Escape($account)), true);
			$runDate = (int) $res['data']['run_date'];
			$taskArr = ['type'=>$type, 'task'=>[]];
			for($i = 0; $i < 10; $i++)
			{
				$itime = strtotime('+'.$i.' days');
				$idate = date('Y-m-d', $itime);
				$iTask = [
					'week'=>date('w', $itime), 
					'bhour'=>sprintf('%02d%02d', 9, rand(0, 20)), 
					'ehour'=>sprintf('%02d%02d', rand(18, 19), rand(10, 50))
				];
				switch($type)
				{
					case 1: 
						//蓄养 不超过25  检测一汽 1/15
						$iTask['vm'] = 15;
						$iTask['count'] = in_array($iTask['week'], [0,6])? rand(10, 15): rand(rand(14, 16), rand(18, 25));
					break;
					case 2:
						//已养活 不超过90  一汽1/3
						$iTask['vm'] = 3;
						$iTask['count'] = in_array($iTask['week'], [0,6])? rand(60, 72): rand(rand(70, 80), rand(85, 95));
						if($i+$runDate < 8) $iTask['count'] = ceil($iTask['count'] * ($i+$runDate) / 20 * rand(88, 95)/100);
					break;
					case 3:
						//养不活 不超过120  检测一汽1/30
						$iTask['vm'] = 30;
						$iTask['count'] = in_array($iTask['week'], [0,6])? rand(80, 95): rand(rand(95, 105), rand(110, 125));
						//5天 过渡期
						if($i+$runDate < 8) $iTask['count'] = ceil($iTask['count'] * ($i+$runDate) / 20 * rand(100, 120)/100);
					break;
					default: 
						$iTask['vm'] = 15;
						$iTask['count'] = in_array($iTask['week'], [0,6])? rand(10, 15): rand(rand(14, 16), rand(18, 25));
					break;
				}
				$iTask['count'] += rand(2, 5);
				for($j = 0; $j < $iTask['count']; $j++)
				{
					$iTask['per'][$j] = ['wait'=>rand(100, 400), 'vm'=>0];
				}
				if($iTask['count'] >= $iTask['vm'])
				{
					$vmKeys = array_rand($iTask['per'], round($iTask['count']/$iTask['vm']));
					if(!is_array($vmKeys)) $vmKeys = [$vmKeys];
					foreach($vmKeys as $vmV)
					{
						$iTask['per'][$vmV]['vm'] = 1;
					}
				}
				$taskArr['task'][$idate] = $iTask;
			}
			$cacheArr[$account] = $taskArr;
			LibFc::ArraySave($cacheArr, $cacheFile);
		}
		return $cacheArr[$account];
	}

	/**
	  * @method 获取Partslink24的需要爬取的任务
	  * @http  post
	  * @param  account   string [必填] 账号ID
	  * @author soul
	  * @copyright 
	  */
	public function getPartslink24Task()
	{
		//任务时间  08~20 非采集时间等待60秒
		if(date('H') < 8 || date('H') >= 20) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>60]);
		$account = $_REQUEST['account'];
		if(empty($account)) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>600, 'msg'=>'noaccount']);
			
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$res = $YPCAR67->get('catch_vin_account', ['*'], sprintf(" and cac_status != -1 and cac_user='%s' limit 1", LibFc::Escape($account)), true);
		if(empty($res['data'])) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>600, 'msg'=>'noaccount']);
		$accountArr = $res['data'];

		//账号是否被借用？
		if($accountArr['cat_jieyong']) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>60]);

		$taskConfig = $this->getPartslink24TaskCofig($accountArr['cac_user'], $accountArr['cac_status']);
		$taskConfig = $taskConfig['task'][date('Y-m-d')];

		if(date('Hi') < $taskConfig['bhour'] || date('Hi') >= $taskConfig['ehour']) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>60]);

		$res = $YPCAR67->get('catch_vin_temp', ['count(distinct vt_vin) as count'], sprintf(" and vt_account='%s' and vt_atime >=%d limit 1", $accountArr['cac_user'], strtotime(date('Y-m-d'))), true);
		$todayCount = $res['data']['count'];
		if(empty($taskConfig['count']) || $todayCount >= $taskConfig['count'] || empty($taskConfig['per'][$todayCount])) LibFc::ReturnJson(true, ['type'=>'end', 'waittime'=>600, 'msg'=>'today max']);
		
		$taskCof = $taskConfig['per'][$todayCount];
		$res = $YPCAR67->get('catch_vin_temp', ['max(vt_atime) as last_atime'], sprintf(" and vt_account='%s' limit 1", $accountArr['cac_user']), true);
		//距离上次采集时间不到3分钟
		if(!empty($res['data']['last_atime']) && time() - $res['data']['last_atime'] < $taskCof['wait']) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>30]);
		
		//将采集中超过10分钟的状态重置
		$YPCAR67->set('catch_vin_task', ['cvt_status'=>0, 'cvt_etime'=>0], sprintf(" and cvt_status = 2 and cvt_etime < %d", time()-600));

		//1小时恢复到启用
		$YPCAR67->set('catch_vin_reg', ['cve_status'=>1, 'cve_status_chk'=>time()], sprintf(" and cve_status = 0 and cve_status_chk < %d and cve_status_chk > 0", time()-3600));

		//一汽系列
		$vmCodeArr = ['fawvw', 'audi', 'svwvw', 'svwsk', 'vw'];
		$tempWhere = !empty($taskCof['vm'])? sprintf(" AND cve_code IN ('%s')", implode("','", $vmCodeArr)) : sprintf(" AND cve_code not IN ('%s')", implode("','", $vmCodeArr)); 
		
		//1:未养活，一汽不取人工的
		if($accountArr['cac_status'] != 2 && !empty($taskCof['vm'])) 
			$tempWhere .= ' and cvt_from != "人工"';

		$table = sprintf("(SELECT cvt_vin AS vin, cve_code, cve_urlcode, cve_url FROM catch_vin_task JOIN catch_vin_reg ON cve_code = cvt_cve_code
			WHERE cvt_status = 0 and cve_style ='p24' AND cve_status = 1 %s ORDER BY cvt_level desc,cve_level DESC LIMIT 500) as a", $tempWhere);
		$res = $YPCAR67->get($table, ['*'], $where.' ORDER BY RAND() LIMIT 1', true);
		$arr = $res['data'];
		$arr['type'] = 'vin';
		//采集中
		$YPCAR67->set('catch_vin_task', ['cvt_status'=>2, 'cvt_etime'=>time()], sprintf(" and cvt_vin='%s' and cvt_status = 0", $arr['vin']));
		LibFc::ReturnJson(true, $arr);
	}
	
	//账号信息获取
	public function getPartslink24Accout()
	{
		$arr = [];
		if(!empty($_POST['account']))
		{
			$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
			$res = $YPCAR67->get('catch_vin_account', ['cac_pass'], sprintf(" and cac_status != -1 and cat_jieyong = 0 and cac_user='%s' limit 1", LibFc::Escape($_POST['account'])), true);
			if(!empty($res['data']))
			{
				$arr = $res['data'];
				$arr['cac_pass'] = rand(20, 99).$arr['cac_pass'].rand(1, 9);
			}
		}
		echo json_encode($arr);
	}
	
	//改变频道状态
	public function stopVinPartslink24()
	{
		if(!empty($_POST['cve_code']))
		{
			$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
			$YPCAR67->set('catch_vin_reg', ['cve_status'=>0, 'cve_status_chk'=>time()], sprintf(" and cve_status != -1 and cve_code='%s'", LibFc::Escape($_POST['cve_code'])));
		}
		LibFc::ReturnJson(true);
	}
	
	
	/*
	获取账号当天的配置信息
	根据手机号码末位取模 奇数：周一到周六上班08:30~12:00 13:30~18:00   偶数：周一到周五  09:00~12:00 13:00~18:00
	每个员工每日开始的时间在15分钟内随机  结束也是15分钟内随机
	*/
	public function getEpcMjAccountCfg($account)
	{
		//法定节假日
		$holidays = ['20240915','20240916','20240917','20241001'];
		//补班日期
		$workdays = ['20240914', '20240929', '20241012'];
		$today = date('Ymd');
		$cacheFile = mvc::$cfg['PATH_CACHE'].'EpcMjTask_'.$account.'.php';
		if(file_exists($cacheFile)) $cacheArr = include($cacheFile);
		if(is_array($cacheArr) && !empty($cacheArr[$today])){
			return $cacheArr[$today];
		}
		if(!is_array($cacheArr)) $cacheArr = [];
		$cfg['w'] = date('w');
		//周六是否要上班
		$workWeek6 = $account % 2 == 1;
		$cfg = ['work_time'=>[], 'remark'=>''];
		if(in_array($today, $holidays)){
			$cfg['remark'] = '国家节假日';
		}else if(!in_array($today, $workdays) && (date('w') == 0 || (!$workWeek6 && date('w') == 6))){
			$cfg['remark'] = '周六或者周末休息';
		}else{
			$cfg['work_time'] = $workWeek6? [['b'=>'08:30', 'e'=>'12:00'], ['b'=>'13:30', 'e'=>'18:00']]: [['b'=>'09:00', 'e'=>'12:00'], ['b'=>'13:00', 'e'=>'18:00']];
			foreach ($cfg['work_time'] as &$item) {
				$b = date_create($item['b']);
				//开始时间随机增加-15~15分钟
				$b->modify(rand(-15, 15) . ' minutes');
				$item['b'] = $b->format('H:i');
				$e = date_create($item['e']);
				//结束时间随机增加-5~15分钟
				$e->modify(rand(-5, 15) . ' minutes');
				$item['e'] = $e->format('H:i');
			}
			$cfg['task']['vin'] = ['max'=>date('w') === 6? rand(20, 30): rand(25, 35)];
			$cfg['task']['pro'] = ['max'=>(int) ($cfg['task']['vin']['max']*rand(80, 130)/10)];
		}
		$cacheArr[$today] = $cfg;
		LibFc::ArraySave($cacheArr, $cacheFile);
		return $cfg;
	}
	
	/**
	  * @method 获取一车一件的需要爬取的任务
	  * @http  post
	  * @param  account   string [必填] 手机号码
	  * @author soul
	  * @copyright 
	  */
	public function getEpcMjTask()
	{
		$account = LibFc::FormatNum($_REQUEST['account']);
		if(empty($account)) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>600, 'msg'=>'no account']);

		$cfg = $this->getEpcMjAccountCfg($account);
		$isWorkTime = false;
		$nowhi = strtotime(date('H:i'));
		foreach ($cfg['work_time'] as $item) {
			if ($nowhi >= strtotime($item['b']) && $nowhi <= strtotime($item['e'])) {
				$isWorkTime = true;
				break;
			}
		}
		//非采集时间等待120秒
		if(!$isWorkTime) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>120, 'msg'=>'not time']);
		$today = strtotime(date('Y-m-d'));
		$arr = [];
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);


		$res = $YPCAR67->get('catch_epcmj', ['count(*) count'], sprintf(" and ce_account='%s' and ce_catch_time >=%d and ce_type = 'vin'", $account, $today), true);
		if($res['data']['count'] > 70) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>120, 'msg'=>'no task']);

		//计算可以执行的任务
		$taskArr = [];
		//$res = $YPCAR67->get('catch_epcmj', ['ce_type, count(*) count'], sprintf(" and ce_account='%s' and ce_catch_time >=%d and ((ce_type = 'vin' AND ce_catch_status IN (2, -1)) OR ce_type != 'vin') group by ce_type", $account, $today));
		$res = $YPCAR67->get('catch_epcmj', ['ce_type, count(*) count'], sprintf(" and ce_account='%s' and ce_catch_time >= %d and ce_catch_status = 2 group by ce_type", $account, $today));
		$hasArr = array_column($res['data'], 'count', 'ce_type');
		foreach($cfg['task'] as $type=>$tcfg){
			$tcfg['ok'] = $hasArr[$type]? $hasArr[$type]: 0;
			$tcfg['wait'] = $tcfg['max'] - $tcfg['ok'];
			if($tcfg['wait'] > 0){
				$tcfg['wait_rate'] = $tcfg['wait'] / $tcfg['max'];
				$taskArr[$type] = $tcfg;
			}
		}
		if(empty($taskArr) || empty($taskArr['vin']['wait'])) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>120, 'msg'=>'no task']);

		//将采集中超过10分钟的状态重置
		$YPCAR67->set('catch_epcmj', ['ce_catch_status'=>0], sprintf(" and ce_catch_status=1 and ce_etime < %d", time()-600));
		
		$outFields = ['ce_id, ce_vin vin, ce_type type, ce_level1, ce_level2, ce_level3, ce_taskby'];
		//30分钟内最后一次任务决定下一次的任务
		$res = $YPCAR67->get('catch_epcmj', $outFields, sprintf(" and ce_account='%s' and (ce_catch_time >=%d or ce_etime>=%d)  order by ce_catch_time desc limit 1", $account, time()-1800, time()-1800), true);
		$lastTask = $res['data'];
		//是否继续前一个车架号的任务
		if(!empty($lastTask)){
			//var_dump($lastTask);
			//此车架号当日查询量
			$res = $YPCAR67->get('catch_epcmj', ['ce_type, count(*) count'], sprintf(" and ce_vin='%s' and ce_catch_time >=%d and ce_catch_status in (2, -1) group by ce_type", $lastTask['vin'], $today));
			$hasVinArr = array_column($res['data'], 'count', 'ce_type');
			
			//通过车架号末位增加随机数
			$rand = substr($lastTask['vin'], -1) % 3;
			$perMax = (int) ($cfg['task']['pro']['max'] / $cfg['task']['vin']['max'] + rand(-$rand*2, $rand*2));
			
			if($hasVinArr['pro'] >= $perMax){

			}else{
				if(in_array($lastTask['type'], ['level3', 'pro'])){
					//同一个分类不能当日不超过5个
					$res = $YPCAR67->get('catch_epcmj', ['count(*) count'], sprintf(" and ce_vin='%s' and ce_type='pro' and ce_level1=%d and ce_level2=%d and ce_catch_time >=%d limit 1", $lastTask['vin'], $lastTask['ce_level1'], $lastTask['ce_level2'], $today), true);
					if($res['data']['count'] < 6){
						//采集号码
						$res = $YPCAR67->get('catch_epcmj', $outFields, sprintf(" and ce_catch_status=0 and ce_task =2 and ce_vin='%s' and ce_type='pro' and ce_level1=%d and ce_level2=%d order by rand() limit 1", $lastTask['vin'], $lastTask['ce_level1'], $lastTask['ce_level2']), true);
						if(!empty($res['data'])) $arr = $res['data'];
					}
				}

				//避免每个车架号都是从第一个主组开始
				$res = $YPCAR67->get('catch_epcmj', ['count(*) count'], sprintf(" and ce_catch_status=2 and ce_vin='%s' and ce_type='level2' limit 1", $lastTask['vin']), true);
				if($res['data']['count'] > 1){
					if(empty($arr['ce_id']) && $lastTask['ce_level1']){
						//第三级分类
						$res = $YPCAR67->get('catch_epcmj', $outFields, sprintf(" and ce_catch_status=0 and ce_task =2 and ce_vin='%s' and ce_type='level3' and ce_level1=%d order by rand() limit 1", $lastTask['vin'], $lastTask['ce_level1']), true);
						if(!empty($res['data'])) $arr = $res['data'];
					}
				}
				
				if(empty($arr['ce_id'])){
					//第二级分类
					$res = $YPCAR67->get('catch_epcmj', $outFields, sprintf(" and ce_catch_status=0 and ce_task =2 and ce_vin='%s' and ce_type='level2' order by rand() limit 1", $lastTask['vin']), true);
					if(!empty($res['data'])) $arr = $res['data'];
				}
			}
		}
		//优先上次采集超过7天左右的任务
		if(empty($arr['ce_id'])){
			$rand = substr($account, -1) % 3;
			$lastDay = (int) (7 + rand(-$rand, $rand*2));
			//$res = $YPCAR67->get('catch_epcmj', $outFields, sprintf(" and ce_vin IN (SELECT ce_vin FROM catch_epcmj WHERE ce_account='%s' and ce_catch_status =2 and ce_catch_time < %d) and ce_vin NOT IN (SELECT ce_vin FROM catch_epcmj WHERE ce_catch_time >= %d) and ce_catch_status=0 and ce_task =2 and ce_type in ('level3', 'pro') order by rand() limit 1", $account, strtotime('-'.$lastDay.' days'), $today), true);
			$res = $YPCAR67->get('catch_epcmj', $outFields, sprintf(" and ce_vin IN (SELECT ce_vin FROM catch_epcmj WHERE ce_catch_status =2 and ce_catch_time < %d) and ce_vin NOT IN (SELECT ce_vin FROM catch_epcmj WHERE ce_catch_time >= %d) and left(ce_vin, 3) in ('LDP','LGD','LHA','LLX','LME','LMW','LNZ','LS6','LVB','LVP','LVX','LXW','LFP') and ce_catch_status=0 and ce_task =2 and ce_type in ('level3', 'pro') order by rand() limit 1", strtotime('-1 days'), $today), true);
			if(!empty($res['data'])) $arr = $res['data'];
		}
		
		//开启新的车架号任务
		if(empty($arr['ce_id'])){
			$whereArr = [
				sprintf("and ce_account ='%s'", $account), //已分配
				sprintf("and ce_account =''"), //无主
			];
			foreach($whereArr as $tempWhere){
				$table = sprintf("(select %s from catch_epcmj where ce_catch_status = 0 and ce_task =2 and ce_type ='vin' %s limit 1000) as a", implode(',', $outFields), $tempWhere);
				$res = $YPCAR67->get($table, ['*'], $tempWhere.' order by rand() limit 1', true);
				if(!empty($res['data'])){
					$arr = $res['data'];
					break;
				}
			}
		}
		//将任务设置为采集中
		if($arr['ce_id']){
			$YPCAR67->set('catch_epcmj', ['ce_account'=>$account, 'ce_catch_status'=>1, 'ce_etime'=>time()], sprintf(" and ce_id=%d", $arr['ce_id']));
			$arr['ce_taskby'] = empty($arr['ce_taskby'])? []: json_decode($arr['ce_taskby'], true);
		}else{
			LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>120, 'msg'=>'no task']);
		}
		LibFc::ReturnJson(true, $arr);
	}


	/**
	  * @method 保存一车一件的数据
	  * @http  post
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @author soul
	  * @copyright 
	  */
	public function saveEpcMjTask()
	{
		$data = $_POST;
		$account = $data['account'];
		$request = $data['request'];
		$request_url = $data['request_url'];
		$request = !empty($request)? json_decode($request, true): [];
		$requeststr = json_encode($request, JSON_UNESCAPED_UNICODE);
		$vin = LibFc::FormatVin($request['vinCode']);
		if(strlen($vin) != 17) LibFc::ReturnJson(false, '车架号'.$vin.'长度不正确');
		$response = json_decode($data['response'], true);
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$res = $YPCAR67->get('catch_epcmj', ['*'], sprintf(" and ce_vin='%s' and ce_type='vin'", $vin), true);
		$hasInfo = $res['data'];
		$taskType = isset($hasInfo['ce_task'])? $hasInfo['ce_task']: 0;

		if($data['datatype'] == 'vinInfo'){
			$vinInfo = $response['data'];
			if(empty($vinInfo)) $vinInfo = [];
			//检测解码任务是否存在
			if(!empty($hasInfo)){
				if($hasInfo['ce_catch_status'] != 2){
					$set = [
						'ce_account'=>$account,
						'ce_catch_status'=>$vinInfo['brand'] || $vinInfo[0]['brand']? 2: -2,
						'ce_catch_count'=>'#@ce_catch_count+1',
						'ce_request_url'=>$request_url,
						'ce_request'=>$requeststr,
						'ce_data'=>json_encode($vinInfo, JSON_UNESCAPED_UNICODE),
						'ce_catch_time'=>time(),
						'ce_etime'=>time()
					];
					$YPCAR67->set('catch_epcmj', $set, sprintf(" and ce_vin='%s' and ce_type='vin'", $vin));
				}
			}else{
				$add = [
					'ce_vin'=>$vin,
					'ce_account'=>$account,
					'ce_catch_status'=>$vinInfo['brand'] || $vinInfo[0]['brand']? 2: -2,
					'ce_catch_count'=>1,
					'ce_request_url'=>$request_url,
					'ce_request'=>$requeststr,
					'ce_type'=>'vin',
					'ce_data'=>json_encode($vinInfo, JSON_UNESCAPED_UNICODE),
					'ce_task'=>$taskType,
					'ce_catch_time'=>time(),
					'ce_atime'=>time(),
					'ce_etime'=>time()
				];
				$YPCAR67->add('catch_epcmj', $add);
			}
		}
		
		if($data['datatype'] == 'partTree'){
			//主组
			if(isset($request['firstLevelId']) && empty($request['firstLevelId'])){
				//一级分类入库
				$treeArr = $response['data'];
				if(empty($treeArr)) $treeArr = [];
				$res = $YPCAR67->get('catch_epcmj', ['*'], sprintf(" and ce_vin='%s' and ce_type='level1'", $vin), true);
				if(!empty($res['data'])){
					if($res['data']['ce_catch_status'] != 2){
						$set = [
							'ce_account'=>$account,
							'ce_catch_status'=>!empty($treeArr)? 2: -2,
							'ce_catch_count'=>'#@ce_catch_count+1',
							'ce_request_url'=>$request_url,
							'ce_request'=>$requeststr,
							'ce_data'=>json_encode($treeArr, JSON_UNESCAPED_UNICODE),
							'ce_catch_time'=>time(),
							'ce_etime'=>time()
						];
						$YPCAR67->set('catch_epcmj', $set, sprintf(" and ce_vin='%s' and ce_type='level1'", $vin));
					}
				}else{
					$add = [
						'ce_vin'=>$vin,
						'ce_account'=>$account,
						'ce_catch_status'=>!empty($treeArr)? 2: -2,
						'ce_catch_count'=>1,
						'ce_request_url'=>$request_url,
						'ce_request'=>$requeststr,
						'ce_type'=>'level1',
						'ce_data'=>json_encode($treeArr, JSON_UNESCAPED_UNICODE),
						'ce_task'=>$taskType,
						'ce_catch_time'=>time(),
						'ce_atime'=>time(),
						'ce_etime'=>time()
					];
					$YPCAR67->add('catch_epcmj', $add);
				}
				
				//追加第二级任务
				foreach($treeArr as $tv){
					$res = $YPCAR67->get('catch_epcmj', ['ce_id'], sprintf(" and ce_vin='%s' and ce_type='level2' and ce_level1=%d limit 1", $vin, $tv['firstLevelId']), true);
					if(empty($res['data'])){
						$add = [
							'ce_vin'=>$vin,
							'ce_type'=>'level2',
							'ce_level1'=>$tv['firstLevelId'],
							'ce_taskby'=>json_encode($tv, JSON_UNESCAPED_UNICODE),
							'ce_task'=>$taskType,
							'ce_atime'=>time()
						];
						$YPCAR67->add('catch_epcmj', $add);
					}
				}
			}else if(!empty($request['firstLevelId']) && isset($request['secondLevelId']) && empty($request['secondLevelId'])){
				//二级分类入库
				$treeArr = $response['data'];
				if(empty($treeArr)) $treeArr = [];
				$level1_id = $request['firstLevelId'];
				$res = $YPCAR67->get('catch_epcmj', ['*'], sprintf(" and ce_vin='%s' and ce_type='level2' and ce_level1=%d", $vin, $level1_id), true);
				if(!empty($res['data'])){
					if($res['data']['ce_catch_status'] != 2){
						$set = [
							'ce_account'=>$account,
							'ce_catch_status'=>!empty($treeArr)? 2: -2,
							'ce_catch_count'=>'#@ce_catch_count+1',
							'ce_request_url'=>$request_url,
							'ce_request'=>$requeststr,
							'ce_level1'=>$level1_id,
							'ce_data'=>json_encode($treeArr, JSON_UNESCAPED_UNICODE),
							'ce_catch_time'=>time(),
							'ce_etime'=>time()
						];
						$YPCAR67->set('catch_epcmj', $set, sprintf(" and ce_vin='%s' and ce_type='level2' and ce_level1=%d", $vin, $level1_id));
					}
				}else{
					$add = [
						'ce_vin'=>$vin,
						'ce_account'=>$account,
						'ce_catch_status'=>!empty($treeArr)? 2: -2,
						'ce_catch_count'=>1,
						'ce_request_url'=>$request_url,
						'ce_request'=>$requeststr,
						'ce_type'=>'level2',
						'ce_level1'=>$level1_id,
						'ce_data'=>json_encode($treeArr, JSON_UNESCAPED_UNICODE),
						'ce_task'=>$taskType,
						'ce_catch_time'=>time(),
						'ce_atime'=>time(),
						'ce_etime'=>time()
					];
					$YPCAR67->add('catch_epcmj', $add);
				}
				
				//追加第三级任务
				foreach($treeArr as $tv){
					$res = $YPCAR67->get('catch_epcmj', ['ce_id'], sprintf(" and ce_vin='%s' and ce_type='level3' and ce_level1=%d and ce_level2=%d limit 1", $vin, $tv['firstLevelId'], $tv['secondLevelId']), true);
					if(empty($res['data'])){
						$add = [
							'ce_vin'=>$vin,
							'ce_type'=>'level3',
							'ce_level1'=>$tv['firstLevelId'],
							'ce_level2'=>$tv['secondLevelId'],
							'ce_taskby'=>json_encode($tv, JSON_UNESCAPED_UNICODE),
							'ce_task'=>$taskType,
							'ce_atime'=>time()
						];
						$YPCAR67->add('catch_epcmj', $add);
					}
				}
			}else if(!empty($request['firstLevelId']) && !empty($request['secondLevelId'])){
				//三级入库
				$treeArr = $response['data'];
				if(empty($treeArr)) $treeArr = [];
				$level1_id = $request['firstLevelId'];
				$level2_id = $request['secondLevelId'];
				$res = $YPCAR67->get('catch_epcmj', ['*'], sprintf(" and ce_vin='%s' and ce_type='level3' and ce_level1=%d and ce_level2=%d", $vin, $level1_id, $level2_id), true);
				if(!empty($res['data'])){
					if($res['data']['ce_catch_status'] != 2){
						$set = [
							'ce_account'=>$account,
							'ce_catch_status'=>!empty($treeArr)? 2: -2,
							'ce_catch_count'=>'#@ce_catch_count+1',
							'ce_request_url'=>$request_url,
							'ce_request'=>$requeststr,
							'ce_level1'=>$level1_id,
							'ce_level2'=>$level2_id,
							'ce_data'=>json_encode($treeArr, JSON_UNESCAPED_UNICODE),
							'ce_task'=>$taskType,
							'ce_catch_time'=>time(),
							'ce_etime'=>time()
						];
						$YPCAR67->set('catch_epcmj', $set, sprintf(" and ce_vin='%s' and ce_type='level3' and ce_level1=%d and ce_level2=%d", $vin, $level1_id, $level2_id));
					}
				}else{
					$add = [
						'ce_vin'=>$vin,
						'ce_account'=>$account,
						'ce_catch_status'=>!empty($treeArr)? 2: -2,
						'ce_catch_count'=>1,
						'ce_request_url'=>$request_url,
						'ce_request'=>$requeststr,
						'ce_type'=>'level3',
						'ce_level1'=>$level1_id,
						'ce_level2'=>$level2_id,
						'ce_data'=>json_encode($treeArr, JSON_UNESCAPED_UNICODE),
						'ce_task'=>$taskType,
						'ce_catch_time'=>time(),
						'ce_atime'=>time(),
						'ce_etime'=>time()
					];
					$YPCAR67->add('catch_epcmj', $add);
				}
				
				//追加产品任务
				foreach($treeArr as $tv){
					$res = $YPCAR67->get('catch_epcmj', ['ce_id'], sprintf(" and ce_vin='%s' and ce_type='pro' and ce_level3='%s' limit 1", $vin, LibFc::Escape($tv['image'])), true);
					if(empty($res['data'])){
						$add = [
							'ce_vin'=>$vin,
							'ce_type'=>'pro',
							'ce_catch_status'=>stripos($tv['imageName'], '其它无图配件') !== false? -4: 0,
							'ce_level1'=>$tv['firstLevelId'],
							'ce_level2'=>$tv['secondLevelId'],
							'ce_level3'=>$tv['image'],
							'ce_taskby'=>json_encode($tv, JSON_UNESCAPED_UNICODE),
							'ce_task'=>$taskType,
							'ce_atime'=>time()
						];
						$YPCAR67->add('catch_epcmj', $add);
					}
				}
			}
		}else if($data['datatype'] == 'pro'){
			//产品入库
			if($request['vinCode'] == $vin && isset($request['image'])){
				$numArr = $response['data'];
				if(empty($numArr)) $numArr = [];
				$imgname = $request['image'];
				$res = $YPCAR67->get('catch_epcmj', ['*'], sprintf(" and ce_vin='%s' and ce_type='pro' and ce_level3='%s'", $vin, LibFc::Escape($imgname)), true);
				if(!empty($res['data'])){
					if($res['data']['ce_catch_status'] != 2){
						$set = [
							'ce_account'=>$account,
							'ce_catch_status'=>!empty($numArr)? 2: -2,
							'ce_catch_count'=>'#@ce_catch_count+1',
							'ce_request_url'=>$request_url,
							'ce_request'=>$requeststr,
							'ce_data'=>json_encode($numArr, JSON_UNESCAPED_UNICODE),
							'ce_catch_time'=>time(),
							'ce_etime'=>time()
						];
						$YPCAR67->set('catch_epcmj', $set, sprintf(" and ce_vin='%s' and ce_type='pro' and ce_level3='%s'", $vin, LibFc::Escape($imgname)));
					}
				}else{
					$add = [
						'ce_vin'=>$vin,
						'ce_account'=>$account,
						'ce_catch_status'=>!empty($numArr)? 2: -2,
						'ce_catch_count'=>1,
						'ce_request_url'=>$request_url,
						'ce_request'=>$requeststr,
						'ce_type'=>'pro',
						'ce_level3'=>$imgname,
						'ce_data'=>json_encode($numArr, JSON_UNESCAPED_UNICODE),
						'ce_task'=>$taskType,
						'ce_catch_time'=>time(),
						'ce_atime'=>time(),
						'ce_etime'=>time()
					];
					$YPCAR67->add('catch_epcmj', $add);
				}
			}
		}
		LibFc::ReturnJson(true);
	}


	/**
	  * @method 查询长安插件随车清单
	  * @author soul
	  * @copyright 
	  */
	public function getChanganVinTask()
	{
		//echo '{"status":true,"data":{"vin":"LS4ASB3R3LA727198"},"code":0}';exit;
		$YpwBase = new YpwBase();
		$table = sprintf("(select sce_vin as vin from stand_catch_list where sce_reg_code = 'changan' and sce_catch_count = 0 order by sce_level DESC limit 100) as a");
		$res = $YpwBase->get($table, ['*'], " order by rand() limit 1", true);
		LibFc::EchoJson($res);
	}


	/**
	  * @method 保存长安插件随车清单
	  * @author soul
	  * @copyright 
	  */
	public function saveChanganVin()
	{
		if(!empty($_POST['vin']) && !empty($_POST['html']))
		{
			$vin = LibFc::FormatVin($_POST['vin']);
			$YpwBase = new YpwBase();
			$res = $YpwBase->get('stand_catch_list', ['sce_id'], sprintf(" and sce_reg_code ='changan' and sce_vin = '%s'", $vin), true);
			if(empty($res['data'])) LibFc::ReturnJson(false, $_POST['vin'].'车架号不存在');

			$setArr = ['sce_catch_count'=>'#@sce_catch_count+1', 'sce_etime'=>time(), 'sce_error'=>LibFc::msubstr($_POST['html'], 0, 128)];
			if(!empty($_POST['vindata']) && is_array($_POST['vindata']))
			{
				//是否有图
				if(!empty($_POST['vindata']['imgdata']))
				{
					$imgDir = mvc::$cfg['HuanbaoScqdPath'].'changan/'.substr($vin, 0, 8).'/'.substr($vin, -3).'/';
					LibDir::CreateDir($imgDir);
					$imgFile = $imgDir.$vin.'.jpg';
					file_put_contents($imgFile, base64_decode(substr(strstr($_POST['vindata']['imgdata'], ','), 1)));
					unset($_POST['vindata']['imgdata']);
				}
				$setArr['sce_data'] = json_encode($_POST['vindata'], JSON_UNESCAPED_UNICODE);
			}
			$YpwBase->set('stand_catch_list', $setArr, sprintf(" and sce_vin = '%s' and sce_reg_code = 'changan'", $vin));
		}
		LibFc::ReturnJson(true);
	}


	/**
	  * @method 查询插件随车清单
	  * @author soul
	  * @copyright 
	  */
	public function getScqdVinTask()
	{
		$site = LibFc::Escape($_POST['site']);
		//echo '{"status":true,"data":{"vin":"LE43X5BB4LL050708"},"code":0}';exit;
		$YpwBase = new YpwBase();
		$table = sprintf("(SELECT sce_vin AS vin FROM stand_catch_list WHERE sce_reg_code='benzbj' AND sce_status = 0 AND sce_catch_count =0 
AND sce_level = (SELECT sce_level FROM stand_catch_list WHERE sce_reg_code='benzbj' AND sce_status = 0 GROUP BY sce_level ORDER BY sce_level DESC LIMIT 1)
 LIMIT 100) as a", $site);
		$res = $YpwBase->get($table, ['*'], " order by rand() limit 1", true);
		LibFc::EchoJson($res);
	}

	/**
	  * @method 保存插件随车清单
	  * @http  post
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @author soul
	  * @copyright 
	  */
	public function saveScqdVinTask()
	{
		$data = $_POST;
		$site = $data['site'];
		$request = $data['request'];
		$request_url = $data['request_url'];
		$request = !empty($request)? json_decode($request, true): [];
		$requeststr = json_encode($request, JSON_UNESCAPED_UNICODE);
		$response = is_array($data['response'])? $data['response']: json_decode($data['response'], true);
		$YpwBase = new YpwBase();
		if($site == 'benzbj'){
			$vin = LibFc::FormatVin($request['vinVal']);
			if(strlen($vin) != 17) LibFc::ReturnJson(false, '车架号'.$vin.'长度不正确');
			if(!$response['validCaptcha'])  LibFc::ReturnJson(false, '验证码校验错误');
			if(isset($response['fileUrl'])){
				$fileurl = $response['fileUrl'];
				if($fileurl){
					$set = ['sce_status'=>2, 'sce_error'=>'', 'sce_url'=>$fileurl];
				}else{
					$set = ['sce_status'=>-2, 'sce_error'=>'#end#'.json_encode($response, JSON_UNESCAPED_UNICODE)];
				}
				$set['sce_etime'] = time();
				$res = $YpwBase->get('stand_catch_list', ['sce_id'], sprintf(" and sce_reg_code='%s' and sce_vin='%s'", $site, $vin), true);
				if($res['data']){
					$YpwBase->set('stand_catch_list', $set, sprintf(" and sce_reg_code='%s' and sce_vin='%s'", $site, $vin));
				}else{
					$add = array_merge(['sce_reg_code'=>$site,'sce_vin'=>$vin,'sce_level'=>9999], $set);
					$YpwBase->add('stand_catch_list', $add);
				}
				//实时入库
				$url = 'http://192.168.1.116:8080/API/hub/index.php/vin/catchHuanbaoScqdVin?site='.$site.'&vin='.$vin;
				$http = new LibHttp(false,false);
				$http->timeout = 1;
				$http->fetch($url);
				LibFc::ReturnJson(true, $set);
			}else{
				LibFc::ReturnJson(false, '站点结果返回异常');
			}
		}
		LibFc::ReturnJson(true);
	}






	/**
	  * @method 保存007的vin数据
	  * @http  post
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  vin        int [必填] VIN
	  * @param  html       string [必填] 页面内容信息
	  * @author soul
	  * @copyright 
	  */
	public function saveVin007()
	{
		$vin = LibFc::FormatVin($_POST['vin']);
		if(strlen($vin) != 17 || empty($_POST['html'])) 
			LibFc::ReturnJson(false, '获取VIN信息失败！');
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$YPCAR67->set('catch_vin007', ['cat_html'=>$_POST['html'], 'cat_etime'=>time()], sprintf(" and cat_vin='%s'", $vin));
		LibFc::ReturnJson(true);
	}

	/**
	  * @method 获取007的需要爬取的任务
	  * @http  post
	  * @author soul
	  * @copyright 
	  */
	public function getVin007Task()
	{
		//任务时间  08~20 非采集时间等待60秒
		//if(date('H') < 8 || date('H') >= 18) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>60]);

		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$res = $YPCAR67->get('catch_vin007', ['max(cat_etime) as last_atime'], '', true);
		//距离上次采集时间不到10s
		if(!empty($res['data']['last_atime']) && time()-$res['data']['last_atime'] < 10) LibFc::ReturnJson(true, ['type'=>'wait', 'waittime'=>10]);

		$where = ' and cat_etime = 0 and cat_html is null';
		$res = $YPCAR67->get('catch_vin007', ['cat_vin AS vin'], $where.' ORDER BY RAND() LIMIT 1', true);
		$arr = $res['data'];
		$arr['type'] = 'vin';
		LibFc::ReturnJson(true, $arr);
	
	}


	//采集附近的商家【跑街令】
	function catchPjlAroundShop()
	{
		$LibHttp = new LibHttp();
		$PjlBase = new PjlBase();
		/*$host = 'http://qxc.bsqipei.com/';
		for($page = 1; $page < 1000; $page++)
		{
			$url = $host.'list-0-0-'.$page.'.html';
			$html = $LibHttp->fetch($url);
			if(preg_match_all('/<li><a href="(\/repair\/[0-9a-zA-Z]+\.html)">([^<]+)<\/a>\(([^\)]*)\)<\/li>/i', $html, $match))
			{
				$res = $PjlBase->get('pl_around_shop', ['ars_name'], sprintf(" and ars_name in ('%s')", implode("','", $match[2])));
				$hasArr = array_column($res['data'], 'ars_name');
				$addArr = [];
				foreach($match[2] as $k=>$v)
				{
					if(in_array($v, $hasArr)) continue;
					$addArr[] = [
						'ars_style'=>'汽修厂',
						'ars_url'=>$host.ltrim($match[1][$k], '/'),
						'ars_name'=>$match[2][$k],
						'ars_tel'=>$match[3][$k]
					];
					$hasArr[] = $v;
				}
				if(!empty($addArr))
				{
					$PjlBase->addAny('pl_around_shop', array_keys($addArr[0]), $addArr);
				}
				echo $url, 'ok<br>';
			}
			else
			{
				echo $url, '匹配失败<br>';
			}
		}

		$host = 'http://qpc.bsqipei.com/';
		for($page = 1; $page < 2500; $page++)
		{
			$url = $host.'list-0-0-'.$page.'.html';
			$html = $LibHttp->fetch($url);
			
			if(preg_match_all('/<li><a href="(\/shangpu\/[0-9a-zA-Z]+\.html)">([^<]+)<\/a>\(([^\)]*)\)<\/li>/i', $html, $match))
			{
				$res = $PjlBase->get('pl_around_shop', ['ars_name'], sprintf(" and ars_name in ('%s')", implode("','", $match[2])));
				$hasArr = array_column($res['data'], 'ars_name');
				
				$addArr = [];
				foreach($match[2] as $k=>$v)
				{
					if(in_array($v, $hasArr)) continue;
					$addArr[] = [
						'ars_style'=>'汽配商',
						'ars_url'=>$host.ltrim($match[1][$k], '/'),
						'ars_name'=>$match[2][$k],
						'ars_tel'=>$match[3][$k]
					];
					$hasArr[] = $v;
					
				}
				if(!empty($addArr))
				{
					$PjlBase->addAny('pl_around_shop', array_keys($addArr[0]), $addArr);
				}
				echo $url, 'ok<br>';
			}
			else
			{
				echo $url, '匹配失败<br>';
			}
		}*/

		//匹配详细信息
		while(1)
		{
			$res = $PjlBase->get('pl_around_shop', ['*'], " and ars_addr = '' order by rand() limit 50");
			if(empty($res['data'])) break;
			$cArr = $res['data'];
			foreach($cArr as $v)
			{
				$html = $LibHttp->fetch($v['ars_url']);
				if(preg_match_all('/<tr>[\s]*<td class="table_one">([^<]*)<\/td>[\s]*<td class="table_two">([^<]*)<\/td>[\s]*<\/tr>/', $html, $match))
				{
					$temp = [];
					foreach($match[1] as $kk=>$vv)
					{
						$temp[$vv] = $match[2][$kk];
					}
					if($temp['名称'] == $v['ars_name'])
					{
						$setArr = [
							'ars_contacts'=>empty($temp['联系人']) || trim($temp['联系人']) == '空' ? '': $temp['联系人'],
							'ars_tel'=>empty($temp['电话']) || trim($temp['电话']) == '空' ? '': $temp['电话'],
							'ars_addr'=>empty($temp['地址']) || trim($temp['地址']) == '空' ? '': $temp['地址']
						];
						if(!empty($temp['主营']) && trim($temp['地址']) != '空') $setArr['ars_scope'] = $temp['主营'];
						if(!preg_match('/^1\d{10}$/', $setArr['ars_tel'], $match))
						{
							if(preg_match('/^\d{2,5}-(1\d{10})$/', $setArr['ars_tel'], $match))
							{
								$setArr['ars_tel'] = $match[1];
							}
							else if(stripos($v['ars_tel'], '-') !== false && stripos($setArr['ars_tel'], '-') === false)
							{
								$setArr['ars_tel'] = $v['ars_tel'];
							}
							else if($setArr['ars_tel'] != $v['ars_tel'] && strlen($v['ars_tel']) > strlen($setArr['ars_tel']))
							{
								$setArr['ars_tel'] = str_replace($setArr['ars_tel'], '-'.ltrim($setArr['ars_tel'], '-'), $v['ars_tel']);
							}
						}
						$PjlBase->set('pl_around_shop', $setArr, ' and ars_id='.$v['ars_id']);
					}
					else
					{
						echo $v['ars_url'], '匹配失败<br>';
					}
				}
				else
				{
					echo $v['ars_url'], '匹配失败<br>';
				}
			}
		}
	}


	/*
	*?table=yp_province_city
	*?table=yp_province_gps
	*?table=pl_shop_addr
	*?table=pl_repair
	*?table=pl_around_shop
	*/
	function initPctsLng()
	{
		$Params = mvc::$URL_PARAMS;
		$YpwBase = new YpwBase();
		$PjlBase = new PjlBase();
		$OthPct = new OthPct();
		$per = $Params['count']? $Params['count']: 100;
		if($Params['table'] == 'yp_province_city')
		{//UPDATE yp_province_city SET pc_name_des = '' WHERE pc_lng = 0
			$res = $YpwBase->get('yp_province_city', ['*']);
			$allPcArr = array_column($res['data'], null, 'pc_id');
			
			$tres = $YpwBase->get('yp_province_city', ['*'], " and t !=1 and pc_lng = 0 order by rand() limit ".$per);
			foreach($tres['data'] as $v)
			{
				//if(!empty($v['pc_name_des'])) continue;
				$addr = [];
				foreach(explode(',', $v['pc_path'].','.$v['pc_id']) as $t)
				{
					if(!empty($allPcArr[$t])) $addr[] = $allPcArr[$t]['pc_name'];
				}
				$set = ['pc_name_des'=>implode(',', $addr)];
				if($v['pc_lng'] == 0)
				{
					$addrs = [implode('', $addr), implode(',', $addr)];
					foreach($addrs as $td)
					{
						$res = $OthPct->getLngLat($td);
						$pct = $res['data'];
						if($pct['lng'] && $pct['lat'])
						{
							$set['pc_lng'] = $pct['lng'];
							$set['pc_lat'] = $pct['lat'];
							break;
						}
					}
				}
				$YpwBase->set('yp_province_city', $set, ' and pc_id='.$v['pc_id']);
				usleep(rand(500, 2500)*1000);
			}
		}

		if($Params['table'] == 'yp_province_gps')
		{
			$tres = $YpwBase->get('yp_province_gps', ['pg_area', 'pg_addr'], ' and t !=1 order by rand() limit '.$per);
			foreach($tres['data'] as $tv)
			{
				$res = $OthPct->getLngLat($tv['pg_addr']);
				$set = [
					'pg_lng'=>$res['data']['lng'],
					'pg_lat'=>$res['data']['lat'],
					'pg_match'=>1,
					't'=>1
				];
				$YpwBase->set('yp_province_gps', $set,sprintf(" and pg_area='%s'", $tv['pg_area']));
				usleep(rand(500, 2500)*1000);
			}
		}

		if($Params['table'] == 'pl_shop_addr')
		{
			$res = $PjlBase->get('pl_shop_addr', ['*'], " and sha_pct_ids !='' and t !=1 order by rand() limit ".$per);
			$cArr = $res['data'];
			foreach($cArr as $v)
			{
				$res = $OthPct->formatAddrInfo($v['sha_addr'], $v['sha_pct_ids']);
				$pct = $res['data'];
				if(count($pct['pctids']) >= 2 && $pct['lng'])
				{
					$set = [
						'sha_lng'=>$pct['lng'],
						'sha_lat'=>$pct['lat'],
						't'=>1
					];
					$PjlBase->set('pl_shop_addr', $set, ' and sha_id='.$v['sha_id']);
				}
				usleep(rand(500, 2500)*1000);
			}
		}

		if($Params['table'] == 'pl_repair')
		{
			$res = $PjlBase->get('pl_repair', ['*'], " and shopr_pct_ids !='' and t !=1 order by rand() limit ".$per);
			$cArr = $res['data'];
			foreach($cArr as $v)
			{
				$res = $OthPct->formatAddrInfo($v['shopr_addr'], $v['shopr_pct_ids']);
				$pct = $res['data'];
				if(count($pct['pctids']) >= 2 && $pct['lng'])
				{
					$set = [
						'shopr_lng'=>$pct['lng'],
						'shopr_lat'=>$pct['lat'],
						't'=>1
					];
					$PjlBase->set('pl_repair', $set, ' and shopr_id='.$v['shopr_id']);
				}
				usleep(rand(500, 2500)*1000);
			}
		}

		if($Params['table'] == 'pl_around_shop')
		{
			$res = $PjlBase->get('pl_around_shop', ['*'], " and ars_pct_ids !='' and ars_uid > 0 and t !=1 order by rand() limit ".$per);
			$cArr = $res['data'];
			foreach($cArr as $v)
			{
				$res = $OthPct->formatAddrInfo($v['ars_addr'], $v['ars_pct_ids']);
				$pct = $res['data'];
				if(count($pct['pctids']) >= 2 && $pct['lng'])
				{
					$set = [
						'ars_lng'=>$pct['lng'],
						'ars_lat'=>$pct['lat'],
						't'=>1
					];
					$PjlBase->set('pl_around_shop', $set, ' and ars_id='.$v['ars_id']);
				}
				usleep(rand(500, 2500)*1000);
			}
		}
		echo 'ok';
	}

	public function bd09ToWgs84()
	{
		$Params = mvc::$URL_PARAMS;
		$per = $Params['count']? $Params['count']: 1000;
		$YpwBase = new YpwBase();
		$OthGpsConvert = new OthGpsConvert();
		$PjlBase = new PjlBase();
		$OthPct = new OthPct();
		if($Params['table'] == 'yp_province_gps')
		{
			$tres = $YpwBase->get('yp_province_gps', ['*'], ' and t=0 and pg_lng > 0 order by rand() limit '.$per);
			foreach($tres['data'] as $v)
			{
				$pct = $OthGpsConvert->bd09ToWgs84($v['pg_lng'], $v['pg_lat']);
				if($pct['longitude'])
				{
					$set = [
						'pg_lng'=>$pct['longitude'],
						'pg_lat'=>$pct['latitude'],
						't'=>-1
					];
					$YpwBase->set('yp_province_gps', $set,sprintf(" and t = 0 and pg_area='%s'", $v['pg_area']));
				}
			}
		}

		if($Params['table'] == 'pl_repair')
		{
			$res = $PjlBase->get('pl_repair', ['*'], " and shopr_pct_ids !='' and t = 0 and shopr_lng > 0 order by rand() limit ".$per);
			$cArr = $res['data'];
			foreach($cArr as $v)
			{
				$pct = $OthGpsConvert->bd09ToWgs84($v['shopr_lng'], $v['shopr_lat']);
				if($pct['longitude'])
				{
					$set = [
						'shopr_lng'=>$pct['longitude'],
						'shopr_lat'=>$pct['latitude'],
						't'=>-1
					];
					$PjlBase->set('pl_repair', $set, ' and t = 0 and shopr_id='.$v['shopr_id']);
				}
			}
		}

		if($Params['table'] == 'pl_around_shop')
		{
			$res = $PjlBase->get('pl_around_shop', ['*'], " and ars_lng > 0 and t = 0 order by rand() limit ".$per);
			$cArr = $res['data'];
			foreach($cArr as $v)
			{
				$pct = $OthGpsConvert->bd09ToWgs84($v['ars_lng'], $v['ars_lat']);
				if($pct['longitude'])
				{
					$set = [
						'ars_lng'=>$pct['longitude'],
						'ars_lat'=>$pct['latitude'],
						't'=>-1
					];
					$PjlBase->set('pl_around_shop', $set, ' and t = 0 and ars_id='.$v['ars_id']);
				}
			}
		}
		
	}
}