ParkLotStatusStatisticJob.java 10.8 KB
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<String> execute(String... params) throws Exception {
        String param = XxlJobHelper.getJobParam();
        if (StringUtils.isNotEmpty(param) && params == null) {
            params = param.split(",");
        }

        ReturnT<String> returnT = new ReturnT<>("成功");

        boolean flag = false;
        if (null != params && params.length > 0) {
            Integer type = Integer.valueOf(params[0]);
            //states:停车场状态:1-使用中,2-演示停车场
            List<Integer> 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<Integer> 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<Integer> states) {

        List<ParkingLotUseStatistic> 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<List<ParkingLotUseStatisticDTO>> orerDataBizResult = parkingRunningStatisticPakOrderQueryService
            .queryParkingLotUseStatisticOfParkOrder(req);
        List<ParkingLotUseStatisticDTO> dtoList = ResultUtils.getBizResultData(orerDataBizResult);

        Map<String, ParkingLotUseStatistic> 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<ParkingLotUseStatistic> saveData = new ArrayList<>(parkingLotUseStatisticMap.values());
        Integer num = parkingLotUseStatisticDao.batchSave(saveData);
    }

}