package com.zteits.park.job; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.xiaoleilu.hutool.date.DateTime; import com.xiaoleilu.hutool.date.DateUtil; 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.park.dao.ParkingLotDao; import com.zteits.park.domain.ParkingLot; import com.zteits.park.service.parkstatistic.oper.ParkRunningStatisticJobService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.stream.Collectors; /** * Copyright: Copyright (c) 2018 zteits * * @ClassName: com.zteits.park.job * @Description: 停车场运行状态统计 * @version: v1.0.0 * @author: atao * @date: 2018/3/13 下午3:58 * Modification History: * Date Author Version Description * ---------------------------------------------------------* * 2018/3/13 atao v1.0.0 创建 */ @Component public class ParkingRunningStatisticJob{ @Autowired private ParkingLotDao parkingLotDao; @Autowired private ParkRunningStatisticJobService parkRunningStatisticJobService; @XxlJob("parkingRunningStatisticJob") public ReturnT execute(String... params) throws Exception { String param = XxlJobHelper.getJobParam(); if (StringUtils.isNotEmpty(param) && params == null) { params = param.split(","); } //时间周期 Integer timeCycle = Integer.valueOf(params[0]); //统计数据类型 1、订单数据 2、地磁数据 Integer dataType = Integer.valueOf(params[1]); //Date startTime =DateUtil.parse(params[2]); //Date endTime =DateUtil.parse(params[3]); List parkingLotList = parkingLotDao.queryParkListAll(); if (CollectionUtils.isEmpty(parkingLotList)) { return new ReturnT<>(ReturnT.FAIL_CODE, "未查找到停车场"); } Map failMap = new HashMap<>(); TimeRange timeRange = getTimeRangeByTimeCycle(timeCycle); //timeRange.setStartTime(startTime); //timeRange.setEndTime(endTime); /** * 路侧停车场 从地磁中获取数据 开始 */ ////路侧停车场数据 //List lcParkingList = parkingLotList.stream().filter( // parkingLot -> Integer.valueOf(1).equals(parkingLot.getPlType())).collect( // Collectors.toList()); // ////封闭停车场数据 //List fbParkingList = parkingLotList.stream().filter( // parkingLot -> Integer.valueOf(2).equals(parkingLot.getPlType())).collect( // Collectors.toList()); // //int num = lcParkingList.size() + fbParkingList.size(); //CountDownLatch countDownLatch = new CountDownLatch(num); ////开始统计路侧停车场数据 //for (ParkingLot parkingLot : lcParkingList) { // parkRunningStatisticJobService.statisticParkRunningDataFromEQPAsync(parkingLot.getPlNo(), timeCycle, // timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); //} // ////开始统计封闭停车场数据 //for (ParkingLot parkingLot : fbParkingList) { // parkRunningStatisticJobService.statisticParkRunningDataFromOrderAsync(parkingLot.getPlNo(), timeCycle, // // timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); //} /** * 设置停车场编码过滤器 * 赤峰的停车场 是从地磁获取数据 * 其余的停车场 是从订单获取数据 */ XxlJobHelper.log("全部停车场数量为:"+parkingLotList.size()); //赤峰停车场数据 List cifengCityParkingList = parkingLotList.stream().filter( parkingLot -> Long.valueOf(91).equals(parkingLot.getPlCityId())).collect( Collectors.toList()); //其他停车场数据 List otherCityParkingList = parkingLotList.stream().filter(parkingLot -> (!Long.valueOf(91).equals( parkingLot.getPlCityId()) || null == parkingLot.getPlCityId())).collect( Collectors.toList()); XxlJobHelper.log("赤峰停车场数量为:"+cifengCityParkingList.size()); XxlJobHelper.log("其他地市停车场数量为:"+otherCityParkingList.size()); int num = cifengCityParkingList.size() + otherCityParkingList.size(); CountDownLatch countDownLatch = new CountDownLatch(num); XxlJobHelper.log("CountDownLatch 线程数量为:"+num); ////开始统计赤峰停车场数据 从地磁获取数据 for (ParkingLot parkingLot : cifengCityParkingList) { //2018-12-10 经武警 与 韩向华 韩总确认 赤峰 车流量、周转率、占用率等指标从订单中获取 //parkRunningStatisticJobService.statisticParkRunningDataFromEQPAsync(parkingLot.getPlNo(), timeCycle, // timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); parkRunningStatisticJobService.statisticParkRunningDataFromOrderAsync(parkingLot.getPlNo(), timeCycle, timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); } //开始统计其他地市停车场数据 从订单获取数据 for (ParkingLot parkingLot : otherCityParkingList) { parkRunningStatisticJobService.statisticParkRunningDataFromOrderAsync(parkingLot.getPlNo(), timeCycle, timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); } /** * 路侧停车场 从地磁中获取数据 结束 * * */ ////plTyp 1:路内、占用道路停车位、路侧停车场,2-路外、封闭停车场*/ ////统计数据类型 1、订单数据 2、地磁数据 //if (dataType == 2) { // parkingLotList = parkingLotList.stream().filter(parkingLot -> Integer.valueOf(1).equals(parkingLot // .getPlType()) ).collect( // Collectors.toList()); //} // //if (CollectionUtils.isEmpty(parkingLotList)) { // return new ReturnT<>(ReturnT.FAIL_CODE, "未查找到有效的停车场"); //} // // //if (dataType == 1) { // //从订单中统计 // for (ParkingLot parkingLot : parkingLotList) { // parkRunningStatisticJobService.statisticParkRunningDataFromOrderAsync(parkingLot.getPlNo(), timeCycle, // timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); // } // //} else { // //从地磁中统计 // for (ParkingLot parkingLot : parkingLotList) { // parkRunningStatisticJobService.statisticParkRunningDataFromEQPAsync(parkingLot.getPlNo(), timeCycle, // timeRange.getStartTime(), timeRange.getEndTime(), failMap, countDownLatch); // } //} countDownLatch.await(); if (!failMap.isEmpty()) { return new ReturnT<>(ReturnT.FAIL_CODE, "失败停车场为:" + JSONObject.toJSONString(failMap)); } return ReturnT.SUCCESS; } private TimeRange getTimeRangeByTimeCycle(Integer timeCycle) { TimeRange timeRange = new TimeRange(); //10:每10分钟; 20:每20分钟; 30:每30分钟; 40:每小时; 50:每天 DateTime dateTime = DateUtil.date(); int minute = dateTime.minute(); if (timeCycle == 10) { if (minute >= 10 && minute < 20) { minute = minute - 10; } if (minute >= 20 && minute < 30) { minute = minute - 20; } if (minute >= 30 && minute < 40) { minute = minute - 30; } if (minute >= 40 && minute < 50) { minute = minute - 40; } if (minute >= 50 && minute < 60) { minute = minute - 50; } Date startTime = DateUtil.offsetMinute(dateTime, -10 - minute); Date endTime = DateUtil.offsetMinute(dateTime, 0 - minute); startTime = DateUtil.parse(DateUtil.format(startTime, "yyyy-MM-dd HH:mm") + ":00"); endTime = DateUtil.parse(DateUtil.format(endTime, "yyyy-MM-dd HH:mm") + ":00"); timeRange.setStartTime(startTime); timeRange.setEndTime(endTime); } else if (timeCycle == 20) { if (minute >= 20 && minute < 40) { minute = minute - 20; } if (minute >= 40 && minute < 60) { minute = minute - 40; } Date startTime = DateUtil.offsetMinute(dateTime, -20 - minute); Date endTime = DateUtil.offsetMinute(dateTime, 0 - minute); startTime = DateUtil.parse(DateUtil.format(startTime, "yyyy-MM-dd HH:mm") + ":00"); endTime = DateUtil.parse(DateUtil.format(endTime, "yyyy-MM-dd HH:mm") + ":00"); timeRange.setStartTime(startTime); timeRange.setEndTime(endTime); } else if (timeCycle == 30) { if (minute >= 30 && minute < 60) { minute = minute - 30; } Date startTime = DateUtil.offsetMinute(dateTime, -30 - minute); Date endTime = DateUtil.offsetMinute(dateTime, 0 - minute); startTime = DateUtil.parse(DateUtil.format(startTime, "yyyy-MM-dd HH:mm") + ":00"); endTime = DateUtil.parse(DateUtil.format(endTime, "yyyy-MM-dd HH:mm") + ":00"); timeRange.setStartTime(startTime); timeRange.setEndTime(endTime); } else if (timeCycle == 40) { Date startTime = DateUtil.offsetMinute(dateTime, -60 - minute); Date endTime = DateUtil.offsetMinute(dateTime, 0 - minute); startTime = DateUtil.parse(DateUtil.format(startTime, "yyyy-MM-dd HH:mm") + ":00"); endTime = DateUtil.parse(DateUtil.format(endTime, "yyyy-MM-dd HH:mm") + ":00"); timeRange.setStartTime(startTime); timeRange.setEndTime(endTime); } else if (timeCycle == 50) { //昨天的开始于结束时间 timeRange.setStartTime(DateUtil.beginOfDay(DateUtil.yesterday())); timeRange.setEndTime(DateUtil.offsetMillisecond(DateUtil.beginOfDay(dateTime), -1)); } return timeRange; } class TimeRange { private Date startTime; private Date endTime; public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } } //public static void main(String[] args){ // ParkingRunningStatisticJob job = new ParkingRunningStatisticJob(); // System.out.println("当前时间"+DateUtil.now()); // TimeRange timeRange = job.getTimeRangeByTimeCycle(10); // System.out.println(DateUtil.format(timeRange.getStartTime(),"yyyy-MM-dd HH:mm:ss")+" " +DateUtil.format // (timeRange.getEndTime(),"yyyy-MM-dd HH:mm:ss")); // // timeRange = job.getTimeRangeByTimeCycle(20); // System.out.println(DateUtil.format(timeRange.getStartTime(),"yyyy-MM-dd HH:mm:ss")+" " +DateUtil.format // (timeRange.getEndTime(),"yyyy-MM-dd HH:mm:ss")); // // timeRange = job.getTimeRangeByTimeCycle(30); // System.out.println(DateUtil.format(timeRange.getStartTime(),"yyyy-MM-dd HH:mm:ss")+" " +DateUtil.format // (timeRange.getEndTime(),"yyyy-MM-dd HH:mm:ss")); // // timeRange = job.getTimeRangeByTimeCycle(40); // System.out.println(DateUtil.format(timeRange.getStartTime(),"yyyy-MM-dd HH:mm:ss")+" " +DateUtil.format // (timeRange.getEndTime(),"yyyy-MM-dd HH:mm:ss")); // // timeRange = job.getTimeRangeByTimeCycle(50); // System.out.println(DateUtil.format(timeRange.getStartTime(),"yyyy-MM-dd HH:mm:ss")+" " +DateUtil.format // (timeRange.getEndTime(),"yyyy-MM-dd HH:mm:ss")); //} }