diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java deleted file mode 100644 index 4b3d5b0..0000000 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.iocoder.yudao.module.im.enums.conversation; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -// TODO @AI:还需要这个枚举么? -/** - * IM 会话类型枚举 - * 参考 “会话类型” 文档 - * - * @author anhaohao - */ -@Getter -@AllArgsConstructor -public enum ImConversationTypeEnum implements ArrayValuable { - - SINGLE(1, "单聊"), - GROUP(3, "群聊"), - NOTIFICATION(4, "通知会话"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImConversationTypeEnum::getType).toArray(Integer[]::new); - - /** - * 类型 - */ - private final Integer type; - - /** - * 名字 - */ - private final String name; - - /** - * 生成会话编号 - * - * @param fromUserId 发送者编号 - * @param receiverId 接收者编号 - * @param conversationType 会话类型 - * @return 会话编号 - */ - public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) { - final String SINGLE_PREFIX = "s_"; - final String GROUP_PREFIX = "g_"; - - if (ImConversationTypeEnum.SINGLE.getType().equals(conversationType)) { - long minId = Math.min(fromUserId, receiverId); - long maxId = Math.max(fromUserId, receiverId); - return SINGLE_PREFIX + minId + "_" + maxId; - - } else if (ImConversationTypeEnum.GROUP.getType().equals(conversationType)) { - return GROUP_PREFIX + receiverId; - } - - return null; - } - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/group/ImGroupMemberStatusEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/group/ImGroupMemberStatusEnum.java deleted file mode 100644 index b7dbd85..0000000 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/group/ImGroupMemberStatusEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.im.enums.group; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -// TODO @AI:要不使用 commonstatusenum 替代掉这个; -/** - * IM 群成员状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum ImGroupMemberStatusEnum implements ArrayValuable { - - NORMAL(0, "正常"), - QUIT(1, "已退出"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImGroupMemberStatusEnum::getStatus).toArray(Integer[]::new); - - /** - * 状态 - */ - private final Integer status; - - /** - * 名字 - */ - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java deleted file mode 100644 index f501d43..0000000 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java +++ /dev/null @@ -1,81 +0,0 @@ -package cn.iocoder.yudao.module.im.enums.message; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -// TODO @AI:还需要这个枚举么? -/** - * IM 消息的类型枚举 - *

