From 4a1e616f1cdb6e06daa23ae113e8d817206dd07e Mon Sep 17 00:00:00 2001 From: zichun Date: Wed, 6 May 2026 17:19:48 +0800 Subject: [PATCH] feat(mod): module create DTO and VO REQ-MOD-001 --- backend/src/main/java/com/xly/erp/module/mod/dto/ModuleCreateDTO.java | 40 ++++++++++++++++++++++++++++++++++++++++ backend/src/main/java/com/xly/erp/module/mod/vo/ModuleVO.java | 37 +++++++++++++++++++++++++++++++++++++ backend/src/test/java/com/xly/erp/module/mod/dto/ModuleCreateDTOValidationTest.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 0 deletions(-) create mode 100644 backend/src/main/java/com/xly/erp/module/mod/dto/ModuleCreateDTO.java create mode 100644 backend/src/main/java/com/xly/erp/module/mod/vo/ModuleVO.java create mode 100644 backend/src/test/java/com/xly/erp/module/mod/dto/ModuleCreateDTOValidationTest.java diff --git a/backend/src/main/java/com/xly/erp/module/mod/dto/ModuleCreateDTO.java b/backend/src/main/java/com/xly/erp/module/mod/dto/ModuleCreateDTO.java new file mode 100644 index 0000000..2682f80 --- /dev/null +++ b/backend/src/main/java/com/xly/erp/module/mod/dto/ModuleCreateDTO.java @@ -0,0 +1,40 @@ +package com.xly.erp.module.mod.dto; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +public class ModuleCreateDTO { + + @NotBlank + @Pattern(regexp = "^(手机端|前端业务|系统配置|接口)$", message = "sDisplayType 必须是 手机端/前端业务/系统配置/接口 之一") + private String sDisplayType; + + @NotBlank + @Size(max = 100) + private String sProcedureName; + + @NotBlank + @Size(max = 50) + private String sModuleType; + + @NotBlank + @Size(max = 50) + private String sManageDeptEn; + + /** 可空,service 层 default false */ + private Boolean bShowPermission; + + @NotBlank + @Size(max = 100) + private String sModuleNameZh; + + /** 可空 */ + private Integer iParentId; + + @Min(0) + private Integer iSortOrder; +} diff --git a/backend/src/main/java/com/xly/erp/module/mod/vo/ModuleVO.java b/backend/src/main/java/com/xly/erp/module/mod/vo/ModuleVO.java new file mode 100644 index 0000000..14fa9cf --- /dev/null +++ b/backend/src/main/java/com/xly/erp/module/mod/vo/ModuleVO.java @@ -0,0 +1,37 @@ +package com.xly.erp.module.mod.vo; + +import com.xly.erp.module.mod.entity.ModuleEntity; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ModuleVO { + private Integer iIncrement; + private String sDisplayType; + private String sProcedureName; + private String sModuleType; + private String sManageDeptEn; + private Boolean bShowPermission; + private String sModuleNameZh; + private Integer iParentId; + private Integer iSortOrder; + private LocalDateTime tCreateDate; + private Boolean bDeleted; + + public static ModuleVO from(ModuleEntity e) { + ModuleVO v = new ModuleVO(); + v.setIIncrement(e.getIIncrement()); + v.setSDisplayType(e.getSDisplayType()); + v.setSProcedureName(e.getSProcedureName()); + v.setSModuleType(e.getSModuleType()); + v.setSManageDeptEn(e.getSManageDeptEn()); + v.setBShowPermission(e.getBShowPermission()); + v.setSModuleNameZh(e.getSModuleNameZh()); + v.setIParentId(e.getIParentId()); + v.setISortOrder(e.getISortOrder()); + v.setTCreateDate(e.getTCreateDate()); + v.setBDeleted(e.getBDeleted()); + return v; + } +} diff --git a/backend/src/test/java/com/xly/erp/module/mod/dto/ModuleCreateDTOValidationTest.java b/backend/src/test/java/com/xly/erp/module/mod/dto/ModuleCreateDTOValidationTest.java new file mode 100644 index 0000000..4ace5ec --- /dev/null +++ b/backend/src/test/java/com/xly/erp/module/mod/dto/ModuleCreateDTOValidationTest.java @@ -0,0 +1,71 @@ +package com.xly.erp.module.mod.dto; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import org.junit.jupiter.api.Test; + +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +class ModuleCreateDTOValidationTest { + + private static final ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory(); + private final Validator validator = FACTORY.getValidator(); + + private ModuleCreateDTO valid() { + ModuleCreateDTO d = new ModuleCreateDTO(); + d.setSDisplayType("前端业务"); + d.setSProcedureName("sp_audit_user"); + d.setSModuleType("USR"); + d.setSManageDeptEn("IT"); + d.setBShowPermission(false); + d.setSModuleNameZh("用户管理"); + d.setIParentId(null); + d.setISortOrder(0); + return d; + } + + @Test + void allValidFields_yieldsNoViolations() { + Set> v = validator.validate(valid()); + assertThat(v).isEmpty(); + } + + @Test + void blankRequiredFields_yieldsViolations() { + ModuleCreateDTO d = new ModuleCreateDTO(); + // 全部不填,触发 5 个 @NotBlank + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()) + .contains("sDisplayType", "sProcedureName", "sModuleType", "sManageDeptEn", "sModuleNameZh"); + } + + @Test + void invalidDisplayTypeEnum_yieldsViolation() { + ModuleCreateDTO d = valid(); + d.setSDisplayType("非法值"); + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sDisplayType"); + } + + @Test + void overSizedFields_yieldsViolations() { + ModuleCreateDTO d = valid(); + d.setSProcedureName("a".repeat(101)); + d.setSModuleType("a".repeat(51)); + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()) + .contains("sProcedureName", "sModuleType"); + } + + @Test + void negativeSortOrder_yieldsViolation() { + ModuleCreateDTO d = valid(); + d.setISortOrder(-1); + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("iSortOrder"); + } +} -- libgit2 0.22.2