车车 3 сар өмнө
parent
commit
c51f5a5620

+ 11 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/sop/SopExecutionPlanServiceImpl.java

@@ -28,6 +28,17 @@ public class SopExecutionPlanServiceImpl extends ServiceImpl<SopExecutionPlanMap
 
 
     @Override
     @Override
     public Long createSopExecutionPlan(SopExecutionPlanSaveReqVO createReqVO) {
     public Long createSopExecutionPlan(SopExecutionPlanSaveReqVO createReqVO) {
+        // 分类处理
+        if (createReqVO.getFrequencyUnit().equals(0)) {
+            // 处理年的数据
+
+
+
+        }
+
+
+
+
         // 插入
         // 插入
         SopExecutionPlanDO sopExecutionPlan = BeanUtils.toBean(createReqVO, SopExecutionPlanDO.class);
         SopExecutionPlanDO sopExecutionPlan = BeanUtils.toBean(createReqVO, SopExecutionPlanDO.class);
         sopExecutionPlanMapper.insert(sopExecutionPlan);
         sopExecutionPlanMapper.insert(sopExecutionPlan);

+ 80 - 3
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/utils/SuperDateUtils.java

@@ -1,5 +1,7 @@
 package cn.iocoder.yudao.module.iscs.utils;
 package cn.iocoder.yudao.module.iscs.utils;
 
 
+import org.apache.commons.lang3.StringUtils;
+
 import java.time.DayOfWeek;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.YearMonth;
 import java.time.YearMonth;
@@ -12,7 +14,6 @@ public class SuperDateUtils {
     private static final DateTimeFormatter YYYYMMDD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     private static final DateTimeFormatter YYYYMMDD = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
 
 
 
-
     // ------------------------------------- 获取指定时间段内的所有日期 ---------------------------------------------------
     // ------------------------------------- 获取指定时间段内的所有日期 ---------------------------------------------------
 
 
     /**
     /**
@@ -129,6 +130,7 @@ public class SuperDateUtils {
     }*/
     }*/
 
 
     // ---------------------------------- 获取指定时间段内的所有指定号日期 -----------------------------------------------------
     // ---------------------------------- 获取指定时间段内的所有指定号日期 -----------------------------------------------------
+
     /**
     /**
      * 根据时间段和指定日期中的“日”部分,获取所有匹配的日期。
      * 根据时间段和指定日期中的“日”部分,获取所有匹配的日期。
      *
      *
@@ -183,8 +185,9 @@ public class SuperDateUtils {
 
 
     /**
     /**
      * 获取指定时间段内每月的第指定天数的日期。
      * 获取指定时间段内每月的第指定天数的日期。
-     * @param startStr 起始日期字符串,格式为yyyy-MM-dd
-     * @param endStr 结束日期字符串,格式为yyyy-MM-dd
+     *
+     * @param startStr   起始日期字符串,格式为yyyy-MM-dd
+     * @param endStr     结束日期字符串,格式为yyyy-MM-dd
      * @param dayOfMonth 每月的第几天(如1表示每月1日)
      * @param dayOfMonth 每月的第几天(如1表示每月1日)
      * @return 符合条件的日期列表
      * @return 符合条件的日期列表
      * java帮我写一个帮助类 可以通过传入时间段  获取指定每月第多少天的日期  如输入2025-08-23,2025-10-25,1,输出2025-09-01和2025-10-01,如果超过每月天数 如输入第天31天,则输出2025-09-30和2025-10-31
      * java帮我写一个帮助类 可以通过传入时间段  获取指定每月第多少天的日期  如输入2025-08-23,2025-10-25,1,输出2025-09-01和2025-10-01,如果超过每月天数 如输入第天31天,则输出2025-09-30和2025-10-31
@@ -241,8 +244,10 @@ public class SuperDateUtils {
     }*/
     }*/
 
 
 // ---------------------------------------- 根据输入的年月获取相邻的前后月份 -----------------------------------------
 // ---------------------------------------- 根据输入的年月获取相邻的前后月份 -----------------------------------------
+
     /**
     /**
      * 根据输入的年月获取相邻的前后月份。
      * 根据输入的年月获取相邻的前后月份。
+     *
      * @param yearMonthStr 输入的年月字符串,格式为"yyyy-MM"
      * @param yearMonthStr 输入的年月字符串,格式为"yyyy-MM"
      * @return 包含前一个月和后一个月的列表,格式为["yyyy-MM", "yyyy-MM"]
      * @return 包含前一个月和后一个月的列表,格式为["yyyy-MM", "yyyy-MM"]
      * java帮我写一个帮助类 可以通过传入月份  获取相邻月份数据  如输入2025-08,输出2025-07和2025-09
      * java帮我写一个帮助类 可以通过传入月份  获取相邻月份数据  如输入2025-08,输出2025-07和2025-09
@@ -274,4 +279,76 @@ public class SuperDateUtils {
         System.out.println(getAdjacentMonths("2025-12")); // [2025-11, 2026-01]
         System.out.println(getAdjacentMonths("2025-12")); // [2025-11, 2026-01]
     }*/
     }*/
 
 
