Commit ea2706976943b3700b1df81ae5e9356f7aa51608

Authored by zichun
1 parent cf0cfc7e

feat(usr): UserConverter (MapStruct) + UserCreateVO REQ-USR-001

backend/src/main/java/com/xly/test4/module/usr/converter/UserConverter.java 0 → 100644
  1 +package com.xly.test4.module.usr.converter;
  2 +
  3 +import com.xly.test4.module.usr.dto.UserCreateDTO;
  4 +import com.xly.test4.module.usr.entity.User;
  5 +import com.xly.test4.module.usr.vo.UserCreateVO;
  6 +import org.mapstruct.Builder;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.Mapping;
  9 +
  10 +/**
  11 + * 关掉 MapStruct 自动选 Lombok @Builder,让其走 setter;User 字段如 `iIncrement` 经 JavaBeans
  12 + * Introspector 解析为 property `IIncrement`(第二字符大写,保持原 case),@Mapping 用此命名。
  13 + */
  14 +@Mapper(componentModel = "spring", builder = @Builder(disableBuilder = true))
  15 +public interface UserConverter {
  16 +
  17 + @Mapping(target = "IIncrement", ignore = true)
  18 + @Mapping(target = "SId", ignore = true)
  19 + @Mapping(target = "SBrandsId", ignore = true)
  20 + @Mapping(target = "SSubsidiaryId", ignore = true)
  21 + @Mapping(target = "TCreateDate", ignore = true)
  22 + @Mapping(target = "TUpdateDate", ignore = true)
  23 + @Mapping(target = "TLastLoginDate", ignore = true)
  24 + @Mapping(target = "TLockedUntil", ignore = true)
  25 + @Mapping(target = "ILoginFailCount", ignore = true)
  26 + @Mapping(target = "IIsDisabled", ignore = true)
  27 + @Mapping(target = "SCreatedBy", ignore = true)
  28 + @Mapping(target = "SPasswordHash", ignore = true)
  29 + @Mapping(target = "SUserCode", source = "userCode")
  30 + @Mapping(target = "SUserName", source = "userName")
  31 + @Mapping(target = "IEmployeeId", source = "employeeId")
  32 + @Mapping(target = "SUserType", source = "userType")
  33 + @Mapping(target = "SLanguage", source = "language")
  34 + @Mapping(target = "ICanEditDoc",
  35 + expression = "java(dto.getCanEditDoc() != null && dto.getCanEditDoc() ? 1 : 0)")
  36 + User toEntity(UserCreateDTO dto);
  37 +
  38 + @Mapping(target = "userId", source = "IIncrement")
  39 + @Mapping(target = "userCode", source = "SUserCode")
  40 + UserCreateVO toVO(User user);
  41 +}
... ...
backend/src/main/java/com/xly/test4/module/usr/vo/UserCreateVO.java 0 → 100644
  1 +package com.xly.test4.module.usr.vo;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +@Data
  9 +@Builder
  10 +@NoArgsConstructor
  11 +@AllArgsConstructor
  12 +public class UserCreateVO {
  13 + private Integer userId;
  14 + private String userCode;
  15 +}
... ...
backend/src/test/java/com/xly/test4/module/usr/converter/UserConverterTest.java 0 → 100644
  1 +package com.xly.test4.module.usr.converter;
  2 +
  3 +import com.xly.test4.module.usr.dto.UserCreateDTO;
  4 +import com.xly.test4.module.usr.entity.User;
  5 +import com.xly.test4.module.usr.vo.UserCreateVO;
  6 +import org.junit.jupiter.api.Test;
  7 +import org.mapstruct.factory.Mappers;
  8 +
  9 +import java.util.List;
  10 +
  11 +import static org.assertj.core.api.Assertions.assertThat;
  12 +
  13 +class UserConverterTest {
  14 +
  15 + private final UserConverter converter = Mappers.getMapper(UserConverter.class);
  16 +
  17 + private UserCreateDTO dto() {
  18 + UserCreateDTO dto = new UserCreateDTO();
  19 + dto.setUserCode("U-100");
  20 + dto.setUserName("bob");
  21 + dto.setEmployeeId(7);
  22 + dto.setUserType("NORMAL");
  23 + dto.setLanguage("en");
  24 + dto.setCanEditDoc(true);
  25 + dto.setPassword("plain-pass");
  26 + dto.setPermissionIds(List.of(1, 2));
  27 + return dto;
  28 + }
  29 +
  30 + @Test
  31 + void toEntity_mapsAllFieldsExceptPasswordAndPermissions() {
  32 + User user = converter.toEntity(dto());
  33 +
  34 + assertThat(user.getSUserCode()).isEqualTo("U-100");
  35 + assertThat(user.getSUserName()).isEqualTo("bob");
  36 + assertThat(user.getIEmployeeId()).isEqualTo(7);
  37 + assertThat(user.getSUserType()).isEqualTo("NORMAL");
  38 + assertThat(user.getSLanguage()).isEqualTo("en");
  39 + // password / 多租户 / sCreatedBy / iIsDisabled 等都不应在 toEntity 阶段填
  40 + assertThat(user.getSPasswordHash()).isNull();
  41 + assertThat(user.getSBrandsId()).isNull();
  42 + assertThat(user.getSSubsidiaryId()).isNull();
  43 + assertThat(user.getSCreatedBy()).isNull();
  44 + assertThat(user.getIIsDisabled()).isNull();
  45 + }
  46 +
  47 + @Test
  48 + void toEntity_canEditDocTrueMapsTo1() {
  49 + UserCreateDTO dto = dto();
  50 + dto.setCanEditDoc(true);
  51 +
  52 + assertThat(converter.toEntity(dto).getICanEditDoc()).isEqualTo(1);
  53 + }
  54 +
  55 + @Test
  56 + void toEntity_canEditDocFalseMapsTo0() {
  57 + UserCreateDTO dto = dto();
  58 + dto.setCanEditDoc(false);
  59 +
  60 + assertThat(converter.toEntity(dto).getICanEditDoc()).isZero();
  61 + }
  62 +
  63 + @Test
  64 + void toVO_mapsIncrementToUserIdAndUserCode() {
  65 + User user = User.builder()
  66 + .iIncrement(42)
  67 + .sUserCode("U-100")
  68 + .sUserName("bob")
  69 + .build();
  70 +
  71 + UserCreateVO vo = converter.toVO(user);
  72 + assertThat(vo.getUserId()).isEqualTo(42);
  73 + assertThat(vo.getUserCode()).isEqualTo("U-100");
  74 + }
  75 +}
... ...