<?php
/**
  * @method 用户系统
  * @author soul
  * @copyright 2016/3/31
  */
class YpwUser extends YpwBase
{

	/**
	  * @method 查询用户表信息
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
		成功：['status'=>true, 'data'=>$OneRow=false 二维数组 ; $OneRow=true 一维数组, 'code'=>'']
		失败：['status'=>false, 'data'=>失败信息, 'code'=>失败代码]
	  */
	public function getUserBase($uidArr)
	{
		$arr = [];
		if(!empty($uidArr))
		{
			$res = $this->get('yp_user', ['u_id','u_name', 'u_nickname', 'u_real_name'], sprintf(" and u_id in (%s)", implode(',', $uidArr)));
			foreach($res['data'] as $v)
			{
				$v['show_name'] = $v['u_name'];
				if(!empty($v['u_real_name']))
					$v['show_name'] .= '['.$v['u_real_name'].']';
				else if(!empty($v['u_nickname']) && $v['u_nickname'] != $v['u_name'])
					$v['show_name'] .= '['.$v['u_nickname'].']';
				$arr[$v['u_id']] = $v;
			}
		}
		return LibFc::ReturnData(true, $arr);
	}





	/**
	  * @method 查询用户表信息
	  * @param  $FieldArr 需要查询的字段名称数组
	  * @param  $Where 查询条件
	  * @param  $OneRow true|false
	  * @author soul
	  * @copyright 2016/3/30
	  * @return 
		成功：['status'=>true, 'data'=>$OneRow=false 二维数组 ; $OneRow=true 一维数组, 'code'=>'']
		失败：['status'=>false, 'data'=>失败信息, 'code'=>失败代码]
	  */
	public function getUser($FieldArr, $Where = '', $OneRow = false)
	{
		$Table = 'yp_user as u join yp_user_ext as ui on u_id=ui_uid';
		return $this->get($Table, $FieldArr, $Where, $OneRow);
	}


	/**
	  * @method 修改用户表信息
	  * @param  $uid 用户ID
	  * @param  $dataArr 需要修改的字段信息 ['u_nickname'=>'xxx', 'ui_qq'=>'xxxx']
	  * @author soul
	  * @copyright 2016/3/30
	  * @return
		成功：['status'=>true, 'data'=>true, 'code'=>'']
		失败：['status'=>false, 'data'=>失败信息, 'code'=>失败代码]
	  */
	public function setUser($uid, $dataArr)
	{
		$uid = (int) $uid;
		if($uid > 0 && is_array($dataArr))
		{
			$arr = [];
			foreach($dataArr as $k=>$v)
			{
				if(stripos($k, 'u_') === 0)
				{
					$arr['base'][$k] = $v;
				}
				if(stripos($k, 'ui_') === 0)
				{
					$arr['ext'][$k] = $v;
				}
			}
			$this->YpwDb->Begin();
			if(!empty($arr['base']))
			{
				$this->set('yp_user', $arr['base'], ' and u_id='.$uid);
			}
			if(!empty($arr['ext']))
			{
				$this->set('yp_user_ext', $arr['ext'], ' and ui_uid='.$uid);
			}
			$this->YpwDb->End();
			return LibFc::ReturnData(true, true);
		}
		return LibFc::ReturnData(false,  'setUser 提供的参数不正确');
	}

