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.task.getfreeberths.param.GetRealFreeBerthsDO; 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.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("开始查询是南泽和青岛的停车场"); 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); //推送诱导数据 parkFreeBerthDao.pushFreeBerthsToScreen(freeBerthsChangeMsgVO); } /** * 调用第三方接口查询空闲车位数 * @throws IOException * 2018年5月11日 zhaowg */ private GetRealFreeBerthsDO queryFreeBerths(String plNo,Integer sourceType){ if(StringUtils.isBlank(qingdaoUrl) || StringUtils.isBlank(nanzeUrl)){ logger.error("道闸平台地址为空,不调用空闲车位接口"); return null; } 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; } }