Browse Source

feature 隐患任务生成逻辑代码提交

xiahan 2 weeks ago
parent
commit
4ccb695c1e

+ 28 - 6
js-common/src/main/java/com/rongwei/safecommon/utils/JSCommonUtils.java

@@ -1,6 +1,5 @@
 package com.rongwei.safecommon.utils;
 
-import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
@@ -35,6 +34,7 @@ import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
@@ -404,16 +404,16 @@ public class JSCommonUtils {
      * @param unit      年 月 日 小时
      * @return
      */
-    public static int DateDifferenceExample(Date startDate, Date endDate, String unit) {
+    public static int dateDifferenceExample(Date startDate, Date endDate, String unit) {
         int returnNum = 0;
-        LocalDate localStartDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-        LocalDate localEndDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDateTime localStartDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime localEndDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
         switch (unit) {
             case SaveConstans.INSPECTION_CYCLE_UNIT.HOUR: // 小时
-                returnNum = (int) DateUtil.between(startDate, endDate, DateUnit.HOUR);
+                returnNum = (int) ChronoUnit.HOURS.between(localStartDate, localEndDate);
                 break;
             case SaveConstans.INSPECTION_CYCLE_UNIT.DAY: //天
-                returnNum = (int) DateUtil.between(startDate, endDate, DateUnit.DAY);
+                returnNum = (int) ChronoUnit.DAYS.between(localStartDate, localEndDate);
                 break;
             case SaveConstans.INSPECTION_CYCLE_UNIT.MONTH: // 月
                 returnNum = (int) ChronoUnit.MONTHS.between(localStartDate, localEndDate);
@@ -428,6 +428,28 @@ public class JSCommonUtils {
         return returnNum;
     }
 
+    public static int dateDifferenceExample(Date startDate, LocalDateTime localEndDate, String unit) {
+        int returnNum = 0;
+        LocalDateTime localStartDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        switch (unit) {
+            case SaveConstans.INSPECTION_CYCLE_UNIT.HOUR: // 小时
+                returnNum = (int) ChronoUnit.HOURS.between(localStartDate, localEndDate);
+                break;
+            case SaveConstans.INSPECTION_CYCLE_UNIT.DAY: //天
+                returnNum = (int) ChronoUnit.DAYS.between(localStartDate, localEndDate);
+                break;
+            case SaveConstans.INSPECTION_CYCLE_UNIT.MONTH: // 月
+                returnNum = (int) ChronoUnit.MONTHS.between(localStartDate, localEndDate);
+                break;
+            case SaveConstans.INSPECTION_CYCLE_UNIT.YEAR: // 年
+                returnNum = (int) ChronoUnit.YEARS.between(localStartDate, localEndDate);
+                break;
+            default:
+                log.error("单位异常");
+
+        }
+        return returnNum;
+    }
     @PostConstruct
     public void info() {
         redisService = autoRedisService;

+ 1 - 3
js-security/security-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/ScheduledTasksService.java

@@ -1,9 +1,7 @@
-package com.rongwei.sfcommon.sys.service.impl;
+package com.rongwei.sfcommon.sys.service;
 
 import com.rongwei.rwcommon.base.R;
 
-import java.util.Map;
-
 /**
  * ScheduledTasksService class
  *

+ 36 - 25
js-security/security-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/HazardInvestigationServiceImpl.java

@@ -11,6 +11,7 @@ import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.safecommon.utils.JSCommonUtils;
+import com.rongwei.sfcommon.sys.dao.AspPersonnelCheckConfigDao;
 import com.rongwei.sfcommon.sys.service.HazardInvestigationService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,6 +22,9 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static com.rongwei.sfcommon.utils.MlConstants.CheckType.RISK;
+import static com.rongwei.sfcommon.utils.MlConstants.ResponsiblePositionAttribute.HIDDEN_DANGER_CHECK;
+
 /**
  * HazardInvestigationServiceImpl class
  *
@@ -30,6 +34,7 @@ import java.util.stream.Collectors;
 @Service
 public class HazardInvestigationServiceImpl implements HazardInvestigationService {
 
+
     private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
     @Autowired
     private ApsHazardInvestigationTemplateServiceImpl apsHazardInvestigationTemplateService;
@@ -47,6 +52,8 @@ public class HazardInvestigationServiceImpl implements HazardInvestigationServic
     private AspMajorHazardSourcesServiceImpl aspMajorHazardSourcesService;
     @Autowired
     private AspRiskUnitPostInfoServiceImpl aspRiskUnitPostInfoService;
+    @Autowired
+    private AspPersonnelCheckConfigDao aspPersonnelCheckConfigDao;
 
     public static final Map<String, List<Function<AspMajorHazardSourcesDo, String>>> getCheckUserInfoFunctionMap = new HashMap<String, List<Function<AspMajorHazardSourcesDo, String>>>() {{
         put("1", new ArrayList<Function<AspMajorHazardSourcesDo, String>>() {{
@@ -82,7 +89,7 @@ public class HazardInvestigationServiceImpl implements HazardInvestigationServic
             return R.ok("模板检查项为空");
         }
         // 生成隐患排查任务
-        assembleTask(tempData, templateZibiaoDos);
+        assembleTask(tempData, templateZibiaoDos, null, null);
 
         return R.ok();
     }
@@ -93,7 +100,8 @@ public class HazardInvestigationServiceImpl implements HazardInvestigationServic
      * @param tempData
      */
     public void assembleTask(ApsHazardInvestigationTemplateDo tempData,
-                             List<ApsHazardInvestigationTemplateZibiaoDo> templateZibiaoDos) {
+                             List<ApsHazardInvestigationTemplateZibiaoDo> templateZibiaoDos,
+                             Date startTime, Date endTime) {
 
         SysUserVo currentUser = JSCommonUtils.getCurrentUser();
 
@@ -122,19 +130,24 @@ public class HazardInvestigationServiceImpl implements HazardInvestigationServic
         List<ApsDetailsHazardInvestigationTasksJcxzibiaoDo> taskDetailSaveList = new ArrayList<>();
         // 按照风险点 分开生成隐患排查任务
         ApsDetailsHazardInvestigationTasksDo apsDetailsHazardInvestigationTasksDo;
-        // 获取当前时间的0点0分0秒
         Calendar startOfDay = Calendar.getInstance();
-        startOfDay.setTime(new Date());
-        startOfDay.set(Calendar.HOUR_OF_DAY, 0);
-        startOfDay.set(Calendar.MINUTE, 0);
-        startOfDay.set(Calendar.SECOND, 1);
-        Date startTime = startOfDay.getTime();
-        // 获取当前时间的23点59分59秒
-        startOfDay.set(Calendar.HOUR_OF_DAY, 23);
-        startOfDay.set(Calendar.MINUTE, 59);
-        startOfDay.set(Calendar.SECOND, 59);
-        startOfDay.set(Calendar.MILLISECOND, 999);
-        Date endTime = startOfDay.getTime();
+        // 获取当前时间的0点0分0秒
+        if (startTime == null) {
+            startOfDay.setTime(new Date());
+            startOfDay.set(Calendar.HOUR_OF_DAY, 0);
+            startOfDay.set(Calendar.MINUTE, 0);
+            startOfDay.set(Calendar.SECOND, 1);
+            startTime = startOfDay.getTime();
+
+        }
+        if (endTime == null) {
+            // 获取当前时间的23点59分59秒
+            startOfDay.set(Calendar.HOUR_OF_DAY, 23);
+            startOfDay.set(Calendar.MINUTE, 59);
+            startOfDay.set(Calendar.SECOND, 59);
+            startOfDay.set(Calendar.MILLISECOND, 999);
+            endTime = startOfDay.getTime();
+        }
         for (AspRiskUnitDo s : aspRiskUnitDos) {
             apsDetailsHazardInvestigationTasksDo = new ApsDetailsHazardInvestigationTasksDo();
             JSCommonUtils.setBaseDetail(apsDetailsHazardInvestigationTasksDo, currentUser);
@@ -210,20 +223,18 @@ public class HazardInvestigationServiceImpl implements HazardInvestigationServic
     public String getCheckUserInfo(AspRiskUnitDo aspRiskUnitDo,
                                    List<AspMajorHazardSourcesDo> aspMajorHazardSourcesDos,
                                    ApsHazardInvestigationTemplateDo tempData) {
-        // 不是重大危险源直接返回责任人
+        // 不是重大危险源且任务类型是日常任务
         if (!"1".equals(aspRiskUnitDo.getMajorhazard()) || "0".equals(tempData.getChecktype())) {
-            // 获取风险点的隐患排查人
-            List<AspRiskUnitPostInfoDo> aspRiskUnitPostInfoDos = aspRiskUnitPostInfoService.list(new LambdaQueryWrapper<AspRiskUnitPostInfoDo>()
-                    .eq(AspRiskUnitPostInfoDo::getId, aspRiskUnitDo.getId())
-                    .like(AspRiskUnitPostInfoDo::getPost, "40")
-            );
-            if (!aspRiskUnitPostInfoDos.isEmpty()) {
-                String name = aspRiskUnitPostInfoDos.stream().map(AspRiskUnitPostInfoDo::getDutyofficername)
-                        .flatMap(data ->Arrays.stream(data.split(",")))
+
+            // 获取点检人
+            List<AspPersonnelCheckConfigDo> risk = aspPersonnelCheckConfigDao.selectCheckUserInfo(aspRiskUnitDo.getId(), HIDDEN_DANGER_CHECK, RISK);
+            if (!risk.isEmpty()) {
+                String name = risk.stream().map(AspPersonnelCheckConfigDo::getDutyofficername)
+                        .flatMap(data -> Arrays.stream(data.split(",")))
                         .distinct()
                         .collect(Collectors.joining(","));
-                String id = aspRiskUnitPostInfoDos.stream().map(AspRiskUnitPostInfoDo::getDutyofficername)
-                        .flatMap(data ->Arrays.stream(data.split(",")))
+                String id = risk.stream().map(AspPersonnelCheckConfigDo::getDutyofficerid)
+                        .flatMap(data -> Arrays.stream(data.split(",")))
                         .distinct()
                         .collect(Collectors.joining(","));
                 return name + "-;-" + id;

+ 273 - 29
js-security/security-common/src/main/java/com/rongwei/sfcommon/sys/service/impl/ScheduledTasksServiceImpl.java

@@ -15,15 +15,14 @@ import com.rongwei.safecommon.utils.ExportExcelByEasyExcel;
 import com.rongwei.safecommon.utils.JSCommonUtils;
 import com.rongwei.safecommon.utils.SaveConstans;
 import com.rongwei.sfcommon.sys.dao.SaveCheckCommonDao;
+import com.rongwei.sfcommon.sys.service.ScheduledTasksService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.LocalTime;
+import java.time.*;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -77,14 +76,6 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
     @Autowired
     private AspCompanyCertificationsServiceImpl aspCompanyCertificationsService;
 
-    public static void main(String[] args) {
-        Calendar calendar = Calendar.getInstance();
-        int currentMonth = calendar.get(Calendar.MONTH) + 1; // 月份是从0开始的,所以加1
-        int currentDay = calendar.get(Calendar.DAY_OF_MONTH); // 当前日
-
-        System.out.println("当前月份: " + currentMonth);
-        System.out.println("当前日: " + currentDay);
-    }
 
     @Override
     public void rectificationSystem() {
@@ -223,35 +214,273 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
         List<ApsHazardInvestigationTemplateZibiaoDo> templateZibiaoDos = apsHazardInvestigationTemplateZibiaoService.list(new LambdaQueryWrapper<ApsHazardInvestigationTemplateZibiaoDo>()
                 .in(ApsHazardInvestigationTemplateZibiaoDo::getMubanid, tempIds)
                 .eq(BaseDo::getDeleted, "0"));
+        // 模板对应的检查项
         List<ApsHazardInvestigationTemplateZibiaoDo> subList;
-        Calendar instance = Calendar.getInstance();
+
+
+        LocalDateTime today = LocalDateTime.now();
+
+
         for (ApsHazardInvestigationTemplateDo mainData : tempList) {
             String tempId = mainData.getId();
             // 获取本次需要生成任务的模板检查项
             subList = templateZibiaoDos.stream()
                     .filter(subData -> tempId.equals(subData.getMubanid()))
                     .collect(Collectors.toList());
-            List<ApsHazardInvestigationTemplateZibiaoDo> updateGenerationDateList = new ArrayList<>();
-            // 判断需要生成任务的模板数据
-            subList = subList.stream().filter(data -> {
-                Date date = preGenerationCheck(data, instance);
-                // 保存上一次生产记录的时间
-                ApsHazardInvestigationTemplateZibiaoDo updateGenerationDateDo = new ApsHazardInvestigationTemplateZibiaoDo();
-                updateGenerationDateDo.setId(data.getId());
-                updateGenerationDateDo.setGenerationdate(date);
-                updateGenerationDateList.add(updateGenerationDateDo);
-                return date != null;
-            }).collect(Collectors.toList());
-            // 当前模板对应的管控措施不满足任务生成条件
-            if (subList.isEmpty()) {
-                continue;
+            //对检查模板数据按照周期以及周期单位进行分组操作 将相同周期单位的数据放在一起生成隐患任务
+            Map<String, List<ApsHazardInvestigationTemplateZibiaoDo>> taskTempMap = subList.stream()
+                    .filter(data -> StringUtils.isNotBlank(data.getInspectioncycleunit()))
+                    .collect(Collectors.groupingBy(ApsHazardInvestigationTemplateZibiaoDo::getInspectioncycleunit));
+            for (Map.Entry<String, List<ApsHazardInvestigationTemplateZibiaoDo>> task : taskTempMap.entrySet()) {
+
+                try {
+                    assembleHiddenDangerCheckTask(task.getKey(), today, task.getValue(), mainData);
+                } catch (Exception e) {
+                    log.error("当前模板生成任务异常 id:{} - 原因: {} | 异常类型: {}", mainData.getId(), e.getMessage(), e.getClass().getSimpleName(), e);
+                }
+
             }
-            apsHazardInvestigationTemplateZibiaoService.updateBatchById(updateGenerationDateList);
-            hazardInvestigationService.assembleTask(mainData, subList);
         }
         return R.ok();
     }
 
+    /**
+     * 隐患任务生成
+     *
+     * @param checkCycleUnit
+     * @param checkCycleUnit
+     */
+    public void assembleHiddenDangerCheckTask(String checkCycleUnit, LocalDateTime today, List<ApsHazardInvestigationTemplateZibiaoDo> tempData, ApsHazardInvestigationTemplateDo mainData) {
+        // 需要生成任务的集合
+        List<ApsHazardInvestigationTemplateZibiaoDo> updateGenerationDateList = new ArrayList<>();
+        // 计划开始时间
+        Calendar startInstance = Calendar.getInstance();
+        startInstance.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); // 设置时区为UTC
+        // 计划结束时间
+        Calendar endInstance = Calendar.getInstance();
+        startInstance.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); // 设置时区为UTC
+        ApsHazardInvestigationTemplateZibiaoDo updateGenerationDateDo = new ApsHazardInvestigationTemplateZibiaoDo();
+        // 因为存在计划开始和计划结束时间 所以需要将周期不同的数据单独提取出来处理
+        Map<Integer, List<ApsHazardInvestigationTemplateZibiaoDo>> groupByCycle = tempData.stream().collect(Collectors.groupingBy(ApsHazardInvestigationTemplateZibiaoDo::getInspectioncycle));
+        Map<String, List<ApsHazardInvestigationTemplateZibiaoDo>> dataMap = new HashMap<>();
+        // 周期单位为小时的特殊处理
+        if (SaveConstans.INSPECTION_CYCLE_UNIT.HOUR.equals(checkCycleUnit)) {
+            for (Map.Entry<Integer, List<ApsHazardInvestigationTemplateZibiaoDo>> task : groupByCycle.entrySet()) {
+                int cycle = task.getKey();
+                List<ApsHazardInvestigationTemplateZibiaoDo> tasks = task.getValue();
+                for (ApsHazardInvestigationTemplateZibiaoDo apsHazardInvestigationTemplateZibiaoDo : tasks) {
+                    boolean sameDatePart = isSameDatePart(apsHazardInvestigationTemplateZibiaoDo.getGenerationdate(), today);
+                    // 时间相同当天不再生成
+                    if (sameDatePart) {
+                        continue;
+                    }
+                    // 开始时间
+                    String startingtimeofwork = apsHazardInvestigationTemplateZibiaoDo.getStartingtimeofwork();
+                    // 结束时间
+                    String endtimeofwork = apsHazardInvestigationTemplateZibiaoDo.getEndtimeofwork();
+                    LocalTime time;
+                    Calendar periodStart = Calendar.getInstance();
+                    if (StringUtils.isNotBlank(startingtimeofwork)) {
+                        // 指定开始时间
+                        time = LocalTime.parse(startingtimeofwork);
+                        periodStart.set(Calendar.HOUR_OF_DAY, time.getHour());
+                        periodStart.set(Calendar.MINUTE, time.getMinute());
+                        periodStart.set(Calendar.SECOND, time.getSecond());
+                    } else {
+                        // 设置当日00:00:00基准时间
+                        periodStart.set(Calendar.HOUR_OF_DAY, 0);
+                        periodStart.set(Calendar.MINUTE, 0);
+                        periodStart.set(Calendar.SECOND, 0);
+                        periodStart.set(Calendar.MILLISECOND, 0);
+                    }
+                    Calendar dayEnd = Calendar.getInstance();
+                    if (StringUtils.isNotBlank(endtimeofwork)) {
+                        // 指定结束时间
+                        time = LocalTime.parse(endtimeofwork);
+                        dayEnd.set(Calendar.HOUR_OF_DAY, time.getHour());
+                        dayEnd.set(Calendar.MINUTE, time.getMinute());
+                        dayEnd.set(Calendar.SECOND, time.getSecond());
+                    } else {
+                        // 设置当日23:59:59结束时间
+                        dayEnd.set(Calendar.HOUR_OF_DAY, 23);
+                        dayEnd.set(Calendar.MINUTE, 59);
+                        dayEnd.set(Calendar.SECOND, 59);
+                        dayEnd.set(Calendar.MILLISECOND, 999);
+                    }
+
+                    // 按周期生成时间段
+                    Calendar currentStart = (Calendar) periodStart.clone();
+                    while (currentStart.before(dayEnd)) {
+                        // 计算当前周期结束时间
+                        Calendar currentEnd = (Calendar) currentStart.clone();
+                        currentEnd.add(Calendar.HOUR_OF_DAY, cycle);
+
+                        // 确保不超过当日结束时间
+                        if (currentEnd.after(dayEnd)) {
+                            currentEnd.setTime(dayEnd.getTime());
+                        }
+                        dataMap.computeIfAbsent(currentStart.getTime().getTime() + ";" + currentEnd.getTime().getTime(), k -> new ArrayList<>()).add(apsHazardInvestigationTemplateZibiaoDo);
+                        // 移动到下一个周期
+                        currentStart.add(Calendar.HOUR_OF_DAY, cycle);
+                    }
+                    updateGenerationDateDo.setId(apsHazardInvestigationTemplateZibiaoDo.getId());
+                    updateGenerationDateDo.setGenerationdate(currentStart.getTime());
+                    updateGenerationDateList.add(updateGenerationDateDo);
+                }
+            }
+        } else {
+
+            // 周期单位---年
+            if (SaveConstans.INSPECTION_CYCLE_UNIT.YEAR.equals(checkCycleUnit)) {
+
+                startInstance.set(Calendar.HOUR_OF_DAY, 0);
+                startInstance.set(Calendar.MINUTE, 0);
+                startInstance.set(Calendar.SECOND, 0);
+                startInstance.set(Calendar.MONTH, Calendar.JANUARY);
+                startInstance.set(Calendar.DAY_OF_MONTH, 1);
+
+
+                endInstance.set(Calendar.HOUR_OF_DAY, 23);
+                endInstance.set(Calendar.MINUTE, 59);
+                endInstance.set(Calendar.SECOND, 59);
+                endInstance.set(Calendar.MONTH, Calendar.DECEMBER);
+                endInstance.set(Calendar.DAY_OF_MONTH, 31);
+                for (Map.Entry<Integer, List<ApsHazardInvestigationTemplateZibiaoDo>> task : groupByCycle.entrySet()) {
+                    endInstance.add(Calendar.YEAR, task.getKey() - 1);
+                    // 如果当前时间是1月1号直接生成隐患任务
+                    if ((today.getMonth() == Month.JANUARY) && (today.getDayOfMonth() == 1)) {
+                        task.getValue()
+                                .parallelStream()
+                                .filter(info -> info.getGenerationdate() == null ||
+                                        JSCommonUtils.dateDifferenceExample(info.getGenerationdate(), today, checkCycleUnit) == info.getInspectioncycle()
+                                ).forEach(apsHazardInvestigationTemplateZibiaoDo -> {
+                                    dataMap.computeIfAbsent(startInstance.getTime().getTime() + ";" + endInstance.getTime().getTime(), k -> new ArrayList<>()).add(apsHazardInvestigationTemplateZibiaoDo);
+
+                                    updateGenerationDateDo.setId(apsHazardInvestigationTemplateZibiaoDo.getId());
+                                    updateGenerationDateDo.setGenerationdate(startInstance.getTime());
+                                    updateGenerationDateList.add(updateGenerationDateDo);
+                                });
+                    } else {
+                        task.getValue()
+                                .parallelStream()
+                                .filter(info -> info.getGenerationdate() == null)
+                                .forEach(apsHazardInvestigationTemplateZibiaoDo -> {
+                                    dataMap.computeIfAbsent(startInstance.getTime().getTime() + ";" + endInstance.getTime().getTime(), k -> new ArrayList<>()).add(apsHazardInvestigationTemplateZibiaoDo);
+
+                                    updateGenerationDateDo.setId(apsHazardInvestigationTemplateZibiaoDo.getId());
+                                    updateGenerationDateDo.setGenerationdate(startInstance.getTime());
+                                    updateGenerationDateList.add(updateGenerationDateDo);
+                                });
+                    }
+                }
+                ;
+
+            } else if (SaveConstans.INSPECTION_CYCLE_UNIT.MONTH.equals(checkCycleUnit)) {
+
+                // 关键步骤:定位到当月最后一天
+                startInstance.set(Calendar.DAY_OF_MONTH, 1);      // 设置为当月第一天
+                // 设置时间为23:59:59
+                startInstance.set(Calendar.HOUR_OF_DAY, 0);
+                startInstance.set(Calendar.MINUTE, 0);
+                startInstance.set(Calendar.SECOND, 0);
+
+
+                // 关键步骤:定位到当月最后一天
+                endInstance.set(Calendar.DAY_OF_MONTH, 1);      // 设置为当月第一天
+                endInstance.add(Calendar.MONTH, 1);             // 跳到下个月第一天
+                endInstance.add(Calendar.DAY_OF_MONTH, -1);     // 回退到当月最后一天
+                // 设置时间为23:59:59
+                endInstance.set(Calendar.HOUR_OF_DAY, 23);
+                endInstance.set(Calendar.MINUTE, 59);
+                endInstance.set(Calendar.SECOND, 59);
+                for (Map.Entry<Integer, List<ApsHazardInvestigationTemplateZibiaoDo>> task : groupByCycle.entrySet()) {
+                    endInstance.add(Calendar.MONTH, task.getKey() - 1);
+                    // 如果当前时间是1月1号直接生成隐患任务
+                    if ((today.getMonth() == Month.JANUARY) && (today.getDayOfMonth() == 1)) {
+                        task.getValue()
+                                .parallelStream()
+                                .filter(info -> info.getGenerationdate() == null ||
+                                        JSCommonUtils.dateDifferenceExample(info.getGenerationdate(), today, checkCycleUnit) == info.getInspectioncycle())
+                                .forEach(apsHazardInvestigationTemplateZibiaoDo -> {
+                                    dataMap.computeIfAbsent(startInstance.getTime().getTime() + ";" + endInstance.getTime().getTime(), k -> new ArrayList<>()).add(apsHazardInvestigationTemplateZibiaoDo);
+
+                                    updateGenerationDateDo.setId(apsHazardInvestigationTemplateZibiaoDo.getId());
+                                    updateGenerationDateDo.setGenerationdate(startInstance.getTime());
+                                    updateGenerationDateList.add(updateGenerationDateDo);
+                                });
+                    } else {
+                        task.getValue().parallelStream()
+                                .filter(info -> info.getGenerationdate() == null)
+                                .forEach(apsHazardInvestigationTemplateZibiaoDo -> {
+                                    dataMap.computeIfAbsent(startInstance.getTime().getTime() + ";" + endInstance.getTime().getTime(), k -> new ArrayList<>()).add(apsHazardInvestigationTemplateZibiaoDo);
+
+                                    updateGenerationDateDo.setId(apsHazardInvestigationTemplateZibiaoDo.getId());
+                                    updateGenerationDateDo.setGenerationdate(startInstance.getTime());
+                                    updateGenerationDateList.add(updateGenerationDateDo);
+                                });
+                    }
+                }
+
+            } else if (SaveConstans.INSPECTION_CYCLE_UNIT.DAY.equals(checkCycleUnit)) {
+                // 对于天的任务 直接判断上次生成时间和当前时间相隔的天数是否满足要求
+                // 设置时间为23:59:59
+                startInstance.set(Calendar.HOUR_OF_DAY, 0);
+                startInstance.set(Calendar.MINUTE, 0);
+                startInstance.set(Calendar.SECOND, 0);
+
+                // 设置时间为23:59:59
+                endInstance.set(Calendar.HOUR_OF_DAY, 23);
+                endInstance.set(Calendar.MINUTE, 59);
+                endInstance.set(Calendar.SECOND, 59);
+
+                for (Map.Entry<Integer, List<ApsHazardInvestigationTemplateZibiaoDo>> task : groupByCycle.entrySet()) {
+                    endInstance.add(Calendar.DAY_OF_MONTH, task.getKey() - 1);
+                    // 如果当前时间是1月1号直接生成隐患任务
+                    task.getValue().parallelStream()
+                            .filter(info -> info.getGenerationdate() == null ||
+                                    JSCommonUtils.dateDifferenceExample(info.getGenerationdate(), today, checkCycleUnit) == info.getInspectioncycle())
+                            .forEach(apsHazardInvestigationTemplateZibiaoDo -> {
+                                dataMap.computeIfAbsent(startInstance.getTime().getTime() + ";" + endInstance.getTime().getTime(), k -> new ArrayList<>()).add(apsHazardInvestigationTemplateZibiaoDo);
+                                updateGenerationDateDo.setId(apsHazardInvestigationTemplateZibiaoDo.getId());
+                                updateGenerationDateDo.setGenerationdate(startInstance.getTime());
+                                updateGenerationDateList.add(updateGenerationDateDo);
+                            });
+                }
+                ;
+
+
+            } else {
+                log.error("暂不支持的周期单位:{}", checkCycleUnit);
+            }
+        }
+        if (!dataMap.isEmpty()) {
+            dataMap.forEach((k, v) -> {
+                //任务生成
+                hazardInvestigationService.assembleTask(mainData, v, new Date(Long.parseLong(k.split(";")[0])), new Date(Long.parseLong(k.split(";")[1])));
+            });
+        }
+        if (!updateGenerationDateList.isEmpty()) {
+            //更新上次生成时间
+            apsHazardInvestigationTemplateZibiaoService.updateBatchById(updateGenerationDateList);
+        }
+    }
+
+    public static boolean isSameDatePart(Date date, LocalDateTime localDateTime) {
+        if(date==null || localDateTime==null){
+            return false;
+        }
+        // 1. 转换 Date -> LocalDate
+        LocalDate dateAsLocalDate = date.toInstant()
+                .atZone(ZoneId.systemDefault()) // 使用系统默认时区
+                .toLocalDate();
+
+        // 2. 转换 LocalDateTime -> LocalDate
+        LocalDate localDate = localDateTime.toLocalDate();
+
+        // 3. 比较两个 LocalDate
+        return dateAsLocalDate.equals(localDate);
+    }
+
     @Override
     public R qualificationCertificateRemind() {
         List<AspCompanyCertificationsDo> list = aspCompanyCertificationsService.list(new LambdaQueryWrapper<AspCompanyCertificationsDo>()
@@ -319,9 +548,11 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
         int i = 0;
         if (generationdate != null) {
             // 当前时间距离上次生成时间的差值
-            i = JSCommonUtils.DateDifferenceExample(generationdate, calendar.getTime(), inspectioncycleunit);
+            i = JSCommonUtils.dateDifferenceExample(generationdate, calendar.getTime(), inspectioncycleunit);
         }
+
         if (SaveConstans.INSPECTION_CYCLE_UNIT.HOUR.equals(inspectioncycleunit)) {
+            // 周期单位小时
             LocalTime startTime = LocalTime.parse(hazardInvestigationTemplateDo.getStartingtimeofwork());
             LocalTime endTime = LocalTime.parse(hazardInvestigationTemplateDo.getEndtimeofwork());
             LocalTime currentTime = LocalTime.now();
@@ -336,6 +567,7 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
                 return null;
             }
         } else if (SaveConstans.INSPECTION_CYCLE_UNIT.DAY.equals(inspectioncycleunit)) {
+            // 周期单位天
             if (generationdate == null) {
                 return returnDate;
             } else if (i == inspectioncycle) {
@@ -344,6 +576,7 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
                 return null;
             }
         } else if (SaveConstans.INSPECTION_CYCLE_UNIT.MONTH.equals(inspectioncycleunit)) {
+            // 周期单位月
             if (generationdate == null) {
                 return returnDate;
             } else if (i == inspectioncycle && currentHour == 1) {
@@ -352,6 +585,9 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
                 return null;
             }
         } else if (SaveConstans.INSPECTION_CYCLE_UNIT.YEAR.equals(inspectioncycleunit)) {
+            // 周期单位年
+            calendar.set(Calendar.MONTH, Calendar.JANUARY); // 月份从0开始(0=1月)
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
             if (generationdate == null) {
                 return returnDate;
             } else if (i == inspectioncycle && currentMonth == 1 && currentDay == 1 && currentHour == 1) {
@@ -484,4 +720,12 @@ public class ScheduledTasksServiceImpl implements ScheduledTasksService {
         });
 
     }
+
+    public static void main(String[] args) {
+        Calendar startInstance = Calendar.getInstance();
+        Date date = new Date();
+        startInstance.setTime(date);
+        System.out.println(startInstance.getTime().getTime() == date.getTime());
+    }
+
 }

+ 2 - 2
js-security/security-common/src/main/java/com/rongwei/sfcommon/utils/MlConstants.java

@@ -133,12 +133,12 @@ public class MlConstants {
         /**
          * 设备
          */
-        public static final String EQU = "equ";
+        public static final String EQU = "EQU";
 
         /**
          * 风险单元(risk)
          */
-        public static final String RISK = "risk";
+        public static final String RISK = "RISK";
     }
 
     /**

+ 1 - 1
js-security/security-server/src/main/java/com/rongwei/savecheck/controller/HazardInvestigationController.java

@@ -23,7 +23,7 @@ public class HazardInvestigationController {
     private HazardInvestigationServiceImpl hazardInvestigationService;
 
     /**
-     * 生成隐患排查任务
+     * 隐患排查任务临时生成
      *
      * @param map
      * @return

+ 2 - 2
js-security/security-server/src/main/java/com/rongwei/savecheck/controller/ScheduledTasksController.java

@@ -1,7 +1,7 @@
 package com.rongwei.savecheck.controller;
 
 import com.rongwei.rwcommon.base.R;
-import com.rongwei.sfcommon.sys.service.impl.ScheduledTasksService;
+import com.rongwei.sfcommon.sys.service.ScheduledTasksService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -95,7 +95,7 @@ public class ScheduledTasksController {
         return R.ok();
     }
 
-    @Scheduled(cron = "0 0 0/1 * * ? ")
+    @Scheduled(cron = "1 0 0 * * ?")
     @PostMapping("/hazard-investigation")
     public R creatHazardInvestigationTask(){
         log.info("隐患排查任务定时生成");