From b4a152ccea1383a88fee1bd864fbdc19aacf327f Mon Sep 17 00:00:00 2001 From: zichun Date: Wed, 6 May 2026 21:33:35 +0800 Subject: [PATCH] feat(usr): user update DTO REQ-USR-002 --- backend/src/main/java/com/xly/erp/module/usr/dto/UserUpdateDTO.java | 33 +++++++++++++++++++++++++++++++++ backend/src/test/java/com/xly/erp/module/usr/dto/UserUpdateDTOValidationTest.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 0 deletions(-) create mode 100644 backend/src/main/java/com/xly/erp/module/usr/dto/UserUpdateDTO.java create mode 100644 backend/src/test/java/com/xly/erp/module/usr/dto/UserUpdateDTOValidationTest.java diff --git a/backend/src/main/java/com/xly/erp/module/usr/dto/UserUpdateDTO.java b/backend/src/main/java/com/xly/erp/module/usr/dto/UserUpdateDTO.java new file mode 100644 index 0000000..9e69d46 --- /dev/null +++ b/backend/src/main/java/com/xly/erp/module/usr/dto/UserUpdateDTO.java @@ -0,0 +1,33 @@ +package com.xly.erp.module.usr.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Data; + +import java.util.List; + +/** + * REQ-USR-002 用户修改入参。 + * 与 {@link UserCreateDTO} 相比剥除 sUserNo / sUserName(登录身份不可改); + * 密码不通过本接口修改,亦不在 DTO 里。 + */ +@Data +public class UserUpdateDTO { + + /** 可空:null 表示清空员工关联(service 层借 iStaffId.IGNORED 策略写入 NULL) */ + private Integer iStaffId; + + @NotBlank + @Pattern(regexp = "^(普通用户|超级管理员)$", message = "sUserType 必须是 普通用户/超级管理员 之一") + private String sUserType; + + @NotBlank + @Pattern(regexp = "^(zh|en|zh-TW)$", message = "sLanguage 必须是 zh/en/zh-TW 之一") + private String sLanguage; + + /** 可空:null 表示保持原值;显式覆盖 */ + private Boolean bCanModifyDocs; + + /** 可空:每元素须存在且未软删除;空数组 / null 都视为清空全部授权关联 */ + private List permissionCategoryIds; +} diff --git a/backend/src/test/java/com/xly/erp/module/usr/dto/UserUpdateDTOValidationTest.java b/backend/src/test/java/com/xly/erp/module/usr/dto/UserUpdateDTOValidationTest.java new file mode 100644 index 0000000..6595057 --- /dev/null +++ b/backend/src/test/java/com/xly/erp/module/usr/dto/UserUpdateDTOValidationTest.java @@ -0,0 +1,58 @@ +package com.xly.erp.module.usr.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.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +class UserUpdateDTOValidationTest { + + private static final ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory(); + private final Validator validator = FACTORY.getValidator(); + + private UserUpdateDTO valid() { + UserUpdateDTO d = new UserUpdateDTO(); + d.setSUserType("超级管理员"); + d.setSLanguage("en"); + d.setBCanModifyDocs(true); + d.setIStaffId(7); + d.setPermissionCategoryIds(List.of(1, 2)); + return d; + } + + @Test + void allValidFields_yieldsNoViolations() { + Set> v = validator.validate(valid()); + assertThat(v).isEmpty(); + } + + @Test + void blankRequiredFields_yieldsViolations() { + UserUpdateDTO d = new UserUpdateDTO(); + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()) + .contains("sUserType", "sLanguage"); + } + + @Test + void invalidUserTypeEnum_yieldsViolation() { + UserUpdateDTO d = valid(); + d.setSUserType("非法值"); + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sUserType"); + } + + @Test + void invalidLanguageEnum_yieldsViolation() { + UserUpdateDTO d = valid(); + d.setSLanguage("fr"); + Set> v = validator.validate(d); + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sLanguage"); + } +} -- libgit2 0.22.2