	//车架号纠错 图片识别 600w保存
	function saveStandModelAny($Params, $postData)
	{
		$dataArr = [];
		foreach($postData['vin'] as $fk=>$fv)
		{
			if(stripos($fk, 'sma_') === 0 || stripos($fk, 'smb_') === 0) $dataArr[$fk] = $fv;
		}
		$dataArr['sma_id'] = (int) $dataArr['sma_id'];
		$this->YpwDb->Begin();
		$PjlBase= new PjlBase();

		//有VIN和工信部型号则入600w库
		$dataArr['sma_vin'] = LibFc::FormatVin(strtoupper($dataArr['sma_vin']));
		if(!empty($dataArr['sma_gxb_code_show']) && (!empty($dataArr['sma_id']) || $postData['vii_status'] == 1 || $postData['err']['ve_status'] == 1 ))
		{
			if(strlen($dataArr['sma_vin']) != 17) return LibFc::ReturnData(false,  'VIN长度不是17位，只有'.strlen($dataArr['sma_vin']));

			$vinYear = LibFc::VinYear($dataArr['sma_vin']);
			
			//重新查找vin对应的记录ID
			$res = $this->get('stand_model_any', ['sma_id', 'sma_from'], sprintf(" and sma_vin='%s'", $dataArr['sma_vin']), true);
			$oldSma = $res['data'];
			if($oldSma['sma_id']){
				if(empty($dataArr['sma_id'])){
					$dataArr['sma_id'] = $oldSma['sma_id'];
				}else if($dataArr['sma_id'] > 0 && $oldSma['sma_id'] != $dataArr['sma_id']){
					//数据库里找到的ID和提交的ID不一致，删除找到的一条
					$this->del('stand_model_any', sprintf(" and sma_id=%d", $oldSma['sma_id']));
				}
			}

			$chk = LibFc::VinCheckCode($dataArr['sma_vin']);
			if(!$chk['ok']) return LibFc::ReturnData(false, 'VIN有误,不能通过校验');

			$dataArr['sma_gxb_code_show'] = $dataArr['sma_gxb_code_show'];
			$dataArr['sma_gxb_code'] = LibFc::FormatNum($dataArr['sma_gxb_code_show']);
			$dataArr['sma_gtype'] = LibFc::getGxbCarType($dataArr['sma_gxb_code']);
			if(substr($dataArr['sma_vin'], 0, 1) == 'L' && strlen($dataArr['sma_gxb_code']) < 3) return LibFc::ReturnData(false,  '工信部型号长度过短');
			else if(substr($dataArr['sma_vin'], 0, 1) != 'L' && strlen($dataArr['sma_gxb_code']) < 2) return LibFc::ReturnData(false,  '工信部型号长度过短');

			if(isset($dataArr['sma_engine6']))
			{
				$dataArr['sma_engine6'] = LibFc::FormatNum($dataArr['sma_engine6'], '-');
				if(strlen($dataArr['sma_engine6']) > 32) $dataArr['sma_engine6'] = substr($dataArr['sma_engine6'], -32);
			}

			$dataArr['sma_vin1_3'] = substr($dataArr['sma_vin'], 0, 3);
			$dataArr['sma_vin1_8'] = substr($dataArr['sma_vin'], 0, 8);
			$dataArr['sma_vin10'] = substr($dataArr['sma_vin'], 9, 1);
			$dataArr['sma_vin10_12'] = substr($dataArr['sma_vin'], 9, 3);
			$dataArr['sma_vin13_17'] = substr($dataArr['sma_vin'], 12, 5);
			$dataArr['sma_vin10_11'] = substr($dataArr['sma_vin'], 9, 2);
			$dataArr['sma_vin12_17'] = substr($dataArr['sma_vin'], 11, 6);
			$dataArr['sma_vyear'] = LibFc::VinYear($dataArr['sma_vin10']);
			if(!empty($dataArr['sma_brand'])){
				$dataArr['sma_brand'] = LibFc::reBrandName($dataArr['sma_brand']);
				$LibYpApi = new LibYpApi();
				$res = $LibYpApi->Get('vin/getWmiReBrand', ['wmi'=>$dataArr['sma_vin1_3'], 'brand'=>$dataArr['sma_brand']]);
				$dataArr['sma_brand'] = $res['data'];
			}
			
			// 整形字段
			$arr = ['sma_length','sma_width','sma_height', 'sma_wheel','sma_axle','sma_weight','sma_passenger'];
			foreach ($arr as $value) 
			{
				if (isset($dataArr[$value]))
				{
					$dataArr[$value] = (int) $dataArr[$value];
				}
			}

			//年份处理
			if(!empty($dataArr['sma_year']))
			{
				$t = explode('-', trim($dataArr['sma_year']));
				if(substr($dataArr['sma_vin'], 0, 1) == 'L' && abs($vinYear-$t[0]) > 2) LibFc::ReturnData(false,  'VIN第十位的年份'.$vinYear.'和生产日期相差大于2年，请检查或者联系技术部');
				if(count($t) > 1 && ($t[1] < 1  || $t[1] > 13))
				{
					LibFc::ReturnData(false,  '生产日期的月份不正确，01~12');
				}

				if(count($t) > 2 && ($t[2] < 1  || $t[2] > 31))
				{
					LibFc::ReturnData(false,  '生产日期的日不正确，01~31');
				}
				if(count($t) == 3){
					$dataArr['sma_year'] = date('Y-m-d', strtotime($dataArr['sma_year']));
					if(strtotime($dataArr['sma_year']) > strtotime('+7 day')) LibFc::ReturnData(false,  '生产日期超过当前日期');

				}else if(count($t) == 2){
					$dataArr['sma_year'] = date('Y-m', strtotime($dataArr['sma_year']));
					if(strtotime($dataArr['sma_year']) > strtotime('+1 month')) LibFc::ReturnData(false,  '生产日期超过当前日期');
				}

				$res = $this->get('yp_allvin_base', ['alb_date'], sprintf(" and alb_vin ='%s'", $dataArr['sma_vin']));
				if(!empty($res['data']))
				{
					if(strlen($dataArr['sma_year']) >= strlen($res['data']['alb_date']))
					{
						$this->set('yp_allvin_base', ['alb_date'=>$dataArr['sma_year']], sprintf(" and alb_vin ='%s' and alb_from ='manual'", $dataArr['sma_vin']));
					}
				}
				else
				{
					$addDate = [
						'alb_vin'=>$dataArr['sma_vin'],
						'alb_vin1_3'=>$dataArr['sma_vin1_3'],
						'alb_vin4_8'=>substr($dataArr['sma_vin'], 3, 5),
						'alb_vin10_11'=>substr($dataArr['sma_vin'], 9, 2),
						'alb_vin12'=>substr($dataArr['sma_vin'], 11, 1),
						'alb_vin13_17'=>$dataArr['sma_vin13_17'],
						'alb_date'=>$dataArr['sma_year'],
						'alb_from'=>'manual',
					];
					$this->add('yp_allvin_base', $addDate);
				}
			}
			else
			{
				$this->del('yp_allvin_base', sprintf(" and alb_vin ='%s' and alb_from ='manual'", $dataArr['sma_vin']));
			}
			
			$dataArr['sma_etime'] = time();
			if(isset($dataArr['sma_tran']) && $dataArr['sma_tran'] == '无') unset($dataArr['sma_tran']);
			if(empty($oldSma) || $oldSma['sma_from'] == 'ocr') $dataArr['sma_from'] = 'manual';

			$addTable = ['sma'=>[], 'smb'=>[]];
			foreach($dataArr as $atk=>$atv){
				if(stripos($atk, 'sma_') === 0){
					$addTable['sma'][$atk] = $atv;
				}else if(stripos($atk, 'smb_') === 0){
					$addTable['smb'][$atk] = $atv;
				}
			}
			
			if($dataArr['sma_id'] > 0){
				$this->set('stand_model_any', $addTable['sma'], sprintf(" and sma_id=%d", $dataArr['sma_id']));
				//othsma
				if(!empty($postData['othsma']))
				{
					$othSmaArr = [];
					foreach(explode(',', $postData['othsma']) as $ts)
					{
						$othSmaArr[] = (int) $ts;
					}
					$sfiled = ['sma_gxb_code', 'sma_gxb_code_show', 'sma_gtype', 'sma_brand', 'sma_engine', 'sma_cc', 'sma_kw', 'sma_length', 'sma_width', 'sma_height', 'sma_wheel', 'sma_axle', 'sma_weight','sma_passenger', 'sma_vtype', 'sma_etime'];
					$othtArr = [];
					foreach($sfiled as $tf)
					{
						if(isset($dataArr[$tf])) $othtArr[$tf] = $dataArr[$tf];
					}
					$this->set('stand_model_any', $othtArr, sprintf(" and sma_id in (%s)", implode(',', $othSmaArr)));
					$this->set('stand_model_any', ['sma_from'=>'manual'], sprintf(" and sma_id in (%s) and sma_from ='ocr'", implode(',', $othSmaArr)));
				}
			}else{
				$res = $this->add('stand_model_any', $addTable['sma']);
				$dataArr['sma_id'] = $res['data'];
			}

			//电池信息
			if($addTable['smb']){
				$addTable['smb']['smb_vin'] = $dataArr['sma_vin'];
				$addTable['smb']['smb_etime'] = time();
				if(isset($addTable['smb']['smb_batcode_show'])) $addTable['smb']['smb_batcode'] = LibFc::FormatNum($addTable['smb']['smb_batcode_show']);
				$this->add('stand_model_battery', $addTable['smb'], 'replace');
			}
			
			//收集识别错误的图片
			if(!empty($postData['revin']) && !empty($postData['revinimg']) && $postData['revin'] != $dataArr['sma_vin'])
			{
				$errImg = mvc::$cfg['AUTOLOAD']['Ypw']['path'].'errvinimg/'.$dataArr['sma_vin'].'.jpg';
				$LibHttp = new LibHttp();
				$html = $LibHttp->fetch($postData['revinimg']);
				@file_put_contents($errImg, $html);
			}

			//othvii 批量处理图片
			if(!empty($postData['othvii']))
			{
				$idsArr = [];
				foreach(explode(',', $postData['othvii']) as $ts)
				{
					$idsArr[] = (int) $ts;
				}
				$res = $this->get('stand_vin_imgs', ['vii_id', 'vii_status', 'vii_vin'], sprintf(' and vii_id in (%s)', implode(',', $idsArr)));
				if(!empty($res['data']))
				{
					$hasArr = [];
					$othviiArr = $res['data'];
					$tvins = array_column($othviiArr, 'vii_vin');
					$tvals = [];
					foreach($tvins as $tik=>$tiv)
					{
						$tvals[] = $tiv;
						if(($tik+1)%500 == 0 || ($tik+1) == count($tvins))
						{
							$res = $this->get('stand_model_any', ['sma_id', 'sma_vin', 'sma_from'], sprintf(" and sma_vin in ('%s')", implode("','", $tvals)));
							foreach($res['data'] as $rv)
							{
								$hasArr[$rv['sma_vin']] = $rv;
							}
							$tvals = [];
						}
					}

					$comSet = [];
					$sfiled = ['sma_gxb_code', 'sma_gxb_code_show', 'sma_gtype', 'sma_brand', 'sma_engine', 'sma_cc', 'sma_kw', 'sma_length', 'sma_width', 'sma_height', 'sma_wheel', 'sma_axle', 'sma_weight','sma_passenger', 'sma_vtype', 'sma_etime'];
					foreach($sfiled as $tf)
					{
						if(isset($dataArr[$tf])) $comSet[$tf] = $dataArr[$tf];
					}
					$okviiVin = [];
					foreach($othviiArr as $tvii)
					{
						if(empty($okviiVin[$tvii['vii_vin']]))
						{
							$othtArr = $comSet;
							$othtArr['sma_vin'] = $tvii['vii_vin'];
							$chk = LibFc::VinCheckCode($othtArr['sma_vin']);
							if(!$chk['ok']) return LibFc::ReturnData(false, $othtArr['sma_vin'].'VIN有误,不能通过校验');
							if(!empty($hasArr[$othtArr['sma_vin']]))
							{
								if($hasArr[$othtArr['sma_vin']]['sma_from'] == 'ocr') $othtArr['sma_from'] = 'manual';
								$tsmaid = $hasArr[$othtArr['sma_vin']]['sma_id'];
								$this->set('stand_model_any', $othtArr, sprintf(" and sma_vin ='%s'", $othtArr['sma_vin']));
							}
							else
							{
								$othtArr['sma_from'] = 'manual';
								$othtArr['sma_vin1_3'] = substr($othtArr['sma_vin'], 0, 3);
								$othtArr['sma_vin1_8'] = substr($othtArr['sma_vin'], 0, 8);
								$othtArr['sma_vin10'] = substr($othtArr['sma_vin'], 9, 1);
								$othtArr['sma_vin10_12'] = substr($othtArr['sma_vin'], 9, 3);
								$othtArr['sma_vin13_17'] = substr($othtArr['sma_vin'], 12, 5);
								$othtArr['sma_vin10_11'] = substr($othtArr['sma_vin'], 9, 2);
								$othtArr['sma_vin12_17'] = substr($othtArr['sma_vin'], 11, 6);
								$othtArr['sma_vyear'] = LibFc::VinYear($othtArr['sma_vin10']);
								$res = $this->add('stand_model_any', $othtArr);
								$tsmaid = $res['data'];
							}
							$hasArr[$othtArr['sma_vin']] = ['sma_id'=>$tsmaid];
							$okviiVin[$tvii['vii_vin']] = $tsmaid;
							$tsetVii = [
								'vii_status'=>1,
								'vii_check_uid'=>mvc::$cfg['LOGUSER']['uid'],
								'vii_check_time'=>time(),
							];
							$this->set('stand_vin_imgs', $tsetVii, sprintf(' and vii_id=%d and vii_status != 1',$tvii['vii_id']));

							$tsetVii = [
								'vii_status'=>-4,
								'vii_check_uid'=>mvc::$cfg['LOGUSER']['uid'],
								'vii_check_time'=>time()
							];
							$this->set('stand_vin_imgs', $tsetVii, sprintf(" and vii_vin='%s' and vii_id!=%d and vii_status != 1", $tvii['vii_vin'], $tvii['vii_id']));
						}
						else
						{
							$tsetVii = [
								'vii_status'=>-4,
								'vii_check_uid'=>mvc::$cfg['LOGUSER']['uid'],
								'vii_check_time'=>time()
							];
							$this->set('stand_vin_imgs', $tsetVii, sprintf(' and vii_id=%d and vii_status != 1',$tvii['vii_id']));
						}
						
					}
				}
			}

			//是否有规则 工信部型号+vin1-8+vin10-12
			$res = $this->get('stand_model_reg', ['smr_id'], sprintf(" and smr_gxb_code='%s' and smr_vin1_8='%s' and smr_vin10_12='%s' limit 1", $dataArr['sma_gxb_code'], $dataArr['sma_vin1_8'], $dataArr['sma_vin10_12']), true);
			if(empty($res['data']))
			{
				$regAdd = [
					'smr_gxb_code'=>$dataArr['sma_gxb_code'],	
					'smr_vin1_8'=>$dataArr['sma_vin1_8'],	
					'smr_vin10_12'=>$dataArr['sma_vin10_12'],
					'smr_vin_count'=>1,
					'smr_vin13_17_min'=>$dataArr['sma_vin13_17'],
					'smr_vin13_17_max'=>$dataArr['sma_vin13_17'],
					'smr_vin_time_min'=>$dataArr['sma_year'],
					'smr_add_user'=>mvc::$cfg['LOGUSER']['urname'],
					'smr_add_time'=>time()
				];
				$this->add('stand_model_reg', $regAdd);
			}

			//制造国 生产厂家
			$isJinkou = in_array(substr($dataArr['sma_vin'], 0, 1), ['L','H'])? false: true;
			if($isJinkou && !empty($dataArr['sma_brand']) && (!empty($postData['vin']['sgv_country']) || !empty($postData['vin']['sgv_company'])))
			{
				if(isset($postData['vin']['sgv_company'])) $postData['vin']['sgv_company'] = LibFc::reBrandName($postData['vin']['sgv_company']);
				$chkwhere = sprintf(" and sgv_vin1_8='%s' and sgv_gxb_code='%s' and sgv_org_brand='%s'", $dataArr['sma_vin1_8'], $dataArr['sma_gxb_code'], $dataArr['sma_brand']);
				$chk = $this->get('stand_gxb_v8info', ['sgv_country,sgv_company'], $chkwhere, true);
				if(!empty($chk['data'])){
					$setArr = [];
					if(!empty($postData['vin']['sgv_country']) && $chk['data']['sgv_country'] != $postData['vin']['sgv_country'])
						 $setArr['sgv_country'] = $postData['vin']['sgv_country'];
					if(!empty($postData['vin']['sgv_company']) && $chk['data']['sgv_company'] != $postData['vin']['sgv_company'])
						 $setArr['sgv_company'] = $postData['vin']['sgv_company'];
					if(!empty($setArr)){
						$setArr['sgv_etime'] = time();
						$setArr['sgv_uid'] = $_SESSION['admin_userid'];
						$this->set('stand_gxb_v8info', $setArr, $chkwhere);
					}
				}else{
					$setArr = [
						'sgv_vin1_8'=>$dataArr['sma_vin1_8'],
						'sgv_gxb_code'=>$dataArr['sma_gxb_code'],
						'sgv_org_brand'=>$dataArr['sma_brand'],
						'sgv_gxb_code_show'=>$dataArr['sma_gxb_code_show'],
						'sgv_etime'=>time(),
						'sgv_uid'=>$_SESSION['admin_userid']
					];
					if(!empty($postData['vin']['sgv_country'])) $setArr['sgv_country'] = $postData['vin']['sgv_country'];
					if(!empty($postData['vin']['sgv_company'])) $setArr['sgv_company'] = $postData['vin']['sgv_company'];
					$this->add('stand_gxb_v8info', $setArr);
				}
			}

			//功率
			if(!empty($postData['kwtype']) && !empty($dataArr['sma_kw']) && $dataArr['sma_engine'] != '')
			{
				$kwfiled = 'ckw_'.$postData['kwtype'].'_kw';
				$addArr = [
					'ckw_gxb_format'=>$dataArr['sma_gxb_code'],
					'ckw_engine'=>$dataArr['sma_engine'],
					'ckw_uid'=>$_SESSION['admin_userid'],
					'ckw_etime'=>time(),
					'ckw_from'=>'manual'
				];

				$chkwhere = sprintf(" and ckw_gxb_format='%s' and ckw_engine='%s'", $addArr['ckw_gxb_format'], $addArr['ckw_engine']);
				if($isJinkou){
					$addArr['ckw_brand'] = $dataArr['sma_brand'];
					$chkwhere .= sprintf(" and ckw_brand='%s'", $addArr['ckw_brand']);
				}
				$cres = $this->get('stand_gxbengine_kw', ['ckw_id,ckw_ed_kw,ckw_jgl_kw'], $chkwhere, true);
				if(!empty($cres['data'])){
					$old = $cres['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']);
					//设置额定功率，如果这个值在净功率里则去掉
					if($kwfiled == 'ckw_ed_kw' && in_array($dataArr['sma_kw'], $old['ckw_jgl_kw']))
					{
						foreach($old['ckw_jgl_kw'] as $tk=>$tv)
						{
							if($dataArr['sma_kw'] == $tv) unset($old['ckw_jgl_kw'][$tk]);
						}
						$addArr['ckw_jgl_kw'] = implode(',', $old['ckw_jgl_kw']);
					}
					if($kwfiled == 'ckw_jgl_kw' && in_array($dataArr['sma_kw'], $old['ckw_ed_kw']))
					{
						foreach($old['ckw_ed_kw'] as $tk=>$tv)
						{
							if($dataArr['sma_kw'] == $tv) unset($old['ckw_ed_kw'][$tk]);
						}
						$addArr['ckw_ed_kw'] = implode(',', $old['ckw_ed_kw']);
					}
					if(!in_array($dataArr['sma_kw'], $old[$kwfiled]))
					{
						if($isJinkou){
							$tn = $old[$kwfiled];
							$tn[] = $dataArr['sma_kw'];
							sort($tn);
							$addArr[$kwfiled] = implode(',', $tn);
						}else{
							$addArr[$kwfiled] = $dataArr['sma_kw'];
						}
					}
					if(isset($addArr['ckw_ed_kw']) || isset($addArr['ckw_jgl_kw']))
						$this->set('stand_gxbengine_kw', $addArr, sprintf(" and ckw_id=%d", $cres['data']['ckw_id']));
				}else{
					$addArr[$kwfiled] = $dataArr['sma_kw'];
					$this->add('stand_gxbengine_kw', $addArr);
				}
			}
		}

