【同步】BOOT 和 CLOUD 的功能

pull/254/head
YunaiV 2026-06-08 00:14:03 +08:00
parent f5a68ce6f3
commit 0c69bedc34
206 changed files with 559 additions and 543 deletions

View File

@ -22,7 +22,7 @@ import cn.iocoder.yudao.framework.web.config.WebProperties;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.controller.admin.face;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.im.controller.admin.face.vo.pack.ImFacePackUserRespVO;
@ -9,12 +10,12 @@ import cn.iocoder.yudao.module.im.service.face.ImFacePackItemService;
import cn.iocoder.yudao.module.im.service.face.ImFacePackService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@ -39,7 +40,7 @@ public class ImFacePackController {
// 1.1 拉所有启用表情包
List<ImFacePackDO> packs = facePackService.getEnabledFacePackList();
if (packs.isEmpty()) {
return success(List.of());
return success(ListUtil.of());
}
// 1.2 拉这些包下所有启用表情,按 packId 分组
List<ImFacePackItemDO> items = facePackItemService.getEnabledItemListByPackIds(
@ -49,7 +50,7 @@ public class ImFacePackController {
// 2. 拼装BeanUtils 把 pack 字段映射 + 自己塞 items
List<ImFacePackUserRespVO> result = convertList(packs, pack -> {
ImFacePackUserRespVO vo = BeanUtils.toBean(pack, ImFacePackUserRespVO.class);
vo.setItems(BeanUtils.toBean(itemsByPackId.getOrDefault(pack.getId(), List.of()), ImFacePackUserRespVO.Item.class));
vo.setItems(BeanUtils.toBean(itemsByPackId.getOrDefault(pack.getId(), ListUtil.of()), ImFacePackUserRespVO.Item.class));
return vo;
});
return success(result);

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.enums.message;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
@ -340,7 +341,7 @@ public enum ImMessageTypeEnum implements ArrayValuable<Integer> {
public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImMessageTypeEnum::getType).toArray(Integer[]::new);
private static final Set<Integer> FRIEND_NOTIFICATION_TYPES = Set.of(
private static final Set<Integer> FRIEND_NOTIFICATION_TYPES = CollUtil.newHashSet(
FRIEND_REQUEST_APPROVED.type,
FRIEND_REQUEST_REJECTED.type,
FRIEND_REQUEST_RECEIVED.type,
@ -351,12 +352,12 @@ public enum ImMessageTypeEnum implements ArrayValuable<Integer> {
FRIEND_INFO_UPDATED.type,
FRIEND_UPDATE.type);
private static final Set<Integer> GROUP_REQUEST_NOTIFICATION_TYPES = Set.of(
private static final Set<Integer> GROUP_REQUEST_NOTIFICATION_TYPES = CollUtil.newHashSet(
GROUP_REQUEST_RECEIVED.type,
GROUP_REQUEST_APPROVED.type,
GROUP_REQUEST_REJECTED.type);
private static final Set<Integer> RTC_NOTIFICATION_TYPES = Set.of(
private static final Set<Integer> RTC_NOTIFICATION_TYPES = CollUtil.newHashSet(
RTC_CALL.type,
RTC_PARTICIPANT_CONNECTED.type,
RTC_PARTICIPANT_DISCONNECTED.type);

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.service.friend;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
@ -22,7 +23,6 @@ import cn.iocoder.yudao.module.im.service.websocket.dto.notification.friend.Frie
import cn.iocoder.yudao.module.im.service.websocket.dto.notification.friend.FriendRequestRejectedNotification;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
@ -31,6 +31,7 @@ import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@ -172,7 +173,7 @@ public class ImFriendRequestServiceImpl implements ImFriendRequestService {
// 1.1 校验申请存在、未处理、操作人是接收方
ImFriendRequestDO request = validateRequestForHandle(userId, requestId);
// 1.2 复验双方用户有效
adminUserApi.validateUserList(List.of(request.getFromUserId(), request.getToUserId()));
adminUserApi.validateUserList(ListUtil.of(request.getFromUserId(), request.getToUserId()));
// 2. 乐观锁更新申请处理结果
ImFriendRequestDO updateObj = new ImFriendRequestDO()
@ -224,7 +225,7 @@ public class ImFriendRequestServiceImpl implements ImFriendRequestService {
public List<ImFriendRequestDO> getMyFriendRequestList(Long userId, Long maxId, Integer limit) {
ImFriendRequestDO maxRequest = maxId != null ? friendRequestMapper.selectById(maxId) : null;
if (maxId != null && maxRequest == null) {
return List.of();
return ListUtil.of();
}
return friendRequestMapper.selectMyList(userId,
maxRequest != null ? maxRequest.getUpdateTime() : null,

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.im.service.group;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -78,7 +79,7 @@ public class ImGroupMemberServiceImpl implements ImGroupMemberService {
public List<ImGroupMemberDO> getGroupMemberListByOwnerAndAdmin(Long groupId) {
// TODO DONE @AI把条件往下传这样减少加载数据量
return groupMemberMapper.selectListByGroupIdAndStatusAndRoles(groupId, CommonStatusEnum.ENABLE.getStatus(),
List.of(ImGroupMemberRoleEnum.OWNER.getRole(), ImGroupMemberRoleEnum.ADMIN.getRole()));
ListUtil.of(ImGroupMemberRoleEnum.OWNER.getRole(), ImGroupMemberRoleEnum.ADMIN.getRole()));
}
/**
@ -270,7 +271,7 @@ public class ImGroupMemberServiceImpl implements ImGroupMemberService {
boolean groupRemarkChanged = updateReqVO.getGroupRemark() != null
&& ObjUtil.notEqual(updateReqVO.getGroupRemark(), member.getGroupRemark());
if (silentChanged || groupRemarkChanged) {
groupMessageService.sendGroupMessage(userId, List.of(userId), ImGroupMessageSendDTO.ofGroupMemberSettingUpdate(
groupMessageService.sendGroupMessage(userId, ListUtil.of(userId), ImGroupMessageSendDTO.ofGroupMemberSettingUpdate(
groupId, userId, updateReqVO.getSilent(), updateReqVO.getGroupRemark()));
}
}

View File

@ -413,12 +413,12 @@ public class ImGroupServiceImpl implements ImGroupService {
ImGroupMemberDO newOwner = groupMemberService.validateMemberInGroup(groupId, newOwnerUserId);
// 2.1 更新成员角色
int newOwnerAffected = groupMemberService.updateGroupMemberRole(groupId, Set.of(newOwner.getUserId()),
int newOwnerAffected = groupMemberService.updateGroupMemberRole(groupId, CollUtil.newHashSet(newOwner.getUserId()),
ImGroupMemberRoleEnum.OWNER.getRole());
if (newOwnerAffected != 1) {
throw exception(GROUP_MEMBER_NOT_IN_GROUP);
}
int oldOwnerAffected = groupMemberService.updateGroupMemberRole(groupId, Set.of(userId),
int oldOwnerAffected = groupMemberService.updateGroupMemberRole(groupId, CollUtil.newHashSet(userId),
ImGroupMemberRoleEnum.NORMAL.getRole());
if (oldOwnerAffected != 1) {
throw exception(GROUP_MEMBER_NOT_IN_GROUP);

View File

@ -32,15 +32,16 @@ import cn.iocoder.yudao.module.im.service.websocket.dto.ImGroupMessageDTO;
import cn.iocoder.yudao.module.im.service.websocket.dto.message.QuoteMessage;
import cn.iocoder.yudao.module.im.service.websocket.dto.message.RecallMessage;
import cn.iocoder.yudao.module.im.util.ImMessageUtils;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
@ -295,7 +296,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService {
.filter(msg -> isMessageVisible(msg, memberMap.get(msg.getGroupId()), userId))
.sorted(Comparator.comparing(ImGroupMessageDO::getId))
.limit(size)
.toList();
.collect(Collectors.toList());
}
/**

View File

@ -1,16 +1,18 @@
package cn.iocoder.yudao.module.im.dal.mysql.message;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.im.dal.dataobject.message.ImGroupMessageDO;
import cn.iocoder.yudao.module.im.enums.message.ImGroupMessageReceiptStatusEnum;
import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum;
import javax.annotation.Resource;
import org.junit.jupiter.api.Test;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* IM Mapper
@ -35,7 +37,7 @@ public class ImGroupMessageMapperTest extends BaseDbUnitTest {
mapper.insert(msg20);
// 调用:只查群 10
List<ImGroupMessageDO> result = mapper.selectListByMinId(List.of(10L), 0L, FAR_PAST, 100);
List<ImGroupMessageDO> result = mapper.selectListByMinId(ListUtil.of(10L), 0L, FAR_PAST, 100);
// 断言:只有 msg10
assertEquals(1, result.size());
@ -50,7 +52,7 @@ public class ImGroupMessageMapperTest extends BaseDbUnitTest {
ImGroupMessageDO recalled = buildMessage(10L, 1L, ImMessageStatusEnum.RECALL);
mapper.insert(recalled);
List<ImGroupMessageDO> result = mapper.selectListByMinId(List.of(10L), 0L, FAR_PAST, 100);
List<ImGroupMessageDO> result = mapper.selectListByMinId(ListUtil.of(10L), 0L, FAR_PAST, 100);
// 断言:撤回消息一并返回,由客户端按 status 切换渲染
assertEquals(2, result.size());
@ -66,7 +68,7 @@ public class ImGroupMessageMapperTest extends BaseDbUnitTest {
outWindow.setSendTime(LocalDateTime.now().minusDays(40));
mapper.insert(outWindow);
List<ImGroupMessageDO> result = mapper.selectListByMinId(List.of(10L), 0L,
List<ImGroupMessageDO> result = mapper.selectListByMinId(ListUtil.of(10L), 0L,
LocalDateTime.now().minusDays(30), 100);
assertEquals(1, result.size());
@ -84,7 +86,7 @@ public class ImGroupMessageMapperTest extends BaseDbUnitTest {
mapper.insert(m3);
// 调用size=2返回 id 最小的 2 条
List<ImGroupMessageDO> result = mapper.selectListByMinId(List.of(10L), 0L, FAR_PAST, 2);
List<ImGroupMessageDO> result = mapper.selectListByMinId(ListUtil.of(10L), 0L, FAR_PAST, 2);
assertEquals(2, result.size());
assertTrue(result.get(0).getId() < result.get(1).getId());

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.service.friend;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
@ -248,7 +249,7 @@ public class ImFriendServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testGetFriendList() {
List<ImFriendDO> list = List.of(
List<ImFriendDO> list = ListUtil.of(
ImFriendDO.builder().id(1L).userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImFriendDO.builder().id(2L).userId(1L).friendUserId(3L)
@ -276,9 +277,9 @@ public class ImFriendServiceImplTest extends BaseMockitoUnitTest {
ImFriendDO friend3 = ImFriendDO.builder().id(2L).userId(1L).friendUserId(3L)
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(imFriendMapper.selectListByUserIdAndStatus(1L, CommonStatusEnum.ENABLE.getStatus()))
.thenReturn(List.of(friend2, friend3));
.thenReturn(ListUtil.of(friend2, friend3));
when(imFriendMapper.selectListByUserIdsAndFriendUserIdAndStatus(anyCollection(), eq(1L),
eq(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(List.of(
eq(CommonStatusEnum.ENABLE.getStatus()))).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(2L).friendUserId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build()));

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.service.group;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
@ -116,10 +117,10 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO exist4 = ImGroupMemberDO.builder().id(40L).groupId(10L).userId(4L)
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMemberMapper.selectListByGroupIdAndUserIds(eq(10L), anyCollection()))
.thenReturn(List.of(exist3, exist4));
.thenReturn(ListUtil.of(exist3, exist4));
// 调用
groupMemberService.addGroupMembers(10L, List.of(2L, 3L, 4L));
groupMemberService.addGroupMembers(10L, ListUtil.of(2L, 3L, 4L));
// 断言updates 只有用户 3inserts 只有用户 2
verify(groupMemberMapper).updateRejoinFields(eq(30L), eq(CommonStatusEnum.ENABLE.getStatus()),
@ -131,7 +132,7 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testAddGroupMembers_allExisting_onlyUpdates() {
// 准备:传入的 3 个用户都已有记录(全部 DISABLE → 只做 update不做 insert
List<ImGroupMemberDO> existing = List.of(
List<ImGroupMemberDO> existing = ListUtil.of(
ImGroupMemberDO.builder().id(1L).groupId(10L).userId(2L)
.status(CommonStatusEnum.DISABLE.getStatus()).build(),
ImGroupMemberDO.builder().id(2L).groupId(10L).userId(3L)
@ -140,7 +141,7 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
when(groupMemberMapper.selectListByGroupIdAndUserIds(eq(10L), anyCollection()))
.thenReturn(existing);
groupMemberService.addGroupMembers(10L, List.of(2L, 3L));
groupMemberService.addGroupMembers(10L, ListUtil.of(2L, 3L));
verify(groupMemberMapper, times(2)).updateRejoinFields(anyLong(), eq(CommonStatusEnum.ENABLE.getStatus()),
any(), eq(ImGroupMemberRoleEnum.NORMAL.getRole()), isNull(), isNull());
@ -151,9 +152,9 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
public void testAddGroupMembers_allNew_onlyInserts() {
// 准备:都不存在 → 只做 insert
when(groupMemberMapper.selectListByGroupIdAndUserIds(eq(10L), anyCollection()))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
groupMemberService.addGroupMembers(10L, List.of(2L, 3L));
groupMemberService.addGroupMembers(10L, ListUtil.of(2L, 3L));
verify(groupMemberMapper, never()).updateRejoinFields(anyLong(), anyInt(), any(), anyInt(), any(), any());
verify(groupMemberMapper).insertBatch(anyList());
@ -162,14 +163,14 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testAddGroupMembers_allExistingEnabled_nothingHappens() {
// 准备:都已存在且 ENABLE → 既不 update 也不 insert
List<ImGroupMemberDO> existing = List.of(
List<ImGroupMemberDO> existing = ListUtil.of(
ImGroupMemberDO.builder().id(1L).groupId(10L).userId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build()
);
when(groupMemberMapper.selectListByGroupIdAndUserIds(eq(10L), anyCollection()))
.thenReturn(existing);
groupMemberService.addGroupMembers(10L, List.of(2L));
groupMemberService.addGroupMembers(10L, ListUtil.of(2L));
verify(groupMemberMapper, never()).updateRejoinFields(anyLong(), anyInt(), any(), anyInt(), any(), any());
verify(groupMemberMapper, never()).insertBatch(anyList());
@ -179,14 +180,14 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
public void testAddGroupMembers_batchInsertDuplicateFallback() {
// 准备:两个新增成员,批量插入失败时降级为逐个 addGroupMember
when(groupMemberMapper.selectListByGroupIdAndUserIds(eq(10L), anyCollection()))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
doThrow(new DuplicateKeyException("concurrent batch insert"))
.when(groupMemberMapper).insertBatch(anyList());
// addGroupMember 单条兜底逻辑
when(groupMemberMapper.selectByGroupIdAndUserId(eq(10L), anyLong())).thenReturn(null);
// 调用
groupMemberService.addGroupMembers(10L, List.of(2L, 3L));
groupMemberService.addGroupMembers(10L, ListUtil.of(2L, 3L));
// 断言:降级为逐条调用 insert
verify(groupMemberMapper, times(2)).insert(any(ImGroupMemberDO.class));
@ -244,7 +245,7 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
// 公开字段昵称变化 → 全员广播 GROUP_MEMBER_NICKNAME_UPDATE
verify(groupMessageService).sendGroupMessage(eq(1L), any(cn.iocoder.yudao.module.im.service.message.dto.ImGroupMessageSendDTO.class));
// 个人字段 silent 变化 → 仅自己多端同步 GROUP_MEMBER_SETTING_UPDATE
verify(groupMessageService).sendGroupMessage(eq(1L), eq(java.util.List.of(1L)),
verify(groupMessageService).sendGroupMessage(eq(1L), eq(ListUtil.of(1L)),
any(cn.iocoder.yudao.module.im.service.message.dto.ImGroupMessageSendDTO.class));
}
@ -278,7 +279,7 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testRemoveGroupMembers_batch() {
groupMemberService.removeGroupMembers(10L, List.of(2L, 3L));
groupMemberService.removeGroupMembers(10L, ListUtil.of(2L, 3L));
ArgumentCaptor<ImGroupMemberDO> captor = ArgumentCaptor.forClass(ImGroupMemberDO.class);
verify(groupMemberMapper).updateByGroupIdAndUserIdsAndStatus(eq(10L), anyCollection(),
@ -303,7 +304,7 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testGetActiveGroupMemberUserIdsByGroupId_extractsUserIds() {
// 准备3 个 ENABLE 成员
List<ImGroupMemberDO> members = List.of(
List<ImGroupMemberDO> members = ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImGroupMemberDO.builder().groupId(10L).userId(2L)
@ -318,13 +319,13 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
List<Long> userIds = groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L);
// 断言:只返回 userId、顺序保留
assertEquals(List.of(1L, 2L, 3L), userIds);
assertEquals(ListUtil.of(1L, 2L, 3L), userIds);
}
@Test
public void testGetActiveGroupMemberUserIdsByGroupId_emptyList() {
when(groupMemberMapper.selectListByGroupIdAndStatus(
10L, CommonStatusEnum.ENABLE.getStatus())).thenReturn(List.of());
10L, CommonStatusEnum.ENABLE.getStatus())).thenReturn(ListUtil.of());
List<Long> userIds = groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L);
@ -333,8 +334,8 @@ public class ImGroupMemberServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testGetGroupMemberListByOwnerAndAdmin_passesRoles() {
List<Integer> roles = List.of(ImGroupMemberRoleEnum.OWNER.getRole(), ImGroupMemberRoleEnum.ADMIN.getRole());
List<ImGroupMemberDO> members = List.of(ImGroupMemberDO.builder().groupId(10L).userId(1L).build());
List<Integer> roles = ListUtil.of(ImGroupMemberRoleEnum.OWNER.getRole(), ImGroupMemberRoleEnum.ADMIN.getRole());
List<ImGroupMemberDO> members = ListUtil.of(ImGroupMemberDO.builder().groupId(10L).userId(1L).build());
when(groupMemberMapper.selectListByGroupIdAndStatusAndRoles(10L, CommonStatusEnum.ENABLE.getStatus(), roles))
.thenReturn(members);

View File

@ -1,5 +1,8 @@
package cn.iocoder.yudao.module.im.service.group;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
@ -39,7 +42,6 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
@ -108,13 +110,13 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
// 准备:创建者 + 2 个初始成员,都是好友
ImGroupCreateReqVO reqVO = new ImGroupCreateReqVO();
reqVO.setName("测试群");
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L, 3L)));
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L, 3L)));
when(groupMapper.insert(any(ImGroupDO.class))).thenAnswer(invocation -> {
ImGroupDO group = invocation.getArgument(0);
group.setId(100L);
return 1;
});
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(List.of(
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImFriendDO.builder().userId(1L).friendUserId(3L)
@ -140,15 +142,15 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
// 准备:初始成员里有非好友
ImGroupCreateReqVO reqVO = new ImGroupCreateReqVO();
reqVO.setName("测试群");
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L, 3L)));
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L, 3L)));
// 只有 2 是好友3 不是
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(List.of(
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build()));
AdminUserRespDTO u3 = new AdminUserRespDTO();
u3.setId(3L);
u3.setNickname("李四");
when(adminUserApi.getUserMap(anyCollection())).thenReturn(Map.of(3L, u3));
when(adminUserApi.getUserMap(anyCollection())).thenReturn(MapUtil.of(3L, u3));
// 调用并断言
ServiceException exception = assertThrows(ServiceException.class,
@ -327,8 +329,8 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
// 被邀请人 2 和 3 都是好友
ImGroupMemberInviteReqVO reqVO = new ImGroupMemberInviteReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L, 3L)));
List<ImFriendDO> friends = List.of(
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L, 3L)));
List<ImFriendDO> friends = ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImFriendDO.builder().userId(1L).friendUserId(3L)
@ -366,7 +368,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.NORMAL.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build());
when(groupMemberService.getActiveGroupMemberListByGroupId(10L)).thenReturn(List.of(
when(groupMemberService.getActiveGroupMemberListByGroupId(10L)).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(99L)
.role(ImGroupMemberRoleEnum.OWNER.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
@ -376,8 +378,8 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberInviteReqVO reqVO = new ImGroupMemberInviteReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L, 3L)));
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(List.of(
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L, 3L)));
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImFriendDO.builder().userId(1L).friendUserId(3L)
@ -408,15 +410,15 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.OWNER.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build());
when(groupMemberService.getActiveGroupMemberListByGroupId(10L)).thenReturn(List.of(
when(groupMemberService.getActiveGroupMemberListByGroupId(10L)).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.OWNER.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build()));
ImGroupMemberInviteReqVO reqVO = new ImGroupMemberInviteReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L, 3L)));
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(List.of(
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L, 3L)));
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImFriendDO.builder().userId(1L).friendUserId(3L)
@ -445,18 +447,18 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectById(10L)).thenReturn(group);
when(groupMemberService.getActiveGroupMemberListByGroupId(10L))
.thenReturn(List.of(ImGroupMemberDO.builder().groupId(10L).userId(1L)
.thenReturn(ListUtil.of(ImGroupMemberDO.builder().groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build()));
ImGroupMemberInviteReqVO reqVO = new ImGroupMemberInviteReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L, 3L)));
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L, 3L)));
// 只有 2 是好友3 不是
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(List.of(
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(2L)
.status(CommonStatusEnum.ENABLE.getStatus()).build()));
AdminUserRespDTO u3 = new AdminUserRespDTO(); u3.setId(3L); u3.setNickname("李四");
when(adminUserApi.getUserMap(anyCollection())).thenReturn(Map.of(3L, u3));
when(adminUserApi.getUserMap(anyCollection())).thenReturn(MapUtil.of(3L, u3));
ServiceException exception = assertThrows(ServiceException.class,
() -> groupService.inviteGroupMember(1L, reqVO));
@ -484,9 +486,9 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberInviteReqVO reqVO = new ImGroupMemberInviteReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(new ArrayList<>(List.of(600L, 601L)));
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(600L, 601L)));
// 被邀请人都是好友
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(List.of(
when(friendService.getActiveFriendList(eq(1L), anyCollection())).thenReturn(ListUtil.of(
ImFriendDO.builder().userId(1L).friendUserId(600L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImFriendDO.builder().userId(1L).friendUserId(601L)
@ -512,7 +514,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectById(10L)).thenReturn(group);
// 用户 2 已在群中
when(groupMemberService.getActiveGroupMemberListByGroupId(10L)).thenReturn(List.of(
when(groupMemberService.getActiveGroupMemberListByGroupId(10L)).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImGroupMemberDO.builder().groupId(10L).userId(2L)
@ -521,7 +523,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberInviteReqVO reqVO = new ImGroupMemberInviteReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(new ArrayList<>(List.of(2L))); // 只邀请 2他已在群中
reqVO.setMemberUserIds(new ArrayList<>(ListUtil.of(2L))); // 只邀请 2他已在群中
// 调用
groupService.inviteGroupMember(1L, reqVO);
@ -606,7 +608,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberRemoveReqVO reqVO = new ImGroupMemberRemoveReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(List.of(1L, 2L));
reqVO.setMemberUserIds(ListUtil.of(1L, 2L));
ServiceException exception = assertThrows(ServiceException.class,
() -> groupService.removeGroupMember(1L, reqVO));
@ -628,7 +630,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.OWNER.getRole()).build());
// 目标:两个普通成员
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(2L)
.role(ImGroupMemberRoleEnum.NORMAL.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
@ -638,7 +640,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberRemoveReqVO reqVO = new ImGroupMemberRemoveReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(List.of(2L, 3L));
reqVO.setMemberUserIds(ListUtil.of(2L, 3L));
groupService.removeGroupMember(1L, reqVO);
@ -665,14 +667,14 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.ADMIN.getRole()).build());
// 目标:另一个管理员
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(2L)
.role(ImGroupMemberRoleEnum.ADMIN.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build()));
ImGroupMemberRemoveReqVO reqVO = new ImGroupMemberRemoveReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(List.of(2L));
reqVO.setMemberUserIds(ListUtil.of(2L));
ServiceException exception = assertThrows(ServiceException.class,
() -> groupService.removeGroupMember(1L, reqVO));
@ -694,14 +696,14 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
when(groupMemberService.validateMemberInGroup(10L, 1L)).thenReturn(
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.OWNER.getRole()).build());
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(99L)
.role(ImGroupMemberRoleEnum.OWNER.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build()));
ImGroupMemberRemoveReqVO reqVO = new ImGroupMemberRemoveReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(List.of(99L));
reqVO.setMemberUserIds(ListUtil.of(99L));
ServiceException exception = assertThrows(ServiceException.class,
() -> groupService.removeGroupMember(1L, reqVO));
@ -723,7 +725,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.role(ImGroupMemberRoleEnum.OWNER.getRole()).build());
// 目标2L 有效普通成员3L 已退群DISABLE的历史管理员应被跳过而非拦截整批
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(2L)
.role(ImGroupMemberRoleEnum.NORMAL.getRole())
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
@ -733,17 +735,17 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberRemoveReqVO reqVO = new ImGroupMemberRemoveReqVO();
reqVO.setGroupId(10L);
reqVO.setMemberUserIds(List.of(2L, 3L));
reqVO.setMemberUserIds(ListUtil.of(2L, 3L));
groupService.removeGroupMember(1L, reqVO);
// 仅有效成员 2L 进入移除 / 已读清理,已退群的 3L 被跳过
ArgumentCaptor<Collection> removeCaptor = ArgumentCaptor.forClass(Collection.class);
verify(groupMemberService).removeGroupMembers(eq(10L), removeCaptor.capture());
assertEquals(Set.of(2L), Set.copyOf(removeCaptor.getValue()));
assertEquals(CollUtil.newHashSet(2L), CollUtil.newHashSet(removeCaptor.getValue()));
ArgumentCaptor<Collection> readCaptor = ArgumentCaptor.forClass(Collection.class);
verify(groupMessageService).deleteReadMaxMessageIds(eq(10L), readCaptor.capture());
assertEquals(Set.of(2L), Set.copyOf(readCaptor.getValue()));
assertEquals(CollUtil.newHashSet(2L), CollUtil.newHashSet(readCaptor.getValue()));
}
}
@ -759,7 +761,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectByIdForUpdate(10L)).thenReturn(group);
// 目标 3 是普通成员
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().userId(3L).status(CommonStatusEnum.ENABLE.getStatus())
.role(ImGroupMemberRoleEnum.NORMAL.getRole()).build()));
// 群里已有 1 个 ADMIN1 + 1 ≤ 3 不超上限
@ -770,7 +772,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupAdminAddReqVO reqVO = new ImGroupAdminAddReqVO();
reqVO.setId(10L);
reqVO.setUserIds(List.of(3L));
reqVO.setUserIds(ListUtil.of(3L));
groupService.addGroupAdmin(1L, reqVO);
@ -789,7 +791,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupDO group = ImGroupDO.builder().id(10L).ownerUserId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectByIdForUpdate(10L)).thenReturn(group);
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().userId(5L).status(CommonStatusEnum.ENABLE.getStatus())
.role(ImGroupMemberRoleEnum.NORMAL.getRole()).build()));
// 群里已有 3 个 ADMIN达到上限再加 1 会超
@ -798,7 +800,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupAdminAddReqVO reqVO = new ImGroupAdminAddReqVO();
reqVO.setId(10L);
reqVO.setUserIds(List.of(5L));
reqVO.setUserIds(ListUtil.of(5L));
ServiceException exception = assertThrows(ServiceException.class,
() -> groupService.addGroupAdmin(1L, reqVO));
@ -816,13 +818,13 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupDO group = ImGroupDO.builder().id(10L).ownerUserId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectByIdForUpdate(10L)).thenReturn(group);
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().userId(1L).status(CommonStatusEnum.ENABLE.getStatus())
.role(ImGroupMemberRoleEnum.OWNER.getRole()).build()));
ImGroupAdminAddReqVO reqVO = new ImGroupAdminAddReqVO();
reqVO.setId(10L);
reqVO.setUserIds(List.of(1L));
reqVO.setUserIds(ListUtil.of(1L));
ServiceException exception = assertThrows(ServiceException.class,
() -> groupService.addGroupAdmin(1L, reqVO));
@ -840,13 +842,13 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectByIdForUpdate(10L)).thenReturn(group);
// 目标已是 ADMIN再加无需操作
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().userId(2L).status(CommonStatusEnum.ENABLE.getStatus())
.role(ImGroupMemberRoleEnum.ADMIN.getRole()).build()));
ImGroupAdminAddReqVO reqVO = new ImGroupAdminAddReqVO();
reqVO.setId(10L);
reqVO.setUserIds(List.of(2L));
reqVO.setUserIds(ListUtil.of(2L));
groupService.addGroupAdmin(1L, reqVO);
@ -866,7 +868,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupDO group = ImGroupDO.builder().id(10L).ownerUserId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectByIdForUpdate(10L)).thenReturn(group);
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().userId(2L).status(CommonStatusEnum.ENABLE.getStatus())
.role(ImGroupMemberRoleEnum.ADMIN.getRole()).build()));
when(groupMemberService.updateGroupMemberRole(eq(10L), anyCollection(),
@ -874,7 +876,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
ImGroupAdminRemoveReqVO reqVO = new ImGroupAdminRemoveReqVO();
reqVO.setId(10L);
reqVO.setUserIds(List.of(2L));
reqVO.setUserIds(ListUtil.of(2L));
groupService.removeGroupAdmin(1L, reqVO);
@ -894,13 +896,13 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
.status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMapper.selectByIdForUpdate(10L)).thenReturn(group);
// 目标已是 MEMBER撤销无需操作
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(List.of(
when(groupMemberService.getGroupMembers(eq(10L), anyCollection())).thenReturn(ListUtil.of(
ImGroupMemberDO.builder().userId(2L).status(CommonStatusEnum.ENABLE.getStatus())
.role(ImGroupMemberRoleEnum.NORMAL.getRole()).build()));
ImGroupAdminRemoveReqVO reqVO = new ImGroupAdminRemoveReqVO();
reqVO.setId(10L);
reqVO.setUserIds(List.of(2L));
reqVO.setUserIds(ListUtil.of(2L));
groupService.removeGroupAdmin(1L, reqVO);
@ -922,9 +924,9 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
when(groupMemberService.validateMemberInGroup(10L, 2L)).thenReturn(
ImGroupMemberDO.builder().groupId(10L).userId(2L)
.role(ImGroupMemberRoleEnum.NORMAL.getRole()).build());
when(groupMemberService.updateGroupMemberRole(eq(10L), eq(Set.of(2L)),
when(groupMemberService.updateGroupMemberRole(eq(10L), eq(CollUtil.newHashSet(2L)),
eq(ImGroupMemberRoleEnum.OWNER.getRole()))).thenReturn(1);
when(groupMemberService.updateGroupMemberRole(eq(10L), eq(Set.of(1L)),
when(groupMemberService.updateGroupMemberRole(eq(10L), eq(CollUtil.newHashSet(1L)),
eq(ImGroupMemberRoleEnum.NORMAL.getRole()))).thenReturn(1);
ImGroupTransferOwnerReqVO reqVO = new ImGroupTransferOwnerReqVO();
@ -938,9 +940,9 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
verify(groupMapper).updateById(groupCaptor.capture());
assertEquals(2L, groupCaptor.getValue().getOwnerUserId());
// 旧群主 → MEMBER新群主 → OWNER
verify(groupMemberService).updateGroupMemberRole(eq(10L), eq(Set.of(1L)),
verify(groupMemberService).updateGroupMemberRole(eq(10L), eq(CollUtil.newHashSet(1L)),
eq(ImGroupMemberRoleEnum.NORMAL.getRole()));
verify(groupMemberService).updateGroupMemberRole(eq(10L), eq(Set.of(2L)),
verify(groupMemberService).updateGroupMemberRole(eq(10L), eq(CollUtil.newHashSet(2L)),
eq(ImGroupMemberRoleEnum.OWNER.getRole()));
}
}
@ -1120,7 +1122,7 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testGetMyGroupList_success() {
// 活跃群成员
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(new ArrayList<>(List.of(
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(new ArrayList<>(ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImGroupMemberDO.builder().groupId(20L).userId(1L)
@ -1128,11 +1130,11 @@ public class ImGroupServiceImplTest extends BaseMockitoUnitTest {
)));
// 最近退群成员(最近 30 天内)
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(new ArrayList<>(List.of(
.thenReturn(new ArrayList<>(ListUtil.of(
ImGroupMemberDO.builder().groupId(30L).userId(1L)
.status(CommonStatusEnum.DISABLE.getStatus()).build()
)));
List<ImGroupDO> groups = List.of(
List<ImGroupDO> groups = ListUtil.of(
ImGroupDO.builder().id(10L).status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImGroupDO.builder().id(20L).status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImGroupDO.builder().id(30L).status(CommonStatusEnum.ENABLE.getStatus()).build()

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.im.service.message;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
@ -96,7 +98,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
when(groupMemberService.validateMemberInGroup(10L, 1L)).thenReturn(member);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L))
.thenReturn(List.of(1L, 2L, 3L));
.thenReturn(ListUtil.of(1L, 2L, 3L));
when(groupMessageMapper.insert(any(ImGroupMessageDO.class))).thenAnswer(invocation -> {
ImGroupMessageDO msg = invocation.getArgument(0);
msg.setId(99L);
@ -168,7 +170,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(joinTime).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(member));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(member));
// 入群前 1 条 + 入群后 1 条
ImGroupMessageDO beforeJoin = ImGroupMessageDO.builder()
@ -177,11 +179,11 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMessageDO afterJoin = ImGroupMessageDO.builder()
.id(2L).groupId(10L).senderId(2L)
.sendTime(now.minusHours(1)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(100)))
.thenReturn(List.of(beforeJoin, afterJoin));
.thenReturn(ListUtil.of(beforeJoin, afterJoin));
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 0L, 100);
@ -200,26 +202,26 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(joinTime).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(member));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(member));
ImGroupMessageDO beforeJoin = ImGroupMessageDO.builder()
.id(1L).groupId(10L).senderId(2L)
.sendTime(now.minusHours(3)).build();
ImGroupMessageDO directedMsg = ImGroupMessageDO.builder()
.id(2L).groupId(10L).senderId(2L)
.receiverUserIds(List.of(2L, 3L))
.receiverUserIds(ListUtil.of(2L, 3L))
.sendTime(now.minusHours(2)).build();
ImGroupMessageDO visibleMsg = ImGroupMessageDO.builder()
.id(3L).groupId(10L).senderId(2L)
.sendTime(now.minusMinutes(30)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(2)))
.thenReturn(List.of(beforeJoin, directedMsg));
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(2L),
.thenReturn(ListUtil.of(beforeJoin, directedMsg));
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(2L),
any(LocalDateTime.class), eq(2)))
.thenReturn(List.of(visibleMsg));
.thenReturn(ListUtil.of(visibleMsg));
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 0L, 2);
@ -227,9 +229,9 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
// 断言:仅返回第二批的可见消息;两批 selectListByMinId 各被调用一次
assertEquals(1, result.size());
assertEquals(3L, result.get(0).getId());
verify(groupMessageMapper).selectListByMinId(eq(List.of(10L)), eq(0L),
verify(groupMessageMapper).selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(2));
verify(groupMessageMapper).selectListByMinId(eq(List.of(10L)), eq(2L),
verify(groupMessageMapper).selectListByMinId(eq(ListUtil.of(10L)), eq(2L),
any(LocalDateTime.class), eq(2));
}
@ -241,14 +243,14 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(now.minusDays(10)).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(activeMember));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(activeMember));
ImGroupMessageDO activeMsg = ImGroupMessageDO.builder()
.id(5L).groupId(10L).senderId(2L)
.sendTime(now.minusHours(2)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(100)))
.thenReturn(List.of(activeMsg));
.thenReturn(ListUtil.of(activeMsg));
// 已退群退群时间在窗口内minId=0minQuitTime 直接用 minSendTime
LocalDateTime quitTime = now.minusDays(3);
@ -258,14 +260,14 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.joinTime(now.minusDays(20))
.quitTime(quitTime).build();
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of(quitMember));
.thenReturn(ListUtil.of(quitMember));
ImGroupMessageDO quitGroupMsg = ImGroupMessageDO.builder()
.id(3L).groupId(20L).senderId(99L)
.sendTime(now.minusDays(5)).build();
when(groupMessageMapper.selectListByGroupIdAndMinIdAndQuitTimeBefore(eq(20L), eq(0L),
any(LocalDateTime.class), eq(quitTime), eq(100)))
.thenReturn(List.of(quitGroupMsg));
.thenReturn(ListUtil.of(quitGroupMsg));
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 0L, 100);
@ -280,14 +282,14 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
public void testPullMessages_quitMemberFilteredByBoundarySendTime() {
// 准备minId > 0边界消息 sendTime 晚于窗口起点,应当被用作 minQuitTime
LocalDateTime now = LocalDateTime.now();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of());
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of());
LocalDateTime boundarySendTime = now.minusDays(2);
ImGroupMessageDO boundary = ImGroupMessageDO.builder()
.id(8L).groupId(10L).senderId(2L).sendTime(boundarySendTime).build();
when(groupMessageMapper.selectById(8L)).thenReturn(boundary);
when(groupMemberService.getQuitGroupMemberListByUserId(1L, boundarySendTime))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 8L, 100);
@ -306,24 +308,24 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(joinTime).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(activeMember));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(activeMember));
ImGroupMessageDO beforeJoin = ImGroupMessageDO.builder()
.id(100L).groupId(10L).senderId(2L)
.sendTime(now.minusHours(3)).build();
ImGroupMessageDO directedMsg = ImGroupMessageDO.builder()
.id(101L).groupId(10L).senderId(2L)
.receiverUserIds(List.of(2L, 3L))
.receiverUserIds(ListUtil.of(2L, 3L))
.sendTime(now.minusMinutes(50)).build();
ImGroupMessageDO visibleActiveMsg = ImGroupMessageDO.builder()
.id(102L).groupId(10L).senderId(2L)
.sendTime(now.minusMinutes(30)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(8L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(8L),
any(LocalDateTime.class), eq(2)))
.thenReturn(List.of(beforeJoin, directedMsg));
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(101L),
.thenReturn(ListUtil.of(beforeJoin, directedMsg));
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(101L),
any(LocalDateTime.class), eq(2)))
.thenReturn(List.of(visibleActiveMsg));
.thenReturn(ListUtil.of(visibleActiveMsg));
LocalDateTime boundarySendTime = now.minusDays(2);
ImGroupMessageDO boundary = ImGroupMessageDO.builder()
@ -337,14 +339,14 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.joinTime(now.minusDays(10))
.quitTime(quitTime).build();
when(groupMemberService.getQuitGroupMemberListByUserId(1L, boundarySendTime))
.thenReturn(List.of(quitMember));
.thenReturn(ListUtil.of(quitMember));
ImGroupMessageDO quitGroupMsg = ImGroupMessageDO.builder()
.id(50L).groupId(20L).senderId(99L)
.sendTime(now.minusDays(1)).build();
when(groupMessageMapper.selectListByGroupIdAndMinIdAndQuitTimeBefore(eq(20L), eq(8L),
any(LocalDateTime.class), eq(quitTime), eq(2)))
.thenReturn(List.of(quitGroupMsg));
.thenReturn(ListUtil.of(quitGroupMsg));
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 8L, 2);
@ -353,9 +355,9 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
assertEquals(2, result.size());
assertEquals(50L, result.get(0).getId());
assertEquals(102L, result.get(1).getId());
verify(groupMessageMapper).selectListByMinId(eq(List.of(10L)), eq(8L),
verify(groupMessageMapper).selectListByMinId(eq(ListUtil.of(10L)), eq(8L),
any(LocalDateTime.class), eq(2));
verify(groupMessageMapper).selectListByMinId(eq(List.of(10L)), eq(101L),
verify(groupMessageMapper).selectListByMinId(eq(ListUtil.of(10L)), eq(101L),
any(LocalDateTime.class), eq(2));
verify(groupMemberService).getQuitGroupMemberListByUserId(1L, boundarySendTime);
verify(groupMessageMapper).selectListByGroupIdAndMinIdAndQuitTimeBefore(eq(20L), eq(8L),
@ -372,22 +374,22 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(now.minusDays(10)).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(member));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(member));
// 定向接收消息:只给用户 2 和 3
ImGroupMessageDO directedMsg = ImGroupMessageDO.builder()
.id(1L).groupId(10L).senderId(5L)
.receiverUserIds(List.of(2L, 3L))
.receiverUserIds(ListUtil.of(2L, 3L))
.sendTime(now.minusHours(2)).build();
// 全员消息
ImGroupMessageDO allMsg = ImGroupMessageDO.builder()
.id(2L).groupId(10L).senderId(5L)
.sendTime(now.minusHours(1)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(100)))
.thenReturn(List.of(directedMsg, allMsg));
.thenReturn(ListUtil.of(directedMsg, allMsg));
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 0L, 100);
@ -405,24 +407,24 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(now.minusDays(10)).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(member));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(member));
ImGroupMessageDO atMsg = ImGroupMessageDO.builder()
.id(1L).groupId(10L).senderId(2L)
.atUserIds(List.of(1L, 3L))
.atUserIds(ListUtil.of(1L, 3L))
.sendTime(now.minusHours(1)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(100)))
.thenReturn(List.of(atMsg));
.thenReturn(ListUtil.of(atMsg));
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
// 调用
List<ImGroupMessageDO> result = groupMessageService.pullGroupMessageList(1L, 0L, 100);
// 断言:@ 字段正确返回
assertEquals(1, result.size());
assertEquals(List.of(1L, 3L), result.get(0).getAtUserIds());
assertEquals(ListUtil.of(1L, 3L), result.get(0).getAtUserIds());
}
@Test
@ -432,15 +434,15 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(now.minusDays(10)).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(activeMember));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(activeMember));
ImGroupMessageDO activeMsg1 = ImGroupMessageDO.builder()
.id(1000L).groupId(10L).senderId(2L).sendTime(now.minusHours(2)).build();
ImGroupMessageDO activeMsg2 = ImGroupMessageDO.builder()
.id(2000L).groupId(10L).senderId(2L).sendTime(now.minusHours(1)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(2)))
.thenReturn(List.of(activeMsg1, activeMsg2));
.thenReturn(ListUtil.of(activeMsg1, activeMsg2));
LocalDateTime quitTime = now.minusDays(1);
ImGroupMemberDO quitMember = ImGroupMemberDO.builder()
@ -449,7 +451,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.joinTime(now.minusDays(20))
.quitTime(quitTime).build();
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of(quitMember));
.thenReturn(ListUtil.of(quitMember));
ImGroupMessageDO quit1 = ImGroupMessageDO.builder()
.id(150L).groupId(20L).senderId(99L).sendTime(now.minusDays(5)).build();
@ -457,7 +459,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.id(160L).groupId(20L).senderId(99L).sendTime(now.minusDays(4)).build();
when(groupMessageMapper.selectListByGroupIdAndMinIdAndQuitTimeBefore(eq(20L), eq(0L),
any(LocalDateTime.class), eq(quitTime), eq(2)))
.thenReturn(List.of(quit1, quit2));
.thenReturn(ListUtil.of(quit1, quit2));
when(groupMessageReadRedisDAO.getReadMaxMessageId(anyLong(), eq(1L))).thenReturn(null);
@ -475,7 +477,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(now.minusDays(10)).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(member));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(member));
ImGroupMessageDO low = ImGroupMessageDO.builder()
.id(5L).groupId(10L).senderId(2L).status(ImMessageStatusEnum.UNREAD.getStatus())
@ -483,11 +485,11 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMessageDO high = ImGroupMessageDO.builder()
.id(10L).groupId(10L).senderId(2L).status(ImMessageStatusEnum.UNREAD.getStatus())
.sendTime(now.minusHours(1)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(100)))
.thenReturn(List.of(low, high));
.thenReturn(ListUtil.of(low, high));
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
when(groupMessageReadRedisDAO.getReadMaxMessageId(10L, 1L)).thenReturn(7L);
@ -505,18 +507,18 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(now.minusDays(10)).build();
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(List.of(member));
when(groupMemberService.getActiveGroupMemberListByUserId(1L)).thenReturn(ListUtil.of(member));
ImGroupMessageDO receiptMsg = ImGroupMessageDO.builder()
.id(100L).groupId(10L).senderId(1L)
.status(ImMessageStatusEnum.UNREAD.getStatus())
.receiptStatus(ImGroupMessageReceiptStatusEnum.PENDING.getStatus())
.sendTime(now.minusHours(1)).build();
when(groupMessageMapper.selectListByMinId(eq(List.of(10L)), eq(0L),
when(groupMessageMapper.selectListByMinId(eq(ListUtil.of(10L)), eq(0L),
any(LocalDateTime.class), eq(100)))
.thenReturn(List.of(receiptMsg));
.thenReturn(ListUtil.of(receiptMsg));
when(groupMemberService.getQuitGroupMemberListByUserId(eq(1L), any(LocalDateTime.class)))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
when(groupMessageReadRedisDAO.getReadMaxMessageId(10L, 1L)).thenReturn(100L);
Map<Long, Long> positions = new HashMap<>();
@ -525,7 +527,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
positions.put(3L, 50L);
when(groupMessageReadRedisDAO.getReadMaxMessageIdMap(10L)).thenReturn(positions);
List<ImGroupMemberDO> allMembers = List.of(
List<ImGroupMemberDO> allMembers = ListUtil.of(
member,
ImGroupMemberDO.builder().groupId(10L).userId(2L)
.status(CommonStatusEnum.ENABLE.getStatus())
@ -564,7 +566,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
when(groupMessageMapper.insert(any(ImGroupMessageDO.class))).thenReturn(1);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L))
.thenReturn(List.of(1L, 2L));
.thenReturn(ListUtil.of(1L, 2L));
// 调用
ImGroupMessageDO result = groupMessageService.recallGroupMessage(1L, 50L);
@ -669,7 +671,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
// 用户 2: 正常,入群在消息之前
// 用户 3: 正常,但入群在消息之后 → 不可见
// 用户 5: 发送者,不计入回执
List<ImGroupMemberDO> allMembers = List.of(
List<ImGroupMemberDO> allMembers = ListUtil.of(
currentMember,
ImGroupMemberDO.builder().groupId(10L).userId(1L)
.status(CommonStatusEnum.ENABLE.getStatus())
@ -739,7 +741,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO member = ImGroupMemberDO.builder()
.groupId(10L).userId(1L).status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMemberService.validateMemberInGroup(10L, 1L)).thenReturn(member);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(List.of(1L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(ListUtil.of(1L));
when(groupMessageMapper.insert(any(ImGroupMessageDO.class))).thenReturn(1);
// 调用
@ -821,7 +823,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.id(100L).groupId(10L).senderId(2L).sendTime(LocalDateTime.now()).build());
when(groupMessageReadRedisDAO.getReadMaxMessageId(10L, 1L)).thenReturn(5L);
// readGroupMessageEvent 内部会调 selectListByGroupIdAndPendingReceipt → 返回空简化流程
when(groupMessageMapper.selectListByGroupIdAndPendingReceipt(10L, 5L, 100L)).thenReturn(List.of());
when(groupMessageMapper.selectListByGroupIdAndPendingReceipt(10L, 5L, 100L)).thenReturn(ListUtil.of());
// 调用
groupMessageService.readGroupMessages(1L, 10L, 100L);
@ -875,7 +877,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMemberDO member = ImGroupMemberDO.builder()
.groupId(10L).userId(1L).status(CommonStatusEnum.ENABLE.getStatus()).build();
when(groupMemberService.validateMemberInGroup(10L, 1L)).thenReturn(member);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(List.of(1L, 2L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(ListUtil.of(1L, 2L));
ImGroupMessageDO result = groupMessageService.sendGroupMessage(1L, reqVO);
@ -932,8 +934,8 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.receiptStatus(ImGroupMessageReceiptStatusEnum.PENDING.getStatus())
.status(ImMessageStatusEnum.UNREAD.getStatus()).build();
when(groupMessageMapper.selectListByGroupIdAndPendingReceipt(10L, 0L, 100L))
.thenReturn(List.of(pending));
List<ImGroupMemberDO> activeMembers = List.of(
.thenReturn(ListUtil.of(pending));
List<ImGroupMemberDO> activeMembers = ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(5L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(LocalDateTime.now().minusDays(10)).build(),
@ -971,8 +973,8 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.receiptStatus(ImGroupMessageReceiptStatusEnum.PENDING.getStatus())
.status(ImMessageStatusEnum.UNREAD.getStatus()).build();
when(groupMessageMapper.selectListByGroupIdAndPendingReceipt(10L, 0L, 100L))
.thenReturn(List.of(pending));
List<ImGroupMemberDO> activeMembers = List.of(
.thenReturn(ListUtil.of(pending));
List<ImGroupMemberDO> activeMembers = ListUtil.of(
ImGroupMemberDO.builder().groupId(10L).userId(5L)
.status(CommonStatusEnum.ENABLE.getStatus())
.joinTime(LocalDateTime.now().minusDays(10)).build(),
@ -1006,7 +1008,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
.setGroupId(10L).setType(ImMessageTypeEnum.RECALL.getType())
.setContent("{\"messageId\":1}");
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L))
.thenReturn(List.of(1L, 2L, 3L, 4L));
.thenReturn(ListUtil.of(1L, 2L, 3L, 4L));
groupMessageService.sendGroupMessage(1L, dto);
@ -1023,9 +1025,9 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMessageSendDTO dto = new ImGroupMessageSendDTO()
.setGroupId(10L).setType(ImMessageTypeEnum.RECALL.getType())
.setContent("{\"messageId\":1}")
.setReceiverUserIds(List.of(2L, 3L));
.setReceiverUserIds(ListUtil.of(2L, 3L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L))
.thenReturn(List.of(1L, 2L, 3L, 4L));
.thenReturn(ListUtil.of(1L, 2L, 3L, 4L));
groupMessageService.sendGroupMessage(1L, dto);
@ -1042,9 +1044,9 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMessageSendDTO dto = new ImGroupMessageSendDTO()
.setGroupId(10L).setType(ImMessageTypeEnum.RECALL.getType())
.setContent("{\"messageId\":1}")
.setReceiverUserIds(List.of(2L, 3L));
.setReceiverUserIds(ListUtil.of(2L, 3L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L))
.thenReturn(List.of(1L, 2L, 3L, 4L));
.thenReturn(ListUtil.of(1L, 2L, 3L, 4L));
groupMessageService.sendGroupMessage(99L, dto);
@ -1061,7 +1063,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMessageSendDTO dto = new ImGroupMessageSendDTO()
.setGroupId(10L).setType(ImMessageTypeEnum.RECALL.getType())
.setContent(new RecallMessage().setMessageId(50L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(List.of(1L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(ListUtil.of(1L));
groupMessageService.sendGroupMessage(1L, dto);
@ -1085,7 +1087,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
ImGroupMessageSendDTO dto = new ImGroupMessageSendDTO()
.setGroupId(10L).setType(ImMessageTypeEnum.RECALL.getType())
.setContent("{\"messageId\":50}").setReceipt(true);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(List.of(1L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(ListUtil.of(1L));
groupMessageService.sendGroupMessage(1L, dto);
@ -1099,7 +1101,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
// 准备persistent=false 类型RECEIPT 回执)→ 不入库,仅推送
ImGroupMessageSendDTO dto = new ImGroupMessageSendDTO()
.setGroupId(10L).setType(ImMessageTypeEnum.RECEIPT.getType());
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(List.of(1L, 2L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(10L)).thenReturn(ListUtil.of(1L, 2L));
groupMessageService.sendGroupMessage(1L, dto);
@ -1110,7 +1112,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testSendGroupMessage_threeArg_explicitTargetsBypassActiveMembers() {
// 准备:调用方传入显式 targets解散场景成员已被批量 DISABLE必须按移除前快照推送
Set<Long> targets = Set.of(1L, 2L, 3L);
Set<Long> targets = CollUtil.newHashSet(1L, 2L, 3L);
ImGroupMessageSendDTO dto = new ImGroupMessageSendDTO()
.setGroupId(10L).setType(ImMessageTypeEnum.GROUP_DISSOLVE.getType()).setContent("{}");
@ -1138,7 +1140,7 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
reqVO.setMaxId(100L);
reqVO.setLimit(20);
List<ImGroupMessageDO> mockList = List.of(
List<ImGroupMessageDO> mockList = ListUtil.of(
ImGroupMessageDO.builder().id(99L).groupId(10L).senderId(2L)
.sendTime(joinTime.plusMinutes(1)).build()
);
@ -1181,9 +1183,9 @@ public class ImGroupMessageServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testDeleteReadMaxMessageIds_delegatesToRedis() {
groupMessageService.deleteReadMaxMessageIds(10L, List.of(1L, 2L));
groupMessageService.deleteReadMaxMessageIds(10L, ListUtil.of(1L, 2L));
verify(groupMessageReadRedisDAO).deleteReadMaxMessageIds(10L, List.of(1L, 2L));
verify(groupMessageReadRedisDAO).deleteReadMaxMessageIds(10L, ListUtil.of(1L, 2L));
}
@Test

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.service.message;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
import cn.iocoder.yudao.module.im.controller.admin.message.vo.privates.ImPrivateMessageListReqVO;
@ -135,7 +136,7 @@ public class ImPrivateMessageServiceImplTest extends BaseMockitoUnitTest {
@Test
public void testPullMessages_success() {
// 准备
List<ImPrivateMessageDO> mockMessages = List.of(
List<ImPrivateMessageDO> mockMessages = ListUtil.of(
ImPrivateMessageDO.builder().id(1L).senderId(1L).receiverId(2L).build(),
ImPrivateMessageDO.builder().id(2L).senderId(2L).receiverId(1L).build()
);
@ -415,7 +416,7 @@ public class ImPrivateMessageServiceImplTest extends BaseMockitoUnitTest {
reqVO.setReceiverId(2L);
reqVO.setMaxId(100L);
reqVO.setLimit(20);
List<ImPrivateMessageDO> mockList = List.of(
List<ImPrivateMessageDO> mockList = ListUtil.of(
ImPrivateMessageDO.builder().id(99L).senderId(1L).receiverId(2L).build(),
ImPrivateMessageDO.builder().id(98L).senderId(2L).receiverId(1L).build()
);

View File

@ -1,5 +1,8 @@
package cn.iocoder.yudao.module.im.service.rtc;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
import cn.iocoder.yudao.module.im.controller.admin.rtc.vo.ImRtcCallCreateReqVO;
@ -30,8 +33,6 @@ import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.RTC_GROUP_INVITEE_REQUIRED;
@ -103,8 +104,8 @@ public class ImRtcCallServiceImplTest extends BaseMockitoUnitTest {
// 准备:候选非空但每个 CAS 都失败(并发已变状态)
ImRtcParticipantDO p = buildParticipant(10L, "r1", 100L, ImRtcParticipantStatusEnum.INVITING);
when(rtcParticipantMapper.selectListByStatusAndInviteTimeBefore(any(), any()))
.thenReturn(List.of(p));
when(adminUserApi.getUserMap(anySet())).thenReturn(Map.of(100L, buildUser(100L)));
.thenReturn(ListUtil.of(p));
when(adminUserApi.getUserMap(anySet())).thenReturn(MapUtil.of(100L, buildUser(100L)));
when(rtcParticipantMapper.updateByIdAndStatus(eq(10L), eq(ImRtcParticipantStatusEnum.INVITING.getStatus()), any()))
.thenReturn(0);
@ -122,15 +123,15 @@ public class ImRtcCallServiceImplTest extends BaseMockitoUnitTest {
// 准备:群通话单候选 CAS 成功shouldCloseGroupRoom 通过 selectListByRoom 多 JOINED 让其返 false跳过 endSession
ImRtcParticipantDO p = buildParticipant(10L, "r1", 100L, ImRtcParticipantStatusEnum.INVITING);
when(rtcParticipantMapper.selectListByStatusAndInviteTimeBefore(any(), any()))
.thenReturn(List.of(p));
when(adminUserApi.getUserMap(anySet())).thenReturn(Map.of(100L, buildUser(100L)));
.thenReturn(ListUtil.of(p));
when(adminUserApi.getUserMap(anySet())).thenReturn(MapUtil.of(100L, buildUser(100L)));
when(rtcParticipantMapper.updateByIdAndStatus(eq(10L), eq(ImRtcParticipantStatusEnum.INVITING.getStatus()), any()))
.thenReturn(1);
ImRtcCallDO call = buildCall("r1", 200L, ImConversationTypeEnum.GROUP, 999L);
when(rtcCallMapper.selectByRoom("r1")).thenReturn(call);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(999L)).thenReturn(List.of(200L, 201L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(999L)).thenReturn(ListUtil.of(200L, 201L));
// 房内 2 个 JOINED + 1 个 INVITING → shouldCloseGroupRoom 返 false
when(rtcParticipantMapper.selectListByRoom("r1")).thenReturn(List.of(
when(rtcParticipantMapper.selectListByRoom("r1")).thenReturn(ListUtil.of(
buildParticipant(20L, "r1", 200L, ImRtcParticipantStatusEnum.JOINED),
buildParticipant(21L, "r1", 201L, ImRtcParticipantStatusEnum.JOINED),
buildParticipant(22L, "r1", 202L, ImRtcParticipantStatusEnum.INVITING)
@ -150,8 +151,8 @@ public class ImRtcCallServiceImplTest extends BaseMockitoUnitTest {
// 准备CAS 成功后通话主表缺失(异常兜底场景)
ImRtcParticipantDO p = buildParticipant(10L, "r1", 100L, ImRtcParticipantStatusEnum.INVITING);
when(rtcParticipantMapper.selectListByStatusAndInviteTimeBefore(any(), any()))
.thenReturn(List.of(p));
when(adminUserApi.getUserMap(anySet())).thenReturn(Map.of(100L, buildUser(100L)));
.thenReturn(ListUtil.of(p));
when(adminUserApi.getUserMap(anySet())).thenReturn(MapUtil.of(100L, buildUser(100L)));
when(rtcParticipantMapper.updateByIdAndStatus(eq(10L), eq(ImRtcParticipantStatusEnum.INVITING.getStatus()), any()))
.thenReturn(1);
when(rtcCallMapper.selectByRoom("r1")).thenReturn(null);
@ -219,15 +220,15 @@ public class ImRtcCallServiceImplTest extends BaseMockitoUnitTest {
ImRtcParticipantDO timeoutTarget = buildParticipant(11L, "r1", 101L, ImRtcParticipantStatusEnum.INVITING);
when(rtcParticipantMapper.selectListByRoomAndStatusAndInviteTimeBefore(
eq("r1"), eq(ImRtcParticipantStatusEnum.INVITING.getStatus()), any()))
.thenReturn(List.of(timeoutTarget));
when(adminUserApi.getUserMap(anySet())).thenReturn(Map.of(101L, buildUser(101L)));
.thenReturn(ListUtil.of(timeoutTarget));
when(adminUserApi.getUserMap(anySet())).thenReturn(MapUtil.of(101L, buildUser(101L)));
when(rtcParticipantMapper.updateByIdAndStatus(eq(11L), eq(ImRtcParticipantStatusEnum.INVITING.getStatus()), any()))
.thenReturn(1);
ImRtcCallDO call = buildCall("r1", 200L, ImConversationTypeEnum.GROUP, 999L);
when(rtcCallMapper.selectByRoom("r1")).thenReturn(call);
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(999L)).thenReturn(List.of(200L, 201L));
when(groupMemberService.getActiveGroupMemberUserIdsByGroupId(999L)).thenReturn(ListUtil.of(200L, 201L));
// 让 shouldCloseGroupRoom 返 false
when(rtcParticipantMapper.selectListByRoom("r1")).thenReturn(List.of(
when(rtcParticipantMapper.selectListByRoom("r1")).thenReturn(ListUtil.of(
buildParticipant(20L, "r1", 200L, ImRtcParticipantStatusEnum.JOINED),
buildParticipant(21L, "r1", 201L, ImRtcParticipantStatusEnum.JOINED)
));
@ -253,7 +254,7 @@ public class ImRtcCallServiceImplTest extends BaseMockitoUnitTest {
ImRtcCallCreateReqVO reqVO = new ImRtcCallCreateReqVO();
reqVO.setConversationType(ImConversationTypeEnum.GROUP.getType());
reqVO.setGroupId(10L);
reqVO.setInviteeIds(Set.of(100L));
reqVO.setInviteeIds(CollUtil.newHashSet(100L));
ServiceException exception = assertThrows(ServiceException.class,
() -> rtcCallService.createCall(100L, reqVO));
@ -335,14 +336,14 @@ public class ImRtcCallServiceImplTest extends BaseMockitoUnitTest {
Callable<Void> callable = invocation.getArgument(1);
return callable.call();
});
when(rtcParticipantMapper.selectListByRoom("r1")).thenReturn(List.of(
when(rtcParticipantMapper.selectListByRoom("r1")).thenReturn(ListUtil.of(
buildParticipant(10L, "r1", 200L, ImRtcParticipantStatusEnum.JOINED),
buildParticipant(11L, "r1", 201L, ImRtcParticipantStatusEnum.JOINED),
buildParticipant(12L, "r1", 202L, ImRtcParticipantStatusEnum.INVITING)
));
ImRtcCallInviteReqVO reqVO = new ImRtcCallInviteReqVO();
reqVO.setRoom("r1");
reqVO.setInviteeIds(Set.of(203L));
reqVO.setInviteeIds(CollUtil.newHashSet(203L));
ServiceException exception = assertThrows(ServiceException.class,
() -> rtcCallService.inviteCall(200L, reqVO));

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.im.service.sensitiveword;
import cn.hutool.core.collection.ListUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
@ -44,7 +45,7 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest {
// mock 启用敏感词列表LoadingCache 在首次 validateText 时懒加载,无需主动 init
// 用 lenient 避免 null / empty 等不触发 cache load 的用例报 UnnecessaryStubbing
lenient().when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()))
.thenReturn(List.of(
.thenReturn(ListUtil.of(
ImSensitiveWordDO.builder().id(1L).word("badword")
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImSensitiveWordDO.builder().id(2L).word("违禁词")
@ -118,7 +119,7 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest {
// 准备mapper 返回新词库(额外多一个 newbad并让 createSensitiveWord 走通
when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()))
.thenReturn(List.of(
.thenReturn(ListUtil.of(
ImSensitiveWordDO.builder().id(1L).word("badword")
.status(CommonStatusEnum.ENABLE.getStatus()).build(),
ImSensitiveWordDO.builder().id(2L).word("违禁词")
@ -178,7 +179,7 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest {
when(imSensitiveWordMapper.selectByWord("updatedbad")).thenReturn(null);
// 准备reload 时返回新词库
when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()))
.thenReturn(List.of(
.thenReturn(ListUtil.of(
ImSensitiveWordDO.builder().id(1L).word("updatedbad")
.status(CommonStatusEnum.ENABLE.getStatus()).build()
));
@ -211,7 +212,7 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest {
.status(CommonStatusEnum.ENABLE.getStatus()).build());
// 准备reload 时返回剩余词库(只剩中文那条)
when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()))
.thenReturn(List.of(
.thenReturn(ListUtil.of(
ImSensitiveWordDO.builder().id(2L).word("违禁词")
.status(CommonStatusEnum.ENABLE.getStatus()).build()
));
@ -251,24 +252,24 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest {
// 准备reload 时返回空词库
when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()))
.thenReturn(List.of());
.thenReturn(ListUtil.of());
// 调用:批量删除,触发 invalidate
sensitiveWordService.deleteSensitiveWordList(List.of(1L, 2L));
sensitiveWordService.deleteSensitiveWordList(ListUtil.of(1L, 2L));
// 调用 + 断言:所有词都不再命中
assertDoesNotThrow(() -> sensitiveWordService.validateText("contains badword here"));
assertDoesNotThrow(() -> sensitiveWordService.validateText("这条消息里有违禁词哦"));
// 断言deleteByIds 被调用 1 次selectListByStatus 共 2 次
verify(imSensitiveWordMapper, times(1)).deleteByIds(List.of(1L, 2L));
verify(imSensitiveWordMapper, times(1)).deleteByIds(ListUtil.of(1L, 2L));
verify(imSensitiveWordMapper, times(2)).selectListByStatus(CommonStatusEnum.ENABLE.getStatus());
}
@Test
public void testDeleteSensitiveWordList_emptyIds_skip() {
// 调用:空列表直接返回
sensitiveWordService.deleteSensitiveWordList(List.of());
sensitiveWordService.deleteSensitiveWordList(ListUtil.of());
// 断言mapper 不被调用
verify(imSensitiveWordMapper, never()).deleteByIds(anyList());

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.api.config;
import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO;
import cn.iocoder.yudao.module.infra.service.config.ConfigService;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;

View File

@ -5,7 +5,7 @@ import cn.hutool.core.util.IdUtil;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import cn.iocoder.yudao.module.infra.framework.file.core.client.s3.S3FileClient;
import cn.iocoder.yudao.module.infra.framework.file.core.client.s3.S3FileClientConfig;
import jakarta.validation.Validation;
import javax.validation.Validation;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -2,16 +2,16 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 分类新增/修改 Request VO")
@Data

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraCategoryDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraCategoryDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraCategoryMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -2,16 +2,16 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 分类新增/修改 Request VO")
@Data

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraCategoryDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraCategoryDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraCategoryMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentContactDO;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -1,16 +1,16 @@
package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.service.demo;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.module.infra.dal.mysql.demo.InfraStudentMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;

View File

@ -2,16 +2,16 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.annotation.Resource;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.infra.controller.admin.demo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import jakarta.validation.constraints.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.module.infra.service.demo;
import java.util.*;
import jakarta.validation.*;
import javax.validation.*;
import cn.iocoder.yudao.module.infra.controller.admin.demo.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.demo.InfraStudentDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

Some files were not shown because too many files have changed in this diff Show More