package com.zteits.park.job; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.clouds.common.cache.park.ParkingLotCacheUtil; import com.clouds.common.utils.ExceptionUtil; import com.clouds.common.utils.ResultUtils; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.constants.ErrorType; import com.zteits.clouds.api.apibase.exception.BizException; import com.zteits.clouds.api.dto.order.parkorder.param.ParkingLotUseStatisticOfParkOrderReq; import com.zteits.clouds.api.dto.park.dto.ParkingLotDTO; import com.zteits.clouds.api.dto.park.dto.ParkingLotUseStatisticDTO; import com.zteits.clouds.api.service.order.parkorder.query.ParkingRunningStatisticPakOrderQueryService; import com.zteits.park.dao.ParkingLotUseStatisticDao; import com.zteits.park.domain.ParkingLotUseStatistic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; /** * Copyright: Copyright (c) 2017 zteits * * @ClassName: com.zteits.park.job * @Description: 停车场状态统计 统计进场数量、出场数量、空置率、周转率、 * @version: v1.0.0 * @author: atao * @date: 2017/9/20 下午2:36 * Modification History: * Date Author Version Description * ---------------------------------------------------------* * 2017/9/20 atao v1.0.0 创建 */ @Component public class ParkLotStatusStatisticJob{ private static final Logger logger = LoggerFactory.getLogger(ParkLotStatusStatisticJob.class); private String errMsg = null; @Autowired private ParkingLotUseStatisticDao parkingLotUseStatisticDao; @Autowired private ParkingRunningStatisticPakOrderQueryService parkingRunningStatisticPakOrderQueryService; @XxlJob("parkLotStatusStatisticJob") public ReturnT execute(String... params) throws Exception { String param = XxlJobHelper.getJobParam(); if (StringUtils.isNotEmpty(param) && params == null) { params = param.split(","); } ReturnT returnT = new ReturnT<>("成功"); boolean flag = false; if (null != params && params.length > 0) { Integer type = Integer.valueOf(params[0]); //states:停车场状态:1-使用中,2-演示停车场 List states = new ArrayList<>(); //如果第二个参数为空 if (params.length < 2) { //停车场状态1-使用中 states.add(1); } else if (StringUtils.isEmpty(params[1])) { //停车场状态1-使用中 states.add(1); } else { String statesStr = params[1]; String state[] = statesStr.split("@"); if (state == null || state.length < 1) { //停车场状态1-使用中 states.add(1); } else { for (String obj : state) { states.add(Integer.valueOf(obj.toString())); } } } try { flag = startStatisticData(type, states); if (!flag) { returnT.setCode(ReturnT.FAIL_CODE); returnT.setMsg(errMsg); } } catch (Exception e) { e.printStackTrace(); returnT.setCode(ReturnT.FAIL_CODE); returnT.setMsg("捕获异常"); returnT.setContent(ExceptionUtil.getTrace(e)); } } return returnT; } /** * 开始统计 数据 * * @param type 1-20分钟; 2-1小时; 3-1天; */ private boolean startStatisticData(final Integer type, final List states) throws Exception { if (type == 1) { //统计前20分钟的数据 //获取要统计的时间段 Calendar begin = Calendar.getInstance(); Calendar end = Calendar.getInstance(); int curMinute = begin.get(Calendar.MINUTE); if (curMinute >= 0 && curMinute < 20) { //取上一小时的40-当前时间的0分钟时间段 begin.add(Calendar.HOUR_OF_DAY, -1); begin.set(Calendar.MINUTE, 40); end.set(Calendar.MINUTE, 0); } else if (curMinute >= 20 && curMinute < 40) { //取当前小时的0-20分钟时间段 begin.set(Calendar.MINUTE, 0); end.set(Calendar.MINUTE, 20); } else if (curMinute >= 40 && curMinute <= 59) { //取当前时间的20-40分钟时间段 begin.set(Calendar.MINUTE, 20); end.set(Calendar.MINUTE, 40); } begin.set(Calendar.SECOND, 0); end.set(Calendar.SECOND, 0); //parkingLotUseStatisticDao.statistic20MinData(begin.getTime(), end.getTime(),states); //查询-分页插入每页100条 parkingLotUseStatisticDao.statistic20MinDataForSelectByLCPark(begin.getTime(), end.getTime(), states); // parkingLotUseStatisticDao.statistic20MinDataForSelectByFBPark(begin.getTime(), end.getTime(), states); //从订单中查询封闭停车场的数据 statistic20MinDataForSelectByFBPark(begin.getTime(), end.getTime(), states); } else if (type == 2) { //统计前1小时数据 //获取要统计的时间段,统计上一个1小时 Calendar begin = Calendar.getInstance(); Calendar end = Calendar.getInstance(); begin.add(Calendar.HOUR_OF_DAY, -1); begin.set(Calendar.MINUTE, 0); end.set(Calendar.MINUTE, 0); begin.set(Calendar.SECOND, 0); end.set(Calendar.SECOND, 0); parkingLotUseStatisticDao.static1HourAnd1DayData(begin.getTime(), end.getTime(), type); } else if (type == 3) { //统计前1天的数据 Calendar begin = Calendar.getInstance(); Calendar end = Calendar.getInstance(); begin.add(Calendar.DAY_OF_YEAR, -1); begin.set(Calendar.HOUR_OF_DAY, 0); end.set(Calendar.HOUR_OF_DAY, 0); begin.set(Calendar.MINUTE, 0); end.set(Calendar.MINUTE, 0); begin.set(Calendar.SECOND, 0); end.set(Calendar.SECOND, 0); parkingLotUseStatisticDao.static1HourAnd1DayData(begin.getTime(), end.getTime(), type); } else { //未知的统计状态 errMsg = "未知的统计状态"; return false; } return true; } /** * 获取封闭停车场 20分钟统计数据,从订单中获取 * * @param * @return * @Author: atao * @Date: 2018/3/14 下午8:22 */ private void statistic20MinDataForSelectByFBPark(Date startDate, Date endDate, List states) { List parkingLotUseStatistics = parkingLotUseStatisticDao .query20MinNewDataGroupByPlNO(); if (parkingLotUseStatistics == null) { throw new BizException(ErrorType.BIZ_ERROR, "查询停车场业务统计数据异常"); } parkingLotUseStatistics.stream().forEach(parkingLotUseStatistic -> { ParkingLotDTO parkingLotDTO = ParkingLotCacheUtil.getParkLotByPlNo(parkingLotUseStatistic.getPlNo()); //初始化处理一下从统计表中整理出来的数据 parkingLotUseStatistic.setId(null); parkingLotUseStatistic.setPlName(parkingLotDTO == null ? null : parkingLotDTO.getPlName()); parkingLotUseStatistic.setPlType(parkingLotDTO == null ? 0 : parkingLotDTO.getPlType()); parkingLotUseStatistic.setStatisticBeginTime(startDate); parkingLotUseStatistic.setStatisticEndTime(endDate); parkingLotUseStatistic.setTmpVehicleFlow(0); parkingLotUseStatistic.setVehicleFlow(0); parkingLotUseStatistic.setFixVehicleFlow(0); parkingLotUseStatistic.setCreateTime(new Date()); parkingLotUseStatistic.setOutParkCount(0); parkingLotUseStatistic.setTotalFreeBerths(0); parkingLotUseStatistic.setTotalBerths(parkingLotDTO == null ? 0 : parkingLotDTO.getPlBerthNum()); System.out.println("数据处理中...."); }); System.out.println("数据为:"+ JSONObject.toJSONString(parkingLotUseStatistics)); //从订单域中查询出最新的汇总数据 ParkingLotUseStatisticOfParkOrderReq req = new ParkingLotUseStatisticOfParkOrderReq(); req.setStartDate(startDate); req.setEndDate(endDate); req.setSysCode("sysCode"); BizResult> orerDataBizResult = parkingRunningStatisticPakOrderQueryService .queryParkingLotUseStatisticOfParkOrder(req); List dtoList = ResultUtils.getBizResultData(orerDataBizResult); Map parkingLotUseStatisticMap = parkingLotUseStatistics.stream().collect( Collectors.toMap(ParkingLotUseStatistic::getPlNo, dto -> dto)); //遍历处理订单域的数据 dtoList.stream().forEach(dto -> { ParkingLotDTO parkingLotDTO = ParkingLotCacheUtil.getParkLotByPlNo(dto.getPlNo()); ParkingLotUseStatistic temp = parkingLotUseStatisticMap.get(dto.getPlNo()); if (null == temp) { temp = new ParkingLotUseStatistic(); BeanUtils.copyProperties(dto, temp); temp.setTotalBerths(parkingLotDTO == null ? 0 : parkingLotDTO.getPlBerthNum()); parkingLotUseStatisticMap.put(temp.getPlNo(), temp); } if (null != dto.getFreeRatio() && null != parkingLotDTO && null != parkingLotDTO.getPlBerthNum() && 0 != parkingLotDTO.getPlBerthNum()) { if (null != dto.getFreeRatio()) { //设置空置率 temp.setFreeRatio(dto.getFreeRatio() / parkingLotDTO.getPlBerthNum()); } if (null != dto.getTmpVehicleFlow()) { //设置周转率 temp.setTurnoverRatio(dto.getTmpVehicleFlow() * 1.0 / parkingLotDTO.getPlBerthNum()); } } }); List saveData = new ArrayList<>(parkingLotUseStatisticMap.values()); Integer num = parkingLotUseStatisticDao.batchSave(saveData); } }