package com.zteits.job.task.getfreeberths;
import com.alibaba.fastjson.JSON;
import com.clouds.common.cache.park.ParkFreeBerthsCacheUtil;
import com.xiaoleilu.hutool.util.CollectionUtil;
import com.zteits.clouds.api.apibase.constants.DataStatusEnum;
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.base.ThirdFreeBerthServiceRoute;
import com.zteits.job.task.getfreeberths.param.GetRealFreeBerthsDO;
import com.zteits.job.task.getfreeberths.param.IarinParkInfo;
import com.zteits.job.task.getfreeberths.param.UpdateFreeByIrainRes;
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.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 调用道闸接口,获取真实的空闲车位数
* .
*
* 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 PublicDealFreeBerths {
private static final Logger logger = LoggerFactory.getLogger(PublicDealFreeBerths.class);
@Autowired
private ParkingLotDao parkingLotDao;
@Autowired
private ParkFreeBerthDao parkFreeBerthDao;
@Autowired
private Map thirdBerthServiceMap;
@Async("myTaskAsyncPool")
public void dealFreeBerths(ParkingLot parkingLotDTO) {
if (99 == parkingLotDTO.getSourceType().intValue()) {
return;
}
logger.info("开始查询停车场" + parkingLotDTO.getPlName() + "[" + parkingLotDTO.getPlNo() + "]");
String plNo = parkingLotDTO.getPlNo();
GetRealFreeBerthsDO getRealFreeBerthsDO = queryFreeBerths(parkingLotDTO);
if (getRealFreeBerthsDO == null) {
return;
}
//调用接口返回的真实空闲车位数,可能为负数或者超过总车位数
Integer realFreeBerths = StringUtils.isBlank(getRealFreeBerthsDO.getFreeParkingSpace()) ? 0 : Integer.valueOf(getRealFreeBerthsDO.getFreeParkingSpace());
//修改后的空闲车位数,最小0,最大不超过总车位数
Integer freeBerths = realFreeBerths;
//判断数据有效性
if (freeBerths < 0) {
logger.info("返回的空闲车位数小于0,修改为0");
freeBerths = 0;
} else if (freeBerths > parkingLotDTO.getPlBerthNum()) {
logger.info("返回的空闲车位数大于总车位数" + parkingLotDTO.getPlBerthNum() + ",修改为总车位数");
freeBerths = parkingLotDTO.getPlBerthNum();
}
//判断缓存中空闲车位数是否发生变化了
FreeBerthsChangeMsgVO freeBerthsChangeMsgVO = ParkFreeBerthsCacheUtil.getFreeBerthsObjectByPlNo(plNo);
if (freeBerthsChangeMsgVO == null) {
return;
}
if (freeBerthsChangeMsgVO.getRealFreeBerths() != realFreeBerths) {
logger.info(plNo + "-原来真实空闲车位数:" + freeBerthsChangeMsgVO.getRealFreeBerths() + ",新真实空闲车位数:" + realFreeBerths + ",新空闲车位数:" + freeBerths);
//更新缓存
freeBerthsChangeMsgVO = ParkFreeBerthsCacheUtil.setFreeBerthsByPlNo(plNo, freeBerths, realFreeBerths);
}
if (SourceTypeEnum.NAN_ZHE.getValue().equals(parkingLotDTO.getSourceType())) {
//南泽的总车位数不正确
return;
}
//判断总车位数是否一致
Integer plBerthNum = StringUtils.isBlank(getRealFreeBerthsDO.getTotalParkingSpace()) ? 0 : Integer.valueOf(getRealFreeBerthsDO.getTotalParkingSpace());
if (!plBerthNum.equals(parkingLotDTO.getPlBerthNum())
&& plBerthNum.intValue() > 0) {
logger.debug(parkingLotDTO.getPlName() + ",总车位数:" + parkingLotDTO.getPlBerthNum() + "与接口返回的不一致,更新总车位数为" + plBerthNum);
parkingLotDao.updateTotalBerths(plNo, plBerthNum);
}
List msgVOList = new ArrayList<>();
msgVOList.add(freeBerthsChangeMsgVO);
PushFreeBerthsChangeRequest pushFreeBerthsChangeRequest = new PushFreeBerthsChangeRequest();
pushFreeBerthsChangeRequest.setBerthsChangeMsgVOs(msgVOList);
pushFreeBerthsChangeRequest.setSysCode("XXL-JOB");
//更新空闲车位数
parkFreeBerthDao.updateFreeBerthsByPlNo(pushFreeBerthsChangeRequest);
}
/**
* 调用第三方接口查询空闲车位数
*
* @throws IOException 2018年5月11日 zhaowg
*/
private GetRealFreeBerthsDO queryFreeBerths(ParkingLot parkingLot) {
try {
/**根据数据来源路由具体的通知服务*/
CallThirdQueryFreeBerthService queryThirdBerthInfoService = ThirdFreeBerthServiceRoute
.selectThirdBerthService(SourceTypeEnum.getEnumByValue(parkingLot.getSourceType()), thirdBerthServiceMap);
/**根据数据来源类型,查询第三方空闲车位数*/
return queryThirdBerthInfoService.queryFreeBerths(parkingLot);
} catch (Exception e) {
logger.error("处理错误", e);
}
return null;
}
}