+
+    // ------------------------------------------根据频率,当前时间和指定的第多少年去获取最近的3条数据
+
+    /**
+     * 计算最近多次符合条件的日期
+     *
+     * @param effectiveDateStr 生效日期,格式yyyy-MM-dd
+     * @param frequencyYears   频率(年数)
+     * @param dayOfYear        第几天(从1开始)
+     * @param count            输出后面多少个数据
+     * @param endDateStr       截至日期,格式yyyy-MM-dd
+     * @return 最近多次的日期字符串数组,格式yyyy-MM-dd
+     */
+    public static List<String> getAdjacentDates(String effectiveDateStr, int frequencyYears, int dayOfYear, int count, String endDateStr) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate effectiveDate = LocalDate.parse(effectiveDateStr, formatter);
+        int baseYear = effectiveDate.getYear();
+
+        // 获取基准年份的有效日期(自动调整非法天数)
+        LocalDate validDateInBaseYear = getValidDateForYear(baseYear, dayOfYear);
+        List<String> result = new ArrayList<>();
+
+        // 添加基准年份日期(需满足不早于生效日期)
+        if (!validDateInBaseYear.isBefore(effectiveDate)) {
+            result.add(validDateInBaseYear.format(formatter));
+        }
+
+        // 初始化当前年份为基准年 + 频率年数
+        int currentYear = baseYear + frequencyYears;
+
+        // 持续生成后续日期,直到达到指定数量或超出截止日期
+        while (result.size() < count) {
+            LocalDate targetDate = getValidDateForYear(currentYear, dayOfYear);
+            // 检查是否超过截止日期(如果有)
+            if (endDateStr != null) {
+                LocalDate endDate = LocalDate.parse(endDateStr, formatter);
+                if (targetDate.isAfter(endDate)) {
+                    break;
+                }
+            }
+            // 确保日期在生效日期之后
+            if (targetDate.isAfter(effectiveDate)) {
+                result.add(targetDate.format(formatter));
+            } else {
+                break; // 无更多有效日期
+            }
+            currentYear += frequencyYears; // 按频率递增年份
+        }
+        List<String> list = result.subList(0, Math.min(count, result.size()));
+        if (StringUtils.isNotBlank(endDateStr)) {
+            list.removeIf(item -> LocalDate.parse(item, formatter).isAfter(LocalDate.parse(endDateStr, formatter)));
+        }return list;
+    }
+
+    private static LocalDate getValidDateForYear(int year, int dayOfYear) {
+        try {
+            return LocalDate.ofYearDay(year, dayOfYear);
+        } catch (Exception e) {
+            // 自动调整到该年最后一天
+            int maxDay = LocalDate.of(year, 12, 31).lengthOfYear();
+            return LocalDate.ofYearDay(year, maxDay);
+        }
+    }
+
+    public static void main(String[] args) {
+        // 示例测试:查找2025-07-24之后,每年第250天的日期,最多10个
+        List<String> dates = getAdjacentDates("2025-07-24", 1, 206, 10, "2029-07-24");
+        System.out.println("结果:" + dates);
+        // 预期输出应包含2028-09-07(若250天合法)
+    }
+
+
 }
 }