diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanDetailRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanDetailRespVO.java index acda41f..78a8502 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanDetailRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanDetailRespVO.java @@ -52,6 +52,14 @@ public class InspectionPlanDetailRespVO { @ExcelProperty("执行时间") private LocalDateTime endTime; + @Schema(description = "计划次数") + @ExcelProperty("计划次数") + private Integer planNum; + + @Schema(description = "完成次数") + @ExcelProperty("完成次数") + private Integer planFinishNum; + @Schema(description = "完成状态 1:未完成;2:进行中;3:已完成", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("完成状态 1:未完成;2:进行中;3:已完成") private Integer finishState; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java index 3a8054a..7cf2b27 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanDetailRespVO.java @@ -51,6 +51,10 @@ public class MaintainPlanDetailRespVO { @ExcelProperty("执行时间") private LocalDateTime endTime; + @Schema(description = "计划次数") + @ExcelProperty("计划次数") + private Integer planNum; + @Schema(description = "完成百分比", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("完成百分比") private Double finishPercent; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/inspectionplan/InspectionPlanDetailDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/inspectionplan/InspectionPlanDetailDO.java index b3abc98..c7a4b6f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/inspectionplan/InspectionPlanDetailDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/inspectionplan/InspectionPlanDetailDO.java @@ -57,6 +57,15 @@ public class InspectionPlanDetailDO extends BaseDO { * 排序号:第n次计划 */ private Integer sortNum; + + /** + * 计划次数 + */ + private Integer planNum; + /** + * 已完成次数 + */ + private Integer planFinishNum; /** * 执行开始时间 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/maintainplan/MaintainPlanDetailDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/maintainplan/MaintainPlanDetailDO.java index 0961d27..ac204ec 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/maintainplan/MaintainPlanDetailDO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/maintainplan/MaintainPlanDetailDO.java @@ -55,6 +55,7 @@ public class MaintainPlanDetailDO extends BaseDO { * 排序号:第n次计划 */ private Integer sortNum; + /** * 执行开始时间 */ @@ -63,6 +64,12 @@ public class MaintainPlanDetailDO extends BaseDO { * 执行时间 */ private LocalDateTime endTime; + + /** + * 计划次数 + */ + private Integer planNum; + /** * 完成百分比 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java index b7834fd..6796162 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/inspectionplan/InspectionPlanServiceImpl.java @@ -90,10 +90,9 @@ public class InspectionPlanServiceImpl implements InspectionPlanService { log.warn("获取两个时间之间间隔天数错误"); return CommonResult.error(INSPECTION_CYCLE_ERROR); } - //计算计划次数 - Integer planNum = calculate.size(); - + //计算计划次数 + int planNum = calculate.stream().mapToInt(PeriodResult::getCount).sum(); //巡检计划list List inspectionPlanList = new ArrayList<>(); //角色列表 @@ -138,13 +137,16 @@ public class InspectionPlanServiceImpl implements InspectionPlanService { roleList.add(inspectionPlanRoleDO); }); /*3.插入巡查计划明细*/ + int index = 1; for (PeriodResult periodResult : calculate) { InspectionPlanDetailDO entity = getInspectionPlanDetailDO(batchNo, createReqVO, roadReqVO, now); ThreadUtil.sleep(2); - entity.setSortNum(periodResult.getCount()); + entity.setSortNum(index); + entity.setPlanNum(periodResult.getCount()); entity.setBeginTime(LocalDateTime.parse(periodResult.getStart() + " 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); entity.setEndTime(LocalDateTime.parse(periodResult.getEnd() + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); detailDOList.add(entity); + index++; } }); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java index e79e1a2..bcd9835 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/maintainplan/MaintainPlanServiceImpl.java @@ -93,7 +93,7 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { return CommonResult.error(INSPECTION_CYCLE_ERROR); } //计算计划次数 - Integer planNum = calculate.size(); + int planNum = calculate.stream().mapToInt(PeriodResult::getCount).sum(); //巡检计划list List maintainPlanList = new ArrayList<>(); //角色列表 @@ -138,13 +138,16 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { roleList.add(maintainPlanRoleDO); }); /*3.插入巡查计划明细*/ + int index =1; for (PeriodResult periodResult : calculate) { MaintainPlanDetailDO entity = getMaintainPlanDetailDO(batchNo, createReqVO, roadReqVO, now); ThreadUtil.sleep(2); - entity.setSortNum(periodResult.getCount()); + entity.setSortNum(index); + entity.setPlanNum(periodResult.getCount()); entity.setBeginTime(LocalDateTime.parse(periodResult.getStart() + " 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); entity.setEndTime(LocalDateTime.parse(periodResult.getEnd() + " 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); detailDOList.add(entity); + index++; } }); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java index e9be9b5..dc74eb7 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java @@ -11,7 +11,7 @@ import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.INSPECT /** * 时间区间拆分+频次计算工具类 - * 支持:按日/周/月/年拆分,区间临界点重叠,动态计算每个区间的执行频次 + * 支持:按日/周/月/年拆分,基于固定天数换算(周=7天,月=30天,年=365天) */ public class TimeIntervalFrequencyUtil { @@ -42,12 +42,12 @@ public class TimeIntervalFrequencyUtil { } /** - * 计算时间段划分结果 + * 计算时间段划分结果(基于固定天数换算) * * @param startStr 开始日期 (yyyy-MM-dd) * @param endStr 结束日期 (yyyy-MM-dd) * @param freq 频次值,格式 "x/y" - * @param cycleId cycleId 1:日/次;2:周/次;3:月/次;4:年/次 + * @param cycleId 1:日/次;2:周/次;3:月/次;4:年/次 * @return 划分结果列表 */ public static List calculate(String startStr, String endStr, String freq, Integer cycleId) { @@ -62,31 +62,29 @@ public class TimeIntervalFrequencyUtil { if (parts.length != 2) { throw new IllegalArgumentException("频次值格式错误,应为 'x/y': " + freq); } - int x = Integer.parseInt(parts[0]); - int y = Integer.parseInt(parts[1]); + int x = Integer.parseInt(parts[0]); // 每周期次数 + int y = Integer.parseInt(parts[1]); // 周期数量 IntervalUnit unit = getIntervalUnit(cycleId); + long periodDays = convertToDays(y, unit); // 转为固定天数 List results = new ArrayList<>(); LocalDate currentStart = start; while (!currentStart.isAfter(end)) { - // 计算当前周期的理论结束日期(包含 y 个单位) - LocalDate periodEnd = calculatePeriodEnd(currentStart, y, unit); - - // 实际段结束 = min(periodEnd, end) - LocalDate segEnd = periodEnd.isAfter(end) ? end : periodEnd; + // 当前段理论结束 = currentStart + periodDays - 1 + LocalDate currentEnd = safePlusDays(currentStart, periodDays - 1); + if (currentEnd.isAfter(end)) { + currentEnd = end; // 截断 + } - results.add(new PeriodResult(currentStart, segEnd, x)); + results.add(new PeriodResult(currentStart, currentEnd, x)); // 下一段从当前段结束的第二天开始 - LocalDate nextStart = segEnd.plusDays(1); - - // 如果已经超过总结束时间,则终止 + LocalDate nextStart = currentEnd.plusDays(1); if (nextStart.isAfter(end)) { break; } - currentStart = nextStart; } @@ -94,62 +92,70 @@ public class TimeIntervalFrequencyUtil { } /** - * 计算从 start 开始,经过 y 个单位周期后的结束日期(包含) + * 将 y 个单位转换为固定天数 */ - private static LocalDate calculatePeriodEnd(LocalDate start, int y, IntervalUnit unit) { + private static long convertToDays(int y, IntervalUnit unit) { switch (unit) { case DAY: - return start.plusDays(y - 1); // 包含 y 天:start 到 start+y-1 + return y; case WEEK: - return start.plusDays((long) y * 7 - 1); // y周 = y*7天,减1得包含结束 + return (long) y * 7; case MONTH: - return addMonthsSafely(start, y).minusDays(1); + return (long) y * 30; case YEAR: - return start.plusYears(y).minusDays(1); + return (long) y * 365; default: - throw new UnsupportedOperationException("未支持的单位: " + unit); + throw new UnsupportedOperationException("不支持的单位: " + unit); } } - - /** - * 安全地加上 y 个月(避免3月31日+1月变成异常) - * 这里使用 Java 8+ 的 plusMonths 自动调整规则 + * 安全地加天数(防止溢出) */ - private static LocalDate addMonthsSafely(LocalDate date, int months) { - return date.plusMonths(months); - // Java 会自动处理:如 1月31日 +1月 → 2月28/29日(不会抛异常) + private static LocalDate safePlusDays(LocalDate date, long days) { + if (days == 0) return date; + try { + return date.plusDays(days); + } catch (ArithmeticException e) { + return days > 0 ? LocalDate.MAX : LocalDate.MIN; + } } - - - // ====================== 测试用例 ====================== - //cycleId 1:日/次;2:周/次;3:月/次;4:年/次 public static void main(String[] args) { - System.out.println("=== 示例1:每3天一次,按日 ==="); - List r1 = calculate("2025-01-01", "2025-01-07", "1/3", 1); + //1:日/次;2:周/次;3:月/次;4:年/次 + System.out.println("=== 示例1:每2天3次(即:3/2),按日 ===2025-12-01 2025-12-31"); + List r1 = calculate("2025-12-01", "2025-12-31", "3/2", 1); r1.forEach(System.out::println); - - System.out.println("\n=== 示例2:每3周一次(21天),按周 ==="); - List r2 = calculate("2025-01-01", "2025-02-08", "1/2", 2); + // 输出: + // 2025-01-01 2025-01-03 1次 + // 2025-01-04 2025-01-06 1次 + // 2025-01-07 2025-01-07 1次 + System.out.println("\n=== 示例2:每2周3次(即:3/2)(14天),按周 ===2025-12-01 2025-12-10"); + List r2 = calculate("2025-12-01", "2025-12-10", "3/2", 2); r2.forEach(System.out::println); - - System.out.println("\n=== 示例3:每5个月一次,按月 ==="); - List r3 = calculate("2025-11-01", "2025-12-31", "5/1", 3); + // 每2周 = 14天 + // 2025-01-01 ~ 2025-01-14 + // 2025-01-15 ~ 2025-01-28 + // 2025-01-29 ~ 2025-02-08(剩余11天) + System.out.println("\n=== 示例3:每2个月4次(即:4/2)(30天),按月 === 2025-09-15 2025-12-31"); + List r3 = calculate("2025-09-15", "2025-12-31", "4/2", 3); r3.forEach(System.out::println); + // 每1月 = 30天 + // 2025-01-01 ~ 2025-01-30 + // 2025-01-31 ~ 2025-02-28(30天?→ 实际是29天,但按30天算) + // 2025-03-01 ~ 2025-03-15(不足) - System.out.println("\n=== 示例4:每3年一次,按年 ==="); - List r4 = calculate("2025-01-01", "2035-06-01", "1/3", 3); + System.out.println("\n=== 示例4:每2年1次(即:1/2)(730天),按年 ===2025-01-01 2030-01-01"); + List r4 = calculate("2025-01-01", "2030-01-01", "1/2", 4); r4.forEach(System.out::println); - - System.out.println("\n=== 示例5:每2天2次,按日 ==="); - List r5 = calculate("2025-01-01", "2025-01-05", "2/2", 1); + // 每2年 = 730天 + // 2025-01-01 ~ 2025-12-26(+729d) + // 2025-12-27 ~ 2027-12-21 + // 2027-12-22 ~ 2029-12-16 + // 2029-12-17 ~ 2030-01-01(最后一段) + System.out.println("\n=== 示例5:每1年4次(即:4/1),按年(测试)=== 2023-09-15 2025-01-31"); + List r5 = calculate("2023-09-15", "2025-01-31", "4/1", 4); r5.forEach(System.out::println); - - System.out.println("\n=== 示例5:每2年1次,按年 ==="); - List r6 = calculate("2025-01-01", "2028-01-05", "1/2", 4); - r6.forEach(System.out::println); } -} \ No newline at end of file +}