Commit 4a1e616f1cdb6e06daa23ae113e8d817206dd07e

Authored by zichun
1 parent d14c3bf3

feat(mod): module create DTO and VO REQ-MOD-001

backend/src/main/java/com/xly/erp/module/mod/dto/ModuleCreateDTO.java 0 → 100644
  1 +package com.xly.erp.module.mod.dto;
  2 +
  3 +import jakarta.validation.constraints.Min;
  4 +import jakarta.validation.constraints.NotBlank;
  5 +import jakarta.validation.constraints.Pattern;
  6 +import jakarta.validation.constraints.Size;
  7 +import lombok.Data;
  8 +
  9 +@Data
  10 +public class ModuleCreateDTO {
  11 +
  12 + @NotBlank
  13 + @Pattern(regexp = "^(手机端|前端业务|系统配置|接口)$", message = "sDisplayType 必须是 手机端/前端业务/系统配置/接口 之一")
  14 + private String sDisplayType;
  15 +
  16 + @NotBlank
  17 + @Size(max = 100)
  18 + private String sProcedureName;
  19 +
  20 + @NotBlank
  21 + @Size(max = 50)
  22 + private String sModuleType;
  23 +
  24 + @NotBlank
  25 + @Size(max = 50)
  26 + private String sManageDeptEn;
  27 +
  28 + /** 可空,service 层 default false */
  29 + private Boolean bShowPermission;
  30 +
  31 + @NotBlank
  32 + @Size(max = 100)
  33 + private String sModuleNameZh;
  34 +
  35 + /** 可空 */
  36 + private Integer iParentId;
  37 +
  38 + @Min(0)
  39 + private Integer iSortOrder;
  40 +}
... ...
backend/src/main/java/com/xly/erp/module/mod/vo/ModuleVO.java 0 → 100644
  1 +package com.xly.erp.module.mod.vo;
  2 +
  3 +import com.xly.erp.module.mod.entity.ModuleEntity;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Data
  9 +public class ModuleVO {
  10 + private Integer iIncrement;
  11 + private String sDisplayType;
  12 + private String sProcedureName;
  13 + private String sModuleType;
  14 + private String sManageDeptEn;
  15 + private Boolean bShowPermission;
  16 + private String sModuleNameZh;
  17 + private Integer iParentId;
  18 + private Integer iSortOrder;
  19 + private LocalDateTime tCreateDate;
  20 + private Boolean bDeleted;
  21 +
  22 + public static ModuleVO from(ModuleEntity e) {
  23 + ModuleVO v = new ModuleVO();
  24 + v.setIIncrement(e.getIIncrement());
  25 + v.setSDisplayType(e.getSDisplayType());
  26 + v.setSProcedureName(e.getSProcedureName());
  27 + v.setSModuleType(e.getSModuleType());
  28 + v.setSManageDeptEn(e.getSManageDeptEn());
  29 + v.setBShowPermission(e.getBShowPermission());
  30 + v.setSModuleNameZh(e.getSModuleNameZh());
  31 + v.setIParentId(e.getIParentId());
  32 + v.setISortOrder(e.getISortOrder());
  33 + v.setTCreateDate(e.getTCreateDate());
  34 + v.setBDeleted(e.getBDeleted());
  35 + return v;
  36 + }
  37 +}
... ...
backend/src/test/java/com/xly/erp/module/mod/dto/ModuleCreateDTOValidationTest.java 0 → 100644
  1 +package com.xly.erp.module.mod.dto;
  2 +
  3 +import jakarta.validation.ConstraintViolation;
  4 +import jakarta.validation.Validation;
  5 +import jakarta.validation.Validator;
  6 +import jakarta.validation.ValidatorFactory;
  7 +import org.junit.jupiter.api.Test;
  8 +
  9 +import java.util.Set;
  10 +
  11 +import static org.assertj.core.api.Assertions.assertThat;
  12 +
  13 +class ModuleCreateDTOValidationTest {
  14 +
  15 + private static final ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory();
  16 + private final Validator validator = FACTORY.getValidator();
  17 +
  18 + private ModuleCreateDTO valid() {
  19 + ModuleCreateDTO d = new ModuleCreateDTO();
  20 + d.setSDisplayType("前端业务");
  21 + d.setSProcedureName("sp_audit_user");
  22 + d.setSModuleType("USR");
  23 + d.setSManageDeptEn("IT");
  24 + d.setBShowPermission(false);
  25 + d.setSModuleNameZh("用户管理");
  26 + d.setIParentId(null);
  27 + d.setISortOrder(0);
  28 + return d;
  29 + }
  30 +
  31 + @Test
  32 + void allValidFields_yieldsNoViolations() {
  33 + Set<ConstraintViolation<ModuleCreateDTO>> v = validator.validate(valid());
  34 + assertThat(v).isEmpty();
  35 + }
  36 +
  37 + @Test
  38 + void blankRequiredFields_yieldsViolations() {
  39 + ModuleCreateDTO d = new ModuleCreateDTO();
  40 + // 全部不填,触发 5 个 @NotBlank
  41 + Set<ConstraintViolation<ModuleCreateDTO>> v = validator.validate(d);
  42 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString())
  43 + .contains("sDisplayType", "sProcedureName", "sModuleType", "sManageDeptEn", "sModuleNameZh");
  44 + }
  45 +
  46 + @Test
  47 + void invalidDisplayTypeEnum_yieldsViolation() {
  48 + ModuleCreateDTO d = valid();
  49 + d.setSDisplayType("非法值");
  50 + Set<ConstraintViolation<ModuleCreateDTO>> v = validator.validate(d);
  51 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sDisplayType");
  52 + }
  53 +
  54 + @Test
  55 + void overSizedFields_yieldsViolations() {
  56 + ModuleCreateDTO d = valid();
  57 + d.setSProcedureName("a".repeat(101));
  58 + d.setSModuleType("a".repeat(51));
  59 + Set<ConstraintViolation<ModuleCreateDTO>> v = validator.validate(d);
  60 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString())
  61 + .contains("sProcedureName", "sModuleType");
  62 + }
  63 +
  64 + @Test
  65 + void negativeSortOrder_yieldsViolation() {
  66 + ModuleCreateDTO d = valid();
  67 + d.setISortOrder(-1);
  68 + Set<ConstraintViolation<ModuleCreateDTO>> v = validator.validate(d);
  69 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("iSortOrder");
  70 + }
  71 +}
... ...