		//VIN 纠错处理
		if(!empty($postData['ve_id']))
		{
			$res = $PjlBase->get('pl_vin_error', ['ve_id', 've_vin', 've_status'], sprintf(" and ve_id=%d", $postData['ve_id']), true);
			$oldVeArr = $res['data'];

			$setArr = ['ve_vin'=>$dataArr['sma_vin']];
			if(!empty($postData['err']))
			{
				$setArr['ve_status'] = (int) $postData['err']['ve_status'];
				$setArr['ve_check'] =json_encode(['uid'=>mvc::$cfg['LOGUSER']['uid'],'remark'=>$postData['err']['remark'],'time'=>time()],JSON_UNESCAPED_UNICODE);
			}
			
			if($setArr['ve_status'] == 1){
				$twhere = sprintf(" and (ve_id=%d or (ve_status = 0 and ve_vin='%s'))", $postData['ve_id'], $setArr['ve_vin']);
			}else{
				$twhere = sprintf(" and ve_id=%d", $postData['ve_id']);
			}
			$nres = $PjlBase->get('pl_vin_error', ['ve_id', 've_vin', 've_status', 've_uid', 've_byinfo', 've_from'], $twhere);
			foreach($nres['data'] as $v)
			{
				$v['ve_byinfo'] = json_decode($v['ve_byinfo'], true);
				if($v['ve_from'] == 'ROBOT'){//机器人通知
					if($v['ve_byinfo']['wrt_id'] > 0){
						$B2cBase = new B2cBase();
						$notice = [
							'wrn_wrt_id'=>$v['ve_byinfo']['wrt_id'],
							'wrn_room_id'=>$v['ve_byinfo']['roomId'],
							'wrn_talker_id'=>$v['ve_byinfo']['talkerId'],
							'wrn_info'=>json_encode(["act"=>"jiucuo","vin"=>$setArr['ve_vin'],"ve_status"=>$setArr['ve_status'],'saymsg'=>$postData['err']['remark']]),
							'wrn_atime'=>time()
						];
						$notice['wrn_unikey'] = md5($notice['wrn_wrt_id'].'@'.$notice['wrn_room_id'].'@'.$notice['wrn_talker_id'].'@'.$setArr['ve_vin'].$postData['err']['remark']);
						$res = $B2cBase->get('wx_robot_notice', ['wrn_id'], sprintf(" and wrn_status = 0 and wrn_unikey='%s'", $notice['wrn_unikey']));
						if(empty($res['data']))
							$B2cBase->add('wx_robot_notice', $notice);
					}
				}else if(!empty($v['ve_byinfo']['kefu_uid']) && $v['ve_uid'] != 8){//IM通知
					$msg = '';
					if($setArr['ve_status'] == -1){
						$msg = '您好，车架号【'.$setArr['ve_vin'].'】纠错无效。'.$postData['err']['remark'];
					}else if($setArr['ve_status'] == 1){
						$msg = "您好，车架号【".$setArr['ve_vin']."】纠错处理完成".($postData['err']['remark']? '【'.$postData['err']['remark'].'】': '')."，您可以重新查询解码结果。";
					}
					if($msg){
						$res = $this->get('im_callback', ['icb_id'], sprintf(" and icb_from_uid=%d and icb_to_uid=%d and icb_json LIKE '%%\"Text\":\"%s\"%%' and icb_atime > %d limit 1", $v['ve_byinfo']['kefu_uid'], $v['ve_uid'], $msg, time()-60));
						if(empty($res['data']))
						{
							$LibYpApi = new LibYpApi();
							$LibYpApi->Get('im/sendImMsg', [], ['fromUid'=>$v['ve_byinfo']['kefu_uid'], 'toUid'=>$v['ve_uid'], 'msg'=>$msg]);
							if($setArr['ve_status'] == 1){
								$LibYpApi->Get('im/sendImMsg', [], ['fromUid'=>$v['ve_byinfo']['kefu_uid'], 'toUid'=>$v['ve_uid'], 'msg'=>'{"vin":"'.$setArr['ve_vin'].'","mod3_name":"点击这里查询最新解码结果","msg_type":"vin","mod3_id":0}']);
							}
						}
					}
				}
			}
			$PjlBase->set('pl_vin_error', $setArr, $twhere);

			//车架号发生变化，将图库的一起变更
			if($oldVeArr['ve_vin'] != $setArr['ve_vin']){
				$csetArr = [
					'vii_status'=>0,
					'vii_vin'=>$setArr['ve_vin'],
					'vii_vin1_3'=>substr($setArr['ve_vin'], 0, 3),
					'vii_vin1_8'=>substr($setArr['ve_vin'], 0, 8),
					'vii_vin10_12'=>substr($setArr['ve_vin'], 9, 3),
					'vii_vin13_17'=>substr($setArr['ve_vin'], 12, 5),
					'vii_year'=>LibFc::VinYear(substr($setArr['ve_vin'], 9, 1)),	
				];
				if($setArr['ve_status'] == 1){//有效的
					$csetArr['vii_status'] = 1;
					$csetArr['vii_check_uid'] = mvc::$cfg['LOGUSER']['uid'];
					$csetArr['vii_check_time'] = time();
				}
				$this->set('stand_vin_imgs', $csetArr, sprintf(" and vii_status in (0,-1,-4) and vii_vin='%s'", $oldVeArr['ve_vin']));
			}
		}
		
