diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java index c1dbcbe..37f1603 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/vo/InspectionPlanSaveReqVO.java @@ -46,6 +46,7 @@ public class InspectionPlanSaveReqVO { @Schema(description = "频次值", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "频次值不能为空") + @Size(max = 6) private String rateValue; @Schema(description = "周期ID: 0:次;1:日/次;2:周/次;3:月/次;4:季/次;5:半年/次;6:年/次", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java index 88b3701..6eb8940 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/maintainplan/vo/MaintainPlanSaveReqVO.java @@ -46,6 +46,7 @@ public class MaintainPlanSaveReqVO { @Schema(description = "频次值", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "频次值不能为空") + @Size(max = 6) private String rateValue; @Schema(description = "周期ID: 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java index 21e8d4c..36b2e29 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadStreetController.java @@ -40,14 +40,14 @@ public class RoadStreetController { @PostMapping("/create") @Operation(summary = "创建街道") - @PreAuthorize("@ss.hasPermission('garden:road-street:create')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:create')") public CommonResult createRoadStreet(@Valid @RequestBody RoadStreetSaveReqVO createReqVO) { return success(roadStreetService.createRoadStreet(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新街道") - @PreAuthorize("@ss.hasPermission('garden:road-street:update')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:update')") public CommonResult updateRoadStreet(@Valid @RequestBody RoadStreetSaveReqVO updateReqVO) { roadStreetService.updateRoadStreet(updateReqVO); return success(true); @@ -56,7 +56,7 @@ public class RoadStreetController { @DeleteMapping("/delete") @Operation(summary = "删除街道") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") public CommonResult deleteRoadStreet(@RequestParam("id") Long id) { roadStreetService.deleteRoadStreet(id); return success(true); @@ -65,7 +65,7 @@ public class RoadStreetController { @DeleteMapping("/delete-list") @Parameter(name = "ids", description = "编号", required = true) @Operation(summary = "批量删除街道") - @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:delete')") public CommonResult deleteRoadStreetList(@RequestParam("ids") List ids) { roadStreetService.deleteRoadStreetListByIds(ids); return success(true); @@ -74,7 +74,7 @@ public class RoadStreetController { @GetMapping("/get") @Operation(summary = "获得街道") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('garden:road-street:query')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:query')") public CommonResult getRoadStreet(@RequestParam("id") Long id) { RoadStreetDO roadStreet = roadStreetService.getRoadStreet(id); return success(BeanUtils.toBean(roadStreet, RoadStreetRespVO.class)); @@ -83,7 +83,7 @@ public class RoadStreetController { @GetMapping("/list") @Operation(summary = "获得街道列表") @Parameter(name = "busi_line", description = "业务线", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('garden:road-street:query')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:query')") public CommonResult> getRoadStreet(@RequestParam("busi_line") @NotBlank String busiLine) { List roadStreet = roadStreetService.getRoadStreetList(busiLine); return success(BeanUtils.toBean(roadStreet, RoadStreetRespVO.class)); @@ -91,7 +91,7 @@ public class RoadStreetController { @GetMapping("/page") @Operation(summary = "获得街道分页") - @PreAuthorize("@ss.hasPermission('garden:road-street:query')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:query')") public CommonResult> getRoadStreetPage(@Valid RoadStreetPageReqVO pageReqVO) { PageResult pageResult = roadStreetService.getRoadStreetPage(pageReqVO); return success(BeanUtils.toBean(pageResult, RoadStreetRespVO.class)); @@ -99,7 +99,7 @@ public class RoadStreetController { @GetMapping("/export-excel") @Operation(summary = "导出街道 Excel") - @PreAuthorize("@ss.hasPermission('garden:road-street:export')") +// @PreAuthorize("@ss.hasPermission('garden:road-street:export')") @ApiAccessLog(operateType = EXPORT) public void exportRoadStreetExcel(@Valid RoadStreetPageReqVO pageReqVO, HttpServletResponse response) throws IOException { @@ -110,4 +110,4 @@ public class RoadStreetController { BeanUtils.toBean(list, RoadStreetRespVO.class)); } -} \ No newline at end of file +} 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 570e5af..c66da31 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 @@ -124,7 +124,7 @@ public class MaintainPlanServiceImpl implements MaintainPlanService { calculate.add(periodResult); planNum = Integer.parseInt(createReqVO.getRateValue()); }else{ - calculate= TimeIntervalFrequencyUtil.calculate(createReqVO.getBeginTime().toString(), createReqVO.getEndTime().toString(), rateValue, createReqVO.getCycleId()); + calculate= TimeIntervalFrequencyUtil.calculateNew(createReqVO.getBeginTime().toString(), createReqVO.getEndTime().toString(), rateValue, createReqVO.getCycleId()); if (CollectionUtils.isEmpty(calculate)) { log.warn("获取两个时间之间间隔天数错误"); return CommonResult.error(INSPECTION_CYCLE_ERROR); 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 1b37e44..fdb19c2 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 @@ -2,6 +2,7 @@ package com.zteits.urbanops.module.garden.util.timeinterval; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -38,6 +39,82 @@ public class TimeIntervalFrequencyUtil { * @param cycleId 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 * @return 划分结果列表 */ + /** + * 计算时间段划分结果(基于固定天数换算) + * + * @param startStr 开始日期 (yyyy-MM-dd) + * @param endStr 结束日期 (yyyy-MM-dd) + * @param freq 频次值,格式 "x/y",其中 x 为每周期次数,y 为周期数量 + * @param cycleId 周期类型:1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 + * @return 时间段划分结果列表,包含每个时间段的开始日期、结束日期和执行次数 + */ + public static List calculateNew(String startStr, String endStr, String freq, Integer cycleId) { + // 解析日期参数 + LocalDate startDate = LocalDate.parse(startStr, FORMATTER); + LocalDate endDate = LocalDate.parse(endStr, FORMATTER); + + // 边界条件:开始日期晚于结束日期时返回空列表 + if (startDate.isAfter(endDate)) { + return Collections.emptyList(); + } + + // 解析频次参数 (格式: "x/y") + String[] freqParts = freq.split("/", 2); + if (freqParts.length != 2) { + throw new IllegalArgumentException(String.format("频次值格式错误,应为 'x/y': %s", freq)); + } + int timesPerPeriod = Integer.parseInt(freqParts[0]); // 每周期执行次数 + int periodCount = Integer.parseInt(freqParts[1]); // 周期数量 + + // 计算周期相关天数 + long daysPerPeriod = convertToDaysNew(periodCount, cycleId); // 单个周期的天数 + long totalPeriodDays = daysPerPeriod * periodCount; // 总周期天数 + + List resultList = new ArrayList<>(); + LocalDate segmentStart = startDate; + + // 循环划分时间段 + while (!segmentStart.isAfter(endDate)) { + // 计算当前时间段的理论结束日期(segmentStart + totalPeriodDays - 1) + LocalDate segmentEnd = safePlusDays(segmentStart, totalPeriodDays - 1); + + // 如果理论结束日期超过总结束日期,则截断 + if (segmentEnd.isAfter(endDate)) { + segmentEnd = endDate; + } + + // 计算当前时间段的实际天数(包含开始和结束日期) + long daysInSegment = ChronoUnit.DAYS.between(segmentStart, segmentEnd) + 1; + + // 计算当前时间段的执行次数:(实际天数/周期天数) * 每周期次数,向上取整 + double proportion = (double) daysInSegment / daysPerPeriod; + int executionCount = (int) Math.ceil(proportion * timesPerPeriod); + + // 添加当前时间段结果 + resultList.add(new PeriodResult(segmentStart, segmentEnd, executionCount)); + + // 计算下一个时间段的开始日期(当前结束日期的次日) + LocalDate nextSegmentStart = segmentEnd.plusDays(1); + + // 如果下一个开始日期超过总结束日期,则退出循环 + if (nextSegmentStart.isAfter(endDate)) { + break; + } + + segmentStart = nextSegmentStart; + } + + return resultList; + } + /** + * 计算时间段划分结果(基于固定天数换算) + * + * @param startStr 开始日期 (yyyy-MM-dd) + * @param endStr 结束日期 (yyyy-MM-dd) + * @param freq 频次值,格式 "x/y" + * @param cycleId 1:日/次;2:周/次;3:月/次;4:年/次;5:按次;6:季度;7:半年 + * @return 划分结果列表 + */ public static List calculate(String startStr, String endStr, String freq, Integer cycleId) { LocalDate start = LocalDate.parse(startStr, FORMATTER); LocalDate end = LocalDate.parse(endStr, FORMATTER); @@ -77,7 +154,36 @@ public class TimeIntervalFrequencyUtil { return results; } - + /** + * 将 y 个单位转换为固定天数 + * TIME(0, "次"), + * DAY(1, "次/日"), + * WEEK(2, "次/周"), + * MONTH(3, "次/月"), + * QUARTER(4, "次/季"), + * SEMIANNUAL(5, "次/半年"), + * YEAR(6, "次/年"); + */ + private static long convertToDaysNew(int y, Integer cycleId) { + switch (cycleId) { + case 1: // DAY + return 1; + case 2: // WEEK + return (long) 7; + case 3: // MONTH + return (long) 30; + case 6: // YEAR + return (long) 365; + case 0: // TIME + return 9999; // 按次:将整个时间段视为1个周期 + case 4: // QUARTER + return (long) 90; // 1季度=3个月=90天 + case 5: // SEMIANNUAL + return (long) 180; // 半年=6个月=180天 + default: + throw new IllegalArgumentException("无效的周期ID: " + cycleId); + } + } /** * 将 y 个单位转换为固定天数 * TIME(0, "次"), @@ -123,52 +229,56 @@ public class TimeIntervalFrequencyUtil { // ====================== 测试用例 ====================== public static void main(String[] args) { - //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); - // 输出: - // 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); + + List r2 = calculateNew("2026-01-01", "2026-02-15", "7/1", 2); r2.forEach(System.out::println); - // 每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:每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); - // 每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=== 示例6:按次单位,整个时间段算1个周期 === 2025-01-01 2025-12-31"); - List r6 = calculate("2025-01-01", "2025-12-31", "2/1", 5); - r6.forEach(System.out::println); - - System.out.println("\n=== 示例7:每1季度2次(即:2/1),按季度(90天)=== 2025-01-01 2025-12-31"); - List r7 = calculate("2025-01-01", "2025-12-31", "2/1", 6); - r7.forEach(System.out::println); - - System.out.println("\n=== 示例8:每1半年3次(即:3/1),按半年(180天)=== 2025-01-01 2025-12-31"); - List r8 = calculate("2025-01-01", "2025-12-31", "3/1", 7); - r8.forEach(System.out::println); + +// //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); +// // 输出: +// // 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); +// // 每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:每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); +// // 每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=== 示例6:按次单位,整个时间段算1个周期 === 2025-01-01 2025-12-31"); +// List r6 = calculate("2025-01-01", "2025-12-31", "2/1", 5); +// r6.forEach(System.out::println); +// +// System.out.println("\n=== 示例7:每1季度2次(即:2/1),按季度(90天)=== 2025-01-01 2025-12-31"); +// List r7 = calculate("2025-01-01", "2025-12-31", "2/1", 6); +// r7.forEach(System.out::println); +// +// System.out.println("\n=== 示例8:每1半年3次(即:3/1),按半年(180天)=== 2025-01-01 2025-12-31"); +// List r8 = calculate("2025-01-01", "2025-12-31", "3/1", 7); +// r8.forEach(System.out::println); } }