<?php
use AlibabaCloud\SDK\Wafopenapi\V20211001\Wafopenapi;
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Tea\Utils\Utils;
use AlibabaCloud\SDK\Wafopenapi\V20211001\Models\DescribeRuleHitsTopClientIpRequest;
use AlibabaCloud\SDK\Wafopenapi\V20211001\Models\CreateMajorProtectionBlackIp;
use AlibabaCloud\Credentials\Credential\Config;



class autoAction extends baseAction
{
	//每日1点凌晨任务
	public function dailyTask()
	{
		//跑街CRM系统工作计划与提醒规则
		if(LibFc::hasFunLock(mvc::$URL_METHOD, 3600)){
			$CrmMain = new CrmMain();
			$CrmMain->initSysPlan();
			LibFc::delFunLock(mvc::$URL_METHOD);
		}

		if(LibFc::hasFunLock(mvc::$URL_METHOD, 3600)){
			$CrmMain = new CrmMain();
			$res = $CrmMain->get('fad_contract', ['fct_ctr_id ctr_id'], " group by fct_ctr_id order by fct_ctr_id");
			foreach($res['data'] as $v){
				$CrmMain->initCtrStatus($v['ctr_id']);
			}
			LibFc::delFunLock(mvc::$URL_METHOD);
		}
		
		//分配无填邀请码超期未入住用户
		if(LibFc::hasFunLock(mvc::$URL_METHOD, 3600)){
			$CrmMain = new CrmMain();
			$CrmMain->fenpeiShopNoInvcode();
			LibFc::delFunLock(mvc::$URL_METHOD);
		}

		//根据唯一规则填补轴距
		$sqlArr = [
			"INSERT INTO `log_sma`(los_vin, los_remark, los_time)
SELECT sma_vin, 'uni_wheel', UNIX_TIMESTAMP() FROM `stand_model_any` 
JOIN stand_kczj_reg ON sma_vin1_8 = skr_vin8 AND sma_gxb_code = skr_gxbcode AND skr_field = 'wheel'
WHERE sma_wheel = 0 AND skr_field = 'wheel' AND skr_val NOT LIKE '%,%'",
			"UPDATE stand_model_any, stand_kczj_reg SET sma_wheel = SUBSTRING_INDEX(skr_val, '+', 1) WHERE sma_vin1_8 = skr_vin8 AND sma_gxb_code = skr_gxbcode AND skr_field = 'wheel' AND sma_wheel != SUBSTRING_INDEX(skr_val, '+', 1) AND skr_field = 'wheel' AND skr_val NOT LIKE '%,%'"
		];
		$YpwVin = new YpwVin();
		$YpwVin->exeAnySql($sqlArr, true);
		
		//重置商城产品关键字
		$B2cKeyword = new B2cKeyword();
		$B2cKeyword->resetProductKeyword([], 'all');
		$B2cKeyword->del("wx_robot_vinlast", sprintf(" and wrv_etime < %d", time()-3600));
		$B2cKeyword->del("wx_robot_msg", sprintf(" and wrm_atime < %d", time()-3600));
		$this->cleanNotUsedFile();
		$this->checkNewGg();

		//检测无产品的号码状态
		$this->autoCheckNumItem();
		echo 'ok';
	}

