zhangfeng
2022-11-08 9a73660fa673120de8fb4fdacdfe2a9f47fe9fbb
emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyCountServiceImpl.java
@@ -17,6 +17,7 @@
import com.gkhy.safePlatform.emergency.model.dto.resp.*;
import com.gkhy.safePlatform.emergency.query.EmergencyDrillCountQuery;
import com.gkhy.safePlatform.emergency.query.EmergencyDrillExecuteCountQuery;
import com.gkhy.safePlatform.emergency.query.EmergencyDrillTimeQuery;
import com.gkhy.safePlatform.emergency.query.EmergencySuppliesCountQuery;
import com.gkhy.safePlatform.emergency.rpc.api.model.dto.req.EmergencyExecuteNumRPCReq;
import com.gkhy.safePlatform.emergency.rpc.api.model.dto.req.EmergencyExecuteTimeRPCReq;
@@ -32,6 +33,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -371,7 +373,7 @@
     * 查询部门及其子级部门最后一次演练时间
     * 后面按部门等级划分
     */
    public EmergencyExecuteTimeRespDTO  getLastTimeByDeptIds(Long deptId){
    public List<EmergencyExecuteDepLevelLasTimeRespDTO>  getLastTimeByDeptIds(Long deptId){
        if(null == deptId){
            throw new EmergencyException(EmergencyResultCodes.SUPPLIES_PARAM_NULL);
@@ -383,24 +385,144 @@
                .stream()
                .map(dep -> dep.getDepId())
                .collect(Collectors.toList());
        //过滤出传入部门的信息
        List<DepInfoRPCRespDTO> selectDepList = depInfoList
                .stream()
                .filter(dep -> dep.getDepId().equals(deptId))
                .collect(Collectors.toList());
        // 查询该部门ids最后一次演练时间
        String lastTime = emergencyDrillExecuteInfoService.getLastTimeByDeptIds(deptIdList);
        List<EmergencyDrillExecuteLastTimeDO> executeLastTimeDOS = emergencyDrillExecuteInfoService.getLastTimeByDeptIds(deptIdList);
        List<EmergencyExecuteDepLevelLasTimeRespDTO> depLevelRespDTOList = new ArrayList<>();
        //循环部门等级
        for(DepartmentLevelEnum departmentLevelEnum : DepartmentLevelEnum.values()){
            //数据填充
            EmergencyExecuteDepLevelLasTimeRespDTO depLevelRespDTO = new EmergencyExecuteDepLevelLasTimeRespDTO();
            depLevelRespDTO.setDepLevel(departmentLevelEnum.getCode());
        //填充数据
        EmergencyExecuteTimeRespDTO respDTO = new EmergencyExecuteTimeRespDTO();
        respDTO.setDepId(deptId);
        respDTO.setLastPricticeTime(StringUtils.isBlank(lastTime) == true ? "" : lastTime);
        if(selectDepList.size()>0){
            respDTO.setDepLevel(selectDepList.get(0).getDepLevel());
            //该等级下的部门数据
            List<DepInfoRPCRespDTO> selectDepList = depInfoList
                    .stream()
                    .filter(dep -> dep.getDepLevel().equals(departmentLevelEnum.getCode()))
                    .collect(Collectors.toList());
            //获取该部门等级下部门演练数据
            List<EmergencyDrillExecuteLastTimeDO> selectExeList = executeLastTimeDOS
                    .stream()
                    .filter(exe -> selectDepList.stream().map(dep -> dep.getDepId()).collect(Collectors.toList()).contains(exe.getDeptId()))
                    .collect(Collectors.toList());
            //获取该等级最后一次演练时间
            String lastTime = getLastPracticeTime(selectExeList);
            depLevelRespDTO.setLastPricateTime(lastTime);
            depLevelRespDTOList.add(depLevelRespDTO);
        }
        return depLevelRespDTOList;
    }
    //获取最大日期
    private String getLastPracticeTime(List<EmergencyDrillExecuteLastTimeDO> selectExeList){
        String lastTime = "";
        if(selectExeList.size()>0){
            SimpleDateFormat sdft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Collections.sort(selectExeList, new Comparator<EmergencyDrillExecuteLastTimeDO>(){
                @Override
                public int compare(EmergencyDrillExecuteLastTimeDO timeDO01, EmergencyDrillExecuteLastTimeDO timeDO02) {
                    int flag = -1;
                    try {
                        Date date1 = sdft.parse(timeDO01.getLastTime());
                        Date date2 = sdft.parse(timeDO02.getLastTime());
                        if(date1.before(date2)){
                            flag=1;
                        }
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    return flag;
                } //compare
            });
            EmergencyDrillExecuteLastTimeDO lastTimeDO = selectExeList.get(0);
            lastTime = lastTimeDO.getLastTime();
        }
        return lastTime;
    }
    @Override
    public EmergencyExecuteLastTimeRespDTO getLastPracticeTimeByDeptIdAndTime(EmergencyDrillTimeQuery query) {
        if(null == query.getDeptId()){
            throw new EmergencyException(EmergencyResultCodes.SUPPLIES_PARAM_NULL,"部门id不可为空");
        }
        if(null == query.getYear()){
            throw new EmergencyException(EmergencyResultCodes.SUPPLIES_PARAM_NULL,"年份不可为空");
        }
        //通过RPC获取部门相关数据
        DepInfoRPCRespDTO depInfoRPCRespDTO = getDepInfoByDepId(query.getDeptId());
        //开始时间结束时间
        String startTime;
        String endTime;
        if(null == query.getMonth()){//年
            startTime = TimeUtils.getYearFirst(query.getYear());
            endTime = TimeUtils.getYearLast(query.getYear());
        }else{//月
            startTime = TimeUtils.getMonthFirst(query.getYear(),query.getMonth());
            endTime = TimeUtils.getMonthLast(query.getYear(),query.getMonth());
        }
        // 查询该部门最后一次演练时间
        String lastTime = emergencyDrillExecuteInfoService.getLastTimeByDeptIdAndTime(query.getDeptId(), startTime,endTime);
        //填充数据
        EmergencyExecuteLastTimeRespDTO respDTO = new EmergencyExecuteLastTimeRespDTO();
        respDTO.setDepId(depInfoRPCRespDTO.getDepId());
        respDTO.setDepLevel(depInfoRPCRespDTO.getDepLevel());
        respDTO.setYear(query.getYear());
        respDTO.setMonth(query.getMonth());
        respDTO.setLastPricticeTime(StringUtils.isBlank(lastTime) == true ? "" : lastTime);
        return respDTO;
    }
    @Override
    public List<EmergencyExecuteDepLevelLasTimeRespDTO> getLastPracticeTimeByDeptIdsAndTime(EmergencyDrillTimeQuery query) {
        if(null == query.getDeptId()){
            throw new EmergencyException(EmergencyResultCodes.SUPPLIES_PARAM_NULL,"部门id不可为空");
        }
        if(null == query.getYear()){
            throw new EmergencyException(EmergencyResultCodes.SUPPLIES_PARAM_NULL,"年份不可为空");
        }
        //通过RPC获取部门相关数据
        List<DepInfoRPCRespDTO> depInfoList = getDepListInfoByDepId(query.getDeptId());
        //过滤获取部门id
        List<Long> deptIdList = depInfoList
                .stream()
                .map(dep -> dep.getDepId())
                .collect(Collectors.toList());
        //开始时间结束时间
        String startTime;
        String endTime;
        if(null == query.getMonth()){//年
            startTime = TimeUtils.getYearFirst(query.getYear());
            endTime = TimeUtils.getYearLast(query.getYear());
        }else{//月
            startTime = TimeUtils.getMonthFirst(query.getYear(),query.getMonth());
            endTime = TimeUtils.getMonthLast(query.getYear(),query.getMonth());
        }
        // 查询该部门ids最后一次演练时间
        List<EmergencyDrillExecuteLastTimeDO> executeLastTimeDOS = emergencyDrillExecuteInfoService.getLastTimeByDeptIdsAndTime(deptIdList,startTime,endTime);
        List<EmergencyExecuteDepLevelLasTimeRespDTO> depLevelRespDTOList = new ArrayList<>();
        //循环部门等级
        for(DepartmentLevelEnum departmentLevelEnum : DepartmentLevelEnum.values()){
            //数据填充
            EmergencyExecuteDepLevelLasTimeRespDTO depLevelRespDTO = new EmergencyExecuteDepLevelLasTimeRespDTO();
            depLevelRespDTO.setDepLevel(departmentLevelEnum.getCode());
            depLevelRespDTO.setYear(query.getYear());
            depLevelRespDTO.setMonth(query.getMonth());
            //该等级下的部门数据
            List<DepInfoRPCRespDTO> selectDepList = depInfoList
                    .stream()
                    .filter(dep -> dep.getDepLevel().equals(departmentLevelEnum.getCode()))
                    .collect(Collectors.toList());
            //获取该部门等级下部门演练数据
            List<EmergencyDrillExecuteLastTimeDO> selectExeList = executeLastTimeDOS
                    .stream()
                    .filter(exe -> selectDepList.stream().map(dep -> dep.getDepId()).collect(Collectors.toList()).contains(exe.getDeptId()))
                    .collect(Collectors.toList());
            //获取该等级最后一次演练时间
            String lastTime = getLastPracticeTime(selectExeList);
            depLevelRespDTO.setLastPricateTime(lastTime);
            depLevelRespDTOList.add(depLevelRespDTO);
        }
        return depLevelRespDTOList;
    }
    /**
     * 根据部门id和指定年份 统计演练数据
     *
@@ -615,4 +737,6 @@
    }
}