Commit 8554c9aea39d28b2b6045633b7dd454525f2c619

Authored by zichun
1 parent eba6afa7

feat(usr): user create DTO and VO REQ-USR-001

backend/src/main/java/com/xly/erp/module/usr/dto/UserCreateDTO.java 0 → 100644
  1 +package com.xly.erp.module.usr.dto;
  2 +
  3 +import jakarta.validation.constraints.NotBlank;
  4 +import jakarta.validation.constraints.Pattern;
  5 +import jakarta.validation.constraints.Size;
  6 +import lombok.Data;
  7 +
  8 +import java.util.List;
  9 +
  10 +/** REQ-USR-001 用户新增入参(密码不在 DTO 里,service 层固定哈希 666666 落库)。 */
  11 +@Data
  12 +public class UserCreateDTO {
  13 +
  14 + @NotBlank
  15 + @Size(max = 50)
  16 + private String sUserNo;
  17 +
  18 + @NotBlank
  19 + @Size(max = 50)
  20 + private String sUserName;
  21 +
  22 + /** 可空:关联职员 id */
  23 + private Integer iStaffId;
  24 +
  25 + @NotBlank
  26 + @Pattern(regexp = "^(普通用户|超级管理员)$", message = "sUserType 必须是 普通用户/超级管理员 之一")
  27 + private String sUserType;
  28 +
  29 + @NotBlank
  30 + @Pattern(regexp = "^(zh|en|zh-TW)$", message = "sLanguage 必须是 zh/en/zh-TW 之一")
  31 + private String sLanguage;
  32 +
  33 + /** 可空:默认 false */
  34 + private Boolean bCanModifyDocs;
  35 +
  36 + /** 可空:每个 id 必须指向未删除的 tPermissionCategory.iIncrement */
  37 + private List<Integer> permissionCategoryIds;
  38 +}
... ...
backend/src/main/java/com/xly/erp/module/usr/vo/UserVO.java 0 → 100644
  1 +package com.xly.erp.module.usr.vo;
  2 +
  3 +import com.xly.erp.module.usr.entity.UserEntity;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +import java.util.ArrayList;
  8 +import java.util.List;
  9 +
  10 +/** REQ-USR-001 用户 VO(不含 sPasswordHash 等内部字段)。 */
  11 +@Data
  12 +public class UserVO {
  13 + private Integer iIncrement;
  14 + private String sUserNo;
  15 + private String sUserName;
  16 + private Integer iStaffId;
  17 + private String sUserType;
  18 + private String sLanguage;
  19 + private Boolean bCanModifyDocs;
  20 + private LocalDateTime tCreateDate;
  21 + private Boolean bDeleted;
  22 + private List<Integer> permissionCategoryIds = new ArrayList<>();
  23 +
  24 + public static UserVO from(UserEntity e, List<Integer> permissionCategoryIds) {
  25 + UserVO v = new UserVO();
  26 + v.setIIncrement(e.getIIncrement());
  27 + v.setSUserNo(e.getSUserNo());
  28 + v.setSUserName(e.getSUserName());
  29 + v.setIStaffId(e.getIStaffId());
  30 + v.setSUserType(e.getSUserType());
  31 + v.setSLanguage(e.getSLanguage());
  32 + v.setBCanModifyDocs(e.getBCanModifyDocs());
  33 + v.setTCreateDate(e.getTCreateDate());
  34 + v.setBDeleted(e.getBDeleted());
  35 + v.setPermissionCategoryIds(permissionCategoryIds == null ? new ArrayList<>() : permissionCategoryIds);
  36 + return v;
  37 + }
  38 +}
... ...
backend/src/test/java/com/xly/erp/module/usr/dto/UserCreateDTOValidationTest.java 0 → 100644
  1 +package com.xly.erp.module.usr.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.List;
  10 +import java.util.Set;
  11 +
  12 +import static org.assertj.core.api.Assertions.assertThat;
  13 +
  14 +class UserCreateDTOValidationTest {
  15 +
  16 + private static final ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory();
  17 + private final Validator validator = FACTORY.getValidator();
  18 +
  19 + private UserCreateDTO valid() {
  20 + UserCreateDTO d = new UserCreateDTO();
  21 + d.setSUserNo("u001");
  22 + d.setSUserName("alice");
  23 + d.setSUserType("普通用户");
  24 + d.setSLanguage("zh");
  25 + d.setBCanModifyDocs(false);
  26 + d.setPermissionCategoryIds(List.of());
  27 + return d;
  28 + }
  29 +
  30 + @Test
  31 + void allValidFields_yieldsNoViolations() {
  32 + Set<ConstraintViolation<UserCreateDTO>> v = validator.validate(valid());
  33 + assertThat(v).isEmpty();
  34 + }
  35 +
  36 + @Test
  37 + void blankRequiredFields_yieldsViolations() {
  38 + UserCreateDTO d = new UserCreateDTO();
  39 + Set<ConstraintViolation<UserCreateDTO>> v = validator.validate(d);
  40 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString())
  41 + .contains("sUserNo", "sUserName", "sUserType", "sLanguage");
  42 + }
  43 +
  44 + @Test
  45 + void invalidUserTypeEnum_yieldsViolation() {
  46 + UserCreateDTO d = valid();
  47 + d.setSUserType("非法值");
  48 + Set<ConstraintViolation<UserCreateDTO>> v = validator.validate(d);
  49 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sUserType");
  50 + }
  51 +
  52 + @Test
  53 + void invalidLanguageEnum_yieldsViolation() {
  54 + UserCreateDTO d = valid();
  55 + d.setSLanguage("fr");
  56 + Set<ConstraintViolation<UserCreateDTO>> v = validator.validate(d);
  57 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sLanguage");
  58 + }
  59 +
  60 + @Test
  61 + void overSizedFields_yieldsViolations() {
  62 + UserCreateDTO d = valid();
  63 + d.setSUserNo("a".repeat(51));
  64 + d.setSUserName("a".repeat(51));
  65 + Set<ConstraintViolation<UserCreateDTO>> v = validator.validate(d);
  66 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString())
  67 + .contains("sUserNo", "sUserName");
  68 + }
  69 +}
... ...