		//图片识别
		if(!empty($postData['vii_id']))
		{
			$viiId = (int) $postData['vii_id'];
			$setArr = [
				'vii_vin'=>$dataArr['sma_vin'],
				'vii_vin1_3'=>substr($dataArr['sma_vin'], 0, 3),
				'vii_vin1_8'=>substr($dataArr['sma_vin'], 0, 8),
				'vii_vin10_12'=>substr($dataArr['sma_vin'], 9, 3),
				'vii_vin13_17'=>substr($dataArr['sma_vin'], 12, 5),
				'vii_year'=>LibFc::VinYear(substr($dataArr['sma_vin'], 9, 1)),	
			];
			//非发动机编码查询时间，并且行驶证型号不清楚
			if(!empty($postData['vii_status']) && $postData['vii_status'] == 'xszeng6')
			{
				//$setArr['vii_xszeng6'] = 1;
				$this->set('stand_vin_imgs', $setArr, sprintf(' and vii_id=%d',$viiId));
			}
			else
			{
				//是否有审核
				if(isset($postData['vii_status']) && $postData['vii_status'] == 1 && empty($dataArr['sma_id']))
				{}
				else if(isset($postData['vii_status']))
				{
					$setArr['vii_status'] = (int) $postData['vii_status'];
					//是否之前有人处理过并且设置为有效
					$res = $this->get('stand_vin_imgs', ['vii_check_uid', 'vii_status'], sprintf(' and vii_id=%d and vii_check_uid > 0', $viiId), true);
					$last = $res['data'];
					//未处理，或者是同一个人，或者状态发生变化
					if(empty($last) || $last['vii_check_uid'] == mvc::$cfg['LOGUSER']['uid'] || $setArr['vii_status'] != $last['vii_status'])
					{
						$setArr['vii_check_uid'] = mvc::$cfg['LOGUSER']['uid'];
						$setArr['vii_check_time'] = time();
					}
				}
				if(!empty($setArr['vii_status']) && $setArr['vii_status'] == -1)
				{
					$ires = $this->get('stand_vin_imgs', ['vii_id', 'vii_imghost', 'vii_img'], sprintf(' and vii_id=%d',$viiId));
					$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['HOST']['VINADMIN67'].'VinTj/delVinOcrImg', $delArr);
					}
					$this->del('stand_vin_imgs', sprintf(' and vii_id=%d',$viiId));
					$this->del('stand_vin_imgs_retask', sprintf(' and vir_vii_id=%d',$viiId));
				}
				else
				{
					$this->set('stand_vin_imgs', $setArr, sprintf(' and vii_id=%d',$viiId));

					$ires = $this->get('stand_vin_imgs', ['vii_id', 'vii_imghost', 'vii_img'], sprintf(" and vii_id != %d and vii_status in (0,-2,-3,-5) and vii_vin='%s'", $viiId, $dataArr['sma_vin']));
					$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['HOST']['VINADMIN67'].'VinTj/delVinOcrImg', $delArr);
					}
					$this->set('stand_vin_imgs', ['vii_status'=>-4], sprintf(" and vii_id != %d and vii_status in (0,-2,-3,-5) and vii_vin='%s'", $viiId, $dataArr['sma_vin']));
				}
			}
		}
		$Params['smaId'] = $dataArr['sma_id'];

		if($postData['vie_unicode']){
			$unicode = strtoupper(trim($postData['vie_unicode']));
			$res = $this->get('stand_vin_epccode', ['vie_unicode'], sprintf(" and vie_vin = '%s'", $dataArr['sma_vin']), true);
			if(empty($res['data']) || $res['data']['vie_unicode'] != $unicode){
				$add = [
					'vie_vin'=>$dataArr['sma_vin'],
					'vie_unicode'=>$unicode,
					'vie_from'=>'manual',
					'vie_etime'=>time()
				];
				$this->replace('stand_vin_epccode', $add);
			}
		}

		$this->YpwDb->End();
		return LibFc::ReturnData(true, ['Params'=>$Params]);
	}


	function standModelAnySet($dataArr)
	{
		$setArr = [];
		//批量修改
		if(!empty($dataArr['ids']))
		{
			// 整形字段
			$initFileds = ['sma_length','sma_width','sma_height', 'sma_wheel','sma_axle','sma_weight','sma_passenger'];
			foreach($dataArr as $filed=>$val)
			{
				if((stripos($filed, 'sma_') === 0 && !empty($val)) || ($filed == 'sma_engine' && $val != ''))
				{
					if(in_array($filed, $initFileds)) $val = (int) $val;
					$setArr[$filed] = $val;
				}
			}
			if(isset($setArr['sma_gxb_code_show'])){
				$setArr['sma_gxb_code'] = LibFc::FormatNum($setArr['sma_gxb_code_show']);
				$setArr['sma_gtype'] = LibFc::getGxbCarType($setArr['sma_gxb_code']);
			}

			$idArr = [];
			foreach(explode(',', $dataArr['ids']) as $id)
			{
				$idArr[] = (int) $id;
			}
			if(!empty($setArr)){
				$setArr['sma_etime'] = time();
				$this->set('stand_model_any', $setArr, sprintf(" and sma_id in (%s)", implode(',', $idArr)));
			}
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, '获取数据失败');
	}


	//改刷车架号
	function setViiVin($vin, $viiId, $smaId = 0)
	{
		$smaId = (int) $smaId;
		$viiId = (int) $viiId;
		$vin = LibFc::FormatVin($vin);
		if(strlen($vin) == 17)
		{
			$chk = LibFc::VinCheckCode($vin);
			if(!$chk['ok']) return LibFc::ReturnData(false, 'VIN有误,不能通过校验');
			$PjlBase= new PjlBase();
			$this->YpwDb->Begin();
			if(!empty($smaId))
			{
				//VIN已存在600W中，则删除旧的ID
				$res = $this->get('stand_model_any', ['sma_id'], sprintf(" and sma_vin='%s' and sma_id !=%d", $vin, $smaId), true);
				{
					$osmaId = $res['data']['sma_id'];
					$this->del('stand_model_any', sprintf(" and sma_id=%d", $osmaId));
				}
				//if(!empty($res['data']))   return LibFc::ReturnData(false, 'VIN已存在600W中，改刷失败。如确认无误，可点保存进行覆盖！');

				$setArr = [
					'sma_vin'=>$vin,
					'sma_vin1_3'=>substr($vin, 0, 3),
					'sma_vin1_8'=>substr($vin, 0, 8),
					'sma_vin10'=>substr($vin, 9, 1),
					'sma_vin10_12'=>substr($vin, 9, 3),
					'sma_vin13_17'=>substr($vin, 12, 5),
					'sma_vin10_11'=>substr($vin, 9, 2),
					'sma_vin12_17'=>substr($vin,11, 6)
				];
				$setArr['sma_vyear'] = LibFc::VinYear($setArr['sma_vin10']);
				$this->set('stand_model_any', $setArr, ' and sma_id='.$smaId);
			}

			$setArr = [
				'vii_vin'=>$vin,
				'vii_vin1_3'=>substr($vin, 0, 3),
				'vii_vin1_8'=>substr($vin, 0, 8),
				'vii_vin10_12'=>substr($vin, 9, 3),
				'vii_vin13_17'=>substr($vin, 12, 5),
				'vii_year'=>LibFc::VinYear(substr($vin, 9, 1)),	
			];
			$res = $this->set('stand_vin_imgs', $setArr, ' and vii_id='.$viiId);
			$this->YpwDb->End();
			return $res;
		}
		return LibFc::ReturnData(false, 'VIN长度不是17位，只有'.strlen($vin));
	
	}

	//审核VIN规则
	function checkVinReg($smr_id, $smr_status)
	{
		$res = $this->get('stand_model_reg', ['*'], sprintf(" and smr_id=%d", $smr_id), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '规则不存在！');
		
		$regArr = $res['data'];
		$setArr = [
			'smr_edit_user'=>mvc::$cfg['LOGUSER']['urname'],
			'smr_edit_time'=>time(),
			'smr_check_user'=>mvc::$cfg['LOGUSER']['urname'],
			'smr_check_time'=>time(),
		];

		$smr_status = (int) $smr_status;
		switch($smr_status)
		{
			case 1:
			case -1:
				$setArr['smr_status'] = $smr_status;
				$this->set('stand_model_reg', $setArr, sprintf(" and smr_id=%d", $regArr['smr_id']));
			break;
			//删除
			case -2:
				$where = sprintf(" and sma_gxb_code='%s' and sma_vin1_8='%s' and sma_vin10_12='%s'", $regArr['smr_gxb_code'], $regArr['smr_vin1_8'], $regArr['smr_vin10_12']);
				$this->del('stand_model_any', $where);

				$where = sprintf(" and vii_vin like '%s_%s%%' and vii_status = 1", $regArr['smr_vin1_8'], $regArr['smr_vin10_12']);
				$this->set('stand_vin_imgs', ['vii_status'=>0, 'vii_check_uid'=>0, 'vii_check_time'=>0], $where);
				$this->del('stand_model_reg', sprintf(" and smr_id=%d", $regArr['smr_id']));
			break;
		}
		$this->YpwDb->End();
		return LibFc::ReturnData(true);
	}


	//更新本地车型工信部型号到线上
	function updateYpcarGxbcode()
	{
		set_time_limit(0);
        $lockFile = mvc::$cfg['AUTOLOAD']['Ypw']['path'].'cache/Lock_updateYpcarGxbcode.txt';
        if(file_exists($lockFile)  && (time() - filemtime($lockFile)) < 60)
		{
			return LibFc::ReturnData(false, '上次任务尚未执行完毕，请稍等。');
		};
        file_put_contents($lockFile, 'lock');
		$this->YpwDb->Begin();
		$Ypc67Base = new BaseDb(mvc::$cfg['DB']['YPCAR67']);
		$this->del('stand_model_ypgxb', ' and 1');
		$table = 'yp_model3 JOIN yp_vin_model3_link ON m3_id=vm3_m3_id JOIN yp_model3_gxb_num ON vm3_m3_id = mg_m3_id JOIN yp_vin ON vin_id = vm3_vin_id';
		$fileds = ['concat(vin_vin3, vin_match) as gxb_vin1_8', 'mg_code as gxb_code', 'COUNT(*) AS gxb_m3_count', "CASE WHEN SUM(CASE WHEN m3_from = 'kcauto' THEN 1 ELSE 0 END) > 0  THEN 1 ELSE 0 END gxb_kcauto", "CASE WHEN SUM(CASE WHEN m3_from != 'kcauto' THEN 1 ELSE 0 END) > 0  THEN 1 ELSE 0 END gxb_manual"];
		$res = $Ypc67Base->get($table, $fileds, ' GROUP BY vin_vin3, vin_match,mg_code');
		$addAny = [];
		foreach($res['data'] as $k=>$v)
		{
			$addAny[] = $v;
			if(count($addAny) == 1000 || ($k+1) == count($res['data']))
			{
				$this->addAny('stand_model_ypgxb', array_keys($addAny[0]), $addAny);
				$addAny = [];
			}
		}
		$this->YpwDb->End();
		@unlink($lockFile);
		return LibFc::ReturnData(true);
	}


	//添加编辑WMI&品牌
	function setWmiAndBrand($swb_id, $dataArr)
	{
		$reArr = [' '=>'', "\r"=>'', "\n"=>'','，'=>',', '；'=>',', ';'=>','];
		$dataArr['swb_brand'] = LibFc::reBrandName(strtr($dataArr['swb_brand'], $reArr));
		$dataArr['swb_word'] = strtr($dataArr['swb_word'], $reArr);
		$setArr = [
			'swb_wmi'=>strtoupper(trim($dataArr['swb_wmi'])),
			'swb_brand'=>trim($dataArr['swb_brand']),
			'swb_word'=>trim($dataArr['swb_word']),
			'swb_etime'=>time()
		];
		if(!preg_match('/^[a-zA-Z0-9]{3}$/', $setArr['swb_wmi'], $match)) LibFc::ReturnJson(false, 'WMI不正确');
		if(empty($setArr['swb_brand'])) LibFc::ReturnJson(false, '品牌名不能为空');
	
		$swb_word = $setArr['swb_word'].','.$setArr['swb_brand'];
		$twords = [];
		foreach(explode(',', $swb_word) as $word)
		{
			if(!empty($word))
				$twords[] = $word;
		}
		$twords = array_unique($twords);
		sort($twords);
		$this->YpwDb->Begin();
		
		//合并前删除独立存在的
		foreach($twords as $tw)
		{
			if(!empty($tw) && $tw != $setArr['swb_brand'])
			{
				$where = sprintf(" and swb_id !=%d and swb_wmi='%s' and swb_brand='%s' and swb_word = ',%s,'", $swb_id, LibFc::Escape($setArr['swb_wmi']), LibFc::Escape($tw), LibFc::Escape($tw));
				$this->del('stand_wmi_brand', $where);
			}
		}

		$setArr['swb_word'] = ','.implode(',', $twords).',';
		if(!empty($swb_id))
		{
			$this->set('stand_wmi_brand', $setArr, sprintf(" and swb_id=%d", $swb_id));
		}
		else
		{
			$this->add('stand_wmi_brand', $setArr);
		}

		foreach($twords as $tw)
		{
			if(!empty($tw) && $tw != $setArr['swb_brand'])
			{
				$where = sprintf(" and sma_vin1_3='%s' and sma_brand='%s' and sma_brand != '%s'", LibFc::Escape($setArr['swb_wmi']), LibFc::Escape($tw), LibFc::Escape($setArr['swb_brand']));
				$this->set('stand_model_any', ['sma_brand'=>$setArr['swb_brand']], $where);

				$where = sprintf(" and gp_gb_id = gb_id AND gp_gl_code = 'vin18' and gb_type='gxb' AND gp_value LIKE '%s%%' and gb_brand='%s' and gb_brand != '%s'", LibFc::Escape($setArr['swb_wmi']), LibFc::Escape($tw), LibFc::Escape($setArr['swb_brand']));
				$this->set('gxb_base,gxb_params', ['gb_brand'=>$setArr['swb_brand']], $where);
			}
		}
		$this->YpwDb->End();
		return LibFc::ReturnData(true);
	}


	//添加编辑功率
	function setEngineKw($dataArr)
	{
		$reArr = ['，'=>',', '；'=>',', ';'=>','];
		foreach(['ckw_ed_kw', 'ckw_jgl_kw'] as $tf){
			if(isset($dataArr[$tf])){
				$tval = [];
				foreach(explode(',', strtr($dataArr[$tf], $reArr)) as $tv)
				{
					if(!empty($tv)) $tval[] = $tv;
				}
				$tval = array_unique($tval);
				sort($tval);
				$dataArr[$tf] = implode(',', $tval);
			}
		}
		$setArr = [];
		//批量修改
		if(!empty($dataArr['ids']))
		{
			if(!empty($dataArr['ckw_brand'])) $setArr['ckw_brand'] = $dataArr['ckw_brand'];
			if(!empty($dataArr['ckw_txt_kw'])) $setArr['ckw_txt_kw'] = $dataArr['ckw_txt_kw'];
			if(!empty($dataArr['ckw_xuhang'])) $setArr['ckw_xuhang'] = $dataArr['ckw_xuhang'];
			if(!empty($dataArr['ckw_dianchi'])) $setArr['ckw_dianchi'] = $dataArr['ckw_dianchi'];
			if(!empty($dataArr['ckw_paifang'])) $setArr['ckw_paifang'] = $dataArr['ckw_paifang'];
			if(!empty($dataArr['ckw_ed_kw'])) $setArr['ckw_ed_kw'] = $dataArr['ckw_ed_kw'];
			if(!empty($dataArr['ckw_jgl_kw'])) $setArr['ckw_jgl_kw'] = $dataArr['ckw_jgl_kw'];

			$idArr = [];
			foreach(explode(',', $dataArr['ids']) as $id)
			{
				$idArr[] = (int) $id;
			}
			if(!empty($setArr['ckw_ed_kw']) && !empty($setArr['ckw_jgl_kw']) && $setArr['ckw_ed_kw'] <= $setArr['ckw_jgl_kw']) return LibFc::ReturnData(false, '额定功率必须大于净功率');
			if(!empty($setArr))
			{
				$setArr['ckw_uid'] = $_SESSION['admin_userid'];
				$setArr['ckw_etime'] = time();
				$setArr['ckw_from'] = 'manual';
				$this->set('stand_gxbengine_kw', $setArr, sprintf(" and ckw_id in (%s)", implode(',', $idArr)));
			}
			return LibFc::ReturnData(true);
		}
		//单个新增或者修改
		$setArr = [
			'ckw_gxb_format'=>LibFc::FormatNum($dataArr['ckw_gxb_format']),
			'ckw_brand'=>$dataArr['ckw_brand'],
			'ckw_engine'=>$dataArr['ckw_engine'],
			'ckw_txt_kw'=>$dataArr['ckw_txt_kw'],
			'ckw_ed_kw'=>$dataArr['ckw_ed_kw'],
			'ckw_jgl_kw'=>$dataArr['ckw_jgl_kw'],
			'ckw_xuhang'=>$dataArr['ckw_xuhang'],
			'ckw_dianchi'=>$dataArr['ckw_dianchi'],
			'ckw_paifang'=>$dataArr['ckw_paifang'],
			'ckw_uid'=>$_SESSION['admin_userid'],
			'ckw_etime'=>time(),
			'ckw_from'=>'manual',
		];

		if(empty($setArr['ckw_gxb_format'])) return LibFc::ReturnData(false, '工信部型号不能为空');
		if($setArr['ckw_engine'] == '') return LibFc::ReturnData(false, '发动机不能为空');
		//if(!empty($setArr['ckw_ed_kw']) && $setArr['ckw_ed_kw'] <= $setArr['ckw_jgl_kw']) return LibFc::ReturnData(false, '额定功率必须大于净功率');

		if(empty($dataArr['ckw_id']))
		{
			//检测是否存在  进口加上品牌判断
			$where = sprintf(" and ckw_gxb_format='%s' and ckw_engine = '%s'", $setArr['ckw_gxb_format'], LibFc::Escape($setArr['ckw_engine']));
			$chk = $this->get('stand_model_tj', ['smt_id'], sprintf(" and smt_gxb_code='%s' and smt_vin1_8 NOT LIKE 'L%%' AND smt_vin1_8 NOT LIKE 'H%%'", $setArr['ckw_gxb_format']));
			if(!empty($chk['data'])) $where .= sprintf(" and ckw_brand = '%s'", $dataArr['ckw_brand']);

			$res = $this->get('stand_gxbengine_kw', ['ckw_id'], $where, true);
			if(!empty($res['data'])) $dataArr['ckw_id'] = $res['data']['ckw_id'];
		}
		
		if(!empty($dataArr['ckw_id']))
		{
			$this->set('stand_gxbengine_kw', $setArr, sprintf(" and ckw_id=%d", $dataArr['ckw_id']));
		}
		else
		{
			$this->add('stand_gxbengine_kw', $setArr);
		}
		return LibFc::ReturnData(true);
	}

	//添加编辑卡车统计
	function kcSizeTjSet($dataArr)
	{//唯一键 kt_gxb_code, skt_length, skt_width, skt_height, skt_wheel_group, skt_engine, skt_b_name, skt_m_name, skt_m1_name, skt_tran, skt_drive
		$reArr = ['，'=>',', '；'=>',', ';'=>','];
		foreach(['skt_tran'] as $tf){
			if(isset($dataArr[$tf])){
				$tval = [];
				foreach(explode(',', strtr($dataArr[$tf], $reArr)) as $tv)
				{
					if(!empty($tv)) $tval[] = $tv;
				}
				$tval = array_unique($tval);
				sort($tval);
				$dataArr[$tf] = implode(',', $tval);
			}
		}

		$setArr = [];
		//批量修改
		if(!empty($dataArr['ids']))
		{
			if(!empty($dataArr['skt_b_name'])) $setArr['skt_b_name'] = $dataArr['skt_b_name'];
			if(!empty($dataArr['skt_m_name'])) $setArr['skt_m_name'] = $dataArr['skt_m_name'];
			if(!empty($dataArr['skt_m1_name'])) $setArr['skt_m1_name'] = $dataArr['skt_m1_name'];
			if(!empty($dataArr['skt_vtype'])) $setArr['skt_vtype'] = $dataArr['skt_vtype'];
			if(!empty($dataArr['skt_kw'])) $setArr['skt_kw'] = $dataArr['skt_kw'];
			if(!empty($dataArr['skt_cc'])) $setArr['skt_cc'] = $dataArr['skt_cc'];
			if(!empty($dataArr['skt_cc_name'])) $setArr['skt_cc_name'] = $dataArr['skt_cc_name'];
			if(!empty($dataArr['skt_tran'])) $setArr['skt_tran'] = $dataArr['skt_tran'];
			if(!empty($dataArr['skt_drive'])) $setArr['skt_drive'] = $dataArr['skt_drive'];
			if(!empty($dataArr['skt_zwps'])) $setArr['skt_zwps'] = $dataArr['skt_zwps'];
			if(!empty($dataArr['skt_fuel'])) $setArr['skt_fuel'] = $dataArr['skt_fuel'];
			if(!empty($dataArr['skt_lts'])) $setArr['skt_lts'] = $dataArr['skt_lts'];
			$idArr = [];
			foreach(explode(',', $dataArr['ids']) as $id)
			{
				$idArr[] = (int) $id;
			}
			if(!empty($setArr))
			{
				$setArr['skt_uid'] = $_SESSION['admin_userid'];
				$setArr['skt_etime'] = time();
				$this->set('stand_kczj_tj', $setArr, sprintf(" and skt_id in (%s)", implode(',', $idArr)));

				$res = $this->get('stand_kczj_tj', ['distinct skt_gxb_code'], sprintf(" and skt_id in (%s)", implode(',', $idArr)));
				if(!empty($res['data']))
				{
					$LibYpApi = new LibYpApi();
					$LibYpApi->Get('ypc/updateKczjSizeTj', [], ['gxbs'=>implode(',', array_column($res['data'], 'skt_gxb_code'))]);
				}
			}
			return LibFc::ReturnData(true);
		}

		//单个新增或者修改
		$setArr = [
			'skt_uid'=>$_SESSION['admin_userid'],
			'skt_etime'=>time(),
		];
		foreach($dataArr as $filed=>$val)
		{
			if(stripos($filed, 'skt_') === 0) $setArr[$filed] = $val;
		}
		
		$setArr['skt_gxb_code'] = LibFc::FormatNum($setArr['skt_gxb_code_show']);
		$setArr['skt_engine'] = LibFc::FormatEng($setArr['skt_engine_show']);

		$setArr['skt_length'] = (float) $setArr['skt_length'];
		$setArr['skt_width'] = (float) $setArr['skt_width'];
		$setArr['skt_height'] = (float) $setArr['skt_height'];
		$setArr['skt_axle'] = (int) $setArr['skt_axle'];
		$setArr['skt_wheel_group'] = $setArr['skt_axle'] == 2? $setArr['skt_wheel']: '';
		if(empty($setArr['skt_gxb_code'])) return LibFc::ReturnData(false, '工信部型号不能为空');
		if(empty($setArr['skt_engine'])) return LibFc::ReturnData(false, '发动机不能为空');
		
		//skt_gxb_code, skt_length, skt_width, skt_height, skt_wheel_group, skt_engine, skt_b_name, skt_m_name, skt_m1_name, skt_tran, skt_drive
		//检测是否存在
		$where = sprintf(" and skt_gxb_code='%s' and skt_length='%s' and skt_width='%s' and skt_height='%s' and skt_wheel_group='%s' and skt_engine = '%s' 
		and skt_b_name = '%s' and skt_m_name = '%s' and skt_m1_name = '%s' and skt_tran = '%s' and skt_drive = '%s'",
			$setArr['skt_gxb_code'], $setArr['skt_length'],$setArr['skt_width'],$setArr['skt_height'],$setArr['skt_wheel_group'],LibFc::Escape($setArr['skt_engine']),
		LibFc::Escape($setArr['skt_b_name']),LibFc::Escape($setArr['skt_m_name']),LibFc::Escape($setArr['skt_m1_name']),LibFc::Escape($setArr['skt_tran']),LibFc::Escape($setArr['skt_drive']));
		$res = $this->get('stand_kczj_tj', ['skt_id'], $where, true);
		if(!empty($res['data']))
		{
			if(!empty($dataArr['skt_id']))
			{
				if($dataArr['skt_id'] != $res['data']['skt_id'])
				{
					return LibFc::ReturnData(false, '记录已存在，ID：'.$res['data']['skt_id'].'，请排查后重新修改');
				}
			}else{
				$dataArr['skt_id'] = $res['data']['skt_id'];
			}
		}
		if(!empty($dataArr['skt_id']))
		{
			$this->set('stand_kczj_tj', $setArr, sprintf(" and skt_id=%d", $dataArr['skt_id']));
		}
		else
		{
			$this->add('stand_kczj_tj', $setArr);
		}
		
		$LibYpApi = new LibYpApi();
		$LibYpApi->Get('ypc/updateKczjSizeTj', [], ['gxbs'=>$setArr['skt_gxb_code']]);
		return LibFc::ReturnData(true);
	}


	//管理型号电池规则
	function savebatteryReg($postData)
	{
		$this->YpwDb->Begin();
		$postData['sgby_gxb_code'] = LibFc::FormatNum($postData['sgby_gxb_code_show']);
		$addArr = []; $setArr = [];
		$delIds = [];
		foreach($postData['reg'] as $kid=>$v){
			$kid = (int) $kid;
			$v['sgby_etime'] = time();
			$v['sgby_uid'] = mvc::$cfg['LOGUSER']['uid'];
			if($kid > 0){
				if($v['del']){
					$delIds[] = $kid;
				}else{
					$setArr[$kid] = $v;
				}
			}else{
				if($postData['sgby_vin1_8'] && $postData['sgby_gxb_code_show']  && $postData['sgby_engine'] && ($v['sgby_engine_b'] || $v['sgby_capacity'] || $v['sgby_voltage'])){
					$v['sgby_vin1_8'] = LibFc::FormatNum($postData['sgby_vin1_8']);
					$v['sgby_gxb_code_show'] = $postData['sgby_gxb_code_show'];
					$v['sgby_gxb_code'] = $postData['sgby_gxb_code'];
					$v['sgby_engine'] = $postData['sgby_engine'];
					if($postData['sgby_vin']) $v['sgby_vin'] = LibFc::FormatVin($postData['sgby_vin']);
					$v['sgbt_status'] = 1;
					if(strlen($v['sgby_vin1_8']) == 8 && strlen($v['sgby_gxb_code']) > 2)
						$addArr[$kid] = $v;
				}
			}
		}

		if($postData['sgbt_status'] == 1){
			foreach($setArr as $kid=>$v){
				$v['sgbt_status'] = $v['sgby_engine_b'] || $v['sgby_capacity'] || $v['sgby_voltage']? 1: 0;
				$this->set('stand_gxb_battery', $v, sprintf(" and sgby_id =%d", $kid));
			}
			foreach($addArr as $kid=>$v){
				$this->add('stand_gxb_battery', $v);
			}
			if($delIds){
				$this->del('stand_gxb_battery', sprintf(" and sgby_id in (%s)", implode(',', $delIds)));
			}
			$sql = "UPDATE stand_gxb_battery JOIN (
			SELECT sma_vin1_8, sma_gxb_code, sma_engine, COUNT(*) vin_count FROM stand_vin_imgs_retask t  
			JOIN stand_model_any sma ON sma_vin = vir_vin AND vir_status = 2 AND vir_type = 'battery'
			WHERE sma_gxb_code ='".$postData['sgby_gxb_code']."'
			GROUP BY sma_vin1_8, sma_gxb_code, sma_engine
			) t ON sgby_vin1_8 = sma_vin1_8 AND sgby_gxb_code = sma_gxb_code AND sma_engine = sgby_engine
			SET sgby_vin_count = vin_count";
			$this->exeAnySql([$sql]);
		}else if($postData['sgbt_status'] == -1){
			$this->set('stand_gxb_battery', ['sgbt_status'=>-1, 'sgby_etime'=>time(), 'sgby_uid'=>mvc::$cfg['LOGUSER']['uid']],sprintf(" and sgby_id in (%s)", implode(',', array_keys($setArr))));
		}
		$this->YpwDb->End();
		return LibFc::ReturnData(true);
	}
}