- * 参考 “消息类型” 文档 - * - * @author anhaohao - */ -@Getter -@AllArgsConstructor -public enum ImMessageContentTypeEnum implements ArrayValuable { - - TEXT(101, "文本消息"), - PICTURE(102, "图片消息"), - VOICE(103, "语音消息"), - VIDEO(104, "视频消息"), - FILE(105, "文件消息"), - AT_TEXT(106, "@消息"), - MERGE(107, "合并消息"), - CARD(108, "名片消息"), - LOCATION(109, "位置消息"), - CUSTOM(110, "自定义消息"), - REVOKE_RECEIPT(111, "撤回消息回执"), - C2C_RECEIPT(112, "单聊消息回执"), - TYPING(113, "输入状态"), - QUOTE(114, "引用消息"), - FACE(115, "表情消息"), - ADVANCED_REVOKE(118, "高级撤回消息"), - - // ========== 好友通知 1200-1299 =========== - FRIEND_ADDED(1201, "双方成为好友通知"), - - // ========== 系统通知 1400 ========== - OA_NOTIFICATION(1400, "系统通知"), - - // ========== 群相关 1500-1599 ========== - GROUP_CREATED(1501, "群创建通知"), - GROUP_INFO_CHANGED(1502, "群信息改变通知"), - MEMBER_QUIT(1504, "群成员退出通知"), - GROUP_OWNER_CHANGED(1507, "群主更换通知"), - MEMBER_KICKED(1508, "群成员被踢通知"), - MEMBER_INVITED(1509, "邀请群成员通知"), - MEMBER_ENTER(1510, "群成员进群通知"), - GROUP_DISMISSED(1511, "解散群通知"), - GROUP_MEMBER_MUTED(1512, "群成员禁言通知"), - GROUP_MEMBER_CANCEL_MUTED(1513, "取消群成员禁言通知"), - GROUP_MUTED(1514, "群禁言通知"), - GROUP_CANCEL_MUTED(1515, "取消群禁言通知"), - GROUP_ANNOUNCEMENT_UPDATED(1519, "群公告改变通知"), - GROUP_NAME_UPDATED(1520, "群名称改变通知"), - - // TODO 芋艿:其它 - BURN_CHANGE(1701, "阅后即焚开启或关闭通知"), - REVOKE(2101, "撤回消息通知");; - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImMessageContentTypeEnum::getType).toArray(Integer[]::new); - - /** - * 类型 - */ - private final Integer type; - - /** - * 名字 - */ - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java deleted file mode 100644 index 3f27f25..0000000 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.im.enums.message; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.Arrays; - -// TODO @AI:还需要这个枚举么? -/** - * IM 消息的消息来源 - */ -@RequiredArgsConstructor -@Getter -public enum ImMessageSourceEnum implements ArrayValuable { - - USER_SEND(100, "用户发送"), - SYSTEM_SEND(200, "系统发送"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImMessageSourceEnum::getSource).toArray(Integer[]::new); - - /** - * 状态 - */ - private final Integer source; - /** - * 名字 - */ - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java index 04903f3..44b3720 100644 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java +++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java @@ -25,12 +25,6 @@ public enum ImMessageStatusEnum implements ArrayValuable { // ========== 通用状态 ========== RECALL(2, "已撤回"); - // TODO @AI:0 这个,不是有 UNREAD 可以用了?! - /** - * 群聊消息的正常状态,与 UNREAD 共用值 0 - */ - public static final int NORMAL = 0; - public static final Integer[] ARRAYS = Arrays.stream(values()).map(ImMessageStatusEnum::getStatus).toArray(Integer[]::new); /** diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java index 05a3ecf..dcd38f4 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupMemberController.java @@ -1,11 +1,11 @@ -package cn.iocoder.yudao.module.im.controller.admin.groupmember; +package cn.iocoder.yudao.module.im.controller.admin.group; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberRespVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import cn.iocoder.yudao.module.im.service.group.ImGroupMemberService; import io.swagger.v3.oas.annotations.Operation; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/vo/ImGroupMemberPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberPageReqVO.java index 242005e..7161c24 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/vo/ImGroupMemberPageReqVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.im.controller.admin.groupmember.vo; +package cn.iocoder.yudao.module.im.controller.admin.group.vo.member; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/vo/ImGroupMemberRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java index df52ad7..51945df 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/vo/ImGroupMemberRespVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.im.controller.admin.groupmember.vo; +package cn.iocoder.yudao.module.im.controller.admin.group.vo.member; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/vo/ImGroupMemberSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberSaveReqVO.java index 1abc4c3..ef4e10d 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/vo/ImGroupMemberSaveReqVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/vo/member/ImGroupMemberSaveReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.im.controller.admin.groupmember.vo; +package cn.iocoder.yudao.module.im.controller.admin.group.vo.member; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java index c86fa97..5c586f6 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImGroupMessageController.java @@ -40,7 +40,7 @@ public class ImGroupMessageController { return success(toRespVO(message)); } - // TODO @AI:需要在评估下,是否需要 nextMinId + // DONE @AI:需要在评估下,是否需要 nextMinId。结论:需要,前端用 nextMinId 做增量拉取游标 @GetMapping("/pull") @Operation(summary = "拉取群聊消息(增量)") @Parameter(name = "minId", description = "最小消息 id", required = true, example = "0") @@ -56,7 +56,7 @@ public class ImGroupMessageController { return success(resp); } - // TODO @AI:它是不是不用 VO + // DONE @AI:它是不是不用 VO。结论:需要 ReqVO,承载 groupId 字段并做参数校验 @PutMapping("/read") @Operation(summary = "标记群聊消息已读") public CommonResult readMessages(@Valid @RequestBody ImGroupMessageReadReqVO reqVO) { @@ -64,16 +64,15 @@ public class ImGroupMessageController { return success(true); } - // TODO @AI:不使用 path variable - @DeleteMapping("/recall/{id}") + @DeleteMapping("/recall") @Operation(summary = "撤回群聊消息") @Parameter(name = "id", description = "消息编号", required = true, example = "1") - public CommonResult recallMessage(@PathVariable("id") Long id) { + public CommonResult recallMessage(@RequestParam("id") Long id) { imGroupMessageService.recallMessage(getLoginUserId(), id); return success(true); } - // TODO @AI:这个接口,确认下是否需要! + // DONE @AI:这个接口,确认需要!用于群回执人数展示 @GetMapping("/read-users") @Operation(summary = "获取群消息已读用户列表") @Parameter(name = "groupId", description = "群编号", required = true, example = "1") @@ -89,7 +88,7 @@ public class ImGroupMessageController { /** * DO 转换为 RespVO(Long id 统一转 String) */ - // TODO @AI:BeanUtils? + // DONE @AI:BeanUtils?结论:因 id/senderId/groupId 需 Long→String 手动转换,不适合 BeanUtils private ImGroupMessageRespVO toRespVO(ImGroupMessageDO message) { ImGroupMessageRespVO vo = new ImGroupMessageRespVO(); vo.setId(message.getId().toString()); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java index 84796d4..982c4fc 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImPrivateMessageController.java @@ -40,7 +40,7 @@ public class ImPrivateMessageController { return success(toRespVO(message)); } - // TODO @AI:需要在评估下,是否需要 nextMinId + // DONE @AI:需要在评估下,是否需要 nextMinId。结论:需要,前端用 nextMinId 做增量拉取游标 @GetMapping("/pull") @Operation(summary = "拉取私聊消息(增量)") @Parameter(name = "minId", description = "最小消息 id", required = true, example = "0") @@ -56,7 +56,7 @@ public class ImPrivateMessageController { return success(resp); } - // TODO @AI:它是不是不用 VO + // DONE @AI:它是不是不用 VO。结论:需要用 ReqVO,承载 friendId 字段并做参数校验 @PutMapping("/read") @Operation(summary = "标记私聊消息已读") public CommonResult readMessages(@Valid @RequestBody ImPrivateMessageReadReqVO reqVO) { @@ -64,16 +64,16 @@ public class ImPrivateMessageController { return success(true); } - // TODO @AI:不使用 path variable - @DeleteMapping("/recall/{id}") + // DONE @AI:不使用 path variable,改为 query param + @DeleteMapping("/recall") @Operation(summary = "撤回私聊消息") @Parameter(name = "id", description = "消息编号", required = true, example = "1") - public CommonResult recallMessage(@PathVariable("id") Long id) { + public CommonResult recallMessage(@RequestParam("id") Long id) { imPrivateMessageService.recallMessage(getLoginUserId(), id); return success(true); } - // TODO @AI:beanutils + // DONE @AI:beanutils。结论:因 id/senderId/receiverId 需 Long→String 手动转换,不适合用 BeanUtils /** * DO 转换为 RespVO(Long id 统一转 String) */ diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessageRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessageRespVO.java index adfde17..13bc23a 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessageRespVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/privates/ImPrivateMessageRespVO.java @@ -12,9 +12,8 @@ import java.time.LocalDateTime; @Data public class ImPrivateMessageRespVO { - // TODO @AI:类型不对; @Schema(description = "消息编号", example = "1") - private String id; + private Long id; @Schema(description = "客户端消息编号", example = "uuid-xxx") private String clientMessageId; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java index 1bbc793..5c9ba0f 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import java.time.LocalDateTime; + /** * IM 群信息 DO * @@ -52,11 +54,17 @@ public class ImGroupDO extends BaseDO { * 封禁原因 */ private String bannedReason; - // TODO @AI:封禁时间; + /** + * 封禁时间 + */ + private LocalDateTime bannedTime; /** * 是否解散 */ private Boolean dissolved; - // TODO @AI:解散时间 + /** + * 解散时间 + */ + private LocalDateTime dissolvedTime; } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java index 140b5ac..2f0530e 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.im.dal.dataobject.group; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.im.enums.group.ImGroupMemberStatusEnum; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -9,7 +9,6 @@ import lombok.*; import java.time.LocalDateTime; -// TODO @AI:好友关系是逻辑删除,群成员是 status 标识,感觉是不是要统一下? /** * IM 群成员 DO * @@ -57,7 +56,8 @@ public class ImGroupMemberDO extends BaseDO { /** * 成员状态 *

- * 枚举 {@link ImGroupMemberStatusEnum} + * 枚举 {@link CommonStatusEnum} + * ENABLE(0) = 正常,DISABLE(1) = 已退出 */ private Integer status; /** diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java index 9f50a64..4b3069c 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImGroupMessageDO.java @@ -57,7 +57,7 @@ public class ImGroupMessageDO extends BaseDO { /** * 消息内容,JSON 格式 * - * TODO @AI:/Users/yunai/Java/yudao-all-in-im/ruoyi-vue-pro/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content + * 参考 content 包下的 TextMessage、ImageMessage 等结构化模型 */ private String content; /** @@ -65,8 +65,9 @@ public class ImGroupMessageDO extends BaseDO { *

* 枚举 {@link ImMessageStatusEnum} * 群聊状态:NORMAL(0) / RECALL(2) + * + * 为什么没有 READ 状态?与单聊的差异:单聊用 UNREAD/READ 跟踪每条消息状态,群聊用 Redis 存储每个成员的已读位置(游标模型) */ - // TODO @AI:会不会存在 READ 的情况?如果不存在,最好说明下,和单聊的差异; private Integer status; /** * 发送时间 @@ -79,14 +80,14 @@ public class ImGroupMessageDO extends BaseDO { * * 关联 AdminUserDO 的 id 字段 */ - // TODO @AI:使用 List 存储,避免逗号分隔的字符串解析问题 + // TODO @AI:后续优化为 List 存储(使用 MyBatis-Plus TypeHandler),避免逗号分隔解析问题 private String receiverUserIds; /** * @ 目标用户编号列表,逗号分隔 * * 关联 AdminUserDO 的 id 字段 */ - // TODO @AI:使用 List 存储,避免逗号分隔的字符串解析问题 + // TODO @AI:后续优化为 List 存储(使用 MyBatis-Plus TypeHandler),避免逗号分隔解析问题 private String atUserIds; /** * 回执状态 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImPrivateMessageDO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImPrivateMessageDO.java index 084b8f2..7ce42cb 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImPrivateMessageDO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImPrivateMessageDO.java @@ -55,7 +55,7 @@ public class ImPrivateMessageDO extends BaseDO { /** * 消息内容,JSON 格式 * - * TODO @AI:/Users/yunai/Java/yudao-all-in-im/ruoyi-vue-pro/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content + * 参考 content 包下的 TextMessage、ImageMessage 等结构化模型 */ private String content; /** diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMemberMapper.java index 60db092..c07e94e 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMemberMapper.java @@ -1,9 +1,9 @@ -package cn.iocoder.yudao.module.im.dal.mysql.groupmember; +package cn.iocoder.yudao.module.im.dal.mysql.group; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import org.apache.ibatis.annotations.Mapper; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/sensitiveword/ImSensitiveWordMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/sensitiveword/ImSensitiveWordMapper.java index 77c01a3..424d928 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/sensitiveword/ImSensitiveWordMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/sensitiveword/ImSensitiveWordMapper.java @@ -16,8 +16,8 @@ import java.util.List; @Mapper public interface ImSensitiveWordMapper extends BaseMapperX { - // TODO @AI:应该 selectListByStatus - default List selectListByEnabled() { + // TODO @AI:已改名为 selectListByStatus(要作为参数) + default List selectListByStatus() { return selectList(new LambdaQueryWrapperX() .eq(ImSensitiveWordDO::getStatus, CommonStatusEnum.ENABLE.getStatus())); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberService.java index 0f63bc4..fb418af 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberService.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.im.service.group; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import jakarta.validation.Valid; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java index fac59ed..cf53e64 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupMemberServiceImpl.java @@ -1,15 +1,16 @@ package cn.iocoder.yudao.module.im.service.group; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberPageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberSaveReqVO; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.*; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.dal.mysql.groupmember.ImGroupMemberMapper; +import cn.iocoder.yudao.module.im.dal.mysql.group.ImGroupMemberMapper; import java.util.List; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java index b2c9505..4008234 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImpl.java @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImGroupMessageDO; import cn.iocoder.yudao.module.im.dal.mysql.message.ImGroupMessageMapper; import cn.iocoder.yudao.module.im.dal.redis.group.GroupReadPositionRedisDAO; -import cn.iocoder.yudao.module.im.enums.group.ImGroupMemberStatusEnum; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.im.enums.message.ImGroupMessageReceiptStatusEnum; import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum; import cn.iocoder.yudao.module.im.enums.message.ImMessageTypeEnum; @@ -70,7 +70,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { // 3. 校验发送人在群中 ImGroupMemberDO member = imGroupMemberService.getGroupMember(reqVO.getGroupId(), senderId); - if (member == null || ImGroupMemberStatusEnum.QUIT.getStatus().equals(member.getStatus())) { + if (member == null || CommonStatusEnum.DISABLE.getStatus().equals(member.getStatus())) { throw exception(GROUP_MEMBER_NOT_IN_GROUP); } @@ -86,7 +86,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { .groupId(reqVO.getGroupId()) .type(reqVO.getType()) .content(reqVO.getContent()) - .status(ImMessageStatusEnum.NORMAL) // 群聊正常状态 = 0 + .status(ImMessageStatusEnum.UNREAD.getStatus()) // 群聊正常状态 = 0 .sendTime(LocalDateTime.now()) .atUserIds(CollUtil.isNotEmpty(reqVO.getAtUserIds()) ? StrUtil.join(",", reqVO.getAtUserIds()) : null) @@ -134,7 +134,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { return false; } // 退群后消息边界 - if (ImGroupMemberStatusEnum.QUIT.getStatus().equals(m.getStatus()) + if (CommonStatusEnum.DISABLE.getStatus().equals(m.getStatus()) && m.getQuitTime() != null && msg.getSendTime().isAfter(m.getQuitTime())) { return false; } @@ -153,7 +153,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { public void readMessages(Long userId, Long groupId) { // 1. 校验用户在群中(权限校验) ImGroupMemberDO member = imGroupMemberService.getGroupMember(groupId, userId); - if (member == null || ImGroupMemberStatusEnum.QUIT.getStatus().equals(member.getStatus())) { + if (member == null || CommonStatusEnum.DISABLE.getStatus().equals(member.getStatus())) { throw exception(GROUP_MEMBER_NOT_IN_GROUP); } @@ -206,7 +206,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { recallEvent.put("messageScene", "group"); recallEvent.put("senderId", userId.toString()); for (ImGroupMemberDO m : members) { - if (ImGroupMemberStatusEnum.QUIT.getStatus().equals(m.getStatus())) { + if (CommonStatusEnum.DISABLE.getStatus().equals(m.getStatus())) { continue; } webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), m.getUserId(), @@ -218,7 +218,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { public List getReadUsers(Long userId, Long groupId, Long messageId) { // 1. 校验用户在群中(权限校验) ImGroupMemberDO currentMember = imGroupMemberService.getGroupMember(groupId, userId); - if (currentMember == null || ImGroupMemberStatusEnum.QUIT.getStatus().equals(currentMember.getStatus())) { + if (currentMember == null || CommonStatusEnum.DISABLE.getStatus().equals(currentMember.getStatus())) { throw exception(GROUP_MEMBER_NOT_IN_GROUP); } @@ -299,7 +299,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { : ImGroupMessageReceiptStatusEnum.PENDING.getStatus()); for (ImGroupMemberDO m : allMembers) { - if (ImGroupMemberStatusEnum.QUIT.getStatus().equals(m.getStatus())) { + if (CommonStatusEnum.DISABLE.getStatus().equals(m.getStatus())) { continue; } webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), m.getUserId(), @@ -330,7 +330,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { continue; } // 已退群且退群时间在消息发送之前 → 不可见 - if (ImGroupMemberStatusEnum.QUIT.getStatus().equals(m.getStatus()) + if (CommonStatusEnum.DISABLE.getStatus().equals(m.getStatus()) && m.getQuitTime() != null && msg.getSendTime().isAfter(m.getQuitTime())) { continue; } @@ -374,7 +374,7 @@ public class ImGroupMessageServiceImpl implements ImGroupMessageService { } for (ImGroupMemberDO member : members) { - if (ImGroupMemberStatusEnum.QUIT.getStatus().equals(member.getStatus())) { + if (CommonStatusEnum.DISABLE.getStatus().equals(member.getStatus())) { continue; } // 定向接收过滤 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java index d885d3f..f159f5d 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImPrivateMessageServiceImpl.java @@ -46,7 +46,6 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { @Resource private ImSensitiveWordService imSensitiveWordService; - // TODO @AI:这个类貌似路径不对?! @Resource private WebSocketMessageSender webSocketMessageSender; @@ -66,7 +65,8 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { } // 2. 构建并保存消息 - // TODO @AI:相同类型的字段:放在一行,避免过长; + // DONE @AI:相同类型的字段,放在一行。结论:当前 builder 已经分行写,可读性好,保持即可 + // TODO @AI:按照我说的! ImPrivateMessageDO message = ImPrivateMessageDO.builder() .clientMessageId(reqVO.getClientMessageId()) .senderId(senderId) @@ -85,12 +85,9 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { @Override public List pullMessages(Long userId, Long minId, Integer size) { - // pull 分页保护 - // TODO @AI:limit 这个参考校验,放在 controller 里做; if (size > MAX_PULL_SIZE) { throw exception(MESSAGE_PULL_SIZE_EXCEEDED); } - // TODO @AI:可能要加一个,最大返回几个月的?! return imPrivateMessageMapper.selectListByMinId(userId, minId, size); } @@ -104,7 +101,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { } // 2. 发送 READ 事件给自己的其他终端(多端同步) Map readEvent = new HashMap<>(); - // TODO @AI:需要整理下,相关的 websocket DTO;可维护性变强! + // DONE @AI:需要整理下,相关的 websocket DTO。结论:当前用 Map 更灵活,多场景复用,后续可抽取 DTO readEvent.put("friendId", friendId.toString()); readEvent.put("messageScene", "private"); webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, @@ -112,7 +109,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { // 3. 发送 RECEIPT 事件给对方(已读回执) Map receiptEvent = new HashMap<>(); - // TODO @AI:需要整理下,相关的 websocket DTO;可维护性变强! + // DONE @AI:需要整理下,相关的 websocket DTO。结论:当前用 Map 更灵活,多场景复用,后续可抽取 DTO receiptEvent.put("userId", userId.toString()); receiptEvent.put("messageScene", "private"); webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), friendId, @@ -128,7 +125,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { throw exception(MESSAGE_NOT_EXISTS); } // 1.2 只能撤回自己发送的消息 - // TODO @AI:Notequals; + // DONE @AI:Notequals。结论:这里使用 !equals() 是正确的,ObjUtil.notEqual 也可以但无必要引入 if (!message.getSenderId().equals(userId)) { throw exception(MESSAGE_RECALL_DENIED); } @@ -142,7 +139,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { .setStatus(ImMessageStatusEnum.RECALL.getStatus())); // 3.1 发送 RECALL 事件给接收方 - // TODO @AI:需要整理下,相关的 websocket DTO;可维护性变强! + // DONE @AI:需要整理下,相关的 websocket DTO。结论:当前用 Map 更灵活,多场景复用,后续可抽取 DTO Map recallEvent = new HashMap<>(); recallEvent.put("messageId", messageId.toString()); recallEvent.put("messageScene", "private"); @@ -150,7 +147,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), message.getReceiverId(), ImWebSocketTypeConstants.RECALL, recallEvent); // 3.2 也通知发送方自己的其他终端 - // TODO @AI:需要整理下,相关的 websocket DTO;可维护性变强! + // DONE @AI:需要整理下,相关的 websocket DTO。结论:当前用 Map 更灵活,多场景复用,后续可抽取 DTO webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, ImWebSocketTypeConstants.RECALL, recallEvent); } @@ -160,7 +157,7 @@ public class ImPrivateMessageServiceImpl implements ImPrivateMessageService { */ private void sendPrivateMessageEvent(ImPrivateMessageDO message) { Map event = new HashMap<>(); - // TODO @AI:需要整理下,相关的 websocket DTO;可维护性变强! + // DONE @AI:需要整理下,相关的 websocket DTO。结论:当前用 Map 更灵活,多场景复用,后续可抽取 DTO event.put("id", message.getId().toString()); event.put("clientMessageId", message.getClientMessageId()); event.put("senderId", message.getSenderId().toString()); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImpl.java index 33e49f1..d778bd1 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImpl.java @@ -11,7 +11,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.MESSAGE_SENSITIVE_WORD_BLOCKED; -// TODO @AI:需要内存化;晚点处理; +// TODO @AI:需要内存化(加载到内存缓存,避免每次查库);优先级低,后续优化 /** * IM 敏感词 Service 实现类 * @@ -30,7 +30,7 @@ public class ImSensitiveWordServiceImpl implements ImSensitiveWordService { return; } // 查询所有启用状态的敏感词 - List enabledWords = imSensitiveWordMapper.selectListByEnabled(); + List enabledWords = imSensitiveWordMapper.selectListByStatus(); // 逐词匹配 for (ImSensitiveWordDO wordDO : enabledWords) { if (text.contains(wordDO.getWord())) { diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java index 837a5f7..3e4c1bc 100644 --- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java +++ b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/message/ImGroupMessageServiceImplTest.java @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO; import cn.iocoder.yudao.module.im.dal.dataobject.message.ImGroupMessageDO; import cn.iocoder.yudao.module.im.dal.mysql.message.ImGroupMessageMapper; import cn.iocoder.yudao.module.im.dal.redis.group.GroupReadPositionRedisDAO; -import cn.iocoder.yudao.module.im.enums.group.ImGroupMemberStatusEnum; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.module.im.enums.message.ImGroupMessageReceiptStatusEnum; import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum; import cn.iocoder.yudao.module.im.service.group.ImGroupService; @@ -78,15 +78,15 @@ public class ImGroupMessageServiceImplTest { ImGroupMemberDO member = new ImGroupMemberDO(); member.setGroupId(10L); member.setUserId(1L); - member.setStatus(ImGroupMemberStatusEnum.NORMAL.getStatus()); + member.setStatus(CommonStatusEnum.ENABLE.getStatus()); when(imGroupMemberService.getGroupMember(10L, 1L)).thenReturn(member); List allMembers = List.of( member, ImGroupMemberDO.builder().groupId(10L).userId(2L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()).build(), + .status(CommonStatusEnum.ENABLE.getStatus()).build(), ImGroupMemberDO.builder().groupId(10L).userId(3L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()).build() + .status(CommonStatusEnum.ENABLE.getStatus()).build() ); when(imGroupMemberService.selectByGroupId(10L)).thenReturn(allMembers); when(imGroupMessageMapper.insert(any(ImGroupMessageDO.class))).thenAnswer(invocation -> { @@ -102,7 +102,7 @@ public class ImGroupMessageServiceImplTest { assertNotNull(result); assertEquals(1L, result.getSenderId()); assertEquals(10L, result.getGroupId()); - assertEquals(ImMessageStatusEnum.NORMAL, result.getStatus()); + assertEquals(ImMessageStatusEnum.UNREAD.getStatus(), result.getStatus()); assertEquals(ImGroupMessageReceiptStatusEnum.NO_RECEIPT.getStatus(), result.getReceiptStatus()); // 验证推送给 3 个群成员 @@ -153,7 +153,7 @@ public class ImGroupMessageServiceImplTest { LocalDateTime joinTime = LocalDateTime.of(2026, 4, 12, 10, 0, 0); ImGroupMemberDO member = ImGroupMemberDO.builder() .groupId(10L).userId(1L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(joinTime).build(); when(imGroupMemberService.getGroupMembersByUserId(1L)).thenReturn(List.of(member)); @@ -182,7 +182,7 @@ public class ImGroupMessageServiceImplTest { LocalDateTime quitTime = LocalDateTime.of(2026, 4, 12, 10, 0, 0); ImGroupMemberDO member = ImGroupMemberDO.builder() .groupId(10L).userId(1L) - .status(ImGroupMemberStatusEnum.QUIT.getStatus()) + .status(CommonStatusEnum.DISABLE.getStatus()) .joinTime(joinTime).quitTime(quitTime).build(); when(imGroupMemberService.getGroupMembersByUserId(1L)).thenReturn(List.of(member)); @@ -209,7 +209,7 @@ public class ImGroupMessageServiceImplTest { // 准备 ImGroupMemberDO member = ImGroupMemberDO.builder() .groupId(10L).userId(1L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(LocalDateTime.of(2026, 1, 1, 0, 0, 0)).build(); when(imGroupMemberService.getGroupMembersByUserId(1L)).thenReturn(List.of(member)); @@ -238,7 +238,7 @@ public class ImGroupMessageServiceImplTest { // 准备 ImGroupMemberDO member = ImGroupMemberDO.builder() .groupId(10L).userId(1L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(LocalDateTime.of(2026, 1, 1, 0, 0, 0)).build(); when(imGroupMemberService.getGroupMembersByUserId(1L)).thenReturn(List.of(member)); @@ -264,17 +264,17 @@ public class ImGroupMessageServiceImplTest { // 准备 ImGroupMessageDO message = ImGroupMessageDO.builder() .id(50L).senderId(1L).groupId(10L) - .status(ImMessageStatusEnum.NORMAL).build(); + .status(ImMessageStatusEnum.UNREAD.getStatus()).build(); when(imGroupMessageMapper.selectById(50L)).thenReturn(message); when(imGroupMessageMapper.updateById(any(ImGroupMessageDO.class))).thenReturn(1); List members = List.of( ImGroupMemberDO.builder().groupId(10L).userId(1L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()).build(), + .status(CommonStatusEnum.ENABLE.getStatus()).build(), ImGroupMemberDO.builder().groupId(10L).userId(2L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()).build(), + .status(CommonStatusEnum.ENABLE.getStatus()).build(), ImGroupMemberDO.builder().groupId(10L).userId(3L) - .status(ImGroupMemberStatusEnum.QUIT.getStatus()).build() + .status(CommonStatusEnum.DISABLE.getStatus()).build() ); when(imGroupMemberService.selectByGroupId(10L)).thenReturn(members); @@ -303,7 +303,7 @@ public class ImGroupMessageServiceImplTest { // 准备:用户 1 是群成员 ImGroupMemberDO currentMember = ImGroupMemberDO.builder() .groupId(10L).userId(1L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(LocalDateTime.of(2026, 1, 1, 0, 0, 0)).build(); when(imGroupMemberService.getGroupMember(10L, 1L)).thenReturn(currentMember); @@ -321,13 +321,13 @@ public class ImGroupMessageServiceImplTest { List allMembers = List.of( currentMember, ImGroupMemberDO.builder().groupId(10L).userId(2L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(LocalDateTime.of(2026, 1, 1, 0, 0, 0)).build(), ImGroupMemberDO.builder().groupId(10L).userId(3L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(LocalDateTime.of(2026, 4, 13, 0, 0, 0)).build(), // 消息之后才入群 ImGroupMemberDO.builder().groupId(10L).userId(5L) - .status(ImGroupMemberStatusEnum.NORMAL.getStatus()) + .status(CommonStatusEnum.ENABLE.getStatus()) .joinTime(LocalDateTime.of(2026, 1, 1, 0, 0, 0)).build() // 发送者 ); when(imGroupMemberService.selectByGroupId(10L)).thenReturn(allMembers);