ParkingRunningStatisticJob.java 12.4 KB
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<String> 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<ParkingLot> parkingLotList = parkingLotDao.queryParkListAll();

        if (CollectionUtils.isEmpty(parkingLotList)) {
            return new ReturnT<>(ReturnT.FAIL_CODE, "未查找到停车场");
        }

        Map<String, String> failMap = new HashMap<>();

        TimeRange timeRange = getTimeRangeByTimeCycle(timeCycle);
        //timeRange.setStartTime(startTime);
        //timeRange.setEndTime(endTime);

        /**
         * 路侧停车场 从地磁中获取数据 开始
         */
        ////路侧停车场数据
        //List<ParkingLot> lcParkingList = parkingLotList.stream().filter(
        //    parkingLot -> Integer.valueOf(1).equals(parkingLot.getPlType())).collect(
        //    Collectors.toList());
        //
        ////封闭停车场数据
        //List<ParkingLot> 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<ParkingLot> cifengCityParkingList = parkingLotList.stream().filter(
            parkingLot -> Long.valueOf(91).equals(parkingLot.getPlCityId())).collect(
            Collectors.toList());

        //其他停车场数据
        List<ParkingLot> 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"));
    //}

}