diff --git a/backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java b/backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java index f0d5e93..bfb4de3 100644 --- a/backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/xly/test4/module/usr/service/impl/UserServiceImpl.java @@ -1,5 +1,8 @@ package com.xly.test4.module.usr.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.xly.test4.common.exception.BusinessException; +import com.xly.test4.common.response.ResultCode; import com.xly.test4.common.security.CurrentUser; import com.xly.test4.common.security.CurrentUserContext; import com.xly.test4.module.usr.converter.UserConverter; @@ -36,6 +39,15 @@ public class UserServiceImpl implements UserService { public UserCreateVO createUser(UserCreateDTO dto) { CurrentUser current = CurrentUserContext.current(); + if (userMapper.selectCount(new LambdaQueryWrapper() + .eq(User::getSUserName, dto.getUserName())) > 0) { + throw new BusinessException(ResultCode.USER_NAME_DUPLICATE, "用户名已存在"); + } + if (userMapper.selectCount(new LambdaQueryWrapper() + .eq(User::getSUserCode, dto.getUserCode())) > 0) { + throw new BusinessException(ResultCode.USER_CODE_DUPLICATE, "用户号已存在"); + } + User user = userConverter.toEntity(dto); user.setSBrandsId(current.getBrandsId()); user.setSSubsidiaryId(current.getSubsidiaryId()); diff --git a/backend/src/test/java/com/xly/test4/module/usr/service/impl/UserServiceImplTest.java b/backend/src/test/java/com/xly/test4/module/usr/service/impl/UserServiceImplTest.java index b8ff942..f3727cf 100644 --- a/backend/src/test/java/com/xly/test4/module/usr/service/impl/UserServiceImplTest.java +++ b/backend/src/test/java/com/xly/test4/module/usr/service/impl/UserServiceImplTest.java @@ -1,5 +1,7 @@ package com.xly.test4.module.usr.service.impl; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.xly.test4.common.exception.BusinessException; import com.xly.test4.common.security.CurrentUser; import com.xly.test4.common.security.CurrentUserContext; import com.xly.test4.module.usr.converter.UserConverter; @@ -18,9 +20,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class UserServiceImplTest { @@ -64,6 +69,7 @@ class UserServiceImplTest { return dto; } + @SuppressWarnings("unchecked") private void stubConverterReturnsEmptyUser() { when(userConverter.toEntity(any(UserCreateDTO.class))).thenAnswer(inv -> new User()); when(userConverter.toVO(any(User.class))).thenAnswer(inv -> { @@ -75,6 +81,7 @@ class UserServiceImplTest { u.setIIncrement(42); return 1; }); + when(userMapper.selectCount(any(Wrapper.class))).thenReturn(0L); } @Test @@ -110,7 +117,37 @@ class UserServiceImplTest { service.createUser(dto); ArgumentCaptor captor = ArgumentCaptor.forClass(User.class); - org.mockito.Mockito.verify(userMapper).insert(captor.capture()); + verify(userMapper).insert(captor.capture()); assertThat(passwordEncoder.matches("666666", captor.getValue().getSPasswordHash())).isTrue(); } + + @Test + @SuppressWarnings("unchecked") + void createUser_duplicateUserName_throws40002() { + stubConverterReturnsEmptyUser(); + // 第一次 selectCount(对 sUserName) 返回 > 0 → 触发 40002 + when(userMapper.selectCount(any(Wrapper.class))).thenReturn(1L); + + assertThatThrownBy(() -> service.createUser(baseDTO())) + .isInstanceOf(BusinessException.class) + .matches(e -> ((BusinessException) e).getCode() == 40002); + + verify(userMapper, never()).insert(any(User.class)); + } + + @Test + @SuppressWarnings("unchecked") + void createUser_duplicateUserCode_throws40003() { + stubConverterReturnsEmptyUser(); + // 第一次 selectCount(userName)=0,第二次(userCode)=1 + when(userMapper.selectCount(any(Wrapper.class))) + .thenReturn(0L) + .thenReturn(1L); + + assertThatThrownBy(() -> service.createUser(baseDTO())) + .isInstanceOf(BusinessException.class) + .matches(e -> ((BusinessException) e).getCode() == 40003); + + verify(userMapper, never()).insert(any(User.class)); + } }