	/*跑街令资讯 的阅读数3  art_read3 art_read3_w
		微信初始新闻 50-500随机阅读量
		3天时间随机刷1500-2000阅读量
		第1天最多，然后次之
		第一天 2/3, 第二天 1/6 第三天 1/6
	*/
	function zxArtRead()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 60)) return true;
		$PjlArticle = new PjlArticle();
		$perTime = 10;
		for($i = 1; $i <= 60/$perTime; $i++)
		{
			$PjlArticle->zxArtRead();
			sleep($perTime);
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::ReturnJson(true);
	}
	

	//跑街令资讯 点赞数
	function zxArticlePraise()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 120)) return true;
		$PjlArticle = new PjlArticle();
		$PjlArticle->zxArticlePraise();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::ReturnJson(true);
	}


	//跑街令基本统计
	function pjlBaseTj()
	{
		//$this->fenpeiNewUser();
		set_time_limit(0);
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$PjlBase = new PjlBase();
		$ApiTjBase = new PjltjBase();

		//分享订单结算
		$PjlUser =  new PjlUser();
		$PjlUser->checkShareOrder();
		
		//配件商附近的地址补漏
		$PjlShop = new PjlShop();
		$sres = $PjlBase->get('pl_shop LEFT JOIN pl_shop_addr ON shop_id = sha_shop_id', ['shop_id'], ' and shop_status = 2 AND  sha_shop_id IS NULL ');
		foreach($sres['data'] as $v)
		{
			$PjlShop->updateShopAddr($v['shop_id']);
		}

		//维修厂附近的地址补漏
		$sres = $PjlBase->get('pl_repair LEFT JOIN pl_around_shop ON shopr_id = ars_shopr_id', ['shopr_id'], ' and shopr_status = 2 AND  ars_shopr_id IS NULL');
		foreach($sres['data'] as $v)
		{
			$PjlShop->updateShopAddr($v['shopr_id']);
		}

		$LibYpApi = new LibYpApi();
		$res = $PjlBase->get('pl_shop', ['shop_id'], " and shop_logo not like '%small%' and (shop_logo != '' or shop_img != '') order by shop_id");
		foreach($res['data'] as $v)
		{
			$LibYpApi->Get('pjl/initShopLogo', $v);
		}

		$LibYpApi = new LibYpApi();
		$res = $PjlBase->get('pl_repair', ['shopr_id'], " and shopr_logo not like '%small%' and (shopr_logo != '' or shopr_img != '') order by shopr_id");
		foreach($res['data'] as $v)
		{
			$LibYpApi->Get('pjl/initShopLogo', $v);
		}

		//自动将过期的商铺停用
		$PjlBase->set('pl_shop', ['shop_status'=>-1], sprintf(" and shop_status = 2 and shop_vip_etime < %d", time()));

		$bdate = '20180901';
		//补充待完善的数据
		/*$sres = $PjlBase->get('tj_any_date', ['taa_date'], ' and taa_status=0 order by taa_date desc limit 1, 100');
		$status0 = [];
		foreach($sres['data'] as $v)
		{
			$where =  sprintf(" and shop_apply_time >= %d and shop_apply_time <%d", strtotime($v['taa_date']), strtotime($v['taa_date'])+3600*24);
			$res = $PjlBase->get('pl_shop', ["shop_checkby, FROM_UNIXTIME(shop_apply_time, '%Y%m%d') as add_date"], $where);
			$setArr = [];
			foreach($res['data'] as $vv)
			{
				$setArr['taa_shop_add']++;
				$check = json_decode($vv['shop_checkby'], true);
				if(is_array($check))
				{
					if(!empty($check['name']))
					{
						if(!empty($check['result']))
							$setArr['taa_shop_add_ok']++;
					}
					else
					{
						$setArr['taa_status'] = -1;
					}
				}
				else
				{
					$setArr['taa_status'] = -1;
				}
			}
			
			$setArr['taa_status'] = $setArr['taa_status'] == -1 ? 0: 1;
			if(!empty($setArr))
				$PjlBase->set('tj_any_date', $setArr, sprintf(" and taa_date=%d", $v['taa_date']));
		}*/
		

		$res = $PjlBase->get('tj_any_date', ['max(taa_date) as taa_date'], ' and taa_status=1 limit 1', true);
		if(!empty($res['data']['taa_date'])) $bdate = $res['data']['taa_date'];
		
		//上一次的统计记录，累计数用到
		$res = $PjlBase->get('tj_any_date', ['*'], sprintf(" and taa_date=%d", date('Ymd', strtotime($bdate)-3600*24)), true);
		$lastDateData = $res['data'];
	
		$edate = date('Ymd');
		$allTjArr = [];

		while(1)
		{
			$t = empty($t) ? $bdate: date('Ymd', strtotime($t)+3600*24);
			if($t > $edate) break;
			$allTjArr[$t] = ['taa_status'=>0, 'taa_date'=>$t];
		}

		//配件商
		$shopTj = [];
		$res = $PjlBase->get('pl_shop', ["shop_status, shop_checkby, FROM_UNIXTIME(shop_apply_time, '%Y%m%d') as add_date"], ' order by shop_apply_time');
		foreach($res['data'] as $v)
		{
			if($v['shop_status'] == 2)
				$shopTj[$v['add_date']]['run']++;
			$shopTj[$v['add_date']]['add']++;
			$check = json_decode($v['shop_checkby'], true);
			if(is_array($check))
			{
				if(!empty($check['name']))
				{
					if(!empty($check['result']))
						$shopTj[$v['add_date']]['ok']++;
				}
				else
				{
					$shopTj[$v['add_date']]['status'] = -1;
				}
			}
			else
			{
				$shopTj[$v['add_date']]['status'] = -1;
			}
		}

		foreach($allTjArr as $d=>$v)
		{
			foreach($shopTj as $sd=>$vv)
			{
				if($sd > $d) break;
				$v['taa_shop'] += $vv['run'];
			}
			$v['taa_shop_add'] = empty($shopTj[$d]['add'])? 0: $shopTj[$d]['add'];
			$v['taa_shop_add_ok'] = empty($shopTj[$d]['ok'])? 0: $shopTj[$d]['ok'];
			//$v['taa_status'] = !empty($shopTj[$d]['status'] && $shopTj[$d]['status'] == -1)? 0: 1;
			$v['taa_status'] = 1;
			$allTjArr[$d] = $v;
		}

		//询价单
		$where = sprintf(" and pur_atime >=%d and pur_atime <=%d group by FROM_UNIXTIME(pur_atime, '%%Y-%%m-%%d')", strtotime($bdate), strtotime($edate)+3600*24);
		$res = $PjlBase->get('pl_purchase', ["FROM_UNIXTIME(pur_atime, '%Y%m%d') as add_date, count(*) as add_count"], $where);
		foreach($res['data'] as $v)
		{
			$allTjArr[$v['add_date']]['taa_purchase_add'] = $v['add_count'];
		}
	
		//报价
		$where = sprintf(" and po_atime >=%d and po_atime <=%d group by FROM_UNIXTIME(po_atime, '%%Y-%%m-%%d')", strtotime($bdate), strtotime($edate)+3600*24);
		$res = $PjlBase->get('pl_purchase_offer', ["FROM_UNIXTIME(po_atime, '%Y%m%d') as add_date, count(*) as add_count"], $where);
		foreach($res['data'] as $v)
		{
			$allTjArr[$v['add_date']]['taa_offer_add'] = $v['add_count'];
		}

		//人脉
		$where = sprintf(" and pu_pro_style != '' and pu_atime >=%d and pu_atime <=%d group by FROM_UNIXTIME(pu_atime, '%%Y-%%m-%%d')", strtotime($bdate), strtotime($edate)+3600*24);
		$res = $PjlBase->get('pl_user', ["FROM_UNIXTIME(pu_atime, '%Y%m%d') as add_date, count(*) as add_count"], $where);
		foreach($res['data'] as $v)
		{
			$allTjArr[$v['add_date']]['taa_renmai_add'] = $v['add_count'];
		}

		$where = sprintf(" and puca_atime >=%d and puca_atime <=%d group by FROM_UNIXTIME(puca_atime, '%%Y-%%m-%%d')", strtotime($bdate), strtotime($edate)+3600*24);
		$res = $PjlBase->get('pl_purchase_call', ["FROM_UNIXTIME(puca_atime, '%Y%m%d') as add_date, count(*) as add_count"], $where);
		foreach($res['data'] as $v)
		{
			$allTjArr[$v['add_date']]['taa_purchase_call_add'] = $v['add_count'];
		}

		foreach($allTjArr as $d=>$v)
		{
			$ld = date('Ymd', strtotime($d)-3600*24);
			if($d == $bdate)
			{
				$v['taa_purchase'] = (int) ($v['taa_purchase_add'] + $lastDateData['taa_purchase']);
				$v['taa_offer'] = (int) ($v['taa_offer_add'] + $lastDateData['taa_offer']);
				$v['taa_renmai'] = (int) ($v['taa_renmai_add'] + $lastDateData['taa_renmai']);
				$v['taa_purchase_call'] = (int) ($v['taa_purchase_call_add'] + $lastDateData['taa_purchase_call']);
			}
			else
			{
				$v['taa_purchase'] = (int) ($allTjArr[$ld]['taa_purchase'] + $v['taa_purchase_add']);
				$v['taa_offer'] = (int) ($allTjArr[$ld]['taa_offer'] + $v['taa_offer_add']);
				$v['taa_renmai'] = (int) ($allTjArr[$ld]['taa_renmai'] + $v['taa_renmai_add']);
				$v['taa_purchase_call'] = (int) ($allTjArr[$ld]['taa_purchase_call'] + $v['taa_purchase_call_add']);
			}
			$allTjArr[$d] = $v;
		}
		
		$res = $PjlBase->get('tj_any_date', ['taa_date'], sprintf(" and taa_date>=%d and taa_date<=%d", $bdate, $edate));
		$hasDate = array_column($res['data'], 'taa_date');
		foreach($allTjArr as $d=>$v)
		{
			$v['taa_status'] = $d == date('Ymd')? 0: $v['taa_status'];
			if(in_array($d, $hasDate))
			{
				$PjlBase->set('tj_any_date', $v, sprintf(" and taa_date=%d", $d));
			}
			else
			{
				$PjlBase->add('tj_any_date', $v);
			}
		}
		
		//招商加盟统计
		$PjlTj = new PjlTj();
		$PjlTj->zsTongji();

		//黑名单
		$PjltjMain = new PjltjMain();
		$PjltjMain->onlyDecodeVinBlack(date('Ymd'));

		LibFc::delFunLock(mvc::$URL_METHOD);

		//机器人状态检测
		$B2cBase = new B2cBase();
		$LibHttp = new LibHttp();
		$tres = $B2cBase->get('wx_robot_token', ['wrt_id', 'wrt_eywid', 'wrt_token_type'], sprintf(" and wrt_token_type in ('geapi', 'eyapi') and wrt_eywid != ''"));
		foreach($tres['data'] as $v){
			if($v['wrt_token_type'] == 'eyapi'){
				$LibHttp->fetch('http://hub.paojd.cn:75/wechatEy/chkRobot?wrt_id='.$v['wrt_id']);
			}else if($v['wrt_token_type'] == 'geapi'){
				$LibHttp->fetch('http://hub.paojd.cn:75/wechatGe/chkRobot?wrt_id='.$v['wrt_id']);
			}
		}
		LibFc::ReturnJson(true);
	}

	/**
	 * @method 更新目录基本统计
	 * @author soul
	 * @copyright 2019/9/26
	 */
	function initSuperBaseTj()
	{
		if(!LibFc::hasFunLock('initSuperBaseTj', 3600)) return true;
		set_time_limit(0);

		$OthB2cDb = new BaseDb(mvc::$cfg['DB']['B2COTH']);

		//按照店铺逐个计算
		//$B2cBase = new B2cBase();
		//在有效期内的目录
		//$res = $B2cBase->get('sh_super', ['distinct ssu_shop_id as shop_id'], sprintf(" and ssu_shop_id > 0 and ssu_etime >=%d", time()-3600*24*7));
		$res = $OthB2cDb->get('tj_super', ['distinct su_shop_id as shop_id'], sprintf(" and su_shop_id > 0 and su_time >=%d", time()-3600*24*30));
		$shopIdArr = array_column($res['data'], 'shop_id');
		foreach($shopIdArr as $shopId)
		{
			$bdate = '20190925';
			//这个店铺已有的最大统计日期数据
			$res = $OthB2cDb->get('tj_super_date', ['*'], sprintf(" and sub_shop_id=%d order by sub_date desc limit 1", $shopId), true);
			$lastDateData = $res['data'];
			if(!empty($lastDateData)) $bdate = $lastDateData['sub_date'];
			$bTime = strtotime($bdate);

			$edate = date('Ymd');
			$allTjArr = [];
			$t = null;
			while(1)
			{
				$t = empty($t) ? $bdate: date('Ymd', strtotime($t)+3600*24);
				if($t > $edate) break;
				$allTjArr[$t] = ['sub_shop_id'=>$shopId, 'sub_date'=>$t];
			}

			//获取统计数据
			$filed = ["FROM_UNIXTIME(su_time,'%Y%m%d') as su_date,  su_from,  count(distinct su_ip) as sub_ip, count(distinct su_ip,su_devcode) as sub_client, count(*) as su_pv"];
			$res = $OthB2cDb->get('tj_super', $filed, sprintf(" and su_shop_id=%d and su_time>=%d group by su_shop_id, su_from, FROM_UNIXTIME(su_time,'%%Y%%m%%d')", $shopId, $bTime));
			foreach($res['data'] as $tv)
			{
				$allTjArr[$tv['su_date']]['sub_ip'] += $tv['sub_ip'];
				$allTjArr[$tv['su_date']]['sub_client'] += $tv['sub_client'];
				
				//细分
				$tag = stripos($tv['su_from'], 'PJDSUPER') === 0 ? 'self': 'tg';
				$allTjArr[$tv['su_date']]['sub_ip_'.$tag] += $tv['sub_ip'];
				$allTjArr[$tv['su_date']]['sub_client_'.$tag] += $tv['sub_client'];
				$allTjArr[$tv['su_date']]['sub_pv_'.$tag] += $tv['su_pv'];
			}

			$filed = ["FROM_UNIXTIME(su_time,'%Y%m%d') AS su_date,  su_from, su_type, count(distinct su_word) AS su_count"];
			$res = $OthB2cDb->get('tj_super', $filed, sprintf(" and su_shop_id=%d and su_time>=%d group by su_from, FROM_UNIXTIME(su_time,'%%Y%%m%%d'), su_type", $shopId, $bTime));
			foreach($res['data'] as $tv)
			{
				$allTjArr[$tv['su_date']]['sub_'.$tv['su_type']] += $tv['su_count'];
				//细分
				$tag = stripos($tv['su_from'], 'PJDSUPER') === 0 ? 'self': 'tg';
				$allTjArr[$tv['su_date']]['sub_'.$tv['su_type'].'_'.$tag] += $tv['su_count'];
			}

			$res = $OthB2cDb->get('tj_super_date', ['sub_date', 'sub_pvrate_self', 'sub_pvrate_tg'], sprintf(" and sub_shop_id=%d and sub_date>=%d and sub_date<=%d", $shopId, $bdate, $edate));
			$hasDate = array_column($res['data'], null, 'sub_date');
			foreach($allTjArr as $d=>$v)
			{
				//PV按照比率计算
				$v['sub_pvrate_self'] = !empty($hasDate[$d]['sub_pvrate_self'])? $hasDate[$d]['sub_pvrate_self']: round(rand(320, 350)/100, 2);
				$v['sub_pv_self'] = $v['sub_pv_self']*$v['sub_pvrate_self'];

				$v['sub_pvrate_tg'] = !empty($hasDate[$d]['sub_pvrate_tg'])? $hasDate[$d]['sub_pvrate_tg']: round(rand(320, 350)/100, 2);
				$v['sub_pv_tg'] = $v['sub_pv_tg']*$v['sub_pvrate_tg'];
				$v['sub_pv'] = $v['sub_pv_self'] + $v['sub_pv_tg'];

				if(!empty($hasDate[$d]))
				{
					$OthB2cDb->set('tj_super_date', $v, sprintf(" and sub_shop_id=%d and sub_date=%d", $shopId, $d));
				}
				else
				{
					$OthB2cDb->add('tj_super_date', $v);
				}
			}
		}
		$OthB2cDb->del('tj_super', sprintf(" and su_time <=%d", $bTime-3600*24*15));

		$bdate = '20240101';
		$res = $OthB2cDb->get('tj_shop_vin', ['max(suv_date) as last_date'], '', true);
		if(!empty($res['data']['last_date'])) $bdate = $res['data']['last_date'];
		$sqlArr = [
			sprintf("DELETE FROM tj_shop_vin WHERE suv_date >=%d", $bdate),
			sprintf("INSERT INTO tj_shop_vin (suv_date,suv_shop_id, suv_from, suv_count)
			SELECT ash_date, ash_uid, ash_from, COUNT(DISTINCT ash_unikey) AS COUNT FROM `api_main`.`api_search_history` where ash_date >=%d GROUP BY ash_date, ash_uid, ash_from", $bdate)
		];
		$OthB2cDb->exeAnySql($sqlArr);

		LibFc::delFunLock('initSuperBaseTj');
		LibFc::ReturnJson(true);
	}


	//生成跑街令商铺的访问日报表 10分钟
    function initPjlShopDateReport()
    {
		if(!LibFc::hasFunLock('initPjlShopDateReport', 600)) return true;
		set_time_limit(0);
        $PjltjBase = new PjltjBase();
		$bdate = '20200201';
		//已有的最大统计日期数据
		$res = $PjltjBase->get('tj_pjl_shop_date', ['max(tpsd_date) as last_date'], '', true);
		if(!empty($res['data']['last_date'])) $bdate = $res['data']['last_date'];
		$bTime = strtotime($bdate);
		$sqlArr = [
			sprintf("DELETE FROM tj_pjl_shop_date WHERE tpsd_date >=%d", date('Ymd', $bTime)),
			sprintf("INSERT INTO tj_pjl_shop_date (tpsd_date, tpsd_shop_id, tpsd_ip_count, tpsd_devcode_count, tpsd_pv_count, tpsd_uid_count)
		SELECT FROM_UNIXTIME(tps_atime,'%%Y%%m%%d') AS tpsd_date, tps_shop_id, COUNT(DISTINCT tps_ip), COUNT(DISTINCT tps_ip,tps_devcode), COUNT(*), COUNT(DISTINCT tps_uid)
		FROM tj_pjl_shop WHERE tps_atime >= %d GROUP BY tps_shop_id, tpsd_date", $bTime),
			sprintf("DELETE FROM tj_pjl_shop WHERE tps_atime <= %d", $bTime-3600*24*15)
		];
		$PjltjBase->exeAnySql($sqlArr);
        LibFc::delFunLock('initPjlShopDateReport');
		LibFc::ReturnJson(true);
    }


	//格式化VIN扫码图像的识别内容
	function initOcrCollVinImg()
	{
		if(!LibFc::hasFunLock('initOcrCollVinImg', 1800)) return true;
		set_time_limit(0);
		$now = time();
		$YpwBase= new YpwBase();
		$res = $YpwBase->get('stand_model_any', ['max(sma_id) sma_id'], '', true);
		$maxSmaId = $res['data'];
		for($i = 0; $i < 48; $i++)
		{
			$ckey = 'sma_vinimg_synetime';
			$res = $YpwBase->getKeyVal($ckey);
			$lastTime = $res['data'];
			if(empty($lastTime) || $lastTime < strtotime('-60 day')) $lastTime = strtotime('-60 day');
			$endTime = $lastTime + 1800;
			if($endTime > $now) $endTime = $now;
			$per = 1000;
			for($j = 0; $j < 10000; $j++)
			{
				$where = sprintf(" and vii_status in (0,-2,-3,-5) AND sma_etime >=%d AND sma_etime <=%d limit %d", $lastTime-600, $endTime, $per);
				$res = $YpwBase->get('stand_vin_imgs JOIN stand_model_any ON vii_vin = sma_vin', ['vii_id'], $where);
				if(!empty($res['data']))
				{
					$YpwBase->set('stand_vin_imgs', ['vii_status'=>1, 'vii_check_time'=>$endTime, 'vii_check_uid'=>8], sprintf(" and vii_status in (0,-2,-3,-5) and vii_id in (%s)", implode(',', array_column($res['data'], 'vii_id'))));
				}
				if(count($res['data']) < $per) break;
			}
			$YpwBase->setKeyVal($ckey, $endTime);
			if($endTime == $now) break;
		}

		for($i = 0; $i < 1000; $i++)
		{
			$table = "(select vii_id, vii_imghost, vii_img from stand_vin_imgs where vii_status in (-1, -4) limit 200) a";
			$ires = $YpwBase->get($table, ['*'], " order by rand() limit 20");
			if(empty($ires['data'])) break;

			$viiids = array_column($ires['data'], 'vii_id');
			$YpwBase->del('stand_vin_imgs',sprintf(' and vii_id in (%s)', implode(',', $viiids)));
			$YpwBase->del('stand_vin_imgs_retask',sprintf(' and vir_vii_id in (%s)', implode(',', $viiids)));
			$delFileArr = [];
			foreach($ires['data'] as $v)
			{
				$delFileArr[$v['vii_imghost']][] = $v['vii_img'];
			}
			if(!empty($delFileArr[1]))
			{
				//删除图片
				$OthFileCenter = new OthFileCenter();
				$delArr = [
					'cate'=>'vinimg',
					'files'=>$delFileArr[1]
				];
				$OthFileCenter->del($delArr, 'yp');
			}

			if(!empty($delFileArr[2]))
			{
				//删除本地的
				$delArr = [
					'token'=>mvc::$cfg['FILE_CENTER']['yp']['token'],
					'files'=>$delFileArr[2]
				];
				$LibHttp = new LibHttp();
				$LibHttp->timeout = 1;
				$LibHttp->fetch(mvc::$cfg['urls']['VINADMIN67'].'VinTj/delVinOcrImg', $delArr);
			}
		}

		//600w VIN入搜索总表
		for($i = 0; $i < 48; $i++)
		{
			$ckey = 'sma_vinsearch_synid';
			$res = $YpwBase->getKeyVal($ckey);
			$lastId = (int) $res['data'];
			$nextId = $lastId + 100000;
			if($nextId > $maxSmaId) $nextId = $maxSmaId;
			$sql = sprintf("INSERT INTO yp_vin_search(vs_vin,vs_click, vs_last_time, vs_vin9, vs_checkcode, vs_ip, vs_vin1_3, vs_vin10) SELECT sma_vin vs_vin,0 vs_click, UNIX_TIMESTAMP(NOW()) vs_last_time, RIGHT(LEFT(sma_vin, 9), 1) vs_vin9, RIGHT(LEFT(sma_vin, 9), 1) vs_checkcode, '127.0.0.1' vs_ip, sma_vin1_3 vs_vin1_3, sma_vin10 vs_vin10 FROM stand_model_any left join yp_vin_search on sma_vin = vs_vin WHERE sma_id >=%d and sma_id <=%d and vs_vin is null", $lastId, $nextId);
			$YpwBase->exeAnySql([$sql]);
			$YpwBase->setKeyVal($ckey, $nextId);
			if($nextId >= $maxSmaId) break;
		}
		LibFc::delFunLock('initOcrCollVinImg');
		echo 'ok';
	}
	
	//下载对账单
	function downloadfundflow()
	{
		if(!LibFc::hasFunLock('downloadfundflow', 3600)) return true;
		set_time_limit(0);
		$MainOrder = new MainOrder();
		$MainOrder->downloadfundflow();
		LibFc::delFunLock('downloadfundflow');
	}


	/**
	  * @method 处理消息
	  * @http	get
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  act                string [必填] 类型 TJ_API_PJL || TJ_WEB_YP
	  * @author soul
	  * @copyright 2017/10/31
	  * @return  末级车型ID
	  {"status":true,"data": ["send"=>10],"code":""}
	  {"status":false,"data":'失败原因',"code":''}
	  */
	public function rabbitReceive()
	{
		$MainRabbit = new MainRabbit($_GET['act']);
		$MainRabbit->receive();
		LibFc::ReturnJson(true);
	}


	/**
	  * @method 通过统计数据计算限制对象
	  * @author soul
	  * @copyright 2020/1/16
	  * @return 
	  */
	public function buildTjApiBlack() 
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 120)) return true;
		$PjltjMain = new PjltjMain();
		$res = $PjltjMain->buildTjApiBlack();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}

	
	/**
	  * @method 自动生成已完成的在线交易的财务凭证
	  * @author soul
	  * @copyright 2020/4/16
	  * @return 
	  */
	public function onlineOrderPingzheng()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 600)) return true;
		$MainCaiwu = new MainCaiwu();
		$res = $MainCaiwu->onlineOrderPingzheng();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}


	/**
	  * @method 主监控系统日统计生成  每小时一更新
	  * @author soul
	  * @copyright 2020/4/30
	  * @return 
	  */
	public function mainTongjiDate()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$PjltjMain = new PjltjMain();
		$res = $PjltjMain->mainTongjiDate();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}

	/**
	  * @method 用户数据日统计生成  每天一更新
	  * @author soul
	  * @copyright 2020/4/30
	  * @return 
	  */
	public function userTongjiDate()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$PjltjMain = new PjltjMain();
		$PjltjMain->userTongjiDate();
		
		$PjltjReport = new PjltjReport();
		$PjltjReport->initModOrgTj();
		//行业报表
		$PjltjReport->initReportIndustry();
		//目录报表
		$PjltjReport->initReportShop();
		
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::ReturnJson(true,'ok');
	}

	/**
	  * @method 广告日报表统计
	  * @author soul
	  * @copyright 2020/4/30
	  * @return 
	  */
	public function adsMainTongji()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$AdsTj = new AdsTj();
		$res = $AdsTj->mainTongji();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}


	/**
	  * @method 更新 品牌和vin1-8 10-11的对应关系的样例表  7天一次
	  * @author soul
	  * @copyright 2020/5/3
	  * @return 
	  */
	public function updateVinBrandDemo()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600*24*7)) return true;
		$YpwBase = new YpwBase();
		$sqlArr = [
		"INSERT INTO ypc_vin_brand_demo(vbd_vin1_8, vbd_vin10_12, vbd_vin, vbd_brand) 
			SELECT sma_vin1_8, sma_vin10_12, sma_vin, REPLACE(sma_brand, '牌', '') FROM `stand_model_any` 
				WHERE CONCAT(sma_vin1_8, sma_vin10_12) NOT IN(
					SELECT CONCAT(vbd_vin1_8, vbd_vin10_12) FROM ypc_vin_brand_demo GROUP BY vbd_vin1_8, vbd_vin10_12
				) GROUP BY sma_vin1_8, sma_vin10_12",
		"INSERT INTO ypc_vin_brand_demo(vbd_vin1_8, vbd_vin10_12, vbd_vin) 
			SELECT  LEFT(vs_vin, 8), RIGHT(LEFT(vs_vin, 12), 3), vs_vin FROM `yp_vin_search`
				WHERE vs_checkcode = vs_vin9 AND CONCAT( LEFT(vs_vin, 8), RIGHT(LEFT(vs_vin, 12), 3)) NOT IN( 
					SELECT CONCAT(vbd_vin1_8, vbd_vin10_12) FROM ypc_vin_brand_demo GROUP BY vbd_vin1_8, vbd_vin10_12
				) AND LEFT(vs_vin, 8) IN (SELECT smt_vin1_8 FROM stand_model_tj) GROUP BY LEFT(vs_vin, 8), RIGHT(LEFT(vs_vin, 12), 3)"
		];
		$YpwBase->exeAnySql($sqlArr);
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::ReturnJson(true);
	}



	/**
	  * @method 品牌和vin1-8 10-11的对应关系
	  * @author soul
	  * @copyright 2020/5/3
	  * @return 
	  */
	public function decodeVinBrandDemo()
	{
		$minLast = time() - 3600*24*10;
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 600)) return true;
		$YpwBase = new YpwBase();
		$YpcVin = new YpcVin();
		$vres = $YpwBase->get('ypc_vin_brand_demo', ['vbd_vin'], sprintf(" and vbd_last_time < %d order by rand() limit 5000", $minLast));
		foreach($vres['data'] as $v)
		{
			$check = LibFc::VinCheckCode($v['vbd_vin']);
			if(!$check['ok']) 
			{
				$YpwBase->del('ypc_vin_brand_demo', sprintf(" and vbd_vin = '%s'", $v['vbd_vin']));
				continue;
			}

			$set = [
				'vbd_last_time'=>time()
			];
			$res = $YpcVin->decodeVin($v['vbd_vin']);
			$vinres = $res['data'];

			if(!empty($vinres['model']) && $vinres['from'] == 'ypc')
			{
				if(count($vinres['model']) < 20)
				{
					$set['vbd_mod1_ids'] = implode(',', array_unique(array_column($vinres['model'], 'mod1_id')));
					$set['vbd_mod2_ids'] = implode(',', array_unique(array_column($vinres['model'], 'mod2_id')));
					$set['vbd_mod3_ids'] = implode(',', array_unique(array_column($vinres['model'], 'mod3_id')));
				}
				$mod = array_shift($vinres['model']);
				$set['vbd_brand_id'] = $mod['brand_id'];
				$set['vbd_brand'] = $mod['brand_name'];
			}
			if(empty($set['vbd_brand']) && !empty($vinres['ads_make']))
				$set['vbd_brand'] = str_replace('牌', '', $vinres['ads_make']);
			$YpwBase->set('ypc_vin_brand_demo', $set, sprintf(" and vbd_vin = '%s'", $v['vbd_vin']));
		}

		//通过名称更新品牌ID
		$vres = $YpwBase->get('ypc_vin_brand_demo', ['DISTINCT vbd_brand'], " and vbd_brand_id = 0 AND vbd_brand != ''");
		foreach($vres['data'] as $v)
		{
			$res = $YpcVin->get('yp_brand', ['b_id', 'b_name'], sprintf(" and b_name = '%s' or b_keyword like '%%%s%%' limit 1", LibFc::Escape($v['vbd_brand']), LibFc::Escape($v['vbd_brand'])), true);
			if(!empty($res['data']))
			{
				$s = $res['data'];
				$YpwBase->set('ypc_vin_brand_demo', ['vbd_brand_id'=>$s['b_id'], 'vbd_brand'=>$s['b_name']], sprintf(" and vbd_brand = '%s'", LibFc::Escape($v['vbd_brand'])));
			}
		}
		
		$res = $YpcVin->get('yp_brand', ['b_id', 'b_name'], '');
		foreach($res['data'] as $v)
		{
			$YpwBase->set('ypc_vin_brand_demo', ['vbd_brand'=>$v['b_name']], sprintf(" and vbd_brand_id = %d", $v['b_id']));
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::ReturnJson(true);
	}


	/**
	  * @method 更新用户省市ID
	  * @author soul
	  * @copyright 2020/4/30
	  * @return 
	  */
	public function updateUserPct()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$per = 1000;
		$lastId = 0;
		$PjlBase = new PjlBase();
		$YpwBase = new YpwBase();
		$B2cBase = new B2cBase();
		$PjltjBase = new PjltjBase();
		$OthPct = new OthPct();
		for($i = 0; $i < 10000; $i++)
		{
			$res = $YpwBase->get('yp_user join yp_user_ext on u_id=ui_uid', ['u_id'], sprintf(" and ui_province = 0 and u_id > %d and u_login_count > 0 order by u_id limit %d", $lastId, $per));
			if(empty($res['data'])) break;
			$userIdArr = array_column($res['data'], null, 'u_id');
			
			$temp = $userIdArr;
			$temp  = array_pop($temp);
			$lastId = $temp['u_id'];

			//跑街令商家
			if(!empty($userIdArr))
			{
				$res = $PjlBase->get('pl_shop', ['shop_pu_id as u_id', 'shop_pct_ids as pct_ids'], sprintf(" and shop_pct_ids != '' and shop_pu_id in (%s)", implode(',', array_keys($userIdArr))));
				foreach($res['data'] as $uv)
				{
					$pctIdArr = explode(',', $uv['pct_ids']);
					$YpwBase->set('yp_user_ext', ['ui_province'=>(int) $pctIdArr[0], 'ui_city'=>(int) $pctIdArr[1]], ' and ui_province = 0 and ui_uid='.$uv['u_id']);
					$YpwBase->set('yp_user', ['u_pct_ids'=>$uv['pct_ids']], ' and u_pct_ids="" and u_id='.$uv['u_id']);
					unset($userIdArr[$uv['u_id']]);
				}
			}

			//跑街令用户
			if(!empty($userIdArr))
			{
				$res = $PjlBase->get('pl_user', ['pu_uid as u_id', 'pu_pct_ids  as pct_ids'], sprintf(" and pu_pct_ids != '' and pu_uid in (%s)", implode(',', array_keys($userIdArr))));
				foreach($res['data'] as $uv)
				{
					$pctIdArr = explode(',', $uv['pct_ids']);
					$YpwBase->set('yp_user_ext', ['ui_province'=>(int) $pctIdArr[0], 'ui_city'=>(int) $pctIdArr[1]], ' and ui_province = 0 and ui_uid='.$uv['u_id']);
					$YpwBase->set('yp_user', ['u_pct_ids'=>$uv['pct_ids']], ' and u_pct_ids="" and u_id='.$uv['u_id']);
					unset($userIdArr[$uv['u_id']]);
				}
			}

			//跑街用户
			if(!empty($userIdArr))
			{
				$res = $B2cBase->get('sh_shop', ['shop_uid as u_id', 'shop_pct_ids  as pct_ids'], sprintf(" and shop_pct_ids != '' and shop_uid in (%s)", implode(',', array_keys($userIdArr))));
				foreach($res['data'] as $uv)
				{
					$pctIdArr = explode(',', $uv['pct_ids']);
					$YpwBase->set('yp_user_ext', ['ui_province'=>(int) $pctIdArr[0], 'ui_city'=>(int) $pctIdArr[1]], ' and ui_province = 0 and ui_uid='.$uv['u_id']);
					$YpwBase->set('yp_user', ['u_pct_ids'=>$uv['pct_ids']], ' and u_pct_ids="" and u_id='.$uv['u_id']);
					unset($userIdArr[$uv['u_id']]);
				}
			}
		
			//IP
			$tableArr = ['at_tongji', 'at_tongji_all'];
			foreach($tableArr as $table)
			{
				if(!empty($userIdArr))
				{
					$res = $PjltjBase->get($table, ['tj_uid as u_id', 'tj_ip'], sprintf(" and tj_ip != '' and tj_uid in (%s) group by tj_uid", implode(',', array_keys($userIdArr))));
					foreach($res['data'] as $uv)
					{
						$ires = $OthPct->getIpPCT($uv['tj_ip']);
						if(!empty($ires['data']['pctids']))
						{
							$pctIdArr = $ires['data']['pctids'];
							$YpwBase->set('yp_user_ext', ['ui_province'=>(int) $pctIdArr[0], 'ui_city'=>(int) $pctIdArr[1]], ' and ui_province = 0 and ui_uid='.$uv['u_id']);
							$YpwBase->set('yp_user', ['u_pct_ids'=>implode(',', $pctIdArr)], ' and u_pct_ids="" and u_id='.$uv['u_id']);
							unset($userIdArr[$uv['u_id']]);
						}
					}
				}
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::ReturnJson(true);
	}


	/**
	  * @method 本地车型库数据同步到线上（仅车型部分）
	  * @author soul
	  * @copyright 2020/6/12
	  * @return 
	  */
	public function updateYpcModelByLocal()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpcModel = new YpcModel();
		$res = $YpcModel->updateYpcModelByLocal();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}

	/**
	  * @method 重新初始化数据到商城车型库
	  * @author soul
	  * @copyright 2020/6/12
	  * @return 
	  */
	public function initB2cCar()
	{
		//if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpcModel = new YpcModel();
		$res = $YpcModel->initB2cCar();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}


	//初始化维修厂图片
	public function initRepairImgs()
	{
		$Params = mvc::$URL_PARAMS;
		$PjlShop = new PjlShop();
		$LibHttp = new LibHttp();
		$OthFileCenter = new OthFileCenter();
		$sres = $PjlShop->get('pl_repair join pl_shop on shop_id = shopr_id', ['shopr_id', 'shop_img'], " and shopr_img = '' and shop_img != '' order by shopr_id");
		foreach($sres['data'] as $v)
		{
			$baseUrl = 'http://file.yiparts.com/fpjl/shop/';
			$imgArr = [];
			foreach(explode(',', $v['shop_img']) as $img)
			{
				$sArr = ['/240/'=>'/'];
				$url = strtr($baseUrl.$img, $sArr);
				$html = $LibHttp->fetch($url);
				$dataArr = [
					'file'=>[
						'name'=>'t.jpg',
						'data'=>$html
					],
					'cate'=>'rate18'
				];
				$res = $OthFileCenter->upload($dataArr, 'pjl');
				$imgArr[] = $res['data']['sfile'];
			}
			$PjlShop->set('pl_repair', ['shopr_img'=>implode(',', $imgArr)], sprintf(" and shopr_id=%d", $v['shopr_id']));
		}

		$sres = $PjlShop->get('pl_repair join pl_shop on shop_id = shopr_id', ['shopr_id', 'shop_license'], " and shopr_license = '{}' and shop_license != '' order by shopr_id");
		foreach($sres['data'] as $v)
		{
			$baseUrl = 'http://file.yiparts.com/fpjl/shop/';
			$imgArr = [];
			$v['shop_license'] = json_decode($v['shop_license'], true);
			foreach($v['shop_license'] as $k=>$img)
			{
				if(stripos($img, 'jpg') === false) continue;
				$sArr = ['/240/'=>'/'];
				$url = strtr($baseUrl.$img, $sArr);
				$html = $LibHttp->fetch($url);
				$dataArr = [
					'file'=>[
						'name'=>'t.jpg',
						'data'=>$html
					],
					'cate'=>'license'
				];
				$res = $OthFileCenter->upload($dataArr, 'pjl');
				$imgArr[$k] = $res['data']['sfile'];
			}
			$PjlShop->set('pl_repair', ['shopr_license'=>json_encode($imgArr)], sprintf(" and shopr_id=%d", $v['shopr_id']));
		}
		LibFc::ReturnJson(true, true);
	}


	//初始化600w表的统计
	public function resetStandVinTj()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwVin = new YpwVin();
		$YpwVin->resetStandVinTj();
		$YpwVin->resetGxbBase();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//初始化本地需要的临时统计
	public function resetLocVinTj()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwVin = new YpwVin();
		$res = $YpwVin->resetLocVinTj();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//初始化本地需要的型号基本信息
	public function resetGxbBase()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwVin = new YpwVin();
		$res = $YpwVin->resetGxbBase();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
		$this->formatXuhang();
		$this->initEngineKw();
	}

	//从总表格式化续航
	function formatXuhang()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwVin = new YpwVin();
		$where = " and smt_gxb_code LIKE '%EV%' group by smt_gxb_code";
		$res = $YpwVin->get('stand_model_tj', ['smt_gxb_code'], $where);
		$gxbArr = array_column($res['data'], 'smt_gxb_code');
		foreach($gxbArr as $gxb)
		{
			$xhres = $YpwVin->get('stand_model_any', ["sma_engine engine,group_concat(distinct sma_xuhang SEPARATOR '@') xuhang"], sprintf(" and sma_gxb_code='%s' and sma_xuhang != '' group by sma_engine", $gxb));
			foreach($xhres['data'] as $tv)
			{
				$res = $YpwVin->formatXuhang(explode('@', $tv['xuhang']));
				if(!empty($res['data']['xuhang']))
				{
					$setArr = [
						'ckw_xuhang'=>$res['data']['xuhang'],
						'ckw_uid'=>8,
						'ckw_etime'=>time()
					];
					$chk = $YpwVin->get('stand_gxbengine_kw', ['ckw_id', 'ckw_uid'], sprintf(" and ckw_gxb_format='%s' and ckw_engine = '%s'", $gxb, $tv['engine']), true);
					if(!empty($chk['data'])){
						$has = $chk['data'];
						if($has['ckw_uid'] == 8) $YpwVin->set('stand_gxbengine_kw', $setArr, sprintf(" and ckw_id=%d", $has['ckw_id']));
					}else{
						$setArr['ckw_gxb_format'] = $gxb;
						$setArr['ckw_engine'] = $tv['engine'];
						$setArr['ckw_from'] = 'catch';
						$YpwVin->add('stand_gxbengine_kw', $setArr);
					}
				}
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	
	//跑街用户统计
	function zjl()
	{
		$PjltjBase = new PjltjBase();
		
		$res = $PjltjBase->get("tj_baidu_activeuser", ['LEFT(ba_date, 6) AS ym, AVG(daily_activity_degree) AS dd, AVG(monthly_activity_degree) AS md'], ' GROUP BY ym');
		$adArr = array_column($res['data'], null, 'ym');

		$res = $PjltjBase->get("tj_pjl_date", ["LEFT(pd_date, 6) AS ym, SUM(pd_new) AS 'pd_new', SUM(pd_active) AS 'pd_active', CEIL(AVG(pd_active)*2) AS 'pd_active_day', SUM(pd_start) AS 'pd_start'"], ' GROUP BY ym');
		$tj1Arr = array_column($res['data'], null, 'ym');

		$res = $PjltjBase->get("(SELECT LEFT(pd_date, 6) AS ym, MAX(pd_total) AS 'pd_total' FROM `tj_pjl_date` GROUP BY LEFT(pd_date, 6), pd_sys) AS a", ['ym, SUM(pd_total) as pd_total'], ' GROUP BY ym');
		$tj2Arr = array_column($res['data'], null, 'ym');
		
		$fArr = ['pd_new','pd_active_day', 'pd_active_month', 'pd_active', 'pd_start', 'pd_total'];
		echo '<table>';
		echo '<tr><td></td>';
		foreach($tj1Arr as $ym=>$v)
		{
			echo '<td>'.$ym.'</td>';
		}
		echo '</tr>';
		foreach($fArr as $f)
		{	
			echo '<tr>';
			echo '<td>'.$f.'</td>';
			foreach($tj1Arr as $ym=>$v)
			{
				if(!empty($tj1Arr[$ym][$f]))
				{
					echo '<td>'.$tj1Arr[$ym][$f].'</td>';
				}
				else if($f == 'pd_active_month')
				{
					echo '<td>'.ceil($tj2Arr[$ym]['pd_total']*$adArr[$ym]['md']/100).'</td>';
				}
				else
				{
					echo '<td>'.$tj2Arr[$ym][$f].'</td>';
				}
			}
			echo '</tr>';
		}
		echo '<table>';
	}


	//每天计算partslink的采集任务
	public function initCatchVinTask()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$YpwBase = new YpwBase();
		
		$res = $YPCAR67->get('yp_vin_year', ['*']);
		$yearVin10 = array_column($res['data'], 'vin_10', 'vin_year');
		$vin10Year = array_column($res['data'], 'vin_year', 'vin_10');

		$regArr = [];
		$makeIdArr = [];
		$brandIdArr = [];
		$res = $YPCAR67->get('catch_vin_reg', ['*'], ' and cve_status != -1');
		foreach($res['data'] as $v)
		{
			$v['cve_reg'] = json_decode($v['cve_reg'], true);
			$v['vin10s'] = [];
			foreach($v['cve_reg']['yearcof'] as $year=>$count)
			{
				$v['vin10s'][] = $yearVin10[$year];
			}
			$v['m_ids'] = empty($v['cve_make_ids']) ? []: explode(',', $v['cve_make_ids']);
			$makeIdArr = array_merge($makeIdArr, $v['m_ids']);
			$v['b_ids'] = empty($v['cve_brand_ids']) ? []: explode(',', $v['cve_brand_ids']);
			$brandIdArr = array_merge($brandIdArr, $v['b_ids']);
			$regArr[$v['cve_code']] = $v;
		}
		
		/*$makeVin8Arr = [];
		$makeVin3Arr = [];
		$table = 'yp_model3
		JOIN yp_model2 ON m3_m2_id = m2_id
		JOIN yp_model1 ON m2_m1_id = m1_id
		JOIN yp_vin_model3_link ON vm3_m3_id = m3_id
		JOIN yp_vin ON vin_id = vm3_vin_id';
		$res = $YPCAR67->get($table, ['m1_m_id, m1_b_id, vin_full'], sprintf(" and m1_m_id in (%s) and m1_b_id in (%s) GROUP BY m1_m_id, m1_b_id, vin_full", implode(',', $makeIdArr), implode(',', $brandIdArr)));
		foreach($res['data'] as $v)
		{
			$makeVin8Arr[$v['m1_m_id'].'@'.$v['m1_b_id']][] = $v['vin_full'];
			$wmi = substr($v['vin_full'], 3);
			$makeVin3Arr[$v['m1_m_id'].'@'.$v['m1_b_id']][$wmi] =$wmi;
		}
		foreach($regArr as $rck=>$rcv)
		{
			$rcv['vin8s'] = [];
			foreach($rcv['m_ids'] as $mid)
			{
				foreach($rcv['b_ids'] as $bid)
				{
					if(!empty($makeVin8Arr[$mid.'@'.$bid]))
						$rcv['vin8s'] = array_merge($rcv['vin8s'], $makeVin8Arr[$mid.'@'.$bid]);
				}
			}
			$regArr[$rck] = $rcv;
		}*/

		foreach($regArr as $rck=>$rcv)
		{
			if(empty($rcv['cve_reg']['wmi']) || empty($rcv['vin10s'])) continue;
			$where = sprintf(" and sma_vin1_3 in ('%s') and sma_gxb_code != '' and sma_vin10 in ('%s')", implode("','", $rcv['cve_reg']['wmi']), implode("','", $rcv['vin10s']));
			//三菱特殊处理VIN11=B && VIN1_5 != LL62H
			if($rck == 'mitsubishi') $where .= " and SUBSTR(sma_vin10_12,2,1) = 'B' and sma_vin1_8 not like 'LL62H%'";

			//上汽大众
			if($rck == 'svwvw') $where .= " and ((sma_vin1_3 = 'LSV' AND sma_brand like '大众汽车%') OR sma_vin1_3 != 'LSV')";
			//斯柯达 上汽|进口
			if($rck == 'svwsk') $where .= " and ((sma_vin1_3 = 'LSV' AND sma_brand like '斯柯达%') OR sma_vin1_3 != 'LSV')";

			//奥迪 一汽|进口
			if($rck == 'audi') $where .= " and ((sma_vin1_3 = 'LFV' AND sma_brand like '奥迪%') OR sma_vin1_3 != 'LFV')";
			//一汽大众|捷达
			if($rck == 'fawvw') $where .= " and ((sma_vin1_3 = 'LFV' AND sma_brand not like '奥迪%') OR sma_vin1_3 != 'LFV')";

			$smaRes = $YpwBase->get('stand_model_any', ['sma_vin1_8, sma_vin10 as vin10, sma_gxb_code, count(*) as count'], $where.' group by sma_vin1_8, sma_vin10, sma_gxb_code');
			foreach($smaRes['data'] as $iv)
			{
				$iv['vin_year'] = $vin10Year[$iv['vin10']];
				//此规则总共需要采集的数量
				$needCount = $rcv['cve_reg']['yearcof'][$iv['vin_year']];

				//进口减半
				if(substr($iv['sma_vin1_8'], 0, 1) != 'L') $needCount = ceil($needCount/2);

				$twhere = sprintf(" and cvt_cve_code='%s' and cvt_vin1_8='%s' and cvt_vin10='%s' and cvt_gxb_code='%s' and cvt_status >= 0", $rck, $iv['sma_vin1_8'], $iv['vin10'], $iv['sma_gxb_code']);
				$res = $YPCAR67->get('catch_vin_task', ['count(*) as count'], $twhere, true);
				$hasCount = $res['data']['count'];

				//还差多少个
				$needCount = $needCount - $hasCount;
				if($needCount < 1 || $hasCount >= $iv['count']) continue;

				$twhere = sprintf(" and sma_vin1_8='%s' and sma_vin10='%s' and sma_gxb_code = '%s' order by sma_id desc limit 5000", $iv['sma_vin1_8'], $iv['vin10'], $iv['sma_gxb_code']);
				$smaLyres = $YpwBase->get('stand_model_any', ['sma_id, sma_vin'], $twhere);
				if(empty($smaLyres['data'])) continue;
				$orgSmaArr = array_column($smaLyres['data'], null, 'sma_vin');

				//总样例
				$hasOkArr = [];
				$tempArr = [];
				$lastArr = [];
				$newVinArr = [];
				foreach($smaLyres['data'] as $tkk=>$tvv)
				{
					if($needCount < 1) break;
					$tempArr[$tvv['sma_vin']] = $tvv;
					if($tkk%100 == 99 || $tkk+1 == count($smaLyres['data']))
					{
						//剔除已有的
						$res = $YPCAR67->get('catch_vin_task', ['cvt_vin'], sprintf(" and cvt_cve_code='%s' and cvt_vin in ('%s')", $rck, implode("','", array_keys($tempArr))));
						foreach($res['data'] as $yv)
						{
							unset($tempArr[$yv['cvt_vin']]);
						}
						//预防最后不够用
						if(!empty($tempArr))
						{
							//优先查询已采集的
							switch($rck)
							{
								case 'mmc':
									$hasRes = $YPCAR67->get('temp_mitsubishi', ['lnk_vin as vin'], sprintf(" and lnk_vin in ('%s') and lnk_modelcode != ''", implode("','", array_keys($tempArr))));
								break;
								case 'landrover':
									$hasRes = $YPCAR67->get('temp_landrover', ['lnk_vin as vin'], sprintf(" and lnk_vin in ('%s') and lnk_extend_code != ''", implode("','", array_keys($tempArr))));
								break;
								case 'bentley':
									$hasRes = $YPCAR67->get('temp_bentley_catch', ['cat_vin as vin'], sprintf(" and cat_vin in ('%s') and cat_extend_code != ''", implode("','", array_keys($tempArr))));
								break;
								case 'porsche':
								case 'porsche2':
									$hasRes = $YPCAR67->get('temp_porsche', ['lnk_vin as vin'], sprintf(" and lnk_vin in ('%s') and param_sales_type != ''", implode("','", array_keys($tempArr))));
								break;
								case 'volvo':
									$hasRes = $YPCAR67->get('temp_volvo', ['lnk_vin as vin'], sprintf(" and lnk_vin in ('%s') and param_sales_no != ''", implode("','", array_keys($tempArr))));
								break;
								case 'bmw':
								case 'mini':
									$hasRes = $YPCAR67->get('temp_bmw_catch', ['cat_vin as vin'], sprintf(" and cat_vin in ('%s') and cat_extend_code != ''", implode("','", array_keys($tempArr))));
								break;
								case 'svwvw':
								case 'fawvw':
								case 'audi':
								case 'vw':
								case 'svwsk':
									$hasRes = $YPCAR67->get('vw_catch', ['cat_vin as vin'], sprintf(" and cat_vin in ('%s') and cat_extend_code != ''", implode("','", array_keys($tempArr))));
								break;
								case 'sgmw':
									$hasRes = $YPCAR67->get('temp_wuling_info', ['tq_vin as vin'], sprintf(" and tq_vin in ('%s') and varieties_0_catalogcode != ''", implode("','", array_keys($tempArr))));
								break;
								default:
									$hasRes = null;
								break;
							}

							if(!empty($hasRes['data']))
							{
								$hasOkArr = array_merge($hasOkArr, array_column($hasRes['data'], 'vin'));
								foreach($hasRes['data'] as $xv)
								{
									$newVinArr[] = $xv['vin'];
									$needCount--;
									unset($tempArr[$xv['vin']]);
									if($needCount < 1) break;
								}
							}
						}
						$lastArr = array_merge($lastArr, $tempArr);
						$tempArr = [];
					}
				}

				if($needCount > 0 && !empty($lastArr))
				{
					foreach($lastArr as $yk=>$yv)
					{
						$newVinArr[] = $yv['sma_vin'];
						$needCount--;
						if($needCount < 1) break;
					}
				}
				$newVinArr = array_unique($newVinArr);
				$addArr = [];
				foreach($newVinArr as $tvin)
				{
					$addArr[] = [
						'cvt_status'=>in_array($tvin, $hasOkArr)? 1: 0,
						'cvt_cve_code'=>$rck,
						'cvt_level'=>substr($tvin, 0, 1) == 'L'? $iv['vin_year']: $iv['vin_year'] - 1000,
						'cvt_vin'=>$tvin,
						'cvt_vin1_8'=>$iv['sma_vin1_8'],
						'cvt_vin10'=>$iv['vin10'],
						'cvt_gxb_code'=>$iv['sma_gxb_code'],
						'cvt_atime'=>time(),
						'cvt_etime'=>in_array($tvin, $hasOkArr) ? time(): 0,
						'cvt_from'=>'计算',
						'cvt_fromid'=>(int) $orgSmaArr[$tvin]['sma_id']
					];
				}
				if(!empty($addArr)) $YPCAR67->addAny('catch_vin_task', array_keys($addArr[0]), $addArr);
			}
		}

		//处理优先级etkcode没有的VIN8+型号
		$table = 'yp_model3
		JOIN yp_model2 ON m3_m2_id = m2_id
		JOIN yp_model1 ON m2_m1_id = m1_id
		JOIN yp_vin_model3_link ON vm3_m3_id = m3_id
		JOIN yp_vin ON vin_id = vm3_vin_id
		JOIN yp_model3_gxb_num ON mg_m3_id = m3_id';
		$where = sprintf(" and m1_m_id IN (%s) and m3_id NOT IN (SELECT DISTINCT mec_m3_id FROM yp_model3_etk_code) GROUP BY vin_full, mg_code", implode(',', $makeIdArr));
		$res = $YPCAR67->get($table, ['vin_full, mg_code'], $where);
		foreach($res['data'] as $v)
		{
			$where = sprintf(" and cvt_level < %d and cvt_status = 0 and cvt_vin1_8='%s' and cvt_gxb_code='%s'", date('Y'), $v['vin_full'], $v['mg_code']);
			$YPCAR67->set('catch_vin_task', ['cvt_level'=>'#@cvt_level+1000'], $where);
		}
		$YPCAR67->set('catch_vin_task', ['cvt_level'=>'#@cvt_level+1000'], " and cvt_level <= ".date('Y')." AND cvt_status = 0 AND cvt_gxb_code != '' AND cvt_gxb_code NOT IN (SELECT mg_code FROM yp_model3_gxb_num)");
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	//车架号扫码图片的规则创建与清除  可以每年执行一次
	function clearVinImgByReg()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 600)) return true;
		set_time_limit(0);
		$YpwBase = new YpwBase();
		
		$res = $YpwBase->get('stand_vin_errreg', ['*'], '');
		$hasWmiArr = array_column($res['data'], null, 'vrr_wmi');

		//wmi的图片<10张
		$maxYear = date('m') <= 6 ? date('Y') -2 : date('Y')-1;
		$wmiRes = $YpwBase->get('stand_vin_imgs', ['vii_vin1_3, count(*) as wmi_count'], sprintf(" and vii_year <= %d GROUP BY vii_vin1_3 HAVING COUNT(*) < 10", $maxYear));
		foreach($wmiRes['data'] as $wv)
		{
			//此WMI是否有人工处理过
			$res = $YpwBase->get('stand_vin_imgs', ['vii_id'], sprintf(" and vii_vin1_3 = '%s' and vii_status = 1", $wv['vii_vin1_3']), true);
			if(!empty($res['data'])) continue;
			
			if(empty($hasWmiArr[$wv['vii_vin1_3']]))
			{
				 $YpwBase->add('stand_vin_errreg', ['vrr_wmi'=>$wv['vii_vin1_3'], 'vrr_max_year'=>$maxYear, 'vrr_last_count'=>$wv['wmi_count'], 'vrr_etime'=>date('Ymd')]);
			}
			else if($hasWmiArr[$wv['vii_vin1_3']]['vrr_max_year'] != $maxYear)
			{
				$YpwBase->set('stand_vin_errreg', ['vrr_max_year'=>$maxYear, 'vrr_last_count'=>$wv['wmi_count'], 'vrr_etime'=>date('Ymd')], sprintf(" and vrr_wmi='%s'", $wv['vii_vin1_3']));
			}
		}

		//清除图片
		$OthFileCenter = new OthFileCenter();
		$clearRes = $YpwBase->get('stand_vin_errreg', ['*']);
		foreach($clearRes['data'] as $cv)
		{
			$ires = $YpwBase->get('stand_vin_imgs', ['vii_id', 'vii_img'], sprintf(" and vii_vin1_3 ='%s' and vii_year <= %d and vii_status != 1", $cv['vrr_wmi'], $maxYear));
			if(empty($ires['data'])) break;
			$delArr = [];
			foreach($ires['data'] as $ik=>$iv)
			{
				$delArr[$iv['vii_id']] = $iv['vii_img'];
				if($ik%5 == 4 || ($ik+1) == count($ires['data']))
				{
					//删除图片
					$dataArr = [
						'cate'=>'vinimg',
						'files'=>array_values($delArr)
					];
					$OthFileCenter->del($dataArr, 'yp');
					$YpwBase->del('stand_vin_imgs',sprintf(' and vii_id in (%s)', implode(',', array_keys($delArr))));
					$delArr = [];
				}
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	//计算清单的采集任务
	function addCatchJsvinByReg()
	{
		$Params = mvc::$URL_PARAMS;
		set_time_limit(0);
		$YpwVin = new YpwVin();
		$YpwVin->addCatchJsvinByReg($Params['site']);
		echo 'ok';
	}

	//计算发动机清单的采集任务?site=tran,gcsearch,gcjs,jinkousearch,jinkoujs,vin1217search,vin1217js
	function addCatchJsvinByEng6()
	{
		$Params = mvc::$URL_PARAMS;
		$siteArr = explode(',', $Params['site']);
		shuffle($siteArr);
		foreach($siteArr as $site){
			if(!LibFc::hasFunLock(mvc::$URL_METHOD.'_'.$site, 1200)) continue;
			set_time_limit(0);
			$YpwVin = new YpwVin();
			$YpwVin->addCatchJsvinByEng6($site);
			LibFc::delFunLock(mvc::$URL_METHOD.'_'.$site);
		}
		echo 'ok';
	}

	//通过600w表计算采集泽达的车架号
	function addCatchZdvinByReg()
	{
		$Params = mvc::$URL_PARAMS;
		$siteArr = explode(',', $Params['site']);
		shuffle($siteArr);
		foreach($siteArr as $site)
		{
			if(!LibFc::hasFunLock(mvc::$URL_METHOD.$site, 1200)) return true;
			set_time_limit(0);
			$YpwVin = new YpwVin();
			$YpwVin->addCatchZdvinByReg($site);
			LibFc::delFunLock(mvc::$URL_METHOD.$site);
		}
		echo 'ok';
	}

	//通过600w表采集泽达的车架号 ?site=lsg&type=has   ?site=lsg&type=jisuan 
	function catchZdvinByReg()
	{
		$Params = mvc::$URL_PARAMS;
		//if(!LibFc::hasFunLock(mvc::$URL_METHOD.$Params['site'], 1800)) return true;
		set_time_limit(0);
		$YpwVin = new YpwVin();
		$YpwVin->catchZdvinByReg($Params['site'], $Params['type']);
		LibFc::delFunLock(mvc::$URL_METHOD.$Params['site']);
		echo 'ok';
	}


	//通过600w表填补多发动机空发动机 泽达的车架号
	function catchZdvinByEngine()
	{
		set_time_limit(0);
		$cacheBTime = time()-3600;
		$YpwVin = new YpwVin();
		$cacheFile = mvc::$cfg['LOGS'].'cache_'.mvc::$URL_METHOD.'.php';
		$where = " and (smt_vin1_8 LIKE 'L%' OR smt_vin1_8 LIKE 'H%') and smt_engine LIKE '%,%' order by rand()";
		$disres = $YpwVin->get('stand_model_ypgxb JOIN stand_model_tj ON smt_vin1_8 = gxb_vin1_8 AND smt_gxb_code = gxb_code', ['smt_vin1_8, smt_gxb_code, smt_engine'], $where);
		foreach($disres['data'] as $tv)
		{
			$unikey = $tv['smt_vin1_8'].'_'.$tv['smt_gxb_code'];
			$cacheArr = file_exists($cacheFile)? include($cacheFile): [];
			if(!empty($cacheArr[$unikey]) && strtotime($cacheArr[$unikey]) > $cacheBTime) continue;

			$where = sprintf(" and sma_vin1_8='%s' and sma_gxb_code='%s' and sma_engine!='' group by sma_vin1_8, sma_vin10_12 having count(distinct sma_engine) > 1", $tv['smt_vin1_8'], $tv['smt_gxb_code']);
			$sres = $YpwVin->get('stand_model_any', ['sma_vin1_8, sma_vin10_12, sma_gxb_code, MIN(sma_vin13_17) as vin13_17_min, MAX(sma_vin13_17) as vin13_17_max'], $where);
			if(!empty($sres['data']))
			{
				foreach($sres['data'] as $rv)
				{
					$comWhere = sprintf(" and sma_vin1_8='%s' and sma_vin10_12='%s' and sma_gxb_code='%s'", $rv['sma_vin1_8'], $rv['sma_vin10_12'], $rv['sma_gxb_code']);
					$res = $YpwVin->get('stand_model_any', ['sma_vin, sma_vin13_17, sma_engine'], $comWhere.sprintf(" and sma_engine != '' and sma_vin13_17 >= '%s' order by sma_vin13_17 asc limit 1", $rv['vin13_17_min']), true);
					$startArr = $res['data'];
					$sqlArr = [];
					while(!empty($startArr['sma_vin13_17']) && $startArr['sma_vin13_17'] < $rv['vin13_17_max'])
					{
						//和start的型号不同最小vin
						$res =  $YpwVin->get('stand_model_any', ['sma_vin, sma_vin13_17, sma_engine'], $comWhere.sprintf(" and sma_engine != '' and sma_engine != '%s' and sma_vin13_17 > '%s' order by sma_vin13_17 asc limit 1", $startArr['sma_engine'], $startArr['sma_vin13_17']), true);
						$nextArr = $res['data'];

						//和nextArr的型号不同最大vin
						$res =  $YpwVin->get('stand_model_any', ['sma_vin, sma_vin13_17, sma_engine'], $comWhere.sprintf(" and sma_engine != '' and sma_engine != '%s' and sma_vin13_17 < '%s' order by sma_vin13_17 desc limit 1", $nextArr['sma_engine'], $nextArr['sma_vin13_17']), true);
						$startArr = $res['data'];
						if($nextArr['sma_vin13_17'] != $startArr['sma_vin13_17'])
						{
							$sqlArr[] = sprintf("INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6)
								SELECT 'ZDAPI', sma_vin, 'sma_engine' FROM stand_model_any WHERE 1=1 %s AND sma_engine='' AND sma_vin13_17>'%s' AND sma_vin13_17<'%s' AND sma_vin NOT IN (SELECT sce_vin FROM stand_catch_list WHERE sce_reg_code='ZDAPI')", $comWhere, $startArr['sma_vin13_17'], $nextArr['sma_vin13_17']);
							//上下再取10条
							$sqlArr[] = sprintf("INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6) 
								SELECT 'ZDAPI', sma_vin, 'sma_engine' from (
									SELECT sma_vin, sma_engine FROM stand_model_any WHERE 1=1 %s AND sma_vin13_17<'%s' order by sma_vin13_17 desc limit 5
								) as t where t.sma_engine = '' AND sma_vin NOT IN (SELECT sce_vin FROM stand_catch_list WHERE sce_reg_code='ZDAPI')", $comWhere, $startArr['sma_vin13_17']);
							$sqlArr[] = sprintf("INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6) 
								SELECT 'ZDAPI', sma_vin, 'sma_engine' from (
									SELECT sma_vin, sma_engine FROM stand_model_any WHERE 1=1 %s AND sma_vin13_17>'%s' order by sma_vin13_17 asc limit 5
								) as t where t.sma_engine = '' AND sma_vin NOT IN (SELECT sce_vin FROM stand_catch_list WHERE sce_reg_code='ZDAPI')", $comWhere, $nextArr['sma_vin13_17']);
						}
						//交换开始结束
						$startArr = $nextArr;
						$nextArr = [];
					}
					if(!empty($sqlArr)) $YpwVin->exeAnySql($sqlArr);
				}
			}
			$cacheArr = file_exists($cacheFile)? include($cacheFile): [];
			$cacheArr[$unikey] = date('Y-m-d H:i:s');
			LibFc::ArraySave($cacheArr, $cacheFile);
		}
		echo 'ok';
	}

	//通过600w表填补多 sma_weight,sma_wheel 泽达的车架号 catchZdvinBySize?filed=xxx
	function catchZdvinBySize()
	{
		set_time_limit(0);
		$Params = mvc::$URL_PARAMS;
		$filed = $Params['filed'];
		if(!in_array($filed, ['sma_weight', 'sma_wheel'])) exit('filed参数错误');
		$cacheBTime = time()-3600*24;
		$YpwVin = new YpwVin();
		$cacheFile = mvc::$cfg['LOGS'].'cache_'.mvc::$URL_METHOD.'_'.$filed.'.php';
		$where = " and (smt_vin1_8 LIKE 'L%' OR smt_vin1_8 LIKE 'H%') order by rand()";
		if(!empty($Params['count'])) $where .= sprintf(" limit %d", $Params['count']);
		$disres = $YpwVin->get('stand_model_ypgxb JOIN stand_model_tj ON smt_vin1_8 = gxb_vin1_8 AND smt_gxb_code = gxb_code', ['smt_vin1_8, smt_gxb_code'], $where);
		foreach($disres['data'] as $tv)
		{
			$unikey = $tv['smt_vin1_8'].'_'.$tv['smt_gxb_code'];
			$cacheArr = file_exists($cacheFile)? include($cacheFile): [];
			if(!is_array($cacheArr)) continue;
			if(!empty($cacheArr[$unikey]) && strtotime($cacheArr[$unikey]) > $cacheBTime) continue;
			$where = " and sma_vin1_8='{$tv['smt_vin1_8']}' and sma_gxb_code='{$tv['smt_gxb_code']}' and {$filed}!=0 group by sma_vin1_8, sma_vin10_12 having count(distinct {$filed}) > 1";
			$sres = $YpwVin->get('stand_model_any', ['sma_vin1_8, sma_vin10_12, sma_gxb_code, MIN(sma_vin13_17) as vin13_17_min, MAX(sma_vin13_17) as vin13_17_max'], $where);
			if(!empty($sres['data']))
			{
				foreach($sres['data'] as $rv)
				{
					$comWhere = sprintf(" and sma_vin1_8='%s' and sma_vin10_12='%s' and sma_gxb_code='%s'", $rv['sma_vin1_8'], $rv['sma_vin10_12'], $rv['sma_gxb_code']);
					$res = $YpwVin->get('stand_model_any', ['sma_vin', 'sma_vin13_17', $filed], $comWhere." and {$filed} != 0 and sma_vin13_17 >= '{$rv['vin13_17_min']}' order by sma_vin13_17 asc limit 1", true);
					$startArr = $res['data'];
					$sqlArr = [];
					while(!empty($startArr['sma_vin13_17']) && $startArr['sma_vin13_17'] < $rv['vin13_17_max'])
					{
						//和start的型号不同最小vin
						$res =  $YpwVin->get('stand_model_any', ['sma_vin, sma_vin13_17', $filed], $comWhere." and {$filed}!=0 and {$filed}!={$startArr[$filed]} and sma_vin13_17>'{$startArr['sma_vin13_17']}' order by sma_vin13_17 asc limit 1", true);
						if(empty($res['data'])) break;
						$nextArr = $res['data'];

						//和nextArr的型号不同最大vin
						$res =  $YpwVin->get('stand_model_any', ['sma_vin, sma_vin13_17', $filed], $comWhere." and {$filed}!=0 and {$filed}!={$nextArr[$filed]} and sma_vin13_17<'{$nextArr['sma_vin13_17']}' order by sma_vin13_17 desc limit 1", true);
						if(empty($res['data'])) break;
						$startArr = $res['data'];
						if($nextArr['sma_vin13_17'] != $startArr['sma_vin13_17'])
						{
							$sqlArr[] = "INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6)
								SELECT 'ZDAPI', sma_vin, '{$filed}' FROM stand_model_any WHERE 1=1 {$comWhere} AND {$filed}=0 AND sma_vin13_17>'{$startArr['sma_vin13_17']}' AND sma_vin13_17<'{$nextArr['sma_vin13_17']}' AND sma_vin NOT IN (SELECT sce_vin FROM stand_catch_list WHERE sce_reg_code='ZDAPI')";
							//上下再取10条
							$sqlArr[] = "INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6) 
								SELECT 'ZDAPI', sma_vin, '{$filed}' from (
									SELECT sma_vin, {$filed} FROM stand_model_any WHERE 1=1 {$comWhere} AND sma_vin13_17<'{$startArr['sma_vin13_17']}' order by sma_vin13_17 desc limit 5
								) as t where t.{$filed} = 0 AND sma_vin NOT IN (SELECT sce_vin FROM stand_catch_list WHERE sce_reg_code='ZDAPI')";
							$sqlArr[] = "INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6) 
								SELECT 'ZDAPI', sma_vin, '{$filed}' from (
									SELECT sma_vin, {$filed} FROM stand_model_any WHERE 1=1 {$comWhere} AND sma_vin13_17>'{$nextArr['sma_vin13_17']}' order by sma_vin13_17 asc limit 5
								) as t where t.{$filed} = 0 AND sma_vin NOT IN (SELECT sce_vin FROM stand_catch_list WHERE sce_reg_code='ZDAPI')";
						}
						//交换开始结束
						$startArr = $nextArr;
						$nextArr = [];
					}
					if(!empty($sqlArr)) $YpwVin->exeAnySql($sqlArr);
				}
			}
			$cacheArr = file_exists($cacheFile)? include($cacheFile): [];
			if(!is_array($cacheArr)) continue;
			$cacheArr[$unikey] = date('Y-m-d H:i:s');
			LibFc::ArraySave($cacheArr, $cacheFile);
		}
		echo 'ok';
	}

	//整理本地现代temp_hyundai需要处理的车架号，并由泽达执行更新
	public function hyundaiVinToZd()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		set_time_limit(0);
		
		$YPCAR67Db = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$addVinArr = [];

		//参数编码中无型号的VIN
		$vinRes = $YPCAR67Db->get('temp_hyundai', ['lnk_extend_code, count(*) as vin_count, lnk_vin'], " and lnk_vin LIKE 'L%' GROUP BY lnk_extend_code HAVING SUM(CASE WHEN lnk_gxb_code = '' THEN 0 ELSE 1 END) = 0");
		foreach($vinRes['data'] as $iv)
		{
			if($iv['vin_count'] == 1)
			{
				$addVinArr[$iv['lnk_vin']] = $iv['lnk_vin'];
				continue;
			}
			//样本量不会太大，全部取
			$res = $YPCAR67Db->get('temp_hyundai', ['lnk_vin'], sprintf(" and lnk_vin LIKE 'L%%' and lnk_extend_code='%s' order by lnk_vin", $iv['lnk_extend_code']));
			$ybvin = $res['data'];
			$ybCount = count($ybvin);
			//前后 + 中间
			$addVinArr[$ybvin[0]['lnk_vin']] = $ybvin[0]['lnk_vin'];
			$addVinArr[$ybvin[$ybCount-1]['lnk_vin']] = $ybvin[$ybCount-1]['lnk_vin'];
			$addVinArr[$ybvin[round(($ybCount-1)/2)]['lnk_vin']] = $ybvin[round(($ybCount-1)/2)]['lnk_vin'];
		}

		//同一个参数编码多个型号的，比例底的进行纠错
		$vinRes = $YPCAR67Db->get('temp_hyundai', ['lnk_extend_code, count(*) as vin_count'], " and lnk_vin LIKE 'L%' AND lnk_gxb_code != '' GROUP BY lnk_extend_code HAVING COUNT(DISTINCT lnk_gxb_code) > 1");
		foreach($vinRes['data'] as $iv)
		{
			$tres = $YPCAR67Db->get('temp_hyundai', ['lnk_extend_code, lnk_gxb_code, count(*) vin_count'], sprintf(" and lnk_extend_code='%s' and lnk_vin LIKE 'L%%' AND lnk_gxb_code != '' group by lnk_extend_code, lnk_gxb_code", $iv['lnk_extend_code']));
			foreach($tres['data'] as $ivv)
			{
				$rate = sprintf("%.2f", $ivv['vin_count']/$iv['vin_count']);
				if($rate < 0.05 || $ivv['vin_count'] < 10)
				{
					$xres = $YPCAR67Db->get('temp_hyundai', ['lnk_vin'], sprintf(" and lnk_extend_code='%s' and lnk_vin LIKE 'L%%' AND lnk_gxb_code = '%s'", $ivv['lnk_extend_code'], $ivv['lnk_gxb_code']));
					foreach($xres['data'] as $xv)
					{
						$addVinArr[$xv['lnk_vin']] = $xv['lnk_vin'];
					}
				}
			}
		}
		
		$YpwVin = new YpwVin();
		foreach($addVinArr as $vin)
		{
			$hasres = $YpwVin->get('stand_model_any', ['sma_gxb_code,sma_gxb_code_show,sma_from'], sprintf(" and sma_vin ='%s'",$vin), true);
			if(!empty($hasres['data']) && in_array($hasres['data']['sma_from'], ['ZDAPI', 'catch']))
			{
				$smaArr = $hasres['data'];
				$set = [
					'lnk_gxb_code'=>$smaArr['sma_gxb_code'],
					'lnk_gxb'=>	$smaArr['sma_gxb_code_show'],
				];
				$YPCAR67Db->set('temp_hyundai',$set, sprintf(" and lnk_vin='%s'", $vin));
			}
			else
			{
				$res = $YpwVin->catchAnyVinfromZdApi([$vin]);
				if(!empty($res['data'][$vin]['viz_gxb_code']))
				{
					$zdArr = $res['data'][$vin];
					$set = [
						'lnk_gxb_code'=>	$zdArr['viz_gxb_code'],
						'lnk_gxb'=>	$zdArr['viz_gxb_code_show'],
					];
					$YPCAR67Db->set('temp_hyundai',$set, sprintf(" and lnk_vin='%s'", $vin));
				}
				else if(!empty($hasres['data']))
				{
					$smaArr = $hasres['data'];
					$set = [
						'lnk_gxb_code'=>$smaArr['sma_gxb_code'],
						'lnk_gxb'=>	$smaArr['sma_gxb_code_show'],
					];
					$YPCAR67Db->set('temp_hyundai',$set, sprintf(" and lnk_vin='%s'", $vin));
				}
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//通过600w表计算采集聚合的车架号
	function addCatchJuhevinByReg()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		set_time_limit(0);
		$YpwVin = new YpwVin();
		$YpwVin->addCatchJuhevinByReg();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	
	//计算搜配的采集任务
	function jsCatchSoupeiVin()
	{
		exit;//2020/12/31
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		set_time_limit(0);
		$YpwVin = new YpwVin();
		$YpwVin->jsCatchSoupeiVin();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	//更新VIN规则的统计
	function updateVinRegTj()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		set_time_limit(0);
		$YpwVin = new YpwVin();
		$YpwVin->updateVinRegTj();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	

	//删除某来源前8不一致的vin型号
	function delVin8NotMatchSmaVins()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		set_time_limit(0);
		$YpwVin = new YpwVin();
		//哪个渠道的
		$from = 'buy01';
		//低于（含）多少个？
		$vinCount = 4;
		$where =  sprintf(" and sma_from ='%s' AND CONCAT(sma_vin1_8, '@', sma_gxb_code) IN (
			SELECT CONCAT(sgi_vin1_8, '@', sgi_gxb_code) FROM stand_gxb_info 
				WHERE sgi_vin1_8 LIKE 'L%%' AND JSON_UNQUOTE(sgi_data->'$.merge.sma_vin_full') != '' AND LOCATE(sgi_vin1_8, JSON_UNQUOTE(sgi_data->'$.merge.sma_vin_full')) < 1
		) GROUP BY sma_vin1_8, sma_gxb_code HAVING COUNT(*) <= %d", $from, $vinCount);
		$vres = $YpwVin->get('stand_model_any', ['sma_vin1_8, sma_gxb_code,count(*) as count'], $where);
		$delcount = 0;
		foreach($vres['data'] as $vt)
		{
			//再次确认总样例中sma_vin1_8+sma_gxb_code vin数是否符合
			$res = $YpwVin->get('stand_model_any', ['count(*) as count'], sprintf(" and sma_vin1_8 = '%s' and sma_gxb_code='%s'", $vt['sma_vin1_8'], $vt['sma_gxb_code']), true);
			if(!empty($res['data']['count']) && $res['data']['count'] <= $vinCount)
			{
				$delcount += $vt['count'];
				$YpwVin->del('stand_model_any', sprintf(" and sma_from ='%s' and sma_vin1_8 = '%s' and sma_gxb_code='%s'", $from, $vt['sma_vin1_8'], $vt['sma_gxb_code']), true);
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo $delcount.' ok';
	}


	//检测线上和本地 的数据异常情况 yp_car   一星期一次
	function checkDbOnlineToLocal()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		set_time_limit(0);
		$YpcBase = new YpcBase();
		$YPCAR67Db = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$onlineDbName = $YpcBase->YpcDb->configs['db_name'];
		$tableArr = [
			//未使用'temp_bentley_catch',
			'temp_bjev',
			'temp_bmw_catch',
			'temp_borgward',
			'temp_changan',
			'temp_changansuzuki',
			'temp_chrysler',
			'temp_citroen',
			'temp_ford_1',
			//未使用'temp_honda',
			'temp_hyundai',
			//未使用'temp_jac',
			'temp_jac_web',
			'temp_landrover',
			'temp_mazda_epc',
			'temp_mercedes',
			'temp_mitsubishi',
			'temp_nassian',
			'temp_nissan_vin',
			'temp_porsche',
			'temp_qirui',
			'temp_roewe_vin',
			'temp_subaru',
			'temp_volvo',
			'temp_wuling',
			'toyota_app_series',
			'toyota_app_vins',
			//不检测'vw_catch'
		];
		$res = $YpcBase->get('information_schema.tables', ['TABLE_NAME'], sprintf(" and table_schema='%s' AND table_type='BASE TABLE' and table_name in ('%s')", $onlineDbName, implode("','", $tableArr)));
		$onLineTableArr = array_column($res['data'], null, 'TABLE_NAME');
		$msgTable = [];
		$okTable = [];
		$yc = '';
		foreach($onLineTableArr as $table=>$tv)
		{
			$btime = time();
			$res = $YpcBase->get($tv['TABLE_NAME'], ['count(*) as count'], '', true);
			$tv['count_online'] = $res['data']['count'];
			
			//本地的记录数
			$res =$YPCAR67Db->get($tv['TABLE_NAME'], ['count(*) as count'], '', true);
			$tv['count_local'] = $res['data']['count'];
			$tv['count_xc'] = abs($tv['count_local'] - $tv['count_online']);
			$tv['count_xcrate'] = $tv['count_xc'] > 0 ? round($tv['count_xc']/$tv['count_local']*100, 2): 0;
			$tv['chktime'] = time()-$btime;
			if($tv['count_xc'] > 0)
			{
				$msgTable[$table] = $tv['TABLE_NAME'].'耗时'.$tv['chktime'].'s，'.'相差<span style="color:red">'.$tv['count_xc'].'</span>条记录'.$tv['count_xcrate'].'%';
				if($tv['count_xcrate'] > 5){
					$yc = '异常#';
					$msgTable[$table] .= '<span style="color:red">###异常####</span>';
				} 
			}
			else
			{
				$okTable[$table] = $tv['TABLE_NAME'].'耗时'.$tv['chktime'].'s'.'=>ok';
			}
			$onLineTableArr[$table] = $tv;
		}
		//发邮件
		$LibYpApi = new LibYpApi();   
        $tarr = ['ema_type'=>'普通', 'ema_from'=>'B2C', 'ema_to_email'=>'472211059@qq.com,296934536@qq.com', 'ema_title'=>$yc.'yp_car检测-线上和本地数据', 'ema_text'=>implode('<br>', $msgTable).'<br>'.implode('<br>', $okTable)];
		$LibYpApi->Get('email/send', [],$tarr);
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//处理自己验证码中错误的验证码
	function fitOcrErrorCode()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwBase = new YpwBase();
		$LibYpApi = new LibYpApi();
		for($i = 0; $i < 100; $i++)
		{
			$codres = $YpwBase->get('ocr_imgcode_error', ['oie_id, oie_sitetype, oie_img'], " and oie_status=0 order by oie_id desc limit 50");
			if(empty($codres['data'])) break;
			foreach($codres['data'] as $cv)
			{
				$post = [
					'imgdata'=>$cv['oie_img'],
					'type'=>3
				];
				if($cv['oie_sitetype'] == 'dflzm') $post['type'] = 7;
				if($cv['oie_sitetype'] == 'bmw') $post['type'] = 1005;
				$imgres = $LibYpApi->Get('ocr/getCodeOcr', [], $post);
				$imgres = $imgres['data'];
				if(!empty($imgres['imgcode']))
				{
					$YpwBase->set('ocr_imgcode_error', ['oie_status'=>1, 'oie_realcode'=>$imgres['imgcode']], sprintf(" and oie_status = 0 and oie_id=%d", $cv['oie_id']));
				}
				else
				{
					$LibYpApi->Get('ocr/refundCodeOcr', $imgres);
				}
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	function initZdApiBrandType()
	{
		$YpwVin = new YpwVin();
		$codres = $YpwVin->get('stand_model_any', ['sma_gxb_code, sma_gxb_code_show, sma_vin1_8'], " and sma_from = 'ZDAPI' GROUP BY sma_gxb_code, sma_vin1_8");
		foreach($codres['data'] as $cv)
		{
			$set = [];
			$res = $YpwVin->catchGxbcodeInfo($cv['sma_gxb_code_show'], 1, $cv['sma_vin1_8']);
			$gxbInfoArr = $res['data'];
			if(!empty($gxbInfoArr['merge']['sma_brand']))
				$set['sma_brand'] = $gxbInfoArr['merge']['sma_brand'];
			if(!empty($gxbInfoArr['merge']['sma_vtype']))
				$set['sma_vtype'] = $gxbInfoArr['merge']['sma_vtype'];
			if(!empty($set))
			{
				$YpwVin->set('stand_model_any', $set, sprintf(" and sma_from = 'ZDAPI' and sma_gxb_code='%s' and sma_vin1_8='%s'", $cv['sma_gxb_code'], $cv['sma_vin1_8']));
			}
		}
		echo 'ok';
	}

	//更新公告采集stand_gxb_info的缓存
	public function updateCatchGxbGg()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 600)) return true;
		$outTime = time() - 3600*24*30;
		$YpwVin = new YpwVin();
		$table = 'stand_model_tj LEFT JOIN stand_gxb_info ON smt_vin1_8 = sgi_vin1_8 AND smt_gxb_code = sgi_gxb_code';
		//只有商车网有的，超过一天重采
		$where = sprintf(" and (smt_vin1_8 LIKE 'L%%' OR smt_vin1_8 LIKE 'H%%') AND (
			sgi_unikey IS NULL OR sgi_atime < %d OR (
				sgi_atime < %d and JSON_UNQUOTE(sgi_data->'$.site.chinacar') IS NULL AND JSON_UNQUOTE(sgi_data->'$.site.cn357') IS NOT NULL)
			) group by smt_vin1_8, smt_gxb_code LIMIT 100", $outTime-3600*24, time() - 3600*24);
		$vinres = $YpwVin->get($table, ['smt_vin1_8, smt_gxb_code_show'], $where);
		foreach($vinres['data'] as $tv)
		{
			$YpwVin->catchGxbcodeInfo($tv['smt_gxb_code_show'], 1, $tv['smt_vin1_8'], [], false);
			sleep(rand(2,5));
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//更新stand_gxb_info的长度
	function updateCatchGxbGgLength()
	{
		/*$YpwVin = new YpwVin();
		$vinres = $YpwVin->get('stand_gxb_info', ['sgi_unikey, sgi_data'], ' and sgi_length_min = 0');
		foreach($vinres['data'] as $xv)
		{
			$xv['sgi_data'] = json_decode($xv['sgi_data'], true);
			if(!empty($xv['sgi_data']['merge']['sma_length']))
			{
				$min = 0;
				foreach(explode(',', $xv['sgi_data']['merge']['sma_length']) as $tvv)
				{
					$tvv = (int) $tvv;
					if($tvv < 1000) continue;
					if($min == 0 || $tvv < $min) $min = $tvv;
				}
				if($min > 0) 
					$YpwVin->set('stand_gxb_info', ['sgi_length_min'=>$min], sprintf(" and sgi_unikey='%s'", $xv['sgi_unikey']));
			}
		}*/
	}

	//重置型号的品牌和类型
	function initSmaBrandType()
	{
		$YpwVin = new YpwVin();

		$nfile = mvc::$cfg['LOGS'].'initSmaBrandType_need.php';
		$initArr = file_exists($nfile)? include($nfile): [];
		if(empty($initArr))
		{
			$gres = $YpwVin->get('stand_model_any', ['sma_vin1_8, sma_gxb_code, sma_gxb_code_show'], " AND sma_vin1_8 LIKE 'L%' AND sma_vin1_8 != '' AND sma_gxb_code !='' AND sma_brand != '' AND sma_vtype != '' GROUP BY sma_vin1_8, sma_gxb_code");
			$initArr = $gres['data'];
			LibFc::ArraySave($initArr, $nfile);
		}

		$file = mvc::$cfg['LOGS'].'initSmaBrandType_ok.php';
		$hasArr = file_exists($file)? include($file): [];
		if(empty($hasArr)) $hasArr = [];

		foreach($initArr as $gv)
		{
			$unikey = $gv['sma_vin1_8'].'@'.$gv['sma_gxb_code'];
			if(!empty($hasArr[$unikey])) continue;
			$res = $YpwVin->catchGxbcodeInfo($gv['sma_gxb_code_show'], 1, $gv['sma_vin1_8']);
			if(!empty($res['data']))
			{
				$comWhere = sprintf(" and sma_vin1_8='%s' and sma_gxb_code='%s'", $gv['sma_vin1_8'], $gv['sma_gxb_code']);
				$gxbInfoArr = $res['data'];
				if(!empty($gxbInfoArr['merge']['sma_brand']))
				{
					$YpwVin->set('stand_model_any', ['sma_brand'=>$gxbInfoArr['merge']['sma_brand']], $comWhere.sprintf(" and sma_brand != '%s'", $gxbInfoArr['merge']['sma_brand']));
				}
				if(!empty($gxbInfoArr['merge']['sma_vtype']))
				{
					$YpwVin->set('stand_model_any', ['sma_vtype'=>$gxbInfoArr['merge']['sma_vtype']], $comWhere.sprintf(" and sma_vtype != '%s'", $gxbInfoArr['merge']['sma_vtype']));
				}
			}
			$hasArr[$unikey] = 1;
			LibFc::ArraySave($hasArr, $file);
		}
		echo 'ok';
	}

	//2021/5/20 付费打电话功能关闭，查询余额退款处理
	function refundPjlSearchMoney()
	{
		exit('请人工开启');
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 6000)) return true;
		$PjlMoney = new PjlMoney();
		$PjlMoney->refundPjlSearchMoney();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//2021/5/20 付费打电话功能关闭，未能退款的钱转商铺余额
	function changePjlSearchMoneyToShopMoney()
	{
		exit('请人工开启');
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 6000)) return true;
		$PjlMoney = new PjlMoney();
		$PjlMoney->changePjlSearchMoneyToShopMoney();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}
	
	//短信通知查询余额退款处理
	function noticeRefundPjlSearchMoney()
	{
		exit('请人工开启');
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 6000)) return true;
		$PjlMoney = new PjlMoney();
		$SendSms = new SendSms();
		$res = $PjlMoney->get('`api_main`.`pa_refund` JOIN `api_main`.`pa_order` ON pre_por_id = por_id JOIN `ypdb_write`.`yp_user` ON u_id = por_u_id', ['u_mobile,por_pay_method,pre_refund_money'], " and pre_des LIKE '%退款(资金原路返回)%'");
		$payArr = [
			'weixin'=>'微信',	
			'alipay'=>'支付宝'
		];
		foreach($res['data'] as $v)
		{
			$dataArr = [
				'sms_type'=>'紧急',
				'sms_from'=>'PJL',
				'sms_style'=>'noticeRefundPjlSearchMoney',
				'sms_to_mobile'=>$v['u_mobile'],
				'sms_text'=>'{"money":"'.$v['pre_refund_money'].'", "payby":"'.$payArr[$v['por_pay_method']].'"}'
			];
			$SendSms->send($dataArr);
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//检测百度本地识别的运行状态
	public function checkBaiduOcrStatus()
	{
		$OthBaiduOcr = new OthBaiduOcr();
		$res = $OthBaiduOcr->checkStatus();
		LibFc::EchoJson($res);
	}

	//初始化省市区街道经纬度表
	public function initProvinceGps()
	{
		//INSERT INTO `yp_province_gps` (pg_area, pg_level, pg_province, pg_city, pg_town, pg_parent, pg_simple, pg_addr,pg_lng_gcj, pg_lat_gcj) SELECT area_id, area_level,province_id,city_id, county_id,parent_id, simple_name, whole_name, lat, lon FROM `sys_common_area` WHERE lon > 0
		$YpwBase = new YpwBase();

		$sqlArr = [
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, ',省直辖县级行政区划', '')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, ',直辖县级行政区划', '')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '中国,', '')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, ',市辖区', '')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '壮族自治区', '')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '自治区', '')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '宁夏回族', '宁夏')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '新疆维吾尔', '新疆')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '甘孜藏族自治州', '甘孜州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '黔西南布依族苗族自治州', '黔西南州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '阿坝藏族羌族自治州', '阿坝州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '伊犁哈萨克自治州', '伊犁州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '怒江傈僳族自治州', '怒江州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '迪庆藏族自治州', '迪庆州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '玉树藏族自治州', '玉树州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '海西蒙古族藏族自治州', '海西州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '湘西土家族苗族自治州', '湘西州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '临夏回族自治州', '临夏州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '红河哈尼族彝族自治州', '红河州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '文山壮族苗族自治州', '文山州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '巴音郭楞蒙古自治州', '巴音郭楞州')",
			"UPDATE yp_province_gps SET pg_addr = REPLACE(pg_addr, '保亭黎族苗族自治县', '保亭县')",
			"UPDATE yp_province_gps SET pg_simple = REPLACE(pg_simple, '村村', '村') WHERE pg_addr LIKE '%村村委会%'",
			"UPDATE `yp_province_gps` SET pg_addr = CONCAT('上海,', pg_addr) WHERE pg_addr LIKE '上海市%'",
			"UPDATE `yp_province_gps` SET pg_addr = CONCAT('天津,', pg_addr) WHERE pg_addr LIKE '天津市%'",
			"UPDATE `yp_province_gps` SET pg_addr = CONCAT('重庆,', pg_addr) WHERE pg_addr LIKE '重庆市%'",
			"UPDATE `yp_province_gps` SET pg_addr = CONCAT('北京,', pg_addr) WHERE pg_addr LIKE '北京市%'",
		];
		$YpwBase->exeAnySql($sqlArr, true);
		$per = 1000;
		$OthPct = new OthPct();
		for($page = 1; $page < 10000; $page++)
		{
			$tres = $YpwBase->get('yp_province_gps', ['pg_area', 'pg_addr'], ' and pg_lng = 0 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
				];
				$res = $YpwBase->get('yp_province_city', ['pc_id'], sprintf(" and LOCATE(pc_fromid, '%s') = 1 ORDER BY LENGTH(pc_fromid) DESC LIMIT 1", $tv['pg_area']), true);
				if(!empty($res['data']))
					$set['pg_pc_id'] = $res['data']['pc_id'];

				$YpwBase->set('yp_province_gps', $set,sprintf(" and pg_area='%s'", $tv['pg_area']));
			}
			if(count($tres['data']) < $per) break;
		}

		$per = 500;
		for($page = 1; $page < 10000; $page++)
		{
			$tres = $YpwBase->get('yp_province_gps', ['pg_area', 'pg_lng_gcj', 'pg_lat_gcj', 'pg_addr', 'pg_level'], ' and pg_pc_id = 0 order by rand() limit '.$per);
			foreach($tres['data'] as $tv)
			{
				$res = $YpwBase->get('yp_province_city', ['pc_id', 'pc_pid'], sprintf(" and LOCATE(pc_name_des, '%s') = 1 ORDER BY LENGTH(pc_name_des) DESC LIMIT 1", $tv['pg_addr']), true);
				if(!empty($res['data']))
				{
					if(strlen($tv['pg_addr']) > 3 && $tv['pg_level'] > 1 && empty($res['data']['pc_pid'])){
					}else{
						$set = [
							'pg_pc_id'=>$res['data']['pc_id'],
							'pg_match'=>2,
						];
						$YpwBase->set('yp_province_gps', $set,sprintf(" and pg_area='%s'", $tv['pg_area']));
					}
				}
			}
			if(count($tres['data']) < $per) break;
		}
		echo 'ok';
	}

	/**
	  * @method 重建TCD知名品牌的车型/发动机关联表 MS_SUP_TYPES、MS_SUP_ENGINES
	  * @http	get
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  supids              string [选填] 默认所有 62,63...
	  * @author soul
	  * @copyright 2019/5/27
	  * @return {"status":true,"data":true,"code":0,"encry":0,"runtime":74}
	  */
	public function resetFacTypLink()
	{
		$Params = mvc::$URL_PARAMS;
		$supIdArr = [];
		if(!empty($Params['supids']))
		{
			foreach(explode(',', $Params['supids']) as $v)
			{
				$supIdArr[] = (int) $v;
			}
		}
		$TcdmArt = new TcdmArt();
		$res = $TcdmArt->resetFacTypLink($supIdArr);
		LibFc::EchoJson($res);
	}


	//通过工信部型号初始化具有唯一性的发动机型号、功率、排量
	function initUniqueByGxbCode()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1200)) return true;
		$YpwVin = new YpwVin();

		//补型号首字母、格式型号
		$res = $YpwVin->get('stand_model_any', ['distinct sma_gxb_code'], sprintf(" AND LEFT(sma_vin1_3, 1) IN ('L', 'H') AND sma_gxb_code REGEXP '[0-9]' AND sma_gtype = ''"));
		foreach($res['data'] as $v)
		{
			$YpwVin->set('stand_model_any', ['sma_gtype'=>LibFc::getGxbCarType($v['sma_gxb_code']), 'sma_gxb_code'=>LibFc::FormatNum($v['sma_gxb_code'])], sprintf(" and sma_gxb_code = '%s'", $v['sma_gxb_code']));
		}

		$tWhere = sprintf(" and left(sma_vin1_3, 1) in ('L', 'H') and sma_etime >= %d", strtotime('-2 day'));
		$whereArr = [
			//品牌为空的
			$tWhere." and sma_brand = '' and sma_gxb_code != '' GROUP BY sma_vin1_8, sma_gxb_code",
			//发动机补齐后，功率为空的
			//$tWhere." and sma_brand != '' and sma_gxb_code != '' and sma_engine != '' and sma_kw ='' GROUP BY sma_vin1_8, sma_gxb_code",
			//采集的但是发动机为空
			//$tWhere.sprintf(" and sma_brand != '' and sma_gxb_code != '' and sma_from = 'catch' and sma_engine = '' GROUP BY sma_vin1_8, sma_gxb_code"),
			//轴距补录
			//" and sma_gxb_code != '' and sma_wheel = 0 order by rand() limit 100"
		];
		foreach($whereArr as $where)
		{
			$res = $YpwVin->get('stand_model_any', ['sma_vin1_8, sma_gxb_code_show'], $where);
			$gArr = $res['data'];
			shuffle($gArr);
			foreach($gArr as $v)
			{
				$YpwVin->initStandGxb($v['sma_gxb_code_show'], $v['sma_vin1_8']);
			}
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	//更新VIN日期的计算规则 7天
	function updateVinDateReg()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwVin = new YpwVin();
		$res = $YpwVin->updateVinDateReg();
		LibFc::delFunLock(mvc::$URL_METHOD);
		LibFc::EchoJson($res);
	}

	//重新生成宜配网
	public function resetYpVinAdsBrand()
	{
		$file = mvc::$cfg['LOGS'].'AdsWMIMake.php';
		$Ypc2Model = new Ypc2Model();
		$res = $Ypc2Model->get('bc_brand', ['brand_id id, brand_name name, brand_name name_cn'], 'order by brand_initial');
		$arr = [];
		foreach($res['data'] as $v)
		{
			$v['id'] += 1000;
			$arr[$v['id']] = $v;
		}
		LibFc::ArraySave($arr, $file);
	}

	
	//检测跑街令入驻商家的营业执照状态
	public function checkLicense()
	{
		exit('采集源被限制');
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$PjlBase = new PjlBase();
		$YpwCompanyInfo = new YpwCompanyInfo();
		$OthIm = new OthIm();
		$now = time();
		$maxTime = strtotime('-1 day');
		$chkres = $PjlBase->get('pl_shop', ['shop_id, shop_name, shop_com_code, shop_com_name'], sprintf(" and shop_status = 2 AND shop_vip_etime > %d and shop_chktime <%d", $now, $maxTime));
		foreach($chkres['data'] as $cv)
		{
			if(!empty($cv['shop_com_code'])) $keyword = $cv['shop_com_code'];
			else if(!empty($cv['shop_com_name'])) $keyword = $cv['shop_com_name'];
			else $keyword = $cv['shop_name'];
			$res = $YpwCompanyInfo->getCompanyInfo($keyword, 1);
			$comArr = $res['data'];
			$setArr = [
				'shop_chktime'=>time()
			];
			if(!empty($comArr['com_name']))
			{
				if(empty($cv['shop_com_code'])) $setArr['shop_com_code'] = $comArr['com_code'];
				if(empty($cv['shop_com_name'])) $setArr['shop_com_name'] = $comArr['com_name'];
				if($comArr['com_status'] == -1)
				{
					//$setArr['shop_status'] = -1;
					$setArr['shop_status_remark'] = '系统检测营业执照异常，'.$comArr['com_status_remark'];
					$OthIm->sendImSysNotice([172999], '入驻商家【'.$cv['shop_name'].'】营业执照异常：'.$comArr['com_status_remark'], 'im');
				}
				$PjlBase->set('pl_shop', $setArr, sprintf(" and shop_id=%d", $cv['shop_id']));
			}
			else if(empty($cv['shop_com_code']))
			{
				$setArr['shop_status_remark'] = '补资料';
				$OthIm->sendImSysNotice([172999], '入驻商家【'.$cv['shop_name'].'】企业名称或者信用代码缺失', 'im');
			}
			else
			{
				$setArr['shop_status_remark'] = '采集异常';
				$OthIm->sendImSysNotice([149894], '入驻商家【'.$cv['shop_name'].'】采集异常', 'im');
			}
			$PjlBase->set('pl_shop', $setArr, sprintf(" and shop_id=%d", $cv['shop_id']));
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	/**
	  * @method 根据公告处理净功率 最大功率、电池种类
	  * @author soul
	  * @copyright 2022/8/22
	  * @return 
	  */
	public function initEngineKw()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpwBase = new YpwBase();
		//更新
		/*$table = 'model_chinacar.car_engine_kw c JOIN ypdb_write.stand_gxbengine_kw r ON c.ckw_gxb_format = r.ckw_gxb_format AND ckw_engine = ckw_engine_format';
		$where = " and ckw_from != 'manual' AND (c.ckw_engine_kw = '' OR (c.ckw_engine_real+0)/(c.ckw_engine_kw+0) <= 1 AND (c.ckw_engine_real+0)/(c.ckw_engine_kw+0) >= 0.75) 
		AND ROUND(c.ckw_engine_real+0, 2) != ROUND(ckw_jgl_kw, 2) OR  (ROUND((c.ckw_engine_kw+0), 2) !=  ROUND(ckw_ed_kw,2) AND c.ckw_engine_kw != '')";
		$res = $YpwBase->Get($table, ['ckw_id, r.ckw_gxb_format, r.ckw_engine, r.ckw_txt_kw, r.ckw_ed_kw , c.ckw_engine_kw, r.ckw_jgl_kw, c.ckw_engine_real'], $where);
		foreach($res['data'] as $sv)
		{
			$setArr = [];
			if(!empty($sv['ckw_engine_kw']))
			{
				$setArr['ckw_ed_kw'] = (float) $sv['ckw_engine_kw'];
				if(empty($sv['ckw_txt_kw'])) $setArr['ckw_txt_kw'] = $sv['ckw_ed_kw'];
			}
			if(!empty($sv['ckw_engine_real'])) $setArr['ckw_jgl_kw'] = (float) $sv['ckw_engine_real'];

			if(!empty($setArr))
			{
				$setArr['ckw_etime'] = time();
				$setArr['ckw_from'] = 'catch';
				$YpwBase->set('stand_gxbengine_kw', $setArr, sprintf(" and ckw_id=%d", $sv['ckw_id']));
			}
		}*/
		$res = $YpwBase->Get('stand_model_tj', ['distinct smt_gxb_code'], " and smt_gxb_code IN (SELECT gb_gxb_code FROM gxb_base)");
		$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);
				$sqlArr = [
					//追加功率
					"INSERT INTO stand_gxbengine_kw (ckw_gxb_format, ckw_engine, ckw_txt_kw, ckw_ed_kw, ckw_jgl_kw, ckw_uid, ckw_etime, ckw_from)
					SELECT ckw_gxb_format,ckw_engine_format,ckw_engine_kw ckw_txt_kw,
					CASE WHEN ckw_engine_kw != '' THEN ckw_engine_kw ELSE '' END ckw_ed_kw, ckw_engine_real ckw_jgl_kw, 8 ckw_uid, UNIX_TIMESTAMP(NOW()) ckw_etime, 'catch' ckw_from
					FROM `model_chinacar`.`car_engine_kw`
					WHERE ckw_gxb_format in ('{$tcodes}') and (ckw_gxb_format, ckw_engine_format) NOT IN (
						SELECT ckw_gxb_format, ckw_engine FROM `ypdb_write`.`stand_gxbengine_kw`
					) AND (ckw_engine_kw = '' OR (ckw_engine_real+0)/(ckw_engine_kw+0) <= 1 AND (ckw_engine_real+0)/(ckw_engine_kw+0) >= 0.75)",
					
					//追加 
					"INSERT INTO stand_gxbengine_kw (ckw_gxb_format, ckw_engine, ckw_txt_kw,ckw_ed_kw, ckw_jgl_kw, ckw_uid, ckw_etime, ckw_from, ckw_dianchi)
					SELECT gb_gxb_code, ge_engine,ge_kw,CASE WHEN ge_ed_kw > 0 THEN ge_ed_kw ELSE '' END ge_ed_kw,CASE WHEN ge_jgl_kw > 0 THEN ge_jgl_kw ELSE '' END ge_jgl_kw, 8 ckw_uid, UNIX_TIMESTAMP(NOW()) ckw_etime, 'catch' ckw_from, gb_dianchi 
					FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id 
					WHERE gb_gxb_code in ('{$tcodes}') and (gb_dianchi != '' or ge_ed_kw > 0 or ge_jgl_kw > 0) AND (gb_gxb_code, ge_engine) NOT IN (SELECT ckw_gxb_format, ckw_engine FROM stand_gxbengine_kw) GROUP BY gb_gxb_code, ge_engine",
					
					"INSERT INTO stand_gxbengine_kw (ckw_gxb_format, ckw_engine, ckw_uid, ckw_etime, ckw_from, ckw_dianchi)
					SELECT gb_gxb_code, '', 8 ckw_uid, UNIX_TIMESTAMP(NOW()) ckw_etime, 'catch' ckw_from, gb_dianchi 
					FROM gxb_base WHERE gb_gxb_code in ('{$tcodes}') and gb_dianchi != '' 
					AND gb_id NOT IN (SELECT DISTINCT ge_gb_id FROM gxb_engine) 
					AND gb_gxb_code NOT IN (SELECT ckw_gxb_format FROM stand_gxbengine_kw WHERE ckw_engine = '') 
					GROUP BY gb_gxb_code",

					"INSERT INTO stand_gxbengine_kw (ckw_gxb_format, ckw_engine, ckw_txt_kw,ckw_ed_kw, ckw_jgl_kw, ckw_uid, ckw_etime, ckw_from, ckw_paifang)
					SELECT gb_gxb_code, ge_engine,ge_kw,CASE WHEN ge_ed_kw > 0 THEN ge_ed_kw ELSE '' END ge_ed_kw,CASE WHEN ge_jgl_kw > 0 THEN ge_jgl_kw ELSE '' END ge_jgl_kw, 8 ckw_uid, UNIX_TIMESTAMP(NOW()) ckw_etime, 'catch' ckw_from, gb_paifang 
					FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id
					WHERE gb_gxb_code in ('{$tcodes}') and gb_paifang != '' AND (gb_gxb_code, ge_engine) NOT IN (SELECT ckw_gxb_format, ckw_engine FROM stand_gxbengine_kw) 
					GROUP BY gb_gxb_code, ge_engine HAVING  COUNT(DISTINCT gb_paifang) = 1",

					"INSERT INTO stand_gxbengine_kw (ckw_gxb_format, ckw_engine, ckw_uid, ckw_etime, ckw_from, ckw_paifang)
					SELECT gb_gxb_code, '', 8 ckw_uid, UNIX_TIMESTAMP(NOW()) ckw_etime, 'catch' ckw_from, gb_paifang 
					FROM gxb_base WHERE gb_gxb_code in ('{$tcodes}') and gb_paifang != '' AND gb_id NOT IN (SELECT DISTINCT ge_gb_id FROM gxb_engine) 
					AND gb_gxb_code NOT IN (SELECT ckw_gxb_format FROM stand_gxbengine_kw WHERE ckw_engine = '') 
					GROUP BY gb_gxb_code HAVING COUNT(DISTINCT gb_paifang) = 1",
					
					//更新电池类型
					"UPDATE stand_gxbengine_kw, (
					SELECT gb_gxb_code, gb_dianchi FROM (
					SELECT gb_gxb_code, gb_dianchi, COUNT(*) gb_count FROM gxb_base WHERE gb_gxb_code in ('{$tcodes}') and gb_dianchi != '' GROUP BY gb_gxb_code, gb_dianchi ORDER BY COUNT(*) DESC
					) t GROUP BY gb_gxb_code
					) tdc SET ckw_dianchi = gb_dianchi, ckw_etime = UNIX_TIMESTAMP(NOW()) WHERE ckw_gxb_format = gb_gxb_code and (ckw_uid = 8 or ckw_dianchi = '') and ckw_dianchi != gb_dianchi",
					
					//额定功率
					"UPDATE stand_gxbengine_kw, (
						SELECT gb_gxb_code, ge_engine, ge_ed_kw FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id 
						WHERE ge_ed_kw > 0 and gb_gxb_code in ('{$tcodes}') GROUP BY gb_gxb_code, ge_engine HAVING COUNT(DISTINCT ge_ed_kw) = 1
					) tdc SET ckw_ed_kw = ge_ed_kw, ckw_etime = UNIX_TIMESTAMP(NOW()) WHERE ckw_gxb_format = gb_gxb_code AND ge_engine = ckw_engine AND (ckw_uid = 8 OR ckw_ed_kw = 0 OR ckw_ed_kw = '') and ckw_ed_kw != ge_ed_kw",

					//净功率
					"UPDATE stand_gxbengine_kw, (
						SELECT gb_gxb_code, ge_engine, ge_jgl_kw FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id 
						WHERE ge_jgl_kw > 0 and gb_gxb_code in ('{$tcodes}') GROUP BY gb_gxb_code, ge_engine HAVING COUNT(DISTINCT ge_jgl_kw) = 1
					) tdc SET ckw_jgl_kw = ge_jgl_kw, ckw_etime = UNIX_TIMESTAMP(NOW()) WHERE ckw_gxb_format = gb_gxb_code AND ge_engine = ckw_engine AND (ckw_uid = 8 OR ckw_jgl_kw = 0 OR ckw_jgl_kw = '') and ckw_jgl_kw != ge_jgl_kw",
					
					//排放
					"UPDATE stand_gxbengine_kw, (
					SELECT gb_gxb_code, gb_paifang FROM (
					SELECT gb_gxb_code, gb_paifang, COUNT(*) gb_count FROM gxb_base WHERE gb_gxb_code IN ('{$tcodes}') AND gb_paifang != '' GROUP BY gb_gxb_code, gb_paifang ORDER BY COUNT(*) DESC
					) t GROUP BY gb_gxb_code
					) tdc SET ckw_paifang = gb_paifang, ckw_etime = UNIX_TIMESTAMP(NOW()) WHERE ckw_gxb_format = gb_gxb_code AND (ckw_uid = 8 OR ckw_paifang = '') AND ckw_paifang != gb_paifang",
				];
				$YpwBase->exeAnySql($sqlArr, false);
				$tgArr = [];
			}
		}

		//底盘反推型号
		$table = "gxb_base 
		JOIN gxb_engine ON ge_gb_id = gb_id AND gb_type = 'dipan'
		JOIN stand_gxb_dipan ON sgd_dpgxb_code = gb_gxb_code
		JOIN stand_model_tj ON  sgd_gxb_code = smt_gxb_code";
		$res = $YpwBase->Get($table, ['distinct gb_gxb_code'], " AND (ge_ed_kw > 0 OR ge_jgl_kw > 0)");
		$gxbArr = array_column($res['data'], 'gb_gxb_code');
		$total = count($gxbArr);
		$tgArr = [];
		foreach($gxbArr as $gk=>$gv)
		{
			$tgArr[] = $gv;
			if(count($tgArr) === 100 || ($gk+1) == $total)
			{
				$tcodes = implode("','", $tgArr);
				$sqlArr = [
					"INSERT INTO stand_gxbengine_kw (ckw_gxb_format, ckw_engine, ckw_txt_kw,ckw_ed_kw, ckw_jgl_kw, ckw_uid, ckw_etime, ckw_from, ckw_dianchi)
					SELECT sgd_gxb_code, ge_engine,ge_kw,CASE WHEN ge_ed_kw > 0 THEN ge_ed_kw ELSE '' END ge_ed_kw,CASE WHEN ge_jgl_kw > 0 THEN ge_jgl_kw ELSE '' END ge_jgl_kw, 8 ckw_uid, UNIX_TIMESTAMP(NOW()) ckw_etime, 'catch' ckw_from, gb_dianchi 
					FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id AND gb_type = 'dipan'
					JOIN stand_gxb_dipan ON sgd_dpgxb_code = gb_gxb_code
					WHERE gb_gxb_code IN ('{$tcodes}') AND (ge_ed_kw > 0 OR ge_jgl_kw > 0) 
					AND (sgd_gxb_code, ge_engine) NOT IN (SELECT ckw_gxb_format, ckw_engine FROM stand_gxbengine_kw)
					AND (sgd_gxb_code, ge_engine) IN (SELECT gb_gxb_code, ge_engine FROM gxb_base JOIN gxb_engine ON ge_gb_id=gb_id AND gb_type='gxb') 
					AND sgd_gxb_code IN (SELECT smt_gxb_code FROM stand_model_tj)
					GROUP BY sgd_gxb_code, ge_engine",

					//额定功率
					"UPDATE stand_gxbengine_kw, (
						SELECT sgd_gxb_code, ge_engine, ge_ed_kw 
						FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id AND gb_type = 'dipan'
						JOIN stand_gxb_dipan ON sgd_dpgxb_code = gb_gxb_code
						WHERE gb_gxb_code IN ('{$tcodes}') AND ge_ed_kw > 0
						AND (sgd_gxb_code, ge_engine) IN (SELECT gb_gxb_code, ge_engine FROM gxb_base JOIN gxb_engine ON ge_gb_id=gb_id AND gb_type='gxb') 
						AND sgd_gxb_code IN (SELECT smt_gxb_code FROM stand_model_tj)
						GROUP BY sgd_gxb_code, ge_engine HAVING COUNT(DISTINCT ge_ed_kw) = 1
					) tdc SET ckw_ed_kw = ge_ed_kw, ckw_etime = UNIX_TIMESTAMP(NOW()) WHERE ckw_gxb_format = sgd_gxb_code AND ge_engine = ckw_engine AND (ckw_uid = 8 OR ckw_ed_kw = 0 OR ckw_ed_kw = '') and ckw_ed_kw != ge_ed_kw",

					//净功率
					"UPDATE stand_gxbengine_kw, (
						SELECT sgd_gxb_code, ge_engine, ge_jgl_kw 
						FROM gxb_base JOIN gxb_engine ON ge_gb_id = gb_id AND gb_type = 'dipan'
						JOIN stand_gxb_dipan ON sgd_dpgxb_code = gb_gxb_code
						WHERE gb_gxb_code IN ('{$tcodes}') AND ge_jgl_kw > 0
						AND (sgd_gxb_code, ge_engine) IN (SELECT gb_gxb_code, ge_engine FROM gxb_base JOIN gxb_engine ON ge_gb_id=gb_id AND gb_type='gxb') 
						AND sgd_gxb_code IN (SELECT smt_gxb_code FROM stand_model_tj)
						GROUP BY sgd_gxb_code, ge_engine HAVING COUNT(DISTINCT ge_jgl_kw) = 1
					) tdc SET ckw_jgl_kw = ge_jgl_kw, ckw_etime = UNIX_TIMESTAMP(NOW()) WHERE ckw_gxb_format = sgd_gxb_code AND ge_engine = ckw_engine AND (ckw_uid = 8 OR ckw_jgl_kw = 0 OR ckw_jgl_kw = '') and ckw_jgl_kw != ge_jgl_kw",
				];
				$YpwBase->exeAnySql($sqlArr, false);
				$tgArr = [];
			}
		}

		//进口 发动机型号+排量+功率 设置为 净功率
		/*$eres = $YpwBase->Get('stand_model_tj', ['distinct smt_engine'], " and smt_vin1_8 NOT LIKE 'L%' AND smt_vin1_8 NOT LIKE 'H%' AND smt_engine IS NOT NULL order by rand()");
		$engArr = [];
		foreach($eres['data'] as $ev)
		{
			foreach(explode(',', $ev['smt_engine']) as $evv)
			{
				if(!empty($evv) && $evv != '-') $engArr[$evv] = $evv;
			}
		}
		foreach($engArr as $eng)
		{
			$where = " and sma_vin1_3 NOT LIKE 'L%' AND sma_vin1_3 NOT LIKE 'H%' AND sma_engine = '{$eng}' and sma_from != 'ZDAPI' AND sma_kw != '' GROUP BY sma_brand, sma_gxb_code, sma_engine";
			$tres = $YpwBase->Get('stand_model_any', ['sma_brand, sma_gxb_code, sma_engine, GROUP_CONCAT(DISTINCT sma_kw) sma_kws'], $where);
			foreach($tres['data'] as $tv)
			{
				$kws = explode(',', $tv['sma_kws']);
				$chk = $YpwBase->Get('stand_gxbengine_kw', ['ckw_id, ckw_ed_kw, ckw_jgl_kw,ckw_uid'], sprintf(" and ckw_brand='%s' and ckw_gxb_format='%s' and ckw_engine='%s'", $tv['sma_brand'], $tv['sma_gxb_code'], $tv['sma_engine']), true);
				if(!empty($chk['data']))
				{
					$old = $chk['data'];
					$old['ckw_jgl_kw'] = empty($old['ckw_jgl_kw'])? []: explode(',', $old['ckw_jgl_kw']);
					$old['ckw_ed_kw'] = empty($old['ckw_ed_kw'])? []: explode(',', $old['ckw_ed_kw']);
					
					$error = false;
					$newkws = $old['ckw_jgl_kw'];
					foreach($kws as $kw)
					{
						if(in_array($kw, $old['ckw_ed_kw'])){
							$error = true;
							break;
						}
						if(!in_array($kw, $old['ckw_jgl_kw'])) $newkws[] = $kw;
					}
					$newkws = array_unique($newkws);
					sort($newkws);
					if(!$error && $newkws != $old['ckw_jgl_kw'] && (empty($old['ckw_jgl_kw']) || $old['ckw_uid'] == 8))
					{
						$setArr = [
							'ckw_jgl_kw'=>implode(',', $newkws),
							'ckw_uid'=>8,
							'ckw_etime'=>time(),
							'ckw_from'=>'catch'
						];
						$YpwBase->set('stand_gxbengine_kw', $setArr, " and ckw_id={$old['ckw_id']}");
					}
				}
				else
				{
					$addArr = [
						'ckw_brand'=>$tv['sma_brand'],
						'ckw_gxb_format'=>$tv['sma_gxb_code'],
						'ckw_engine'=>$tv['sma_engine'],
						'ckw_jgl_kw'=>$tv['sma_kws'],
						'ckw_uid'=>8,
						'ckw_etime'=>time(),
						'ckw_from'=>'catch'
					];
					$YpwBase->add('stand_gxbengine_kw', $addArr);
				}
			}
		}*/
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	public function catchZdLsg()
	{
		$YpcVin = new YpcVin();
		$sqlArr = [];
		foreach($YpcVin->isZdcofArr as $vin8=>$v10s)
		{
			foreach(str_split($v10s) as $v10)
			{
				$sqlArr[] = sprintf("INSERT INTO stand_catch_list(sce_reg_code, sce_vin, sce_engine6) 
				SELECT 'ZDAPI', vs_vin, 'lsg' FROM `yp_vin_search` WHERE vs_vin LIKE '%s_%s%%' 
				AND vs_vin NOT IN (SELECT sma_vin FROM `stand_model_any` WHERE sma_from = 'ZDAPI' AND sma_vin LIKE '%s_%s%%')
				AND vs_vin NOT IN (SELECT sce_vin FROM `stand_catch_list` WHERE sce_reg_code = 'ZDAPI' AND sce_vin LIKE '%s_%s%%')", $vin8, $v10, $vin8, $v10, $vin8, $v10);
			}
		}
		echo implode(";<br>", $sqlArr);
	}

	/**
	  * @method 整理车辆的启动标识
	  * @author soul
	  * @copyright 2023/10/24
	  * @return 
	  */
	public function updateMod3StartStop()
	{
		$Params = mvc::$URL_PARAMS;
		//if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$YpcModel = new YpcModel();
		$YpcModel->updateMod3StartStop($Params['m3_id']);
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	
	//初始化空的底盘
	public function initChassis()
	{
		$YPCAR67 = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		
		$table = 'yp_model3
		JOIN yp_model2 ON m3_m2_id = m2_id
		JOIN yp_model1 ON m2_m1_id = m1_id
		JOIN yp_make ON m1_m_id = m_id
		JOIN yp_brand ON m1_b_id = b_id
		LEFT JOIN yp_model3_etk_code ON m3_id = mec_m3_id
		LEFT JOIN yp_model3_modcode ON m3_id = mem_m3_id';
		$where = " and b_id IN (7,62,97) AND m3_chassis = '' GROUP BY m3_id";
		$mres = $YPCAR67->get($table, ['*, GROUP_CONCAT(mem_code) mem_codes, GROUP_CONCAT(mec_code) mec_codes'], $where);
		foreach($mres['data'] as $v){
			$chassis = [];
			$codstr = $v['m3_mcode'];
			if(empty($codstr) && !empty($v['mem_codes'])) $codstr = $v['mem_codes'];
			else if(empty($codstr) && !empty($v['mec_codes'])) $codstr = $v['mec_codes'];
			foreach(explode(',', $codstr) as $cv){
				$temp = explode('-', $cv);
				$chassis[] = $temp[0];
			}
			$chassis = array_unique($chassis);
			if(in_array($v['b_id'], [62,97])){
				foreach($chassis as $ck=>$cv){
					if(substr($cv, -1, 1) == 'L')
						$chassis[$ck] = substr($cv, 0, -1);
				}
				$chassis = array_unique($chassis);
			}
			
			if(!empty($chassis)){
				$YPCAR67->set('yp_model3', ['m3_chassis'=>implode(',', $chassis)], sprintf(" and m3_id=%d", $v['m3_id']));
			}
		}
		echo 'ok';
	}

	//初始化跑街CRM历史数据
	public function initPjdCrm()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$PjlUser = new PjlUser();
		$CrmMain = new CrmMain();
		$B2cBase = new B2cBase();
		$AdsBase = new AdsBase();
		$YpwUser = new YpwUser();

		//VIP
		$table = 'pl_user_vip_list 
		JOIN pl_user_vip ON  uip_uvl_id = uvl_id AND uvl_status = 2
		JOIN dl_order_list ON uvl_id = dml_order_id';
		$res = $PjlUser->get($table, ['uvl_id'], ' order by uvl_id');
		foreach($res['data'] as $v){
			$CrmMain->addContractByPjlVipOrder($v['uvl_id'], false);
		}
		
		//联动服务
		$table = '`sh_shop_app`
		JOIN `sh_shop` ON shop_id = aps_shop_id
		LEFT JOIN `an_user` ON au_name = aps_sales';
		$cres = $B2cBase->get($table, ['shop_id u_id, shop_name, au_uid,au_name, aps_sales, aps_btime btime, aps_etime etime'], " order by aps_btime");
		foreach($cres['data'] as $v){
			if(empty($v['au_uid'])) $v['au_uid'] = 172999;
			$v['title'] = '联动服务';
			$v['sves'][] = [
				'sve_id'=>3,
				'remark'=>'商城联动版',
				'money'=>30000,
				'btime'=>$v['btime'],
				'etime'=>$v['etime'],
			];
			$CrmMain->addContractByOld($v);
		}

		//公众号目录
		$table = 'sh_super
		JOIN `sh_shop` ON shop_id = ssu_shop_id
		LEFT JOIN `an_user` ON au_name = ssu_sales';
		$cres = $B2cBase->get($table, ['shop_id u_id, shop_name, au_uid,au_name, ssu_name keyword, ssu_sales, ssu_pjl_show, ssu_super_gzh,ssu_btime btime, ssu_etime etime'], " order by ssu_btime");
		foreach($cres['data'] as $v){
			if(stripos($v['keyword'], '测试') !== false || stripos($v['keyword'], '借用') !== false || stripos($v['keyword'], '体验') !== false) continue;
			if(empty($v['au_uid'])) $v['au_uid'] = 172999;
			$v['title'] = '联动服务';
			$sve_remark = [];
			if($v['ssu_pjl_show']) $sve_remark[] = '品牌目录';
			if($v['ssu_super_gzh']) $sve_remark[]= '公众号目录';
			$sve_remark = implode("+", $sve_remark);
			$v['sves'][] = [
				'sve_id'=>3,
				'remark'=>$sve_remark,
				'money'=>10000,
				'btime'=>$v['btime'],
				'etime'=>$v['etime'],
			];
			$CrmMain->addContractByOld($v);
		}

		//机器人
		$table = 'wx_robot
		JOIN `sh_shop` ON shop_id = wr_uid
		JOIN wx_robot_token on wrt_id = wr_wrt_id
		LEFT JOIN `an_user` ON au_name = wr_sales';
		$cres = $B2cBase->get($table, ['shop_id u_id, shop_name, au_uid,au_name, wr_sales, concat(wr_name, wr_remark) keyword,wr_btime btime, wr_etime etime'], " and wr_type = 'wxgr' order by wr_btime");
		foreach($cres['data'] as $v){
			if(stripos($v['keyword'], '测试') !== false || stripos($v['keyword'], '借用') !== false || stripos($v['keyword'], '体验') !== false) continue;
			if(empty($v['au_uid'])) $v['au_uid'] = 172999;
			$v['title'] = '机器人';
			$v['sves'][] = [
				'sve_id'=>4,
				'remark'=>'机器人服务费',
				'money'=>3000,
				'btime'=>$v['btime'],
				'etime'=>$v['etime'],
			];
			$v['sves'][] = [
				'sve_id'=>5,
				'remark'=>'机器人token代购费',
				'money'=>2400,
				'btime'=>$v['btime'],
				'etime'=>$v['etime'],
			];
			$CrmMain->addContractByOld($v);
		}

		//接口
		$table = 'api_main.api_user a
		LEFT JOIN `an_user` b ON b.au_name = a.au_sales';
		$cres = $B2cBase->get($table, ['a.au_uid u_id, b.au_uid,b.au_name, concat(au_comname, a.au_remark) keyword, a.au_sales, a.au_remark,au_btime btime, au_etime etime'], " order by au_btime");
		foreach($cres['data'] as $v){
			if(stripos($v['keyword'], '测试') !== false || stripos($v['keyword'], '借用') !== false || stripos($v['keyword'], '体验') !== false) continue;
			if(empty($v['au_uid'])) $v['au_uid'] = 172999;
			$v['title'] = 'API接口';
			$v['sves'][] = [
				'sve_id'=>18,
				'remark'=>$v['au_remark'],
				'money'=>10000,
				'btime'=>$v['btime'],
				'etime'=>$v['etime'],
			];
			$CrmMain->addContractByOld($v);
		}
		
		$comToUser = [
			'杭州峰源汽配 理想车型广告'=>'a693292',
			'广州凯顿贸易有限公司 特斯拉车架号广告'=>'18620292566',
			'上海弘焰贸易有限公司 理想车架号广告'=>'13564223118',
			'广州宝瑞 长安启源车架号广告'=>'b788898',
			'广州德广 几何汽车车架号广告'=>'13078638625',
			'东方海博 吉林首页广告'=>'twt123',
			'京茂伟业 英菲尼迪车架号广告'=>'18613886545',
			'芜湖佳先传动轴有限公司 首页广告 全国'=>'13706860835',
			'广州市台头汽车配件有限公司广汽埃安车架号广告'=>'18502019100',
			'广州铭辉 极氪车架号 广告'=>'13535070629',
			'新疆一水 本田乘用车车型广告'=>'a956910',
			'上海佳熙（优欧配） 保时捷车型'=>'13391362666',
			'广州世纪鑫盛贸易有限公司 欧拉车型广告'=>'13750551420',
			'广州鑫海林肯野马配件林肯车型广告'=>'18689433732',
			'广州兴众行 九龙商用车车型广告'=>'18718888541',
			'杭州速配优品 浙江省首页广告'=>'a032008',
			'广州台头 新特汽车乘用车车架号广告'=>'18502019100',
			'郑州鑫华建 河南开机广告'=>'b289559',
			'广州卓立 宝马车架号广告'=>'13022091192',
			'北京路福福特汽配 福特乘用车车架号广告'=>'18810280667',
			'济南鑫顺通达 中国重汽VGV和潍柴英致乘用车车架号广告'=>'13256700846',
			'广州金鸿汽配 东风风光乘用车车架号广告'=>'a020482',
			'香河锐诚霖商贸有限公司 福特乘用车车型广告'=>'15810436100',
			'广州市钜狮贸易有限公司 雪铁龙、标志 车型广告'=>'15814590537',
			'长春789 吉林开机广告'=>'15043090781',
			'广州多普森 北京开机广告'=>'a286308',
			'广洋汽配 福建开机广告'=>'b580008',
			'广州得昇 零跑、哪吒车架号广告'=>'15088054546',
			'广州富林汽配有限公司 东南乘用车车型广告'=>'18925038638',
			'云南铭浩 云南开机广告'=>'15288351097',
			'前程汽车配件制造有限公司 河北开机广告'=>'13930903695',
			'广州安通 新疆开机广告'=>'a339963',
			'河南省壹桶金减震器厂 长城乘用车车型广告'=>'17516501500',
			'武汉天裕汽配 湖北开机'=>'15307156720',
			'广州匠合 宾利 乘用车车型广告'=>'18692041789',
			'杭州耀辉汽配 东风小康车架号广告'=>'e270665',
			'北京立扬胜达商贸有限公司 现代车型广告'=>'13671161681',
			'武汉海川电喷电器 湖北开机'=>'13911864696',
			'郑州亚鑫汽配 汉腾车型广告'=>'18860394086',
			'贵阳轩宇 贵州开机广告'=>'18786681003',
			'广州钜狮 DS 谛艾仕 车架号广告'=>'15814590537',
			'郑州电之家 新特、大运乘用车车型'=>'13837033707',
			'广州闽发汽配 比亚迪乘用车车架号广告'=>'13535255346',
			'广州祥兴新能源汽配（蔚来部）蔚来车型广告'=>'18124295833',
			'昆明车邦商贸 猎豹车型广告'=>'a717543',
			'北京领沃汽车配件有限公司 领克车型广告'=>'17801591608',
			'刚正汽配 长安欧尚商用车车型广告'=>'a868135',
			'广州万熹达汽配商行 高合乘用车车架号广告'=>'13428333923',
			'广州致顺新能源配件哪吒车型广告'=>'13538832057',
			'广州国仁 北汽制造车架号 半年'=>'a693292',
			'济南鑫志远汽车配件有限公司 吉利乘用车车型广告'=>'15165050858',
			'广州新东成 铃木乘用车车型广告'=>'b781864',
			'昆明广成汽配 云南首页广告'=>'13529196424',
			'郑州尚森（乌鲁木齐瑞祥隆） 新疆首页广告'=>'17337893628',
			'河北喆霖 浙江首页广告'=>'18832916328',
			'拉萨路航 西藏开机广告'=>'a905970',
			'广州环莱 浙江开机广告'=>'18102680212',
			'广州鑫腾凌宝乘用车车架号广告'=>'b084874',
			'上海上新 江苏开机广告'=>'17321488793',
			'北京奇陆行（施格瑞） 辽宁和安徽开机广告'=>'13391773566',
			'北京欧捷行 北京开机广告'=>'13810609868',
			'昆明领克汽配 力帆乘用车车型广告'=>'15368025095',
			'湖北相睿 河南开机广告'=>'13437205284',
			'君诚信业 山西开机广告 三个月'=>'15834105945',
			'北京奇陆行(施格瑞) 河北开机广告'=>'13391773566',
			'南昌福铃 陆风乘用车车架号广告'=>'15797770876',
			'广州吉尔赛 广西/湖南/江西开机广告'=>'c886333',
			'广州鑫博 东风纳米（东风EV新能源）车型'=>'a296735',
			'昆明喆联 云南开机广告 三个月'=>'18082906039',
			'广州力诚汽配 飞凡乘用车车架号广告'=>'15920330259',
			'广州市腾飞汽车配件有限公司 金杯乘用车车型广告'=>'b187794',
			'杭州丰运汽配有限公司 中华车架号广告'=>'13867148082',
			'广州韩品优配汽配 赛力斯乘用车车型广告'=>'15626288830',
			'台州慕溪汽配有限公司 几何乘用车车型广告'=>'15857673366',
			'北京盛启名车 宾利车型广告'=>'13001060003',
			'山河弘丰汽配 成功汽车商用车车型广告'=>'15698329895',
			'合心惠 江铃车型广告'=>'15066659661',
			'广州粤盟 江淮车型广告'=>'13434266667',
			'广州华洋广琪汽配有限公司 东风EV新能源'=>'a066337',
			'广州立祥 斯巴鲁车型广告'=>'1353315220',
			'广州市捷汇汽配 凯迪拉克'=>'13560081440',
			'沈阳佳峰 双龙乘用车车型广告'=>'a132435',
			'广州友能汽配 大运乘用车车型广告'=>'13924252556',
			'株田汽车散热器丰田商用车车型广告'=>'15915795280',
			'香河华誉商贸有限公司 江淮商用车车架号广告'=>'a007020',
			'广州鸿运汽配商行 长城商用车车型广告'=>'b329829',
			'神杭 广东首页'=>'13587571636',
			'兰州捷瑞行 甘肃开机广告'=>'13669312781',
			'沈阳鑫鑫利源汽配商贸有限公司 发动机广告'=>'18309820555',
			'沈阳瀚盛汽配公司 五十铃车型广告'=>'18742448857',
			'重庆晨泽商贸（重庆东博汽车电器）重庆首页广告'=>'db68121416',
			'河南稳众减震（河南同飞）山西、内蒙古开机广告'=>'a730331',
			'广州凤凰 海南开机广告'=>'13928862562',
			'北京大田 马自达 车架号广告'=>'18001184618',
			'广州迈泉 瑞驰新能源车架号广告'=>'19396884386',
			'广州永生汽配配件公司 五菱汽车车型广告'=>'13828407557',
			'贵阳万江航空机电有限公司贵州办事处 贵州OE号广告'=>'13608592439',
			'西安洁圣鑫业商贸有限公司北汽昌河车架号广告'=>'13096999848',
			'河南稳众减震（河南同飞）湖南开机广告'=>'a730331',
			'北京新佳通汽配 北京首页广告'=>'13699130376',
			'金迪汽配（壹达汽车 ）三菱车架号广告'=>'13631736442',
			'杭州盛超汽配有限公司 三菱车型'=>'13588855903',
			'海川电喷电器 湖北首页'=>'17771414052',
			'天津广源百威商贸公司天津开机广告'=>'15222835992',
			'黑龙江鑫金鑫 黑龙江开机广告'=>'18945051037',
			'广州祥兴 福建、云南首页广告'=>'18124295833',
			'广州天汽 新疆首页广告'=>'18146498982',
			'广州盛发汽车配件有限公司 捷豹车型广告 赠送2个月'=>'13076584331',
			'山东韩亚汽车配件有限公司 双龙车型广告 赠送2个月'=>'15552897409',
			'广州百事通 奔腾车型广告 2个月'=>'19924766846',
			'杭州车乐享汽配有限公司 浙江开机'=>'wtzmg',
			'贵阳领秀汽配 荣威车型广告'=>'19908500087',
			'广州贯淘贸易 四川首页 赠送2个月'=>'14788880828',
			'北京王东汽配 河北开机广告 两个月'=>'18532552191',
			'南京华博(原东周)汽配有限公司 江苏OE号广告'=>'13813891253',
			'兰州捷瑞行奇瑞 青海开机广告 2个月'=>'13669312781',
			'北京高山汽配长安跨越车型广告'=>'15201198281',
			'哈尔滨骏业鑫天天汽车配件有限公司'=>'13836144986',
			'北京大田马自达车架号广告'=>'18001184618',
			'沈阳正发盛业汽配 辽宁省首页广告三个月'=>'15940491394',
			'任丘市广源汽车配件供应站河北开机（天津广源赠送）'=>'15222835992',
			'昆明宇航减震器大全云南开机'=>'15368862073',
			'兰州恒晟轴承 甘肃OE号广告'=>'18193122456',
			'台州市秀草阁机械有限公司上海开机'=>'13600577511',
			'广州森乐贸易有限公司 四川开机广告'=>'18820124885',
			'长春市震达汽配 内蒙古开机'=>'15164362226',
			'广州汇宾名车汽配 兰博基尼车架号广告'=>'13710859002',
			'KSN--凯斯恩汽车零部件有限公司 河北开机'=>'15966682759',
			'南京华博(原东周)汽配有限公司'=>'13813891253',
			'上海弘焰 江淮车架号广告'=>'13564223118',
			'南京忠豪汽配销售中心江苏开机广告'=>'wz777006',
			'沈阳恒稳减振器中心库 内蒙古开机广告'=>'b207388',
			'昆明宇航减震器大全云南OE号广告'=>'15368862073',
			'沈阳鑫吉龙汽配有限公司辽宁开机'=>'ssssssdddddd',
			'翔安三菱东南猎豹马自达东南车架号广告'=>'15013026811',
			'浙江佰远威宏贸易有限公司浙江开机'=>'13634167786',
			'北京昌德源汽车配件销售 北京首页'=>'13720033701',
			'北京福源北汽商贸中心 雷丁、朋克车型广告'=>'13716118828',
			'广州叁加汽车配件有限公司吉普车型广告'=>'18613138238',
			'弘焰供应链 湖北首页赠送'=>'13564223118',
			'广州震豪汽车配件有限公司'=>'a984708',
			'沈阳恒稳减震器中心库—沈阳鑫元汽配 辽宁首页'=>'15524207388',
			'杭州华捷汽配有限公司 纳智捷车架号'=>'17767105019',
			'广州胜昌贸易商行四川开机'=>'gzscmy',
			'广州顺广佳汽配 车型广告 雪佛兰'=>'13610260505',
			'哈尔滨菱源汽配商行黑龙江开机'=>'13766871450',
			'沈阳恒稳减振器中心库吉林首页'=>'15524207388',
			'江西江顺汽车配件有限公司江西首页'=>'17770897800',
			'维尔塔 江西开机（优安途）'=>'13736526166',
			'鑫诚信电喷 新疆首页'=>'17690735238',
			'宏渠盛业配件商行 开机 黑龙江'=>'b089111',
			'广州鑫华汽配 JEEP吉普车型广告'=>'okm227599',
			'南昌腾飞马达电机总汇 江西首页'=>'13576278966',
			'广州市车宝仕汽车配件贸易有限公司'=>'13610260505',
			'世凯特滤清器有限公司'=>'15033191005',
			'南昌腾飞马达电机总汇'=>'13576278966',
			'成都汽配之家(卓越)汽贸'=>'13668123881',
			'山东城际通有限责任公司'=>'13668821160',
			'昆明冰川越洋 首页广告 云南 赠送一个月'=>'13708875210',
			'广州屹远大通汽配有限公司'=>'13580312156',
			'广州屹远大通汽配有限公司 EPC广告'=>'13580312156',
			'杭州峰源'=>'a693292','广州凯顿贸易'=>'18620292566','上海弘焰贸易'=>'13564223118','广州宝瑞'=>'b788898','广州德广'=>'13078638625','东方海博'=>'twt123','京茂伟业'=>'18613886545','芜湖佳先传动轴'=>'13706860835','广州市台头'=>'18502019100','广州铭辉'=>'13535070629','新疆一水'=>'a956910','上海佳熙（优欧配）'=>'13391362666','广州世纪鑫盛贸易'=>'13750551420','广州鑫海林肯野马配件林肯'=>'18689433732','广州兴众行'=>'18718888541','杭州速配优品'=>'a032008','广州台头'=>'18502019100','郑州鑫华建'=>'b289559','广州卓立'=>'13022091192','北京路福福特'=>'18810280667','济南鑫顺通达'=>'13256700846','广州金鸿'=>'a020482','香河锐诚霖商贸'=>'15810436100','广州市钜狮贸易'=>'15814590537','长春789'=>'15043090781','广州多普森'=>'a286308','广洋'=>'b580008','广州得昇'=>'15088054546','广州富林'=>'18925038638','云南铭浩'=>'15288351097','前程'=>'13930903695','广州安通'=>'a339963','河南省壹桶金减震器厂'=>'17516501500','武汉天裕'=>'15307156720','广州匠合'=>'18692041789','杭州耀辉'=>'e270665','北京立扬胜达商贸'=>'13671161681','武汉海川电喷电器'=>'13911864696','郑州亚鑫'=>'18860394086','贵阳轩宇'=>'18786681003','广州钜狮'=>'15814590537','郑州电之家'=>'13837033707','广州闽发'=>'13535255346','广州祥兴新能源'=>'18124295833','昆明车邦商贸'=>'a717543','北京领沃'=>'17801591608','刚正'=>'a868135','广州万熹达'=>'13428333923','广州致顺新能源配件哪吒'=>'13538832057','广州国仁'=>'a693292','济南鑫志远'=>'15165050858','广州新东成'=>'b781864','昆明广成'=>'13529196424','郑州尚森（乌鲁木齐瑞祥隆）'=>'17337893628','河北喆霖'=>'18832916328','拉萨路航'=>'a905970','广州环莱'=>'18102680212','广州鑫腾凌宝乘用车'=>'b084874','上海上新'=>'17321488793','北京奇陆行（施格瑞）'=>'13391773566','北京欧捷行'=>'13810609868','昆明领克'=>'15368025095','湖北相睿'=>'13437205284','君诚信业'=>'15834105945','北京奇陆行(施格瑞)'=>'13391773566','南昌福铃'=>'15797770876','广州吉尔赛'=>'c886333','广州鑫博'=>'a296735','昆明喆联'=>'18082906039','广州力诚'=>'15920330259','广州市腾飞'=>'b187794','杭州丰运'=>'13867148082','广州韩品优配'=>'15626288830','台州慕溪'=>'15857673366','北京盛启名车'=>'13001060003','山河弘丰'=>'15698329895','合心惠'=>'15066659661','广州粤盟'=>'13434266667','广州华洋广琪'=>'a066337','广州立祥'=>'1353315220','广州市捷汇'=>'13560081440','沈阳佳峰'=>'a132435','广州友能'=>'13924252556','株田'=>'15915795280','香河华誉商贸'=>'a007020','广州鸿运'=>'b329829','神杭'=>'13587571636','兰州捷瑞行'=>'13669312781','沈阳鑫鑫利源'=>'18309820555','沈阳瀚盛'=>'18742448857','重庆晨泽商贸（重庆东博'=>'db68121416','河南稳众减震（河南同飞）山西、内蒙古'=>'a730331','广州凤凰'=>'13928862562','北京大田'=>'18001184618','广州迈泉'=>'19396884386','广州永生'=>'13828407557','贵阳万江航空机电'=>'13608592439','西安洁圣鑫业商贸'=>'13096999848','河南稳众减震（河南同飞）湖南'=>'a730331','北京新佳通'=>'13699130376','金迪'=>'13631736442','杭州盛超'=>'13588855903','海川电喷电器'=>'17771414052','天津广源百威商贸公司天津'=>'15222835992','黑龙江鑫金鑫'=>'18945051037','广州祥兴'=>'18124295833','广州天汽'=>'18146498982','广州盛发'=>'13076584331','山东韩亚'=>'15552897409','广州百事通'=>'19924766846','杭州车乐享'=>'wtzmg','贵阳领秀'=>'19908500087','广州贯淘贸易'=>'14788880828','北京王东'=>'18532552191','南京华博(原东周)'=>'13813891253','兰州捷瑞行奇瑞'=>'13669312781','北京高山'=>'15201198281','哈尔滨骏业鑫天天'=>'13836144986','北京大田马自达'=>'18001184618','沈阳正发盛业'=>'15940491394','任丘市广源'=>'15222835992','昆明宇航减震器大全云南'=>'15368862073','兰州恒晟轴承'=>'18193122456','台州市秀草阁机械'=>'13600577511','广州森乐贸易'=>'18820124885','长春市震达'=>'15164362226','广州汇宾名车'=>'13710859002','KSN--凯斯恩'=>'15966682759','南京华博(原东周)'=>'13813891253','上海弘焰'=>'13564223118','南京忠豪'=>'wz777006','沈阳恒稳减振器中心库'=>'b207388','昆明宇航减震器大全云南OE号广告'=>'15368862073','沈阳鑫吉龙'=>'ssssssdddddd','翔安三菱东南猎豹马自达东南'=>'15013026811','浙江佰远威宏贸易'=>'13634167786','北京昌德源'=>'13720033701','北京福源北汽商贸中心'=>'13716118828','广州叁加'=>'18613138238','弘焰供应链'=>'13564223118','广州震豪'=>'a984708','沈阳恒稳减震器中心库—沈阳鑫元'=>'15524207388','杭州华捷'=>'17767105019','广州胜昌贸易商行四川'=>'gzscmy','广州顺广佳'=>'13610260505','哈尔滨菱源'=>'13766871450','沈阳恒稳减振器中心库吉林'=>'15524207388','江西江顺'=>'17770897800','维尔塔'=>'13736526166','鑫诚信电喷'=>'17690735238','宏渠盛业配件商行'=>'b089111','广州鑫华'=>'okm227599','南昌腾飞马达电机总汇'=>'13576278966','广州市车宝仕'=>'13610260505','世凯特滤清器'=>'15033191005','南昌腾飞马达电机总汇'=>'13576278966','成都'=>'13668123881','山东城际通有限责任公司'=>'13668821160','昆明冰川越洋'=>'13708875210','广州屹远大通'=>'13580312156','广州屹远大通'=>'13580312156'
		];
		foreach($comToUser as $k=>$v){
			$comToUser[strtoupper(trim($k))] = $v;
		}
		//广告
		$table = '`pj_place_ads` 
		JOIN `pj_place_ads_time` ON pat_pla_id = pla_id
		JOIN `pj_user_ads` ON ads_id = pla_ads_id
		LEFT JOIN `ypb2c`.`an_user` ON au_name = pla_sales';
		$cres = $AdsBase->get($table, ['pla_id, pal_shoufei, ads_id,ads_u_id u_id, ads_name,au_uid, au_name, pla_sales, pla_remark, concat(ads_name, pla_remark) keyword, MIN(pat_btime) btime, MAX(pat_etime) etime'], " GROUP BY pla_id order by pla_id");
		$nullCom = [];
		$nullCom2 = [];
		foreach($cres['data'] as $v){
			if(stripos($v['keyword'], '测试') !== false || stripos($v['keyword'], '借用') !== false || stripos($v['keyword'], '体验') !== false) continue;
			if(empty($v['au_uid'])) $v['au_uid'] = 172999;
			if(empty($v['u_id']))
			{
				$uname = '';
				if(!empty($comToUser[strtoupper(trim($v['ads_name']))])){
					$uname = LibFc::Escape($comToUser[strtoupper(trim($v['ads_name']))]);
					$res = $YpwUser->get('yp_user', ['u_id'], sprintf(" and (u_name='%s' or u_nickname='%s' or (u_mobile='%s' and u_mobile_check='Y'))", $uname, $uname, $uname));
					if(!empty($res['data'])) $v['u_id'] = $res['data'][0]['u_id'];
				}

				if(empty($v['u_id'])){
					$re = ['VIN', '开机', '首页', '车架号', '车型', '号码', '发动机', '有限公司', '科技','汽车', '汽配'];
					$word = trim(str_replace($re, ' ', $v['ads_name']));
					$sub = stripos($word, ' ')? substr($word, 0, stripos($word, ' ')+1): $word;
					$res = $PjlUser->get('pl_shop', ['shop_pu_id u_id'], sprintf(" and shop_name like '%%%s%%'", LibFc::Escape($sub)));
					if(!empty($res['data'])){
						if(count($res['data']) == 1) $v['u_id'] = $res['data'][0]['u_id'];
					}else{
						$res = $PjlUser->get('ypb2c.sh_shop', ['shop_uid u_id'], sprintf(" and shop_name like '%%%s%%'", LibFc::Escape($sub)));
						if(!empty($res['data'])){
							if(count($res['data']) == 1) $v['u_id'] = $res['data'][0]['u_id'];
						}else{
							$res = $PjlUser->get('ypdb_write.yp_user_ext', ['ui_uid u_id'], sprintf(" and ui_company like '%%%s%%'", LibFc::Escape($sub)));
							if(!empty($res['data'])){
								if(count($res['data']) == 1) $v['u_id'] = $res['data'][0]['u_id'];
							}
						}
					}

					if(empty($v['u_id']) && !empty($comToUser[strtoupper(trim($sub))])){
						$uname = LibFc::Escape($comToUser[strtoupper(trim($sub))]);
						$res = $YpwUser->get('yp_user', ['u_id'], sprintf(" and (u_name='%s' or u_nickname='%s' or (u_mobile='%s' and u_mobile_check='Y'))", $uname, $uname, $uname));
						if(!empty($res['data'])) $v['u_id'] = $res['data'][0]['u_id'];
					}
					
					if(empty($v['u_id'])){
						$nullCom[$sub] = $v;
					}
				}
				
				if(empty($v['u_id']) && preg_match('/^1\d{10}$/', $uname)){
					$code = '000000';
					$addSms = [
						'smc_mobile'=>$uname,
						'smc_style'=>'bind',
						'smc_from'=>'system',
						'smc_code'=>$code,
						'smc_send_time'=>time(),	
						'smc_expire_time'=>time()+600,
						'smc_sms'=>0
					];
					$SendSms = new SendSms();
					$SendSms->Add('sc_mobile_code', $addSms);
					$addUser = [
						'u_mobile'=>$uname,
						'mobile_code'=>$code,
						'u_from'=>'system',
					];
					$res = $YpwUser->Register($addUser);
					$v['u_id'] = $res['data'];
				}

				if(!empty($v['u_id'])){
					$AdsBase->set('pj_user_ads', ['ads_u_id'=>$v['u_id']], sprintf(" and ads_id=%d", $v['ads_id']));
				}
			}
			if(empty($v['u_id'])) continue;
			$money = 0.01;
			if($v['pal_shoufei'] == -1) $money = 0.00;
			if(preg_match('/(\d+\.?\d*)元/', $v['pla_remark'], $match)) $money = $match[1];

			$v['title'] = $v['ads_name'];
			$v['sves'][] = [
				'sve_id'=>7,
				'remark'=>$v['pla_remark'],
				'money'=>$money,
				'btime'=>$v['btime'],
				'etime'=>$v['etime'],
				'des_id'=>$v['pla_id']
			];
			$CrmMain->addContractByOld($v);
		}
		echo '<table border="1"><tr><td>广告</td><td>客户</td><td>会员账号</td><td>业务员</td><td>到期时间</td></tr>';
		foreach($nullCom as $sub=>$v){
			echo '<tr><td>'.$v['ads_name'].'</td><td>'.$sub.'</td><td></td><td>'.$v['pla_sales'].'</td><td>'.date('Y-m-d', $v['etime']).'</td></tr>';
		}
		echo '</table>';
		//echo implode("\n", array_unique($nullCom));
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	//初始化跑街CRM 客户状态
	public function initPjdCrmCtrStatus()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 3600)) return true;
		$CrmMain = new CrmMain();
		//$CrmMain->initCtrStatus(5324);
		$res = $CrmMain->get('fad_contract', ['fct_ctr_id ctr_id'], " order by fct_ctr_id");
		foreach($res['data'] as $v){
			$CrmMain->initCtrStatus($v['ctr_id']);
		}
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	public function ctrAnyUser()
	{
		$CrmMain = new CrmMain();
		$now = time();
		$table = 'fad_link_fct_sve
		JOIN fad_service ON sve_id = fsl_sve_id
		JOIN fad_contract ON fct_id = fsl_fct_id
		JOIN fad_link_fct_usr ON duc_fct_id = fct_id
		JOIN crm_customer ON ctr_id = fct_ctr_id
		JOIN crm_customer_admin ON cca_ctr_id = ctr_id
		JOIN `ypb2c`.`an_user` c1 ON c1.au_uid = duc_usr_id
		JOIN `ypb2c`.`an_user` c2 ON c2.au_uid = cca_au_uid';
		$ares = $CrmMain->get($table, ['ctr_id, ctr_comname, ctr_level_id, cca_au_uid,c2.au_uid ctr_au_id, c2.au_name ctr_au_name, GROUP_CONCAT(DISTINCT duc_usr_id), GROUP_CONCAT(DISTINCT sve_text)'], sprintf(" and fsl_etime > %d GROUP BY ctr_id HAVING COUNT(DISTINCT duc_usr_id) > 1", $now));
		echo '<table border="1"><tr><td>ID</td><td>客户</td><td>当前业务员</td><td>服务</td></tr>';
		$setSql = [];
		foreach($ares['data'] as $v){
			$serArr = [];
			$res = $CrmMain->get($table, ['c1.au_uid,c1.au_name, sve_id, sve_text, fsl_money, fsl_btime, fsl_etime, c1.au_status'], sprintf(" and fsl_etime > %d and ctr_id=%d order by fsl_money DESC", $now, $v['ctr_id']));
			$isVip = true;
			$change = 0;
			foreach($res['data'] as $kk=>$vv){
				if($kk === 0 && $vv['au_uid'] != $v['ctr_au_id']) $change = $vv['au_uid'];
				$serArr[] = $vv['sve_text'].' '.$vv['fsl_money'].' '.date('Y-m-d', $vv['fsl_etime']).' '.$vv['au_name'].' ['.$vv['au_status'].']'.'['.$vv['au_uid'].']';
				//$serArr[] = $vv['sve_text'].' '.$vv['fsl_money'].' '.date('Y-m-d', $vv['fsl_etime']).' '.$vv['au_name'];
				if(!in_array($vv['sve_id'], [1,2])) $isVip = false;
			}
			
			if($isVip) continue;
			if($change) $setSql[] = sprintf("update crm_customer_admin set cca_au_uid = %d where cca_ctr_id=%d", $change, $v['ctr_id']);
			echo '<tr><td>'.$v['ctr_id'].'</td><td>'.$v['ctr_comname'].'</td><td>'.$v['ctr_au_name'].'</td><td>'.implode("<br>", $serArr).'</td></tr>';
		}
		echo '</table>';
		echo implode(";<br>", $setSql).';';
	}

	//跑街产品车型自动匹配任务  ?shop_id=xxx
	public function autoYpb2cItemModel()
	{
		$Params = mvc::$URL_PARAMS;
		$B2cProduct = new B2cProduct();
		$B2cProduct->del("bc_product_model_auto", " and pma_pro_id NOT IN (SELECT pro_id FROM bc_product)");
		$where = sprintf(" and shop_status = 1 AND shop_smt_code NOT IN ('chassis', 'engine') AND (
		shop_id IN (SELECT aps_shop_id FROM `sh_shop_app` WHERE aps_etime > UNIX_TIMESTAMP(NOW())) 
		OR shop_id IN (SELECT ssu_shop_id FROM `sh_super` WHERE ssu_style ='B2C' AND ssu_etime > UNIX_TIMESTAMP(NOW()))
		)");
		if(!empty($Params['shop_id']))  $where .= sprintf(" and shop_id=%d",  $Params['shop_id']);
		$res = $B2cProduct->get('sh_shop', ['shop_id'], $where);
		foreach($res['data'] as $v){
			$cfg = [
				'shopid'=>$v['shop_id'],
				'from'=>'NUMBER',
				'proids'=>[],
			];
			$B2cProduct->autoYpb2cItemModel($cfg);
		}
		echo 'ok';
	}
	
	//重置商城的es关键字
	public function resetB2cItemEs()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		$B2cElastic = new B2cElastic();
		$B2cElastic->delIndex();
		$B2cElastic->createIndex();
		$B2cElastic->updateItemWord();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}

	//重置车型的es关键字
	public function resetModelWord()
	{
		if(!LibFc::hasFunLock(mvc::$URL_METHOD, 1800)) return true;
		$Ypc2Elastic = new Ypc2Elastic();
		$Ypc2Elastic->delIndex();
		$Ypc2Elastic->createIndex();
		$Ypc2Elastic->updateItemWord();
		LibFc::delFunLock(mvc::$URL_METHOD);
		echo 'ok';
	}


	//跑街令产品车型自动匹配任务  ?shop_id=xxx
	public function autoPjlItemModel()
	{
		$Params = mvc::$URL_PARAMS;
		$PjlProduct = new PjlProduct();
		$where = sprintf(" and shop_status = 2 ");
		if(!empty($Params['shop_id']))  $where .= sprintf(" and shop_id=%d", $Params['shop_id']);
		$res = $PjlProduct->get('pl_shop', ['shop_id'], $where);
		foreach($res['data'] as $v){
			$cfg = [
				'shopid'=>$v['shop_id'],
				'proids'=>[],
			];
			$PjlProduct->autoPjlItemModel($cfg);
		}
		echo 'ok';
	}

	//清楚无用产品图
	function cleanNotUsedFile()
	{
		$B2cProduct = new B2cProduct();
		$OthFileCenter = new OthFileCenter();
		$pres = $B2cProduct->get('sh_pic', ['spi_id, spi_cate, spi_path, spi_name, spi_ext'], " AND spi_cate = 'product' AND spi_id NOT IN (SELECT pp_spi_id FROM bc_product_pic)");
		foreach(array_chunk($pres['data'], 50) as $rows){
			$dels = ['cate' =>'product', 'files' =>[]];
			foreach($rows as $row){
				$dels['files'][] = $row['spi_path'].'100/'.$row['spi_name'].'.'.$row['spi_ext'];
			}
			$res = $OthFileCenter->del($dels, 'b2c');
			if($res['data'] == 'ok'){
				$B2cProduct->del('sh_pic',sprintf("and spi_id in (%s)",implode(',',array_column($rows, 'spi_id'))));
			}
		}
		echo 'ok';
	}

	
	//检测工信部的新公告
	function checkNewGg()
	{
		$YpwGxb = new YpwGxb();
		$res = $YpwGxb->get('gxb_base', ['max(gb_pici) gb_pici'], " and gb_from='miitgov' limit 1", true);
		$pici = $res['data']['gb_pici']+1;
		$url = 'https://www.miit.gov.cn/search-front-server/api/search/info?websiteid=110000000000000&scope=basic&q='.$pici.'%E6%89%B9&pg=10&cateid=47&pos=title_text,titlepy,infocontent,filenumbername,keyword,contentdescribe&pq=&oq=&eq=&begin=&end=&dateField=deploytime&selectFields=title,content,deploytime,_index,url,cdate,infoextends,infocontentattribute,keyword,contentdescribe,sectitle,picpath,columnname,themename,publishgroupname,publishtime,metaid,bexxgk,columnid,infocontenthashcode&group=distinct&highlightConfigs=[{%22field%22:%22infocontent%22,%22numberOfFragments%22:2,%22fragmentOffset%22:0,%22fragmentSize%22:110,%22noMatchSize%22:110}]&highlightFields=title_text,infocontent,webid&level=6&sortFields=[{%22name%22:%22extend1%22,%22type%22:%22desc%22},{%22name%22:%22jsearch_score%22,%22type%22:%22desc%22}]&hidCol=fbafd13557fa453d9c59432567d2b150&p=1';
		$LibHttp = new LibHttp();
		$html = $LibHttp->fetch($url);
		$txtArr = json_decode($html, true);
		if(!empty($txtArr['data']['searchResult']['dataResults'])){
			foreach($txtArr['data']['searchResult']['dataResults'] as $row){
				if(stripos($row['groupData'][0]['data']['title_text'], '道路机动车辆生产企业及产品公告')){
					$msg = ['ema_type'=>'紧急', 'ema_from'=>'主站', 'ema_to_email'=>'472211059@qq.com', 'ema_title'=>'工信部有新的公告第'.$pici.'批', 'ema_text'=>'https://www.miit.gov.cn/search/index.html?websiteid=110000000000000&pg=&p=&tpl=&category=&q='.$pici.'%E6%89%B9&jsflIndexSeleted='];
					$SendEmail = new SendEmail();
					$SendEmail->send($msg);
					echo 'has';
					exit;
				}
			}
		}
		echo 'no';
	}

	//分配新注册用户
	function fenpeiNewUser()
	{
		$CrmMain = new CrmMain();
		$CrmMain->del('crm_customer_admin', sprintf(" and cca_end_time < %d and cca_level_id=1", time()));
		$YpwUser = new YpwUser();
		$key = 'fenpei_register';
		$res = $YpwUser->getKeyVal($key);
		$last = empty($res['data']) ? 1125347: $res['data'];
		$res = $YpwUser->get('yp_user', ['u_id'], sprintf(" and u_id > %d and u_register_time between %d and %d order by u_id limit 1000", $last, strtotime('-7days'), strtotime('-1days')));
		foreach($res['data'] as $v){
			$CrmMain->fenpeiNewUser($v['u_id']);
			$YpwUser->setKeyVal($key, $v['u_id']);
		}
		$CrmMain->Del("crm_plan", " and cp_ctr_id IN (SELECT ctr_id FROM crm_customer JOIN ypdb_write.yp_user ON ctr_uid = u_id WHERE u_status != 1) AND cp_ok = 0 AND cp_by_uid = 8");
		echo 'ok';
	}
	
	//单一车架号查询 列入黑名单
	function onlyDecodeVinBlack(){
		$PjltjMain = new PjltjMain();
		$today = date('Ymd');
		$PjltjMain->onlyDecodeVinBlack($today);
		/*
		$OthB2cDb = new BaseDb(mvc::$cfg['DB']['B2COTH']);
		$res = $OthB2cDb->get('pj_ads_show', ['min(as_date) min_date'], '', true);
		$adsMinDate = $res['data']['min_date'];
		for($i = 0; $i < 100; $i++){
			$tdate = date('Ymd', strtotime('-'.$i.'day', strtotime($today)));
			if($tdate <= $adsMinDate) break;
			//echo $tdate, '<br>';
			$PjltjMain->onlyDecodeVinBlack($tdate);
		}*/
		echo 'ok';
	}

	//检测号码是否存在
	public function autoCheckNumItem(){
		$per = 100;
		$maxtime = strtotime("-15 days");
		$YpwBase = new YpwBase();
		$OthNumber = new OthNumber();
		while(1){
			$lastId = 0;
			$lres = $YpwBase->get('yp_search_numnull', ['ysn_id', 'ysn_format'], sprintf(" and ysn_id > %d and ysn_chktime < %d order by ysn_id limit %d", $lastId, $maxtime, $per));
			foreach($lres['data'] as $v){
				$res = $OthNumber->search(['onlycheck'=>1, 'word'=>$v['ysn_format']]);
				$set = [
					'ysn_chkstatus'=>empty($res['data'])? 0: 1,
					'ysn_chktime'=>time()
				];
				$YpwBase->set('yp_search_numnull', $set, sprintf(" and ysn_id = %d", $v['ysn_id']));
				$lastId = $v['ysn_id'];
			}
			if(count($lres['data']) < $per) break;
		}
		echo 'ok';
	}


	/**
	  * @method get 哪些数据源有此号码
	  * @http  GET
	  * @param  token              string [必填] 调用接口凭证 (post|get)
	  * @param  word			   string [必填] 号码
	  * @author soul
	  * @copyright 2026/6/3
	  * @return  {"status":true,"data":["yp","tcd"],"code":"","runtime":481}
	  */
	public function checkNumItem()
	{
		$Params = mvc::$URL_PARAMS;
		
		LibFc::ReturnJson(true, array_keys($res['data']));
	}
}
