package com.zteits.job.task.getfreeberths;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.clouds.common.cache.park.ParkFreeBerthsCacheUtil;
import com.clouds.common.utils.ApprntSignUtil;
import com.xiaoleilu.hutool.util.CollectionUtil;
import com.zteits.clouds.api.apibase.constants.AppPublicArgsEnum;
import com.zteits.clouds.api.apibase.constants.SourceTypeEnum;
import com.zteits.clouds.api.dto.order.parkorder.param.pushfreeberths.PushFreeBerthsChangeRequest;
import com.zteits.clouds.api.dto.rocketmq.datacollection.freeberths.FreeBerthsChangeMsgVO;
import com.zteits.job.dao.park.ParkFreeBerthDao;
import com.zteits.job.dao.park.ParkingLotDao;
import com.zteits.job.domain.ParkingLot;
import com.zteits.job.domain.ParkingLotExample;
import com.zteits.job.task.getfreeberths.param.GetRealFreeBerthsDO;
import com.zteits.job.util.HttpClientTutorial;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 调用道闸接口,获取真实的空闲车位数
* 青岛,南泽厂家
* .
*
* Copyright: Copyright (c) 2017 zteits
*
* @ClassName: GetRealFreeBerthsJob
* @Description:
* @version: v1.0.0
* @author: zhaowg
* @date: 2018年5月11日 下午5:47:42
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2018年5月11日 zhaowg v1.0.0 创建
*/
@Component
public class GetRealFreeBerthsJob{
private static final Logger logger = LoggerFactory.getLogger(GetRealFreeBerthsJob.class);
/** 私钥key. */
public static final String app_id = "test8f5373ca4866aec2f8e9d93632323";
/** 私钥value. */
public static final String secret_key = "test55dfdf27b13840c2a4af6wewtrer";
@Value("${dzurl.qingdao}")
private String qingdaoUrl;
@Value("${dzurl.nanze}")
private String nanzeUrl;
@Autowired
private ParkingLotDao parkingLotDao;
@Autowired
private ParkFreeBerthDao parkFreeBerthDao;
/**
* 间隔10秒执行一次
*
* 2018年5月4日 zhaowg
*/
@Scheduled(fixedDelay=10000)
public void execute(){
logger.debug("开始查询是南泽和青岛的停车场");
if(StringUtils.isBlank(qingdaoUrl) || StringUtils.isBlank(nanzeUrl)){
return;
}
ParkingLotExample example = new ParkingLotExample();
List sourceTypes = new ArrayList<>();
sourceTypes.add(4);//南泽
sourceTypes.add(6);//青岛
example.createCriteria()
.andStateEqualTo(1)
.andSourceTypeIn(sourceTypes);
List parkingLots = parkingLotDao.selectByExample(example);
//获取空闲车位
this.updateParkFreeBerths(parkingLots);
}
private void updateParkFreeBerths(List parkingLots) {
if(CollectionUtil.isEmpty(parkingLots)){
return;
}
List berthsChangeMsgVOs = new ArrayList<>();
for (ParkingLot parkingLotDTO : parkingLots) {
String plNo = parkingLotDTO.getPlNo();
GetRealFreeBerthsDO getRealFreeBerthsDO = queryFreeBerths(parkingLotDTO.getPlNo(),parkingLotDTO.getSourceType());
if(getRealFreeBerthsDO == null){
continue;
}
//调用接口返回的真实空闲车位数,可能为负数或者超过总车位数
Integer realFreeBerths = StringUtils.isBlank(getRealFreeBerthsDO.getFreeParkingSpace())?0:Integer.valueOf(getRealFreeBerthsDO.getFreeParkingSpace());
//修改后的空闲车位数,最小0,最大不超过总车位数
Integer freeBerths = realFreeBerths;
//判断数据有效性
if(freeBerths<0){
logger.debug("返回的空闲车位数小于0,修改为0");
freeBerths = 0;
}else if(freeBerths>parkingLotDTO.getPlBerthNum()){
logger.debug("返回的空闲车位数大于总车位数"+parkingLotDTO.getPlBerthNum()+",修改为总车位数");
freeBerths = parkingLotDTO.getPlBerthNum();
}
//判断缓存中空闲车位数是否发生变化了
FreeBerthsChangeMsgVO freeBerthsChangeMsgVO = ParkFreeBerthsCacheUtil.getFreeBerthsObjectByPlNo(plNo);
if(freeBerthsChangeMsgVO==null){
continue;
}
if(freeBerthsChangeMsgVO.getRealFreeBerths() != realFreeBerths){
logger.debug(plNo+"-原来真实空闲车位数:"+freeBerthsChangeMsgVO.getRealFreeBerths()+",新真实空闲车位数:"+realFreeBerths+",新空闲车位数:"+freeBerths);
//更新缓存
freeBerthsChangeMsgVO = ParkFreeBerthsCacheUtil.setFreeBerthsByPlNo(plNo, freeBerths,realFreeBerths);
}
berthsChangeMsgVOs.add(freeBerthsChangeMsgVO);
if(SourceTypeEnum.NAN_ZHE.getValue().equals(parkingLotDTO.getSourceType())){
//南泽的总车位数不正确
continue;
}
//判断总车位数是否一致
Integer plBerthNum = StringUtils.isBlank(getRealFreeBerthsDO.getTotalParkingSpace())?0:Integer.valueOf(getRealFreeBerthsDO.getTotalParkingSpace());
if(!plBerthNum.equals(parkingLotDTO.getPlBerthNum())
&& 0!=plBerthNum.intValue()){
logger.debug(parkingLotDTO.getPlName()+",总车位数:"+parkingLotDTO.getPlBerthNum()+"与接口返回的不一致,更新总车位数为"+plBerthNum);
parkingLotDao.updateTotalBerths(plNo,plBerthNum);
}
}
if(CollectionUtil.isEmpty(berthsChangeMsgVOs)){
return;
}
PushFreeBerthsChangeRequest freeBerthsChangeMsgVO = new PushFreeBerthsChangeRequest();
freeBerthsChangeMsgVO.setBerthsChangeMsgVOs(berthsChangeMsgVOs );
freeBerthsChangeMsgVO.setSysCode("XXL-JOB");
//更新空闲车位数
parkFreeBerthDao.updateFreeBerthsByPlNo(freeBerthsChangeMsgVO);
}
/**
* 调用第三方接口查询空闲车位数
* @throws IOException
* 2018年5月11日 zhaowg
*/
private GetRealFreeBerthsDO queryFreeBerths(String plNo,Integer sourceType){
String sourceTypeName = "";
String url1 = "";
if(SourceTypeEnum.QING_DAO.getValue().equals(sourceType)){
url1 = qingdaoUrl+"/query/queryParkInfo";
sourceTypeName = "青岛";
}else if(SourceTypeEnum.NAN_ZHE.getValue().equals(sourceType)){
sourceTypeName = "南泽";
url1 = nanzeUrl + "/query/queryParkInfo";
}
Map returnMap = new HashMap();
returnMap.put(AppPublicArgsEnum.APP_ID.getCode(), app_id);
returnMap.put(AppPublicArgsEnum.APP_SALT.getCode(), secret_key);
returnMap.put(AppPublicArgsEnum.APP_SIGN_TYPE.getCode(), "md5");
returnMap.put("parkCode", plNo);
try {
String appSign = ApprntSignUtil.signRequest(returnMap, secret_key, "md5");
returnMap.put("sign", appSign);
String rs = "";
String req = JSON.toJSONString(returnMap,true);
logger.debug(sourceTypeName+" 获取空闲车位请求参数:"+req+"------请求URL:"+url1);
rs = HttpClientTutorial.httpPostRequest(url1, req);
logger.debug(sourceTypeName+"获取空闲车位响应信息"+rs);
//返回示例:{"code":"0","message":"成功","data":{"parkCode":"P32118200D","totalParkingSpace":"55","freeParkingSpace":"18"}}
JSONObject resultJson = JSON.parseObject(rs);
if("0".equals(resultJson.getString("code"))){
//成功
GetRealFreeBerthsDO berthsDO = JSON.parseObject(resultJson.getString("data"),GetRealFreeBerthsDO.class);
return berthsDO;
}else{
logger.warn(sourceTypeName+"获取空闲车位请求参数:"+req+"------请求URL:"+url1);
logger.error(sourceTypeName+"获取空闲车位接口返回失败:"+rs);
}
} catch (Exception e) {
logger.error(sourceTypeName+"获取空闲车位接口失败",e);
}
return null;
}
}