From c590e968a477c7e55bf655c68e82176fbf57fafc Mon Sep 17 00:00:00 2001 From: wangfs <15029758498@163.com> Date: Fri, 5 Dec 2025 22:13:54 +0800 Subject: [PATCH] 道路回填公司+部门 --- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java | 2 +- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java | 10 ++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java | 9 +++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java | 6 +++--- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java | 5 +++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadRespVO.java | 8 ++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java | 2 +- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadService.java | 2 +- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/timeinterval/TimeIntervalFrequencyUtil.java | 6 +++--- 11 files changed, 174 insertions(+), 44 deletions(-) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java index 55df46e..b11bc59 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/inspectionplan/InspectionPlanController.java @@ -49,7 +49,7 @@ public class InspectionPlanController { @PreAuthorize("@ss.hasPermission('garden:inspection-plan:create')") public CommonResult createInspectionPlan(@Valid @RequestBody InspectionPlanSaveReqVO createReqVO) { if(!createReqVO.verify()){ - log.warn("次数值范围:1-20或者分数格式:1/3, rateValue={}", createReqVO.getRateValue()); + log.warn("次数值范围:1-10或者分数格式:1/3, rateValue={}", createReqVO.getRateValue()); return error(PLAN_RATE_VALUE_ERROR); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java index cf0a27e..65e5781 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/PlanRateController.java @@ -1,5 +1,6 @@ package com.zteits.urbanops.module.garden.controller.admin.planrate; +import com.zteits.urbanops.module.garden.util.StringValidateUtil; import jakarta.validation.constraints.NotBlank; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; @@ -27,6 +28,7 @@ import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PLAN_RATE_LEVEL_ID_DUPLICATE; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PLAN_RATE_VALUE_ERROR; import com.zteits.urbanops.module.garden.controller.admin.planrate.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.planrate.PlanRateDO; @@ -45,6 +47,14 @@ public class PlanRateController { @Operation(summary = "创建计划频次") @PreAuthorize("@ss.hasPermission('garden:plan-rate:create')") public CommonResult createPlanRate(@Valid @RequestBody PlanRateSaveReqVO createReqVO) { + //校验 + for (PlanRateDetailSaveReqVO detail : createReqVO.getDetails()) { + if(!StringValidateUtil.validate(detail.getRate())){ + String str = "频次值["+detail.getRate()+"]错误,只能是1-10数字或者分数如1/3"; + return error(PLAN_RATE_VALUE_ERROR.getCode(), str); + } + } + return success(planRateService.createPlanRate(createReqVO)); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java index 4066912..43bb6f6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/planrate/vo/PlanRateSaveReqVO.java @@ -1,11 +1,15 @@ package com.zteits.urbanops.module.garden.controller.admin.planrate.vo; +import com.zteits.urbanops.framework.common.exception.ServerException; +import com.zteits.urbanops.module.garden.util.StringValidateUtil; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import lombok.*; import java.util.*; import jakarta.validation.constraints.*; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.PLAN_RATE_VALUE_ERROR; + @Schema(description = "管理后台 - 计划频次新增/修改 Request VO") @Data public class PlanRateSaveReqVO { @@ -32,4 +36,9 @@ public class PlanRateSaveReqVO { @Valid private List details; + public String verify(){ + + return null; + } + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java index 7a2aeb1..c820fff 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/RoadController.java @@ -83,8 +83,8 @@ public class RoadController { @Operation(summary = "获得道路管理分页") @PreAuthorize("@ss.hasPermission('garden:road:query')") public CommonResult> getRoadPage(@Valid RoadPageReqVO pageReqVO) { - PageResult pageResult = roadService.getRoadPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, RoadRespVO.class)); + PageResult pageResult = roadService.getRoadPage(pageReqVO); + return success(pageResult); } @PostMapping("/list") @@ -103,7 +103,7 @@ public class RoadController { public void exportRoadExcel(@Valid RoadPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = roadService.getRoadPage(pageReqVO).getList(); + List list = roadService.getRoadPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "道路管理.xls", "数据", RoadRespVO.class, BeanUtils.toBean(list, RoadRespVO.class)); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java index 453f13a..b6ce26f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadListReqVO.java @@ -2,6 +2,7 @@ package com.zteits.urbanops.module.garden.controller.admin.road.vo; import com.zteits.urbanops.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -25,4 +26,8 @@ public class RoadListReqVO { @NotNull(message = "归属(一级部门id)不能为空") private Long companyId; + @Schema(description = "业务看", example = "yl") + @NotEmpty(message = "创建者不能为空") + private String busiLine; + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadRespVO.java index 518c6f8..66eb0c2 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/road/vo/RoadRespVO.java @@ -108,4 +108,12 @@ public class RoadRespVO { @ExcelProperty("更新者") private String updaterName; + @Schema(description = "公司名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "20800") + @ExcelProperty("归属(一级部门id)") + private String companyName; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "20800") + @ExcelProperty("部门(道路负责部门)") + private String deptName; + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java index 68b83fe..fac65a8 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java @@ -96,7 +96,7 @@ public interface ErrorCodeConstants { ErrorCode PLAN_RATE_LEVEL_ID_DUPLICATE = new ErrorCode(1-100-007-002, "养护等级重复"); ErrorCode PLAN_RATE_NOT_EXISTS = new ErrorCode(1-100-007-002, "未配置计划频次"); ErrorCode PLAN_RATE_DETAIL_EXISTS = new ErrorCode(1-100-007-003, "计划频次已存在"); - ErrorCode PLAN_RATE_VALUE_ERROR = new ErrorCode(1-100-007-004, "次数值范围:1-20或者分数格式:1/3"); + ErrorCode PLAN_RATE_VALUE_ERROR = new ErrorCode(1-100-007-004, "次数值范围:1-10或者分数格式:1/3"); ErrorCode MATERIAL_TYPE_NOT_EXISTS = new ErrorCode(1-100-004-001, "物料类型不存在"); ErrorCode MATERIAL_TYPE_MANAGER_NOT_EXISTS = new ErrorCode(1-100-004-002, "耗材类别管理不存在"); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadService.java index 1e8a0e0..7e9d2bc 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadService.java @@ -57,7 +57,7 @@ public interface RoadService { * @param pageReqVO 分页查询 * @return 道路管理分页 */ - PageResult getRoadPage(RoadPageReqVO pageReqVO); + PageResult getRoadPage(RoadPageReqVO pageReqVO); /** * 道路列表查询 diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java index 477f81e..40d34a4 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/road/RoadServiceImpl.java @@ -2,14 +2,22 @@ package com.zteits.urbanops.module.garden.service.road; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.garden.controller.admin.inspectionplan.vo.InspectionPlanRespVO; +import com.zteits.urbanops.module.garden.dal.dataobject.inspectionplan.InspectionPlanRoleDO; import com.zteits.urbanops.module.garden.dal.mysql.road.RoadInterceptMapper; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; +import com.zteits.urbanops.module.system.dal.dataobject.permission.RoleDO; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; +import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; + import com.zteits.urbanops.module.garden.controller.admin.road.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.road.RoadDO; import com.zteits.urbanops.framework.common.pojo.PageResult; @@ -17,6 +25,8 @@ import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.dal.mysql.road.RoadMapper; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + /** * 道路管理 Service 实现类 @@ -33,6 +43,10 @@ public class RoadServiceImpl implements RoadService { @Resource private RoadInterceptMapper roadInterceptMapper; + @Resource + private DeptApi deptApi; + + @Override public Long createRoad(RoadSaveReqVO createReqVO) { LocalDateTime now = LocalDateTime.now(); @@ -88,8 +102,40 @@ public class RoadServiceImpl implements RoadService { } @Override - public PageResult getRoadPage(RoadPageReqVO pageReqVO) { - return roadInterceptMapper.selectPage(pageReqVO); + public PageResult getRoadPage(RoadPageReqVO pageReqVO) { + PageResult pageResult = roadInterceptMapper.selectPage(pageReqVO); + PageResult page = BeanUtils.toBean(pageResult, RoadRespVO.class); + addDataInspectionPlan(page.getList()); + return page; + } + + /** + * 回填部门/公司/角色 + * @param list 分页对象 + */ + private void addDataInspectionPlan(List list ){ + if(CollectionUtils.isEmpty(list)){ + return ; + } + //公司 + Set companyIds = list.stream().map(RoadRespVO::getCompanyId).collect(Collectors.toSet()); + //部门 + Set deptIds = list.stream().map(RoadRespVO::getDeptId).collect(Collectors.toSet()); + deptIds.addAll(companyIds); + /*1.获取部门*/ + Map deptMap = deptApi.getDeptMap(deptIds); + + list.forEach(plan -> { + DeptRespDTO dept = deptMap.get(plan.getDeptId()); + if (dept != null) { + plan.setDeptName(dept.getName()); + + } + DeptRespDTO company = deptMap.get(plan.getCompanyId()); + if(company != null){ + plan.setCompanyName(company.getName()); + } + }); } @Override @@ -99,6 +145,7 @@ public class RoadServiceImpl implements RoadService { sql.lambda().eq(RoadDO::getCompanyId, reqVO.getCompanyId()) .eq(RoadDO::getLevelId, reqVO.getLevelId()) + .eq(RoadDO::getBusiLine, reqVO.getBusiLine()) .likeRight(StringUtils.isNotEmpty(reqVO.getRoadName()), RoadDO::getRoadName, reqVO.getRoadName()); return roadMapper.selectList(sql); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java index 755644d..a55458f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/StringValidateUtil.java @@ -6,58 +6,109 @@ import java.util.regex.Pattern; * 字符串校验工具:校验是否为1-20的整数或合法分数(如1/3) */ public class StringValidateUtil { - // 正则1:匹配1-20的整数(无前置0,如"05"非法) - private static final Pattern INTEGER_PATTERN = Pattern.compile("^(1|[1-9]\\d?|20)$"); - // 正则2:匹配分数格式(分子/分母均为正整数,无空格、无空值) - private static final Pattern FRACTION_PATTERN = Pattern.compile("^[1-9]\\d*/[1-9]\\d*$"); + + // 正则表达式:匹配1-10的数字 或 分子/分母(分子、分母均为1-10的数字) + private static final Pattern PATTERN = Pattern.compile( + "^(?:[1-9]|10)$|^(?:[1-9]|10)/(?:[1-9]|10)$" + ); /** - * 核心校验方法 - * @param input 待校验的字符串 - * @return true=合法,false=非法 + * 校验字符是否符合规则(正则表达式方式) + * @param input 待校验的字符 + * @return true-符合,false-不符合 */ public static boolean validate(String input) { - // 空值/空字符串直接非法 if (input == null || input.trim().isEmpty()) { return false; } - String trimInput = input.trim(); // 去除首尾空格(若允许空格可省略) + return PATTERN.matcher(input.trim()).matches(); + } - // 先校验是否为1-20的整数 - if (INTEGER_PATTERN.matcher(trimInput).matches()) { - return true; + /** + * 校验字符是否符合规则(逻辑校验方式,便于理解和调试) + * @param input 待校验的字符 + * @return true-符合,false-不符合 + */ + public static boolean validateByLogic(String input) { + if (input == null || input.trim().isEmpty()) { + return false; + } + input = input.trim(); + + // 检查是否为纯数字 + if (isNumber(input)) { + int num = Integer.parseInt(input); + return num >= 1 && num <= 10; } - // 再校验是否为合法分数格式 - if (FRACTION_PATTERN.matcher(trimInput).matches()) { - // 可选:若需要限制分子/分母范围(如1-20),可添加以下逻辑 - String[] parts = trimInput.split("/"); - int numerator = Integer.parseInt(parts[0]); // 分子 - int denominator = Integer.parseInt(parts[1]); // 分母 - // 示例:限制分子、分母均为1-20 - return numerator >= 1 && numerator <= 20 && denominator >= 1 && denominator <= 20; + // 检查是否为分数格式 + if (input.contains("/")) { + String[] parts = input.split("/"); + if (parts.length != 2) { + return false; // 分数必须是分子/分母两部分 + } + // 校验分子 + if (!isNumber(parts[0])) { + return false; + } + int numerator = Integer.parseInt(parts[0]); + if (numerator < 1 || numerator > 10) { + return false; + } + // 校验分母 + if (!isNumber(parts[1])) { + return false; + } + int denominator = Integer.parseInt(parts[1]); + return denominator >= 1 && denominator <= 10; } - // 既不是整数也不是分数 + // 既不是数字也不是分数 return false; } + /** + * 判断字符串是否为整数 + * @param str 字符串 + * @return true-是整数,false-不是 + */ + private static boolean isNumber(String str) { + if (str == null || str.isEmpty()) { + return false; + } + for (char c : str.toCharArray()) { + if (!Character.isDigit(c)) { + return false; + } + } + // 处理数字以0开头的情况(如01、05,不符合1-10的规则) + if (str.length() > 1 && str.startsWith("0")) { + return false; + } + return true; + } + // 测试用例 public static void main(String[] args) { - // 合法用例 - System.out.println(validate("5")); // true(1-20整数) - System.out.println(validate("20")); // true(1-20整数) - System.out.println(validate("1/3")); // true(分数,分子分母1-20) - System.out.println(validate("10/20")); // true(分数,分子分母1-20) + // 测试符合规则的情况 + System.out.println(validate("1")); // true + System.out.println(validate("10")); // true + System.out.println(validate("1/3")); // true + System.out.println(validate("5/1")); // true + System.out.println(validate("10/10")); // true - // 非法用例 + // 测试不符合规则的情况 System.out.println(validate("0")); // false(小于1) - System.out.println(validate("21")); // false(大于20) - System.out.println(validate("1.5")); // false(小数,非整数/分数) - System.out.println(validate("1/0")); // false(分母为0) - System.out.println(validate(" 1/3")); // false(首尾空格,trim后合法,若保留空格则false) - System.out.println(validate("1//3")); // false(格式错误) - System.out.println(validate("21/5")); // false(分子超20) + System.out.println(validate("11")); // false(大于10) + System.out.println(validate("1/0")); // false(分母小于1) + System.out.println(validate("1/11")); // false(分母大于10) + System.out.println(validate("1.5")); // false(小数) + System.out.println(validate("1/3/5")); // false(多斜杠) + System.out.println(validate(" 1/3 ")); // true(trim后符合,validate方法会处理) System.out.println(validate(null)); // false(空值) + + // 测试逻辑校验方式 + System.out.println(validateByLogic("2/3")); // true + System.out.println(validateByLogic("05")); // false(以0开头) } } 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 f4dbcf1..e9be9b5 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 @@ -133,11 +133,11 @@ public class TimeIntervalFrequencyUtil { r1.forEach(System.out::println); System.out.println("\n=== 示例2:每3周一次(21天),按周 ==="); - List r2 = calculate("2025-01-01", "2025-02-01", "1/3", 2); + List r2 = calculate("2025-01-01", "2025-02-08", "1/2", 2); r2.forEach(System.out::println); - System.out.println("\n=== 示例3:每2个月一次,按月 ==="); - List r3 = calculate("2025-01-01", "2025-12-31", "1/2", 3); + System.out.println("\n=== 示例3:每5个月一次,按月 ==="); + List r3 = calculate("2025-11-01", "2025-12-31", "5/1", 3); r3.forEach(System.out::println); System.out.println("\n=== 示例4:每3年一次,按年 ==="); -- libgit2 0.21.4