Commit fa23ce144d9391c3b30b050c2ad80f6a21bcda82

Authored by 安浩浩
1 parent 2b891cb4

修改:代码优化

Showing 49 changed files with 423 additions and 711 deletions
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ConversationTypeEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java
@@ -6,7 +6,6 @@ import lombok.Getter; @@ -6,7 +6,6 @@ import lombok.Getter;
6 6
7 import java.util.Arrays; 7 import java.util.Arrays;
8 8
9 -// TODO @anhaohao:IM 前缀还是要的哈  
10 /** 9 /**
11 * IM 会话类型枚举 10 * IM 会话类型枚举
12 * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档 11 * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档
@@ -15,13 +14,13 @@ import java.util.Arrays; @@ -15,13 +14,13 @@ import java.util.Arrays;
15 */ 14 */
16 @Getter 15 @Getter
17 @AllArgsConstructor 16 @AllArgsConstructor
18 -public enum ConversationTypeEnum implements IntArrayValuable { 17 +public enum ImConversationTypeEnum implements IntArrayValuable {
19 18
20 SINGLE(1, "单聊"), 19 SINGLE(1, "单聊"),
21 GROUP(3, "群聊"), 20 GROUP(3, "群聊"),
22 NOTIFICATION(4, "通知会话"); 21 NOTIFICATION(4, "通知会话");
23 22
24 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ConversationTypeEnum::getType).toArray(); 23 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImConversationTypeEnum::getType).toArray();
25 24
26 /** 25 /**
27 * 类型 26 * 类型
@@ -33,25 +32,26 @@ public enum ConversationTypeEnum implements IntArrayValuable { @@ -33,25 +32,26 @@ public enum ConversationTypeEnum implements IntArrayValuable {
33 */ 32 */
34 private final String name; 33 private final String name;
35 34
36 - @Override  
37 - public int[] array() {  
38 - return ARRAYS;  
39 - }  
40 -  
41 /** 35 /**
42 - * 生成会话编号 TODO @anhaohao:方法注释,和下面参数之间,要有空格  
43 - * @param fromUserId 发送者编号  
44 - * @param receiverId 接收者编号 36 + * 生成会话编号
  37 + *
  38 + * @param fromUserId 发送者编号
  39 + * @param receiverId 接收者编号
45 * @param conversationType 会话类型 40 * @param conversationType 会话类型
46 * @return 会话编号 41 * @return 会话编号
47 */ 42 */
48 public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) { 43 public static String generateConversationNo(Long fromUserId, Long receiverId, Integer conversationType) {
49 - if (conversationType.equals(ConversationTypeEnum.SINGLE.getType())) { 44 + if (conversationType.equals(ImConversationTypeEnum.SINGLE.getType())) {
50 return "s_" + fromUserId + "_" + receiverId; 45 return "s_" + fromUserId + "_" + receiverId;
51 - } else if (conversationType.equals(ConversationTypeEnum.GROUP.getType())) { 46 + } else if (conversationType.equals(ImConversationTypeEnum.GROUP.getType())) {
52 return "g_" + receiverId; 47 return "g_" + receiverId;
53 } 48 }
54 return null; 49 return null;
55 } 50 }
56 51
  52 + @Override
  53 + public int[] array() {
  54 + return ARRAYS;
  55 + }
  56 +
57 } 57 }
58 \ No newline at end of file 58 \ No newline at end of file
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageContentTypeEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageContentTypeEnum.java
@@ -6,7 +6,6 @@ import lombok.Getter; @@ -6,7 +6,6 @@ import lombok.Getter;
6 6
7 import java.util.Arrays; 7 import java.util.Arrays;
8 8
9 -// TODO @anhaohao:IM 前缀还是要的哈  
10 /** 9 /**
11 * IM 消息的类型枚举 10 * IM 消息的类型枚举
12 * <p> 11 * <p>
@@ -16,7 +15,7 @@ import java.util.Arrays; @@ -16,7 +15,7 @@ import java.util.Arrays;
16 */ 15 */
17 @Getter 16 @Getter
18 @AllArgsConstructor 17 @AllArgsConstructor
19 -public enum MessageContentTypeEnum implements IntArrayValuable { 18 +public enum ImMessageContentTypeEnum implements IntArrayValuable {
20 19
21 TEXT(101, "文本消息"), 20 TEXT(101, "文本消息"),
22 PICTURE(102, "图片消息"), 21 PICTURE(102, "图片消息"),
@@ -57,7 +56,7 @@ public enum MessageContentTypeEnum implements IntArrayValuable { @@ -57,7 +56,7 @@ public enum MessageContentTypeEnum implements IntArrayValuable {
57 BURN_CHANGE(1701, "阅后即焚开启或关闭通知"), 56 BURN_CHANGE(1701, "阅后即焚开启或关闭通知"),
58 REVOKE(2101, "撤回消息通知");; 57 REVOKE(2101, "撤回消息通知");;
59 58
60 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageContentTypeEnum::getType).toArray(); 59 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageContentTypeEnum::getType).toArray();
61 60
62 /** 61 /**
63 * 类型 62 * 类型
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageSourceEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageSourceEnum.java
@@ -6,24 +6,22 @@ import lombok.RequiredArgsConstructor; @@ -6,24 +6,22 @@ import lombok.RequiredArgsConstructor;
6 6
7 import java.util.Arrays; 7 import java.util.Arrays;
8 8
9 -// TODO @anhaohao:IM 前缀还是要的哈  
10 /** 9 /**
11 * IM 消息的消息来源 10 * IM 消息的消息来源
12 */ 11 */
13 @RequiredArgsConstructor 12 @RequiredArgsConstructor
14 @Getter 13 @Getter
15 -public enum MessageSourceEnum implements IntArrayValuable { 14 +public enum ImMessageSourceEnum implements IntArrayValuable {
16 15
17 USER_SEND(100, "用户发送"), 16 USER_SEND(100, "用户发送"),
18 SYSTEM_SEND(200, "系统发送"); 17 SYSTEM_SEND(200, "系统发送");
19 18
20 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageSourceEnum::getStatus).toArray(); 19 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageSourceEnum::getSource).toArray();
21 20
22 - // TODO @anhaohao:应该是 source  
23 /** 21 /**
24 * 状态 22 * 状态
25 */ 23 */
26 - private final Integer status; 24 + private final Integer source;
27 /** 25 /**
28 * 名字 26 * 名字
29 */ 27 */
yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/MessageStatusEnum.java renamed to yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java
@@ -6,27 +6,21 @@ import lombok.RequiredArgsConstructor; @@ -6,27 +6,21 @@ import lombok.RequiredArgsConstructor;
6 6
7 import java.util.Arrays; 7 import java.util.Arrays;
8 8
9 -// TODO @anhaohao:IM 前缀还是要的哈  
10 -// TODO TODO 状态是这些哈,客户端的视角:  
11 -//  
12 -//- 草稿(预留) 0  
13 -//- 发送中 1  
14 -//- 发送成功 2  
15 -//- 发送失败 3  
16 -//- 已删除 4  
17 -//- 已撤回 5  
18 /** 9 /**
19 * IM 消息的状态枚举 10 * IM 消息的状态枚举
20 */ 11 */
21 @RequiredArgsConstructor 12 @RequiredArgsConstructor
22 @Getter 13 @Getter
23 -public enum MessageStatusEnum implements IntArrayValuable { 14 +public enum ImMessageStatusEnum implements IntArrayValuable {
24 15
  16 + DRAFT(0, "草稿"),
25 SENDING(1, "发送中"), 17 SENDING(1, "发送中"),
26 - SUCCEED(2, "发送成功"),  
27 - FAILED(3, "发送失败"); 18 + SUCCESS(2, "发送成功"),
  19 + FAILURE(3, "发送失败"),
  20 + DELETED(4, "已删除"),
  21 + RECALL(5, "已撤回");
28 22
29 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(MessageStatusEnum::getStatus).toArray(); 23 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageStatusEnum::getStatus).toArray();
30 24
31 /** 25 /**
32 * 状态 26 * 状态
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ImConversationController.java
@@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.im.controller.admin.conversation; @@ -2,10 +2,10 @@ package cn.iocoder.yudao.module.im.controller.admin.conversation;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; 5 +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
6 import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; 6 import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO;
7 -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO;  
8 -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; 7 +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
  8 +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
9 import cn.iocoder.yudao.module.im.service.conversation.ConversationService; 9 import cn.iocoder.yudao.module.im.service.conversation.ConversationService;
10 import io.swagger.v3.oas.annotations.Operation; 10 import io.swagger.v3.oas.annotations.Operation;
11 import io.swagger.v3.oas.annotations.tags.Tag; 11 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -17,13 +17,13 @@ import org.springframework.web.bind.annotation.*; @@ -17,13 +17,13 @@ import org.springframework.web.bind.annotation.*;
17 import java.util.List; 17 import java.util.List;
18 18
19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  20 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
20 21
21 -// TODO @anhaohao:im 前缀少啦  
22 @Tag(name = "管理后台 - IM 会话") 22 @Tag(name = "管理后台 - IM 会话")
23 @RestController 23 @RestController
24 @RequestMapping("/im/conversation") 24 @RequestMapping("/im/conversation")
25 @Validated 25 @Validated
26 -public class ConversationController { 26 +public class ImConversationController {
27 27
28 @Resource 28 @Resource
29 private ConversationService conversationService; 29 private ConversationService conversationService;
@@ -31,23 +31,21 @@ public class ConversationController { @@ -31,23 +31,21 @@ public class ConversationController {
31 @GetMapping("/list") 31 @GetMapping("/list")
32 @Operation(summary = "获得用户的会话列表") 32 @Operation(summary = "获得用户的会话列表")
33 public CommonResult<List<ImConversationRespVO>> getConversationList() { 33 public CommonResult<List<ImConversationRespVO>> getConversationList() {
34 - List<ConversationDO> conversationList = conversationService.getConversationList(); 34 + List<ImConversationDO> conversationList = conversationService.getConversationList();
35 return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class)); 35 return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class));
36 } 36 }
37 37
38 - // TODO @hao:这个接口,需要单独的 VO 哈;  
39 @PostMapping("/update-pinned") 38 @PostMapping("/update-pinned")
40 @Operation(summary = "置顶会话") 39 @Operation(summary = "置顶会话")
41 - public CommonResult<Boolean> updatePinned(@Valid @RequestBody ConversationPinnedReqVO updateReqVO) {  
42 - conversationService.updatePinned(updateReqVO); 40 + public CommonResult<Boolean> updatePinned(@Valid @RequestBody ImConversationUpdatePinnedReqVO updateReqVO) {
  41 + conversationService.updatePinned(getLoginUserId(),updateReqVO);
43 return success(true); 42 return success(true);
44 } 43 }
45 44
46 - // TODO @hao:这个接口,需要单独的 VO 哈;  
47 @PostMapping("/update-last-read-time") 45 @PostMapping("/update-last-read-time")
48 @Operation(summary = "更新最后已读时间") 46 @Operation(summary = "更新最后已读时间")
49 - public CommonResult<Boolean> updateLastReadTime(@Valid @RequestBody ConversationLastTimeReqVO updateReqVO) {  
50 - conversationService.updateLastReadTime(updateReqVO); 47 + public CommonResult<Boolean> updateLastReadTime(@Valid @RequestBody ImConversationUpdateLastReadTimeReqVO updateReqVO) {
  48 + conversationService.updateLastReadTime(getLoginUserId(),updateReqVO);
51 return success(true); 49 return success(true);
52 } 50 }
53 51
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdateLastReadTimeReqVO.java
1 package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; 1 package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
2 2
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
3 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
4 -import jakarta.validation.constraints.NotEmpty;  
5 import jakarta.validation.constraints.NotNull; 6 import jakarta.validation.constraints.NotNull;
6 import lombok.Data; 7 import lombok.Data;
7 8
8 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
9 10
10 -// TODO @anhaohao:改成 ConversationUpdateLastReadTimeReqVO,项目目前都是动名词哈。更新置顶  
11 @Schema(description = "管理后台 - 会话最后已读时间 Request VO") 11 @Schema(description = "管理后台 - 会话最后已读时间 Request VO")
12 @Data 12 @Data
13 -public class ConversationLastTimeReqVO {  
14 -  
15 - // TODO @anhaohao:no 不用传递哈。因为 userId + targetId 可以推出来  
16 - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2")  
17 - @NotEmpty(message = "会话标志不能为空")  
18 - private String no; 13 +public class ImConversationUpdateLastReadTimeReqVO {
19 14
20 @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00") 15 @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00")
21 @NotNull(message = "最后已读时间不能为空") 16 @NotNull(message = "最后已读时间不能为空")
22 private LocalDateTime lastReadTime; 17 private LocalDateTime lastReadTime;
23 18
24 - // TODO @anhaohao:userId 不用传递,因为 token 已经能解析出当前用户  
25 - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
26 - private Long userId;  
27 -  
28 @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") 19 @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
29 private Long targetId; 20 private Long targetId;
30 21
31 - @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
32 - private Integer type; // 枚举 ConversationTypeEnum TODO ,这里可以使用 @InEnum 校验,这样这个注释就不用写了 22 + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
  24 + private Integer type;
33 25
34 } 26 }
35 \ No newline at end of file 27 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationUpdatePinnedReqVO.java
1 package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; 1 package cn.iocoder.yudao.module.im.controller.admin.conversation.vo;
2 2
3 -import com.alibaba.excel.annotation.ExcelProperty; 3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
5 -import jakarta.validation.constraints.NotEmpty;  
6 import jakarta.validation.constraints.NotNull; 6 import jakarta.validation.constraints.NotNull;
7 import lombok.Data; 7 import lombok.Data;
8 8
9 -import java.time.LocalDateTime;  
10 -  
11 -// TODO @anhaohao:改成 ConversationUpdatePinnedReqVO,项目目前都是动名词哈。更新置顶  
12 @Schema(description = "管理后台 - 会话置顶 Request VO") 9 @Schema(description = "管理后台 - 会话置顶 Request VO")
13 @Data 10 @Data
14 -public class ConversationPinnedReqVO {  
15 -  
16 - // TODO @anhaohao:no 不用传递哈。因为 userId + targetId 可以推出来  
17 - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2")  
18 - @NotEmpty(message = "会话标志不能为空")  
19 - private String no; 11 +public class ImConversationUpdatePinnedReqVO {
20 12
21 @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 13 @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
22 @NotNull(message = "是否置顶不能为空") 14 @NotNull(message = "是否置顶不能为空")
23 private Boolean pinned; 15 private Boolean pinned;
24 16
25 - // TODO @anhaohao:userId 不用传递,因为 token 已经能解析出当前用户  
26 - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
27 - private Long userId;  
28 -  
29 @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") 17 @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
30 private Long targetId; 18 private Long targetId;
31 19
32 - @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
33 - private Integer type; // 枚举 ConversationTypeEnum TODO ,这里可以使用 @InEnum 校验,这样这个注释就不用写了 20 + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + @InEnum(value = ImConversationTypeEnum.class, message = "会话类型必须是 {value}")
  22 + private Integer type;
34 23
35 } 24 }
36 \ No newline at end of file 25 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/group/ImGroupController.java
@@ -25,8 +25,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; @@ -25,8 +25,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
25 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; 25 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
26 26
27 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; 27 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
28 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO;  
29 -import cn.iocoder.yudao.module.im.service.group.ImGroupService; 28 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
  29 +import cn.iocoder.yudao.module.im.service.group.GroupService;
30 30
31 // TODO @芋艿:得看看 create、update、delete、get、page 这几个接口,要保留哪些 31 // TODO @芋艿:得看看 create、update、delete、get、page 这几个接口,要保留哪些
32 @Tag(name = "管理后台 - 群") 32 @Tag(name = "管理后台 - 群")
@@ -36,20 +36,20 @@ import cn.iocoder.yudao.module.im.service.group.ImGroupService; @@ -36,20 +36,20 @@ import cn.iocoder.yudao.module.im.service.group.ImGroupService;
36 public class ImGroupController { 36 public class ImGroupController {
37 37
38 @Resource 38 @Resource
39 - private ImGroupService imGroupService; 39 + private GroupService groupService;
40 40
41 @PostMapping("/create") 41 @PostMapping("/create")
42 @Operation(summary = "创建群") 42 @Operation(summary = "创建群")
43 @PreAuthorize("@ss.hasPermission('im:group:create')") 43 @PreAuthorize("@ss.hasPermission('im:group:create')")
44 public CommonResult<Long> createGroup(@Valid @RequestBody ImGroupSaveReqVO createReqVO) { 44 public CommonResult<Long> createGroup(@Valid @RequestBody ImGroupSaveReqVO createReqVO) {
45 - return success(imGroupService.createGroup(createReqVO)); 45 + return success(groupService.createGroup(createReqVO));
46 } 46 }
47 47
48 @PutMapping("/update") 48 @PutMapping("/update")
49 @Operation(summary = "更新群") 49 @Operation(summary = "更新群")
50 @PreAuthorize("@ss.hasPermission('im:group:update')") 50 @PreAuthorize("@ss.hasPermission('im:group:update')")
51 public CommonResult<Boolean> updateGroup(@Valid @RequestBody ImGroupSaveReqVO updateReqVO) { 51 public CommonResult<Boolean> updateGroup(@Valid @RequestBody ImGroupSaveReqVO updateReqVO) {
52 - imGroupService.updateGroup(updateReqVO); 52 + groupService.updateGroup(updateReqVO);
53 return success(true); 53 return success(true);
54 } 54 }
55 55
@@ -58,7 +58,7 @@ public class ImGroupController { @@ -58,7 +58,7 @@ public class ImGroupController {
58 @Parameter(name = "id", description = "编号", required = true) 58 @Parameter(name = "id", description = "编号", required = true)
59 @PreAuthorize("@ss.hasPermission('im:group:delete')") 59 @PreAuthorize("@ss.hasPermission('im:group:delete')")
60 public CommonResult<Boolean> deleteGroup(@RequestParam("id") Long id) { 60 public CommonResult<Boolean> deleteGroup(@RequestParam("id") Long id) {
61 - imGroupService.deleteGroup(id); 61 + groupService.deleteGroup(id);
62 return success(true); 62 return success(true);
63 } 63 }
64 64
@@ -67,7 +67,7 @@ public class ImGroupController { @@ -67,7 +67,7 @@ public class ImGroupController {
67 @Parameter(name = "id", description = "编号", required = true, example = "1024") 67 @Parameter(name = "id", description = "编号", required = true, example = "1024")
68 @PreAuthorize("@ss.hasPermission('im:group:query')") 68 @PreAuthorize("@ss.hasPermission('im:group:query')")
69 public CommonResult<ImGroupRespVO> getGroup(@RequestParam("id") Long id) { 69 public CommonResult<ImGroupRespVO> getGroup(@RequestParam("id") Long id) {
70 - GroupDO group = imGroupService.getGroup(id); 70 + ImGroupDO group = groupService.getGroup(id);
71 return success(BeanUtils.toBean(group, ImGroupRespVO.class)); 71 return success(BeanUtils.toBean(group, ImGroupRespVO.class));
72 } 72 }
73 73
@@ -75,22 +75,8 @@ public class ImGroupController { @@ -75,22 +75,8 @@ public class ImGroupController {
75 @Operation(summary = "获得群分页") 75 @Operation(summary = "获得群分页")
76 @PreAuthorize("@ss.hasPermission('im:group:query')") 76 @PreAuthorize("@ss.hasPermission('im:group:query')")
77 public CommonResult<PageResult<ImGroupRespVO>> getGroupPage(@Valid ImGroupPageReqVO pageReqVO) { 77 public CommonResult<PageResult<ImGroupRespVO>> getGroupPage(@Valid ImGroupPageReqVO pageReqVO) {
78 - PageResult<GroupDO> pageResult = imGroupService.getGroupPage(pageReqVO); 78 + PageResult<ImGroupDO> pageResult = groupService.getGroupPage(pageReqVO);
79 return success(BeanUtils.toBean(pageResult, ImGroupRespVO.class)); 79 return success(BeanUtils.toBean(pageResult, ImGroupRespVO.class));
80 } 80 }
81 81
82 - // TODO @anhaohao:导出可以先不做哈;  
83 - @GetMapping("/export-excel")  
84 - @Operation(summary = "导出群 Excel")  
85 - @PreAuthorize("@ss.hasPermission('im:group:export')")  
86 - @OperateLog(type = EXPORT)  
87 - public void exportGroupExcel(@Valid ImGroupPageReqVO pageReqVO,  
88 - HttpServletResponse response) throws IOException {  
89 - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);  
90 - List<GroupDO> list = imGroupService.getGroupPage(pageReqVO).getList();  
91 - // 导出 Excel  
92 - ExcelUtils.write(response, "群.xls", "数据", ImGroupRespVO.class,  
93 - BeanUtils.toBean(list, ImGroupRespVO.class));  
94 - }  
95 -  
96 } 82 }
97 \ No newline at end of file 83 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java
@@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; 9 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
10 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO; 10 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO;
11 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; 11 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO;
12 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; 12 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; 13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
14 import io.swagger.v3.oas.annotations.Operation; 14 import io.swagger.v3.oas.annotations.Operation;
15 import io.swagger.v3.oas.annotations.Parameter; 15 import io.swagger.v3.oas.annotations.Parameter;
@@ -66,7 +66,7 @@ public class ImGroupMemberController { @@ -66,7 +66,7 @@ public class ImGroupMemberController {
66 @Parameter(name = "id", description = "编号", required = true, example = "1024") 66 @Parameter(name = "id", description = "编号", required = true, example = "1024")
67 @PreAuthorize("@ss.hasPermission('im:group-member:query')") 67 @PreAuthorize("@ss.hasPermission('im:group-member:query')")
68 public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) { 68 public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) {
69 - GroupMemberDO groupMember = groupMemberService.getGroupMember(id); 69 + ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id);
70 return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class)); 70 return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class));
71 } 71 }
72 72
@@ -74,7 +74,7 @@ public class ImGroupMemberController { @@ -74,7 +74,7 @@ public class ImGroupMemberController {
74 @Operation(summary = "获得群成员分页") 74 @Operation(summary = "获得群成员分页")
75 @PreAuthorize("@ss.hasPermission('im:group-member:query')") 75 @PreAuthorize("@ss.hasPermission('im:group-member:query')")
76 public CommonResult<PageResult<ImGroupMemberRespVO>> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) { 76 public CommonResult<PageResult<ImGroupMemberRespVO>> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) {
77 - PageResult<GroupMemberDO> pageResult = groupMemberService.getGroupMemberPage(pageReqVO); 77 + PageResult<ImGroupMemberDO> pageResult = groupMemberService.getGroupMemberPage(pageReqVO);
78 return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class)); 78 return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class));
79 } 79 }
80 80
@@ -85,7 +85,7 @@ public class ImGroupMemberController { @@ -85,7 +85,7 @@ public class ImGroupMemberController {
85 public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO, 85 public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO,
86 HttpServletResponse response) throws IOException { 86 HttpServletResponse response) throws IOException {
87 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); 87 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
88 - List<GroupMemberDO> list = groupMemberService.getGroupMemberPage(pageReqVO).getList(); 88 + List<ImGroupMemberDO> list = groupMemberService.getGroupMemberPage(pageReqVO).getList();
89 // 导出 Excel 89 // 导出 Excel
90 ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class, 90 ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class,
91 BeanUtils.toBean(list, ImGroupMemberRespVO.class)); 91 BeanUtils.toBean(list, ImGroupMemberRespVO.class));
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveMessageReqVO.java deleted
1 -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -  
6 -import java.time.LocalDateTime;  
7 -  
8 -// TODO @anhaohao:im 前缀哈  
9 -@Schema(description = "管理后台 - 收件箱保存消息 Request VO")  
10 -@Data  
11 -public class InboxSaveMessageReqVO {  
12 -  
13 - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
14 - private Integer conversationType; // 对应 ImConversationTypeEnum 枚举  
15 -  
16 - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
17 - private Long fromId; // 根据 conversationType 区分  
18 -  
19 - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")  
20 - private String senderNickname;  
21 -  
22 - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED)  
23 - private String senderAvatar;  
24 -  
25 - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")  
26 - private Long receiverId;  
27 -  
28 - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")  
29 - private Long messageId;  
30 -  
31 - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
32 - private Integer contentType; // 参见 ImMessageTypeEnum 枚举  
33 -  
34 - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)  
35 - private String content;  
36 -  
37 - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)  
38 - private LocalDateTime sendTime;  
39 -  
40 -// @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)  
41 -// private Long sequence;  
42 -  
43 -}  
44 \ No newline at end of file 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/package-info.java 0 → 100644
  1 +/**
  2 + * @author anhaohao
  3 + * @since 2024/3/31 下午10:41
  4 + */
  5 +package cn.iocoder.yudao.module.im.controller.admin.inbox.vo;
0 \ No newline at end of file 6 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
@@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.im.controller.admin.message; @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.im.controller.admin.message;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;  
6 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageReqVO;  
7 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO;  
8 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO;  
9 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 5 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
  6 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO;
  7 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO;
  8 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendRespVO;
  9 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
10 import cn.iocoder.yudao.module.im.service.message.MessageService; 10 import cn.iocoder.yudao.module.im.service.message.MessageService;
11 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
12 import io.swagger.v3.oas.annotations.Parameter; 12 import io.swagger.v3.oas.annotations.Parameter;
@@ -25,35 +25,33 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @@ -25,35 +25,33 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
25 @RestController 25 @RestController
26 @RequestMapping("/im/message") 26 @RequestMapping("/im/message")
27 @Validated 27 @Validated
28 -public class MessageController { 28 +public class ImMessageController {
29 29
30 @Resource 30 @Resource
31 private MessageService messageService; 31 private MessageService messageService;
32 32
33 @PostMapping("/send") 33 @PostMapping("/send")
34 @Operation(summary = "发送消息") 34 @Operation(summary = "发送消息")
35 - public CommonResult<SendMessageRespVO> sendMessage(@Valid @RequestBody SendMessageReqVO message) {  
36 - return success(messageService.sendMessage(getLoginUserId(), message)); 35 + public CommonResult<ImMessageSendRespVO> sendMessage(@Valid @RequestBody ImMessageSendReqVO imMessageSendReqVO) {
  36 + ImMessageDO message = messageService.sendMessage(getLoginUserId(), imMessageSendReqVO);
  37 + return success(BeanUtils.toBean(message, ImMessageSendRespVO.class));
37 } 38 }
38 39
39 - // TODO @anhaohao:我在想,这个接口,改成叫 pullMessageList,会不会更好理解?拉取消息列表  
40 - @GetMapping("/list-by-sequence")  
41 - @Operation(summary = "拉取大于 sequence 的消息列表") 40 + @GetMapping("/pull")
  41 + @Operation(summary = "消息列表-拉取大于 sequence 的消息列表")
42 @Parameter(name = "sequence", description = "序号", required = true, example = "1") 42 @Parameter(name = "sequence", description = "序号", required = true, example = "1")
43 @Parameter(name = "size", description = "条数", required = true, example = "10") 43 @Parameter(name = "size", description = "条数", required = true, example = "10")
44 - public CommonResult<List<MessageReqVO>> getMessageListBySequence(@RequestParam("sequence") Long sequence,  
45 - @RequestParam("size") Integer size) {  
46 - List<MessageDO> messages = messageService.getMessageListBySequence(getLoginUserId(), sequence, size);  
47 - return success(BeanUtils.toBean(messages, MessageReqVO.class)); 44 + public CommonResult<List<ImMessageRespVO>> pullMessageList(@RequestParam("sequence") Long sequence,
  45 + @RequestParam("size") Integer size) {
  46 + List<ImMessageDO> messages = messageService.pullMessageList(getLoginUserId(), sequence, size);
  47 + return success(BeanUtils.toBean(messages, ImMessageRespVO.class));
48 } 48 }
49 49
50 - // TODO @anhaohao:直接叫 getMessageList,不叫历史哈;因为它只是给用户叫历史,对系统来说,就是消息列表  
51 - @GetMapping("/history")  
52 - @Operation(summary = "查询聊天记录-根据会话标志和发送时间进行分页查询")  
53 - public CommonResult<List<MessageReqVO>> getHistoryMessage(@Valid MessagePageReqVO pageReqVO) {  
54 - //根据会话标志和发送时间进行分页查询  
55 - List<MessageDO> messagePage = messageService.getHistoryMessage(pageReqVO);  
56 - return success(BeanUtils.toBean(messagePage, MessageReqVO.class)); 50 + @GetMapping("/list")
  51 + @Operation(summary = "消息列表-根据接收人和发送时间进行分页查询")
  52 + public CommonResult<List<ImMessageRespVO>> getMessageList(@Valid ImMessageListReqVO listReqVO) {
  53 + List<ImMessageDO> messagePage = messageService.getMessageList(getLoginUserId(), listReqVO);
  54 + return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class));
57 } 55 }
58 56
59 } 57 }
60 \ No newline at end of file 58 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageListReqVO.java 0 → 100755
  1 +package cn.iocoder.yudao.module.im.controller.admin.message.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import lombok.Data;
  8 +import lombok.ToString;
  9 +import org.springframework.format.annotation.DateTimeFormat;
  10 +
  11 +import java.time.LocalDateTime;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
  14 +
  15 +@Schema(description = "管理后台 - 消息列表 Request VO")
  16 +@Data
  17 +@ToString(callSuper = true)
  18 +public class ImMessageListReqVO {
  19 +
  20 + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
  21 + @NotNull(message = "接收人编号不能为空")
  22 + private Long receiverId;
  23 +
  24 + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  25 + @InEnum(value = ImConversationTypeEnum.class,message = "会话类型必须是 {value}")
  26 + @NotNull(message = "会话类型不能为空")
  27 + private Integer conversationType;
  28 +
  29 + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
  31 + private LocalDateTime sendTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSendMessageReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageRespVO.java 100644 → 100755
1 -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo; 1 +package cn.iocoder.yudao.module.im.controller.admin.message.vo;
2 2
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
  5 +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
3 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 7 import lombok.Data;
5 8
6 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
7 10
8 -@Schema(description = "管理后台 - 收件箱保存消息 Request VO") 11 +@Schema(description = "管理后台 - 消息 Response VO")
9 @Data 12 @Data
10 -public class InboxSendMessageReqVO { 13 +public class ImMessageRespVO {
  14 +
  15 + @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
  16 + private Long id;
11 17
12 @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 18 @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
13 - private Integer conversationType; // 对应 ImConversationTypeEnum 枚举 19 + @InEnum(value = ImConversationTypeEnum.class)
  20 + private Integer conversationType;
14 21
15 - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
16 - private Long fromId; // 根据 conversationType 区分 22 + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + private Long senderId;
17 24
18 @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") 25 @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
19 private String senderNickname; 26 private String senderNickname;
20 27
21 - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) 28 + @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://www.iocoder.cn/xxx.jpg")
22 private String senderAvatar; 29 private String senderAvatar;
23 -  
24 - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")  
25 - private Long receiverId;  
26 30
27 - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")  
28 - private Long messageId; 31 + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  32 + private Long receiverId;
29 33
30 @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 34 @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
31 - private Integer contentType; // 参见 ImMessageTypeEnum 枚举 35 + @InEnum(value = ImMessageContentTypeEnum.class)
  36 + private Integer contentType;
32 37
33 - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) 38 + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好")
34 private String content; 39 private String content;
35 40
36 - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) 41 + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27 12:00:00")
37 private LocalDateTime sendTime; 42 private LocalDateTime sendTime;
38 43
39 - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) 44 + @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
40 private Long sequence; 45 private Long sequence;
41 46
42 } 47 }
43 \ No newline at end of file 48 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageReqVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendReqVO.java
1 package cn.iocoder.yudao.module.im.controller.admin.message.vo; 1 package cn.iocoder.yudao.module.im.controller.admin.message.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;  
5 -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;  
6 -import com.alibaba.excel.annotation.ExcelProperty; 4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
  5 +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
7 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
  7 +import jakarta.validation.constraints.NotNull;
8 import lombok.Data; 8 import lombok.Data;
9 9
10 -// TODO @anhaohao:MessageSendReqVO,消息发送  
11 -  
12 -// TODO @anhaohao:不应该有 excel 相关的注解  
13 -  
14 @Schema(description = "管理后台 - 发送消息 Request VO") 10 @Schema(description = "管理后台 - 发送消息 Request VO")
15 @Data 11 @Data
16 -@ExcelIgnoreUnannotated  
17 -public class SendMessageReqVO { 12 +public class ImMessageSendReqVO {
18 13
19 @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") 14 @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
20 - @ExcelProperty("客户端消息编号 uuid,用于排重") 15 + @NotNull(message = "客户端消息编号不能为空")
21 private String clientMessageId; 16 private String clientMessageId;
22 17
23 @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") 18 @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
24 - @ExcelProperty("接收人编号") 19 + @NotNull(message = "接收人编号不能为空")
25 private Long receiverId; 20 private Long receiverId;
26 21
27 @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") 22 @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
28 - @ExcelProperty("会话类型") 23 + @InEnum(value = ImConversationTypeEnum.class)
  24 + @NotNull(message = "会话类型不能为空")
29 private Integer conversationType; 25 private Integer conversationType;
30 26
31 @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 27 @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
32 - @ExcelProperty("消息类型")  
33 - @InEnum(MessageContentTypeEnum.class) 28 + @InEnum(ImMessageContentTypeEnum.class)
  29 + @NotNull(message = "消息类型不能为空")
34 private Integer contentType; 30 private Integer contentType;
35 31
36 - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)  
37 - @ExcelProperty("消息内容") 32 + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好")
  33 + @NotNull(message = "消息内容不能为空")
38 private String content; 34 private String content;
39 35
40 } 36 }
41 \ No newline at end of file 37 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/SendMessageRespVO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSendRespVO.java
@@ -10,13 +10,11 @@ import java.time.LocalDateTime; @@ -10,13 +10,11 @@ import java.time.LocalDateTime;
10 10
11 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 11 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
12 12
13 -// TODO @anhaohao:MessageSendRespVO,消息发送结果  
14 -  
15 @Schema(description = "管理后台 - 发送消息 Response VO") 13 @Schema(description = "管理后台 - 发送消息 Response VO")
16 @Data 14 @Data
17 @AllArgsConstructor 15 @AllArgsConstructor
18 @NoArgsConstructor 16 @NoArgsConstructor
19 -public class SendMessageRespVO { 17 +public class ImMessageSendRespVO {
20 18
21 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12") 19 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
22 private Long id; 20 private Long id;
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessagePageReqVO.java deleted
1 -package cn.iocoder.yudao.module.im.controller.admin.message.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -import lombok.ToString;  
6 -import org.springframework.format.annotation.DateTimeFormat;  
7 -  
8 -import java.time.LocalDateTime;  
9 -  
10 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;  
11 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
12 -  
13 -// TODO @anhaohao:这个类,不要交 Page,而是消息列表,MessageListReqVO  
14 -@Schema(description = "管理后台 - 消息分页 Request VO")  
15 -@Data  
16 -@ToString(callSuper = true)  
17 -public class MessagePageReqVO {  
18 -  
19 - // TODO @anhaohao:还是传递 targetId 和 conversationType,我们要弱化 no 的概念;  
20 -  
21 - @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "g_1000")  
22 - private String conversationNo;  
23 -  
24 - // TODO @anhaohao:应该不传递时间范围,而是传递分页的时间,然后根据时间,查询消息  
25 -  
26 - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-27")  
27 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
28 - private LocalDateTime[] sendTime;  
29 -  
30 -}  
31 \ No newline at end of file 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java deleted
1 -package cn.iocoder.yudao.module.im.controller.admin.message.vo;  
2 -  
3 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
4 -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;  
5 -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;  
6 -import com.alibaba.excel.annotation.ExcelProperty;  
7 -import io.swagger.v3.oas.annotations.media.Schema;  
8 -import lombok.Data;  
9 -import org.springframework.format.annotation.DateTimeFormat;  
10 -  
11 -import java.time.LocalDateTime;  
12 -  
13 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
14 -  
15 -// TODO @anhaohao:MessageRespVO 消息响应 Response VO  
16 -// TODO @anahaohao:每个 example 都写下;啊哈,漏了地方,要补下;因为 http mock 的时候,可以根据它去生成  
17 -@Schema(description = "管理后台 - 消息 Request VO")  
18 -@Data  
19 -public class MessageReqVO {  
20 -  
21 - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")  
22 - private Long id;  
23 -  
24 - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
25 - private Integer conversationType; // 对应 ImConversationTypeEnum 枚举  
26 -  
27 - // TODO @anhaohao:这个应该是 senderId  
28 - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
29 - private Long fromId; // 根据 conversationType 区分  
30 -  
31 - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")  
32 - private String senderNickname;  
33 -  
34 - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED)  
35 - private String senderAvatar;  
36 -  
37 - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")  
38 - private Long receiverId;  
39 -  
40 - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
41 - private Integer contentType; // 参见 ImMessageTypeEnum 枚举  
42 -  
43 - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)  
44 - private String content;  
45 -  
46 - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)  
47 - private LocalDateTime sendTime;  
48 -  
49 - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)  
50 - private Long sequence;  
51 -  
52 -}  
53 \ No newline at end of file 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ConversationDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/conversation/ImConversationDO.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.conversation; 1 package cn.iocoder.yudao.module.im.dal.dataobject.conversation;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; 4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
5 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
@@ -9,7 +9,6 @@ import lombok.*; @@ -9,7 +9,6 @@ import lombok.*;
9 9
10 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
11 11
12 -// TODO @anhaohao:还是有 IM 前缀哈  
13 /** 12 /**
14 * IM 会话 DO 13 * IM 会话 DO
15 * 14 *
@@ -23,7 +22,7 @@ import java.time.LocalDateTime; @@ -23,7 +22,7 @@ import java.time.LocalDateTime;
23 @Builder 22 @Builder
24 @NoArgsConstructor 23 @NoArgsConstructor
25 @AllArgsConstructor 24 @AllArgsConstructor
26 -public class ConversationDO extends BaseDO { 25 +public class ImConversationDO extends BaseDO {
27 26
28 /** 27 /**
29 * 编号 28 * 编号
@@ -39,7 +38,7 @@ public class ConversationDO extends BaseDO { @@ -39,7 +38,7 @@ public class ConversationDO extends BaseDO {
39 /** 38 /**
40 * 会话类型 39 * 会话类型
41 * <p> 40 * <p>
42 - * 枚举 {@link ConversationTypeEnum} 41 + * 枚举 {@link ImConversationTypeEnum}
43 */ 42 */
44 private Integer type; 43 private Integer type;
45 /** 44 /**
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupDO.java
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId; @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
8 8
9 -// TODO @anhaohao:还是要有 IM  
10 /** 9 /**
11 * IM 群信息 DO 10 * IM 群信息 DO
12 * 11 *
@@ -20,7 +19,7 @@ import lombok.*; @@ -20,7 +19,7 @@ import lombok.*;
20 @Builder 19 @Builder
21 @NoArgsConstructor 20 @NoArgsConstructor
22 @AllArgsConstructor 21 @AllArgsConstructor
23 -public class GroupDO extends BaseDO { 22 +public class ImGroupDO extends BaseDO {
24 23
25 /** 24 /**
26 * 编号 25 * 编号
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/GroupMemberDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/group/ImGroupMemberDO.java
@@ -4,7 +4,6 @@ import lombok.*; @@ -4,7 +4,6 @@ import lombok.*;
4 import com.baomidou.mybatisplus.annotation.*; 4 import com.baomidou.mybatisplus.annotation.*;
5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 6
7 -// TODO @anhaohao:还是要有 IM  
8 /** 7 /**
9 * IM 群成员 DO 8 * IM 群成员 DO
10 * 9 *
@@ -18,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -18,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
18 @Builder 17 @Builder
19 @NoArgsConstructor 18 @NoArgsConstructor
20 @AllArgsConstructor 19 @AllArgsConstructor
21 -public class GroupMemberDO extends BaseDO { 20 +public class ImGroupMemberDO extends BaseDO {
22 21
23 /** 22 /**
24 * 编号 23 * 编号
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/InboxDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/inbox/ImInboxDO.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.inbox; 1 package cn.iocoder.yudao.module.im.dal.dataobject.inbox;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 4 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
5 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.*; 8 import lombok.*;
9 9
10 -// TODO @anhaohao:还是要有 IM  
11 // TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列; 10 // TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列;
  11 +
12 /** 12 /**
13 * IM 收件箱 DO 13 * IM 收件箱 DO
14 * 14 *
@@ -22,7 +22,7 @@ import lombok.*; @@ -22,7 +22,7 @@ import lombok.*;
22 @Builder 22 @Builder
23 @NoArgsConstructor 23 @NoArgsConstructor
24 @AllArgsConstructor 24 @AllArgsConstructor
25 -public class InboxDO extends BaseDO { 25 +public class ImInboxDO extends BaseDO {
26 26
27 /** 27 /**
28 * 编号 28 * 编号
@@ -31,14 +31,14 @@ public class InboxDO extends BaseDO { @@ -31,14 +31,14 @@ public class InboxDO extends BaseDO {
31 private Long id; 31 private Long id;
32 /** 32 /**
33 * 用户编号 33 * 用户编号
34 - *  
35 - * TODO @hao:写下 userId 和 messageId 的关联字段 34 + * <p>
  35 + * 关联 {@link ImMessageDO#getSenderId()} 或者 {@link ImMessageDO#getReceiverId()}
36 */ 36 */
37 private Long userId; 37 private Long userId;
38 /** 38 /**
39 * 消息编号 39 * 消息编号
40 - *  
41 - * 关联 {@link MessageDO#getId()} 40 + * <p>
  41 + * 关联 {@link ImMessageDO#getId()}
42 */ 42 */
43 private Long messageId; 43 private Long messageId;
44 /** 44 /**
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/MessageDO.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/ImMessageDO.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;  
5 -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;  
6 -import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum;  
7 -import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum; 4 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
  5 +import cn.iocoder.yudao.module.im.enums.message.ImMessageContentTypeEnum;
  6 +import cn.iocoder.yudao.module.im.enums.message.ImMessageSourceEnum;
  7 +import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum;
8 import com.baomidou.mybatisplus.annotation.KeySequence; 8 import com.baomidou.mybatisplus.annotation.KeySequence;
9 import com.baomidou.mybatisplus.annotation.TableId; 9 import com.baomidou.mybatisplus.annotation.TableId;
10 import com.baomidou.mybatisplus.annotation.TableName; 10 import com.baomidou.mybatisplus.annotation.TableName;
@@ -12,7 +12,6 @@ import lombok.*; @@ -12,7 +12,6 @@ import lombok.*;
12 12
13 import java.time.LocalDateTime; 13 import java.time.LocalDateTime;
14 14
15 -// TODO @anhaohao:还是要有 IM  
16 /** 15 /**
17 * IM 消息 DO 16 * IM 消息 DO
18 * 17 *
@@ -26,7 +25,7 @@ import java.time.LocalDateTime; @@ -26,7 +25,7 @@ import java.time.LocalDateTime;
26 @Builder 25 @Builder
27 @NoArgsConstructor 26 @NoArgsConstructor
28 @AllArgsConstructor 27 @AllArgsConstructor
29 -public class MessageDO extends BaseDO { 28 +public class ImMessageDO extends BaseDO {
30 29
31 /** 30 /**
32 * 编号 31 * 编号
@@ -60,24 +59,24 @@ public class MessageDO extends BaseDO { @@ -60,24 +59,24 @@ public class MessageDO extends BaseDO {
60 */ 59 */
61 private String senderAvatar; 60 private String senderAvatar;
62 /** 61 /**
63 - * 会话类型 枚举 {@link ConversationTypeEnum} 62 + * 会话类型 枚举 {@link ImConversationTypeEnum}
64 */ 63 */
65 private Integer conversationType; 64 private Integer conversationType;
66 /** 65 /**
67 * 会话标志 66 * 会话标志
68 - *  
69 - * 生成规则:{@link ConversationTypeEnum#generateConversationNo(Long, Long, Integer)} 方法 67 + * <p>
  68 + * 生成规则:{@link ImConversationTypeEnum#generateConversationNo(Long, Long, Integer)} 方法
70 */ 69 */
71 private String conversationNo; 70 private String conversationNo;
72 /** 71 /**
73 * 消息类型 72 * 消息类型
74 - *  
75 - * 枚举 {@link MessageContentTypeEnum} 73 + * <p>
  74 + * 枚举 {@link ImMessageContentTypeEnum}
76 */ 75 */
77 private Integer contentType; 76 private Integer contentType;
78 /** 77 /**
79 * 消息内容 78 * 消息内容
80 - * 79 + * <p>
81 * JSON 格式 对应 dal/dataobject/message/content 包 80 * JSON 格式 对应 dal/dataobject/message/content 包
82 */ 81 */
83 private String content; 82 private String content;
@@ -87,14 +86,14 @@ public class MessageDO extends BaseDO { @@ -87,14 +86,14 @@ public class MessageDO extends BaseDO {
87 private LocalDateTime sendTime; 86 private LocalDateTime sendTime;
88 /** 87 /**
89 * 消息来源 88 * 消息来源
90 - *  
91 - * 枚举 {@link MessageSourceEnum} 89 + * <p>
  90 + * 枚举 {@link ImMessageSourceEnum}
92 */ 91 */
93 private Integer sendFrom; 92 private Integer sendFrom;
94 /** 93 /**
95 * 消息状态 94 * 消息状态
96 - *  
97 - * 枚举 {@link MessageStatusEnum} 95 + * <p>
  96 + * 枚举 {@link ImMessageStatusEnum}
98 */ 97 */
99 private Integer messageStatus; 98 private Integer messageStatus;
100 99
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/AudioMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
@@ -8,7 +8,7 @@ import lombok.NoArgsConstructor; @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor;
8 // TODO @anhaohao:要有 IM; 8 // TODO @anhaohao:要有 IM;
9 // TODO @芋艿:后续要挪到 api 包下,主要是给外部接口使用 9 // TODO @芋艿:后续要挪到 api 包下,主要是给外部接口使用
10 /** 10 /**
11 - * 语音消息的 {@link MessageDO 字段 content} 的内容 11 + * 语音消息的 {@link ImMessageDO 字段 content} 的内容
12 * 12 *
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/CardMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 7
8 /** 8 /**
9 - * 名片消息的 {@link MessageDO 字段 content} 的内容 9 + * 名片消息的 {@link ImMessageDO 字段 content} 的内容
10 * 10 *
11 * @author anhaohao 11 * @author anhaohao
12 * @since 2024/3/23 下午5:53 12 * @since 2024/3/23 下午5:53
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/FileMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 7
8 /** 8 /**
9 - * 文件消息的 {@link MessageDO 字段 content} 的内容 9 + * 文件消息的 {@link ImMessageDO 字段 content} 的内容
10 * 10 *
11 * @author 芋道源码 11 * @author 芋道源码
12 */ 12 */
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/ImageMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 7
8 /** 8 /**
9 - * 图片消息的 {@link MessageDO 字段 content} 的内容 9 + * 图片消息的 {@link ImMessageDO 字段 content} 的内容
10 * 10 *
11 * @author 芋道源码 11 * @author 芋道源码
12 */ 12 */
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/LocationMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 7
8 /** 8 /**
9 - * 地址位置消息的 {@link MessageDO 字段 content} 的内容 9 + * 地址位置消息的 {@link ImMessageDO 字段 content} 的内容
10 * 10 *
11 * @author 芋道源码 11 * @author 芋道源码
12 */ 12 */
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/TextMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 7
8 /** 8 /**
9 - * 文本消息的 {@link MessageDO 字段 content} 的内容 9 + * 文本消息的 {@link ImMessageDO 字段 content} 的内容
10 * 10 *
11 * @author 芋道源码 11 * @author 芋道源码
12 */ 12 */
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/message/content/VideoMessage.java
1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content; 1 package cn.iocoder.yudao.module.im.dal.dataobject.message.content;
2 2
3 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 /** 6 /**
7 - * 视频消息的 {@link MessageDO 字段 content} 的内容 7 + * 视频消息的 {@link ImMessageDO 字段 content} 的内容
8 * 8 *
9 * @author 芋道源码 9 * @author 芋道源码
10 */ 10 */
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java
1 package cn.iocoder.yudao.module.im.dal.mysql.conversation; 1 package cn.iocoder.yudao.module.im.dal.mysql.conversation;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
5 -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; 4 +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
6 import org.apache.ibatis.annotations.Mapper; 5 import org.apache.ibatis.annotations.Mapper;
7 6
8 /** 7 /**
@@ -11,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper; @@ -11,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper;
11 * @author 芋道源码 10 * @author 芋道源码
12 */ 11 */
13 @Mapper 12 @Mapper
14 -public interface ConversationMapper extends BaseMapperX<ConversationDO> { 13 +public interface ConversationMapper extends BaseMapperX<ImConversationDO> {
15 14
16 - default ConversationDO selectByNo(String no){  
17 - return selectOne(ConversationDO::getNo, no); 15 + default ImConversationDO selectByNo(String no){
  16 + return selectOne(ImConversationDO::getNo, no);
18 } 17 }
19 } 18 }
20 \ No newline at end of file 19 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/ImGroupMapper.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/group/GroupMapper.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.group; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.group;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; 6 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
7 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
8 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; 8 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
9 9
@@ -13,18 +13,18 @@ import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; @@ -13,18 +13,18 @@ import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Mapper 15 @Mapper
16 -public interface ImGroupMapper extends BaseMapperX<GroupDO> { 16 +public interface GroupMapper extends BaseMapperX<ImGroupDO> {
17 17
18 - default PageResult<GroupDO> selectPage(ImGroupPageReqVO reqVO) {  
19 - return selectPage(reqVO, new LambdaQueryWrapperX<GroupDO>()  
20 - .likeIfPresent(GroupDO::getGroupName, reqVO.getGroupName())  
21 - .eqIfPresent(GroupDO::getOwnerId, reqVO.getOwnerId())  
22 - .eqIfPresent(GroupDO::getHeadImage, reqVO.getHeadImage())  
23 - .eqIfPresent(GroupDO::getHeadImageThumb, reqVO.getHeadImageThumb())  
24 - .eqIfPresent(GroupDO::getNotice, reqVO.getNotice())  
25 - .eqIfPresent(GroupDO::getRemark, reqVO.getRemark())  
26 - .betweenIfPresent(GroupDO::getCreateTime, reqVO.getCreateTime())  
27 - .orderByDesc(GroupDO::getId)); 18 + default PageResult<ImGroupDO> selectPage(ImGroupPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<ImGroupDO>()
  20 + .likeIfPresent(ImGroupDO::getGroupName, reqVO.getGroupName())
  21 + .eqIfPresent(ImGroupDO::getOwnerId, reqVO.getOwnerId())
  22 + .eqIfPresent(ImGroupDO::getHeadImage, reqVO.getHeadImage())
  23 + .eqIfPresent(ImGroupDO::getHeadImageThumb, reqVO.getHeadImageThumb())
  24 + .eqIfPresent(ImGroupDO::getNotice, reqVO.getNotice())
  25 + .eqIfPresent(ImGroupDO::getRemark, reqVO.getRemark())
  26 + .betweenIfPresent(ImGroupDO::getCreateTime, reqVO.getCreateTime())
  27 + .orderByDesc(ImGroupDO::getId));
28 } 28 }
29 29
30 } 30 }
31 \ No newline at end of file 31 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/ImGroupMemberMapper.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/groupmember/GroupMemberMapper.java
@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; 6 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
7 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; 7 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 import java.util.List; 10 import java.util.List;
@@ -15,21 +15,21 @@ import java.util.List; @@ -15,21 +15,21 @@ import java.util.List;
15 * @author 芋道源码 15 * @author 芋道源码
16 */ 16 */
17 @Mapper 17 @Mapper
18 -public interface ImGroupMemberMapper extends BaseMapperX<GroupMemberDO> { 18 +public interface GroupMemberMapper extends BaseMapperX<ImGroupMemberDO> {
19 19
20 - default PageResult<GroupMemberDO> selectPage(ImGroupMemberPageReqVO reqVO) {  
21 - return selectPage(reqVO, new LambdaQueryWrapperX<GroupMemberDO>()  
22 - .eqIfPresent(GroupMemberDO::getGroupId, reqVO.getGroupId())  
23 - .eqIfPresent(GroupMemberDO::getUserId, reqVO.getUserId())  
24 - .likeIfPresent(GroupMemberDO::getNickname, reqVO.getNickname())  
25 - .eqIfPresent(GroupMemberDO::getAvatar, reqVO.getAvatar())  
26 - .likeIfPresent(GroupMemberDO::getAliasName, reqVO.getAliasName())  
27 - .eqIfPresent(GroupMemberDO::getRemark, reqVO.getRemark())  
28 - .betweenIfPresent(GroupMemberDO::getCreateTime, reqVO.getCreateTime())  
29 - .orderByDesc(GroupMemberDO::getId)); 20 + default PageResult<ImGroupMemberDO> selectPage(ImGroupMemberPageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<ImGroupMemberDO>()
  22 + .eqIfPresent(ImGroupMemberDO::getGroupId, reqVO.getGroupId())
  23 + .eqIfPresent(ImGroupMemberDO::getUserId, reqVO.getUserId())
  24 + .likeIfPresent(ImGroupMemberDO::getNickname, reqVO.getNickname())
  25 + .eqIfPresent(ImGroupMemberDO::getAvatar, reqVO.getAvatar())
  26 + .likeIfPresent(ImGroupMemberDO::getAliasName, reqVO.getAliasName())
  27 + .eqIfPresent(ImGroupMemberDO::getRemark, reqVO.getRemark())
  28 + .betweenIfPresent(ImGroupMemberDO::getCreateTime, reqVO.getCreateTime())
  29 + .orderByDesc(ImGroupMemberDO::getId));
30 } 30 }
31 31
32 - default List<GroupMemberDO> selectListByGroupId(Long groupId) {  
33 - return selectList(new LambdaQueryWrapperX<GroupMemberDO>().eq(GroupMemberDO::getGroupId, groupId)); 32 + default List<ImGroupMemberDO> selectListByGroupId(Long groupId) {
  33 + return selectList(new LambdaQueryWrapperX<ImGroupMemberDO>().eq(ImGroupMemberDO::getGroupId, groupId));
34 } 34 }
35 } 35 }
36 \ No newline at end of file 36 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.inbox; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.inbox;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; 5 +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
7 7
8 import java.util.List; 8 import java.util.List;
@@ -13,27 +13,14 @@ import java.util.List; @@ -13,27 +13,14 @@ import java.util.List;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Mapper 15 @Mapper
16 -public interface InboxMapper extends BaseMapperX<InboxDO> { 16 +public interface InboxMapper extends BaseMapperX<ImInboxDO> {
17 17
18 - // TODO @anhaohao:返回 List<InboxDO> ,转换成 messageId 交给上层;dao 尽量通用  
19 - default List<Long> selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) {  
20 - return selectList(new LambdaQueryWrapperX<InboxDO>()  
21 - .gt(InboxDO::getUserId, userId)  
22 - .gt(InboxDO::getSequence, sequence)  
23 - .orderByAsc(InboxDO::getSequence)  
24 - .last("limit 0," + size)) // TODO @anhaohao:这里 limit 就可以了,不用从 limit 0 开始;  
25 - .stream()  
26 - .map(InboxDO::getMessageId)  
27 - .toList(); 18 + default List<ImInboxDO> selectListByUserIdAndSequence(Long userId, Long sequence, Integer size) {
  19 + return selectList(new LambdaQueryWrapperX<ImInboxDO>()
  20 + .gt(ImInboxDO::getUserId, userId)
  21 + .gt(ImInboxDO::getSequence, sequence)
  22 + .orderByAsc(ImInboxDO::getSequence)
  23 + .last("LIMIT " + size));
28 } 24 }
29 25
30 -// default PageResult<InboxDO> selectPage(ImInboxPageReqVO reqVO) {  
31 -// return selectPage(reqVO, new LambdaQueryWrapperX<InboxDO>()  
32 -// .eqIfPresent(InboxDO::getUserId, reqVO.getUserId())  
33 -// .eqIfPresent(InboxDO::getMessageId, reqVO.getMessageId())  
34 -// .eqIfPresent(InboxDO::getSequence, reqVO.getSequence())  
35 -// .betweenIfPresent(InboxDO::getCreateTime, reqVO.getCreateTime())  
36 -// .orderByDesc(InboxDO::getId));  
37 -// }  
38 -  
39 } 26 }
40 \ No newline at end of file 27 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java
@@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.message; @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.message;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;  
6 -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO;  
7 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;  
8 -import com.github.yulichang.wrapper.MPJLambdaWrapper; 5 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
9 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
10 7
11 import java.util.List; 8 import java.util.List;
@@ -16,13 +13,12 @@ import java.util.List; @@ -16,13 +13,12 @@ import java.util.List;
16 * @author 芋道源码 13 * @author 芋道源码
17 */ 14 */
18 @Mapper 15 @Mapper
19 -public interface MessageMapper extends BaseMapperX<MessageDO> { 16 +public interface MessageMapper extends BaseMapperX<ImMessageDO> {
20 17
21 - default List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO) {  
22 - return selectList(new LambdaQueryWrapperX<MessageDO>()  
23 - .eqIfPresent(MessageDO::getConversationNo, pageReqVO.getConversationNo())  
24 - .betweenIfPresent(MessageDO::getSendTime, pageReqVO.getSendTime())  
25 - .orderByAsc(MessageDO::getSendTime)); 18 + default List<ImMessageDO> selectMessageList(ImMessageDO message) {
  19 + return selectList(new LambdaQueryWrapperX<ImMessageDO>()
  20 + .eqIfPresent(ImMessageDO::getConversationNo, message.getConversationNo())
  21 + .eqIfPresent(ImMessageDO::getSendTime, message.getSendTime())
  22 + .orderByAsc(ImMessageDO::getSendTime));
26 } 23 }
27 -  
28 } 24 }
29 \ No newline at end of file 25 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDao.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceRedisDAO.java
1 package cn.iocoder.yudao.module.im.dal.redis.inbox; 1 package cn.iocoder.yudao.module.im.dal.redis.inbox;
2 2
3 import jakarta.annotation.Resource; 3 import jakarta.annotation.Resource;
4 -import org.redisson.api.RedissonClient;  
5 import org.springframework.data.redis.core.RedisTemplate; 4 import org.springframework.data.redis.core.RedisTemplate;
6 import org.springframework.stereotype.Repository; 5 import org.springframework.stereotype.Repository;
7 6
@@ -15,7 +14,7 @@ import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUE @@ -15,7 +14,7 @@ import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUE
15 * @author anhaohao 14 * @author anhaohao
16 */ 15 */
17 @Repository 16 @Repository
18 -public class SequenceRedisDao { 17 +public class SequenceRedisDAO {
19 18
20 @Resource 19 @Resource
21 private RedisTemplate<String, Long> redisTemplate; 20 private RedisTemplate<String, Long> redisTemplate;
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java
1 package cn.iocoder.yudao.module.im.service.conversation; 1 package cn.iocoder.yudao.module.im.service.conversation;
2 2
3 -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO;  
4 -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO;  
5 -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; 3 +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
  4 +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
  5 +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
6 6
7 import java.util.List; 7 import java.util.List;
8 8
@@ -18,20 +18,22 @@ public interface ConversationService { @@ -18,20 +18,22 @@ public interface ConversationService {
18 * 18 *
19 * @return 会话列表 19 * @return 会话列表
20 */ 20 */
21 - List<ConversationDO> getConversationList(); 21 + List<ImConversationDO> getConversationList();
22 22
23 /** 23 /**
24 * 置顶会话 24 * 置顶会话
25 * 25 *
  26 + * @param loginUserId 登录用户编号
26 * @param updateReqVO 更新信息 27 * @param updateReqVO 更新信息
27 */ 28 */
28 - void updatePinned(ConversationPinnedReqVO updateReqVO); 29 + void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO);
29 30
30 /** 31 /**
31 * 更新最后已读时间 32 * 更新最后已读时间
32 * 33 *
  34 + * @param loginUserId 登录用户编号
33 * @param updateReqVO 更新信息 35 * @param updateReqVO 更新信息
34 */ 36 */
35 - void updateLastReadTime(ConversationLastTimeReqVO updateReqVO); 37 + void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO);
36 38
37 } 39 }
38 \ No newline at end of file 40 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java
1 package cn.iocoder.yudao.module.im.service.conversation; 1 package cn.iocoder.yudao.module.im.service.conversation;
2 2
3 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
4 -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO;  
5 -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO;  
6 -import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; 3 +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdateLastReadTimeReqVO;
  4 +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationUpdatePinnedReqVO;
  5 +import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ImConversationDO;
7 import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; 6 import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper;
  7 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
8 import cn.iocoder.yudao.module.im.service.inbox.InboxService; 8 import cn.iocoder.yudao.module.im.service.inbox.InboxService;
9 import jakarta.annotation.Resource; 9 import jakarta.annotation.Resource;
10 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
@@ -27,50 +27,50 @@ public class ConversationServiceImpl implements ConversationService { @@ -27,50 +27,50 @@ public class ConversationServiceImpl implements ConversationService {
27 private InboxService inboxService; 27 private InboxService inboxService;
28 28
29 @Override 29 @Override
30 - public List<ConversationDO> getConversationList() { 30 + public List<ImConversationDO> getConversationList() {
31 return conversationMapper.selectList(); 31 return conversationMapper.selectList();
32 } 32 }
33 33
34 @Override 34 @Override
35 - public void updatePinned(ConversationPinnedReqVO updateReqVO) {  
36 - // TODO @hao:updateTop 和 updateLastReadTime 使用独立的逻辑实现,不使用统一的 ImConversationSaveReqVO;  
37 - // TODO 大体步骤建议:  
38 - // 1. 先 getOrderCreateConversation,查询会话,不存在则插入;  
39 - // 2. 更新对应的字段  
40 - // 3. 做对应更新的 notify 推送  
41 - ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo()); 35 + public void updatePinned(Long loginUserId, ImConversationUpdatePinnedReqVO updateReqVO) {
  36 + // 1. 获得会话编号
  37 + String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
  38 + // 2. 查询会话
  39 + ImConversationDO conversation = conversationMapper.selectByNo(no);
42 if (conversation == null) { 40 if (conversation == null) {
43 - ConversationDO conversationDO = new ConversationDO();  
44 - // TODO @hao:no 不是前端传递哈,后端生成;另外,其实可以把 insert 写成一个公用方法;get会话,拿不到就 insert;接着处理 update 操作;首次多 update 一次,无所谓的;没多少量的  
45 - conversationDO.setNo(updateReqVO.getNo());  
46 - conversationDO.setPinned(updateReqVO.getPinned());  
47 - conversationDO.setUserId(updateReqVO.getUserId());  
48 - conversationDO.setTargetId(updateReqVO.getTargetId());  
49 - conversationDO.setType(updateReqVO.getType());  
50 - conversationMapper.insert(conversationDO);  
51 - } else {  
52 - // 更新 TODO @anhaohao:这里不要 toBean,因为这里逻辑偏 toc,new ConversationDO 对象,然后逐个 set 需要的值;  
53 - ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class);  
54 - conversationMapper.updateById(updateObj); 41 + // 2.1. 不存在,则插入
  42 + conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
55 } 43 }
  44 + // 3. 更新会话
  45 + conversation.setPinned(updateReqVO.getPinned());
  46 + conversationMapper.updateById(conversation);
  47 + // 4. 做对应更新的 notify 推送
  48 + }
  49 +
  50 + private ImConversationDO insertConversation(String no, Long userId, Long targetId, Integer type) {
  51 + ImConversationDO imConversationDO = new ImConversationDO();
  52 + imConversationDO.setNo(no);
  53 + imConversationDO.setUserId(userId);
  54 + imConversationDO.setTargetId(targetId);
  55 + imConversationDO.setType(type);
  56 + conversationMapper.insert(imConversationDO);
  57 + return imConversationDO;
56 } 58 }
57 59
58 @Override 60 @Override
59 - public void updateLastReadTime(ConversationLastTimeReqVO updateReqVO) {  
60 - ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo()); 61 + public void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO) {
  62 + // 1. 获得会话编号
  63 + String no = ImConversationTypeEnum.generateConversationNo(loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
  64 + // 2. 查询会话
  65 + ImConversationDO conversation = conversationMapper.selectByNo(no);
61 if (conversation == null) { 66 if (conversation == null) {
62 - ConversationDO conversationDO = new ConversationDO();  
63 - conversationDO.setNo(updateReqVO.getNo());  
64 - conversationDO.setLastReadTime(updateReqVO.getLastReadTime());  
65 - conversationDO.setUserId(updateReqVO.getUserId());  
66 - conversationDO.setTargetId(updateReqVO.getTargetId());  
67 - conversationDO.setType(updateReqVO.getType());  
68 - conversationMapper.insert(conversationDO);  
69 - } else {  
70 - // 更新  
71 - ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class);  
72 - conversationMapper.updateById(updateObj); 67 + // 2.1. 不存在,则插入
  68 + conversation = insertConversation(no, loginUserId, updateReqVO.getTargetId(), updateReqVO.getType());
73 } 69 }
  70 + // 3. 更新会话
  71 + conversation.setLastReadTime(updateReqVO.getLastReadTime());
  72 + conversationMapper.updateById(conversation);
  73 + // 4. 做对应更新的 notify 推送
74 } 74 }
75 75
76 } 76 }
77 \ No newline at end of file 77 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupService.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupService.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.service.group; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.im.service.group;
2 2
3 import jakarta.validation.*; 3 import jakarta.validation.*;
4 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; 4 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
5 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; 5 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 7
8 /** 8 /**
@@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -10,7 +10,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 * 10 *
11 * @author 芋道源码 11 * @author 芋道源码
12 */ 12 */
13 -public interface ImGroupService { 13 +public interface GroupService {
14 14
15 /** 15 /**
16 * 创建群 16 * 创建群
@@ -40,7 +40,7 @@ public interface ImGroupService { @@ -40,7 +40,7 @@ public interface ImGroupService {
40 * @param id 编号 40 * @param id 编号
41 * @return 群 41 * @return 群
42 */ 42 */
43 - GroupDO getGroup(Long id); 43 + ImGroupDO getGroup(Long id);
44 44
45 /** 45 /**
46 * 获得群分页 46 * 获得群分页
@@ -48,6 +48,6 @@ public interface ImGroupService { @@ -48,6 +48,6 @@ public interface ImGroupService {
48 * @param pageReqVO 分页查询 48 * @param pageReqVO 分页查询
49 * @return 群分页 49 * @return 群分页
50 */ 50 */
51 - PageResult<GroupDO> getGroupPage(ImGroupPageReqVO pageReqVO); 51 + PageResult<ImGroupDO> getGroupPage(ImGroupPageReqVO pageReqVO);
52 52
53 } 53 }
54 \ No newline at end of file 54 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/ImGroupServiceImpl.java renamed to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/group/GroupServiceImpl.java
@@ -5,11 +5,11 @@ import jakarta.annotation.Resource; @@ -5,11 +5,11 @@ import jakarta.annotation.Resource;
5 import org.springframework.validation.annotation.Validated; 5 import org.springframework.validation.annotation.Validated;
6 6
7 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*; 7 import cn.iocoder.yudao.module.im.controller.admin.group.vo.*;
8 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupDO; 8 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 10 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
11 11
12 -import cn.iocoder.yudao.module.im.dal.mysql.group.ImGroupMapper; 12 +import cn.iocoder.yudao.module.im.dal.mysql.group.GroupMapper;
13 13
14 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 14 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
15 import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; 15 import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
@@ -21,16 +21,16 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; @@ -21,16 +21,16 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
21 */ 21 */
22 @Service 22 @Service
23 @Validated 23 @Validated
24 -public class ImGroupServiceImpl implements ImGroupService { 24 +public class GroupServiceImpl implements GroupService {
25 25
26 @Resource 26 @Resource
27 - private ImGroupMapper imGroupMapper; 27 + private GroupMapper groupMapper;
28 28
29 @Override 29 @Override
30 public Long createGroup(ImGroupSaveReqVO createReqVO) { 30 public Long createGroup(ImGroupSaveReqVO createReqVO) {
31 // 插入 31 // 插入
32 - GroupDO group = BeanUtils.toBean(createReqVO, GroupDO.class);  
33 - imGroupMapper.insert(group); 32 + ImGroupDO group = BeanUtils.toBean(createReqVO, ImGroupDO.class);
  33 + groupMapper.insert(group);
34 // 返回 34 // 返回
35 return group.getId(); 35 return group.getId();
36 } 36 }
@@ -40,8 +40,8 @@ public class ImGroupServiceImpl implements ImGroupService { @@ -40,8 +40,8 @@ public class ImGroupServiceImpl implements ImGroupService {
40 // 校验存在 40 // 校验存在
41 validateGroupExists(updateReqVO.getId()); 41 validateGroupExists(updateReqVO.getId());
42 // 更新 42 // 更新
43 - GroupDO updateObj = BeanUtils.toBean(updateReqVO, GroupDO.class);  
44 - imGroupMapper.updateById(updateObj); 43 + ImGroupDO updateObj = BeanUtils.toBean(updateReqVO, ImGroupDO.class);
  44 + groupMapper.updateById(updateObj);
45 } 45 }
46 46
47 @Override 47 @Override
@@ -49,23 +49,23 @@ public class ImGroupServiceImpl implements ImGroupService { @@ -49,23 +49,23 @@ public class ImGroupServiceImpl implements ImGroupService {
49 // 校验存在 49 // 校验存在
50 validateGroupExists(id); 50 validateGroupExists(id);
51 // 删除 51 // 删除
52 - imGroupMapper.deleteById(id); 52 + groupMapper.deleteById(id);
53 } 53 }
54 54
55 private void validateGroupExists(Long id) { 55 private void validateGroupExists(Long id) {
56 - if (imGroupMapper.selectById(id) == null) { 56 + if (groupMapper.selectById(id) == null) {
57 throw exception(GROUP_NOT_EXISTS); 57 throw exception(GROUP_NOT_EXISTS);
58 } 58 }
59 } 59 }
60 60
61 @Override 61 @Override
62 - public GroupDO getGroup(Long id) {  
63 - return imGroupMapper.selectById(id); 62 + public ImGroupDO getGroup(Long id) {
  63 + return groupMapper.selectById(id);
64 } 64 }
65 65
66 @Override 66 @Override
67 - public PageResult<GroupDO> getGroupPage(ImGroupPageReqVO pageReqVO) {  
68 - return imGroupMapper.selectPage(pageReqVO); 67 + public PageResult<ImGroupDO> getGroupPage(ImGroupPageReqVO pageReqVO) {
  68 + return groupMapper.selectPage(pageReqVO);
69 } 69 }
70 70
71 } 71 }
72 \ No newline at end of file 72 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.groupmember; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.service.groupmember;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO; 4 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
5 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; 5 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO;
6 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; 6 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
7 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
8 8
9 import java.util.List; 9 import java.util.List;
@@ -43,7 +43,7 @@ public interface GroupMemberService { @@ -43,7 +43,7 @@ public interface GroupMemberService {
43 * @param id 编号 43 * @param id 编号
44 * @return 群成员 44 * @return 群成员
45 */ 45 */
46 - GroupMemberDO getGroupMember(Long id); 46 + ImGroupMemberDO getGroupMember(Long id);
47 47
48 /** 48 /**
49 * 获得群成员分页 49 * 获得群成员分页
@@ -51,7 +51,7 @@ public interface GroupMemberService { @@ -51,7 +51,7 @@ public interface GroupMemberService {
51 * @param pageReqVO 分页查询 51 * @param pageReqVO 分页查询
52 * @return 群成员分页 52 * @return 群成员分页
53 */ 53 */
54 - PageResult<GroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO); 54 + PageResult<ImGroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO);
55 55
56 /** 56 /**
57 * 根据群组id查询群成员 57 * 根据群组id查询群成员
@@ -59,5 +59,5 @@ public interface GroupMemberService { @@ -59,5 +59,5 @@ public interface GroupMemberService {
59 * @param groupId 群组id 59 * @param groupId 群组id
60 * @return 群成员列表 60 * @return 群成员列表
61 */ 61 */
62 - List<GroupMemberDO> selectByGroupId(Long groupId); 62 + List<ImGroupMemberDO> selectByGroupId(Long groupId);
63 } 63 }
64 \ No newline at end of file 64 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java
@@ -5,11 +5,11 @@ import jakarta.annotation.Resource; @@ -5,11 +5,11 @@ import jakarta.annotation.Resource;
5 import org.springframework.validation.annotation.Validated; 5 import org.springframework.validation.annotation.Validated;
6 6
7 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.*; 7 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.*;
8 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; 8 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 10 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
11 11
12 -import cn.iocoder.yudao.module.im.dal.mysql.groupmember.ImGroupMemberMapper; 12 +import cn.iocoder.yudao.module.im.dal.mysql.groupmember.GroupMemberMapper;
13 13
14 import java.util.List; 14 import java.util.List;
15 15
@@ -26,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; @@ -26,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
26 public class GroupMemberServiceImpl implements GroupMemberService { 26 public class GroupMemberServiceImpl implements GroupMemberService {
27 27
28 @Resource 28 @Resource
29 - private ImGroupMemberMapper imGroupMemberMapper; 29 + private GroupMemberMapper groupMemberMapper;
30 30
31 @Override 31 @Override
32 public Long createGroupMember(ImGroupMemberSaveReqVO createReqVO) { 32 public Long createGroupMember(ImGroupMemberSaveReqVO createReqVO) {
33 // 插入 33 // 插入
34 - GroupMemberDO groupMember = BeanUtils.toBean(createReqVO, GroupMemberDO.class);  
35 - imGroupMemberMapper.insert(groupMember); 34 + ImGroupMemberDO groupMember = BeanUtils.toBean(createReqVO, ImGroupMemberDO.class);
  35 + groupMemberMapper.insert(groupMember);
36 // 返回 36 // 返回
37 return groupMember.getId(); 37 return groupMember.getId();
38 } 38 }
@@ -42,8 +42,8 @@ public class GroupMemberServiceImpl implements GroupMemberService { @@ -42,8 +42,8 @@ public class GroupMemberServiceImpl implements GroupMemberService {
42 // 校验存在 42 // 校验存在
43 validateGroupMemberExists(updateReqVO.getId()); 43 validateGroupMemberExists(updateReqVO.getId());
44 // 更新 44 // 更新
45 - GroupMemberDO updateObj = BeanUtils.toBean(updateReqVO, GroupMemberDO.class);  
46 - imGroupMemberMapper.updateById(updateObj); 45 + ImGroupMemberDO updateObj = BeanUtils.toBean(updateReqVO, ImGroupMemberDO.class);
  46 + groupMemberMapper.updateById(updateObj);
47 } 47 }
48 48
49 @Override 49 @Override
@@ -51,28 +51,28 @@ public class GroupMemberServiceImpl implements GroupMemberService { @@ -51,28 +51,28 @@ public class GroupMemberServiceImpl implements GroupMemberService {
51 // 校验存在 51 // 校验存在
52 validateGroupMemberExists(id); 52 validateGroupMemberExists(id);
53 // 删除 53 // 删除
54 - imGroupMemberMapper.deleteById(id); 54 + groupMemberMapper.deleteById(id);
55 } 55 }
56 56
57 private void validateGroupMemberExists(Long id) { 57 private void validateGroupMemberExists(Long id) {
58 - if (imGroupMemberMapper.selectById(id) == null) { 58 + if (groupMemberMapper.selectById(id) == null) {
59 throw exception(GROUP_MEMBER_NOT_EXISTS); 59 throw exception(GROUP_MEMBER_NOT_EXISTS);
60 } 60 }
61 } 61 }
62 62
63 @Override 63 @Override
64 - public GroupMemberDO getGroupMember(Long id) {  
65 - return imGroupMemberMapper.selectById(id); 64 + public ImGroupMemberDO getGroupMember(Long id) {
  65 + return groupMemberMapper.selectById(id);
66 } 66 }
67 67
68 @Override 68 @Override
69 - public PageResult<GroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO) {  
70 - return imGroupMemberMapper.selectPage(pageReqVO); 69 + public PageResult<ImGroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO) {
  70 + return groupMemberMapper.selectPage(pageReqVO);
71 } 71 }
72 72
73 @Override 73 @Override
74 - public List<GroupMemberDO> selectByGroupId(Long groupId) {  
75 - return imGroupMemberMapper.selectListByGroupId(groupId); 74 + public List<ImGroupMemberDO> selectByGroupId(Long groupId) {
  75 + return groupMemberMapper.selectListByGroupId(groupId);
76 } 76 }
77 77
78 } 78 }
79 \ No newline at end of file 79 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
1 package cn.iocoder.yudao.module.im.service.inbox; 1 package cn.iocoder.yudao.module.im.service.inbox;
2 2
3 -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; 3 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
4 4
5 import java.util.List; 5 import java.util.List;
6 6
@@ -14,9 +14,9 @@ public interface InboxService { @@ -14,9 +14,9 @@ public interface InboxService {
14 /** 14 /**
15 * 保存收件箱和发送消息 15 * 保存收件箱和发送消息
16 * 16 *
17 - * @param inboxSaveMessageReqVO 收件箱保存消息 Request VO 17 + * @param imMessageDO 收件箱保存消息 Request VO
18 */ 18 */
19 - void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessageReqVO); 19 + void saveInboxAndSendMessage(ImMessageDO imMessageDO);
20 20
21 /** 21 /**
22 * 获得大于 sequence 的消息ids 22 * 获得大于 sequence 的消息ids
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
@@ -2,18 +2,19 @@ package cn.iocoder.yudao.module.im.service.inbox; @@ -2,18 +2,19 @@ package cn.iocoder.yudao.module.im.service.inbox;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO;  
6 -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSendMessageReqVO;  
7 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;  
8 -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; 5 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageRespVO;
  6 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
  7 +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
  8 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
9 import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper; 9 import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper;
10 import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO; 10 import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO;
11 -import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao;  
12 -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; 11 +import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDAO;
  12 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; 13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
14 import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; 14 import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
15 import jakarta.annotation.Resource; 15 import jakarta.annotation.Resource;
16 import org.dromara.hutool.core.date.DateUnit; 16 import org.dromara.hutool.core.date.DateUnit;
  17 +import org.springframework.scheduling.annotation.Async;
17 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
18 import org.springframework.validation.annotation.Validated; 19 import org.springframework.validation.annotation.Validated;
19 20
@@ -33,50 +34,60 @@ public class InboxServiceImpl implements InboxService { @@ -33,50 +34,60 @@ public class InboxServiceImpl implements InboxService {
33 34
34 @Resource 35 @Resource
35 private InboxMapper inboxMapper; 36 private InboxMapper inboxMapper;
  37 +
36 @Resource 38 @Resource
37 - private SequenceRedisDao sequenceRedisDao; // 序列生成器Redis DAO 39 + private SequenceRedisDAO sequenceRedisDAO;
38 @Resource 40 @Resource
39 - private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO 41 + private InboxLockRedisDAO inboxLockRedisDAO;
  42 +
40 @Resource 43 @Resource
41 private WebSocketSenderApi webSocketSenderApi; 44 private WebSocketSenderApi webSocketSenderApi;
42 @Resource 45 @Resource
43 private GroupMemberService groupMemberService; 46 private GroupMemberService groupMemberService;
44 47
45 - // TODO @anhaohao:下面的逻辑,最好是,1. 保存收件箱 + 发送消息给用户; 2. xxx;这样看的人,会更有感觉哈;  
46 @Override 48 @Override
47 - public void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessage) {  
48 - // 保存收件箱 + 发送消息给用户  
49 - saveInboxAndSendMessageForUser(inboxSaveMessage.getFromId(), inboxSaveMessage);  
50 -  
51 - if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) {  
52 - saveInboxAndSendMessageForUser(inboxSaveMessage.getReceiverId(), inboxSaveMessage);  
53 - } else if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) {  
54 - List<GroupMemberDO> groupMembers = groupMemberService.selectByGroupId(inboxSaveMessage.getReceiverId());  
55 - groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), inboxSaveMessage)); 49 + public void saveInboxAndSendMessage(ImMessageDO message) {
  50 + // 1. 保存收件箱 + 发送消息给发送人
  51 + saveInboxAndSendMessageForUser(message.getSenderId(), message);
  52 + // 2. 保存收件箱 + 发送消息给接收人
  53 + if (message.getConversationType().equals(ImConversationTypeEnum.SINGLE.getType())) {
  54 + // 2.1 如果是单聊,直接发送给接收人
  55 + saveInboxAndSendMessageForUser(message.getReceiverId(), message);
  56 + } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) {
  57 + // 2.2 如果是群聊,发送给群聊的所有人
  58 + List<ImGroupMemberDO> groupMembers = groupMemberService.selectByGroupId(message.getReceiverId());
  59 + groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), message));
56 } 60 }
57 } 61 }
58 62
59 @Override 63 @Override
60 public List<Long> selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) { 64 public List<Long> selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) {
61 - return inboxMapper.selectMessageIdsByUserIdAndSequence(userId, sequence, size); 65 + List<ImInboxDO> imInboxDOS = inboxMapper.selectListByUserIdAndSequence(userId, sequence, size);
  66 + return imInboxDOS.stream().map(ImInboxDO::getMessageId).toList();
62 } 67 }
63 68
64 - private void saveInboxAndSendMessageForUser(Long userId, InboxSaveMessageReqVO inboxSaveMessage) { 69 +
  70 + //TODO 多线程处理
  71 + public void saveInboxAndSendMessageForUser(Long userId, ImMessageDO message) {
65 inboxLockRedisDAO.lock(userId, INBOX_LOCK_TIMEOUT, () -> { 72 inboxLockRedisDAO.lock(userId, INBOX_LOCK_TIMEOUT, () -> {
66 - Long userSequence = sequenceRedisDao.generateSequence(userId);  
67 - // TODO @anhaohao:链式调用;  
68 - InboxDO inbox = new InboxDO();  
69 - inbox.setUserId(userId);  
70 - inbox.setMessageId(inboxSaveMessage.getMessageId());  
71 - inbox.setSequence(userSequence); 73 + // 1. 生成序列号
  74 + Long userSequence = sequenceRedisDAO.generateSequence(userId);
  75 + // 2. 保存收件箱
  76 + ImInboxDO inbox = new ImInboxDO()
  77 + .setUserId(userId)
  78 + .setMessageId(message.getId())
  79 + .setSequence(userSequence);
72 inboxMapper.insert(inbox); 80 inboxMapper.insert(inbox);
73 -  
74 - // TODO @anhaohao:是不是 send 不用在加锁里面哈?!  
75 - // TODO @anhaohao:再进一步,是不是用 spring @async 可以并发推送噢  
76 - InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class);  
77 - message.setSequence(userSequence);  
78 - webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message); 81 + // 3. 发送消息
  82 + sendAsyncMessage(userId, message, userSequence);
79 }); 83 });
80 } 84 }
81 85
  86 + @Async
  87 + public void sendAsyncMessage(Long userId, ImMessageDO message, Long userSequence) {
  88 + ImMessageRespVO messageRespVO = BeanUtils.toBean(message, ImMessageRespVO.class);
  89 + messageRespVO.setSequence(userSequence);
  90 + webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, messageRespVO);
  91 + }
  92 +
82 } 93 }
83 \ No newline at end of file 94 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java
1 package cn.iocoder.yudao.module.im.service.message; 1 package cn.iocoder.yudao.module.im.service.message;
2 2
3 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;  
4 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO;  
5 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO;  
6 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
  4 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO;
  5 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
7 6
8 import java.util.List; 7 import java.util.List;
9 8
@@ -17,26 +16,28 @@ public interface MessageService { @@ -17,26 +16,28 @@ public interface MessageService {
17 /** 16 /**
18 * 获得历史消息 17 * 获得历史消息
19 * 18 *
20 - * @param pageReqVO 分页查询 19 + * @param loginUserId 登录用户编号
  20 + * @param listReqVO 分页查询
21 * @return 消息分页 21 * @return 消息分页
22 */ 22 */
23 - List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO); 23 + List<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO);
24 24
25 /** 25 /**
26 * 拉取消息-大于 seq 的消息 26 * 拉取消息-大于 seq 的消息
27 * 27 *
28 - * @param userId 用户id  
29 - * @param sequence 序列号  
30 - * @param size 数量 28 + * @param loginUserId 登录用户编号
  29 + * @param sequence 序列号
  30 + * @param size 数量
31 * @return 消息列表 31 * @return 消息列表
32 */ 32 */
33 - List<MessageDO> getMessageListBySequence(Long userId, Long sequence, Integer size); 33 + List<ImMessageDO> pullMessageList(Long loginUserId, Long sequence, Integer size);
34 34
35 /** 35 /**
36 * 发送消息 36 * 发送消息
  37 + *
37 * @param loginUserId 登录用户编号 38 * @param loginUserId 登录用户编号
38 - * @param message 消息 39 + * @param message 消息
39 * @return 消息编号 40 * @return 消息编号
40 */ 41 */
41 - SendMessageRespVO sendMessage(Long loginUserId, SendMessageReqVO message); 42 + ImMessageDO sendMessage(Long loginUserId, ImMessageSendReqVO message);
42 } 43 }
43 \ No newline at end of file 44 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java
1 package cn.iocoder.yudao.module.im.service.message; 1 package cn.iocoder.yudao.module.im.service.message;
2 2
3 -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO;  
4 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO;  
5 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO;  
6 -import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO;  
7 -import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO;  
8 -import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; 3 +import cn.hutool.core.bean.BeanUtil;
  4 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageListReqVO;
  5 +import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSendReqVO;
  6 +import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupMemberDO;
  7 +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
9 import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper; 8 import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper;
10 -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;  
11 -import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum;  
12 -import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum; 9 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
  10 +import cn.iocoder.yudao.module.im.enums.message.ImMessageSourceEnum;
  11 +import cn.iocoder.yudao.module.im.enums.message.ImMessageStatusEnum;
13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; 12 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
14 import cn.iocoder.yudao.module.im.service.inbox.InboxService; 13 import cn.iocoder.yudao.module.im.service.inbox.InboxService;
15 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 14 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -38,92 +37,66 @@ public class MessageServiceImpl implements MessageService { @@ -38,92 +37,66 @@ public class MessageServiceImpl implements MessageService {
38 @Resource 37 @Resource
39 private MessageMapper messageMapper; 38 private MessageMapper messageMapper;
40 @Resource 39 @Resource
41 - private InboxService inboxService;  
42 - @Resource  
43 private AdminUserApi adminUserApi; 40 private AdminUserApi adminUserApi;
44 @Resource 41 @Resource
  42 + private InboxService inboxService;
  43 + @Resource
45 private GroupMemberService groupMemberService; 44 private GroupMemberService groupMemberService;
46 45
47 @Override 46 @Override
48 - public List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO) {  
49 - return messageMapper.getHistoryMessage(pageReqVO); 47 + public List<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO) {
  48 + // 1. 获得会话编号
  49 + String no = ImConversationTypeEnum.generateConversationNo(loginUserId, listReqVO.getReceiverId(), listReqVO.getConversationType());
  50 + // 2. 查询历史消息
  51 + ImMessageDO message = new ImMessageDO()
  52 + .setSendTime(listReqVO.getSendTime())
  53 + .setConversationNo(no);
  54 + return messageMapper.selectMessageList(message);
50 } 55 }
51 56
52 @Override 57 @Override
53 - public List<MessageDO> getMessageListBySequence(Long userId, Long sequence, Integer size) { 58 + public List<ImMessageDO> pullMessageList(Long userId, Long sequence, Integer size) {
54 List<Long> messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size); 59 List<Long> messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size);
55 return messageMapper.selectBatchIds(messageIds); 60 return messageMapper.selectBatchIds(messageIds);
56 } 61 }
57 62
58 @Override 63 @Override
59 - public SendMessageRespVO sendMessage(Long fromUserId, SendMessageReqVO message) {  
60 - // 保存消息  
61 - // TODO @anhaohao:InboxSaveMessageReqVO 不用 new 出来传递到 saveMessage 方法里;  
62 - InboxSaveMessageReqVO inboxSaveMessageReqVO = new InboxSaveMessageReqVO();  
63 - SendMessageRespVO sendMessageRespVO = saveMessage(fromUserId, message, inboxSaveMessageReqVO);  
64 -  
65 - // 保存收件箱 + 发送消息给用户  
66 - // TODO @anhaohao:考虑到少定义一些 VO,直接传递 MessageDO 就完事了;反正这两者也是强耦合的;  
67 - inboxService.saveInboxAndSendMessage(inboxSaveMessageReqVO);  
68 - return sendMessageRespVO; 64 + public ImMessageDO sendMessage(Long fromUserId, ImMessageSendReqVO imMessageSendReqVO) {
  65 + // 1. 保存消息
  66 + ImMessageDO message = saveMessage(fromUserId, imMessageSendReqVO);
  67 + // 2. 保存到收件箱,并发送消息
  68 + inboxService.saveInboxAndSendMessage(message);
  69 + return message;
69 } 70 }
70 71
71 - // TODO @anhaohao:这个方法,是不是定义成 private 哈;然后返回是 MessageDO 对象,设置最上面的 sendMessage 也是这个。最终 controller 转成 SendMessageRespVO  
72 - public SendMessageRespVO saveMessage(Long fromUserId, SendMessageReqVO message, InboxSaveMessageReqVO inboxSaveMessageReqVO) {  
73 - // 需要校验 receiverId 存在 72 + private ImMessageDO saveMessage(Long fromUserId, ImMessageSendReqVO message) {
  73 + // 1. 校验接收人是否存在
74 validateReceiverIdExists(message); 74 validateReceiverIdExists(message);
75 - // 查询发送人昵称和发送人头像 75 + // 2. 查询发送人信息
76 AdminUserRespDTO fromUser = adminUserApi.getUser(fromUserId); 76 AdminUserRespDTO fromUser = adminUserApi.getUser(fromUserId);
77 - // 使用链式调用创建 MessageDO 对象  
78 - // TODO @anhaohao:一部分字段,可以 beanutils tobean 搞定;  
79 - // TODO @anhaohao:链式 set 的时候,要把相同的放在一行;例如说,setSenderNickname、setSenderAvatar;本质上,就是为了“同类”在一行,阅读起来简单;  
80 - MessageDO messageDO = new MessageDO()  
81 - .setClientMessageId(message.getClientMessageId()) 77 + // 3. 保存消息
  78 + ImMessageDO imMessageDO = BeanUtil.copyProperties(message, ImMessageDO.class)
  79 + .setSenderNickname(fromUser.getNickname()).setSenderAvatar(fromUser.getAvatar())
82 .setSenderId(fromUserId) 80 .setSenderId(fromUserId)
83 - .setReceiverId(message.getReceiverId())  
84 - .setSenderNickname(fromUser.getNickname())  
85 - .setSenderAvatar(fromUser.getAvatar())  
86 - .setConversationType(message.getConversationType())  
87 - .setContentType(message.getContentType())  
88 - .setConversationNo(ConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType()))  
89 - .setContent(message.getContent())  
90 - .setSendFrom(MessageSourceEnum.USER_SEND.getStatus())  
91 - .setSendTime(TimeUtil.now())  
92 - .setMessageStatus(MessageStatusEnum.SENDING.getStatus());  
93 - messageMapper.insert(messageDO);  
94 -  
95 - // 设置 InboxSaveMessageReqVO 对象  
96 - inboxSaveMessageReqVO.setConversationType(message.getConversationType())  
97 - .setFromId(fromUserId)  
98 - .setReceiverId(message.getReceiverId())  
99 - .setMessageId(messageDO.getId())  
100 - .setContentType(message.getContentType())  
101 - .setContent(message.getContent())  
102 - .setSendTime(messageDO.getSendTime())  
103 - .setSenderNickname(fromUser.getNickname())  
104 - .setSenderAvatar(fromUser.getAvatar());  
105 -  
106 - // 返回 SendMessageRespVO 对象  
107 - return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime()); 81 + .setConversationNo(ImConversationTypeEnum.generateConversationNo(fromUserId, message.getReceiverId(), message.getConversationType()))
  82 + .setSendFrom(ImMessageSourceEnum.USER_SEND.getSource())
  83 + .setMessageStatus(ImMessageStatusEnum.SENDING.getStatus())
  84 + .setSendTime(TimeUtil.now());
  85 + messageMapper.insert(imMessageDO);
  86 + return imMessageDO;
108 } 87 }
109 88
110 - // TODO @anhaohao:validateReceiver,更简单一点哈;不仅仅校验存在,未来还可以校验,自己是不是有好友关系、群聊是否在群聊里面等等  
111 - private void validateReceiverIdExists(SendMessageReqVO message) {  
112 - // TODO @anhaohao:这个不要这里校验,交给 validator 校验掉  
113 - if (message.getReceiverId() == null) {  
114 - throw exception(MESSAGE_RECEIVER_NOT_EXISTS);  
115 - }  
116 - if (message.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) {  
117 - // TODO @anhaohao:// 之后要空一个空格,中英文协作习惯,中文和英文之间,不能连着;最后也不用 ;哈  
118 - //校验用户是否存在; 89 + private void validateReceiverIdExists(ImMessageSendReqVO message) {
  90 + if (message.getConversationType().equals(ImConversationTypeEnum.SINGLE.getType())) {
  91 + // 校验用户是否存在
119 AdminUserRespDTO receiverUser = adminUserApi.getUser(message.getReceiverId()); 92 AdminUserRespDTO receiverUser = adminUserApi.getUser(message.getReceiverId());
120 if (receiverUser == null) { 93 if (receiverUser == null) {
121 throw exception(MESSAGE_RECEIVER_NOT_EXISTS); 94 throw exception(MESSAGE_RECEIVER_NOT_EXISTS);
122 } 95 }
123 - } else if (message.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) {  
124 - //校验群聊是否存在;  
125 - List<GroupMemberDO> groupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId());  
126 - if (groupMemberDOS.isEmpty()) { 96 + } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) {
  97 + // 校验群聊是否存在
  98 + List<ImGroupMemberDO> imGroupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId());
  99 + if (imGroupMemberDOS.isEmpty()) {
127 throw exception(MESSAGE_RECEIVER_NOT_EXISTS); 100 throw exception(MESSAGE_RECEIVER_NOT_EXISTS);
128 } 101 }
129 } 102 }
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java deleted
1 -package cn.iocoder.yudao.module.im.websocket;  
2 -  
3 -import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener;  
4 -import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;  
5 -import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;  
6 -import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;  
7 -import jakarta.annotation.Resource;  
8 -import lombok.extern.slf4j.Slf4j;  
9 -import org.springframework.stereotype.Component;  
10 -import org.springframework.web.socket.WebSocketSession;  
11 -  
12 -// TODO @hao:消息发送,使用 http 上行。因为在 cloud 框架下,我们比较难去 Listener。因为 im-server 不会自己启动 websocket 路径  
13 -  
14 -/**  
15 - * WebSocket im  
16 - *  
17 - * @author 芋道源码  
18 - */  
19 -@Component  
20 -@Slf4j  
21 -public class ImWebSocketMessageListener implements WebSocketMessageListener<ImSendMessage> {  
22 -  
23 - public static final String IM_MESSAGE_RECEIVE = "im-message-receive";  
24 - @Resource  
25 - private WebSocketSenderApi webSocketSenderApi; // WebSocket消息发送器  
26 -  
27 - /**  
28 - * 处理WebSocket消息  
29 - *  
30 - * @param session WebSocket会话  
31 - * @param message 发送的IM消息  
32 - */  
33 - @Override  
34 - public void onMessage(WebSocketSession session, ImSendMessage message) {  
35 - Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); // 获取登录用户ID  
36 - log.info(message.toString());  
37 - }  
38 -  
39 - /**  
40 - * 获取类型  
41 - *  
42 - * @return 类型  
43 - */  
44 - @Override  
45 - public String getType() {  
46 - return "im-message-send";  
47 - }  
48 -  
49 -}  
50 \ No newline at end of file 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImReceiveMessage.java deleted
1 -package cn.iocoder.yudao.module.im.websocket.message;  
2 -  
3 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
4 -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;  
5 -import io.swagger.v3.oas.annotations.media.Schema;  
6 -import lombok.Data;  
7 -  
8 -import java.time.LocalDateTime;  
9 -  
10 -@Schema(description = "管理后台 - 消息发送 receive")  
11 -@Data  
12 -public class ImReceiveMessage {  
13 -  
14 - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
15 - @InEnum(ConversationTypeEnum.class)  
16 - private Integer conversationType;  
17 -  
18 - // TODO @anhaohao:我们应该是 senderId;因为它和 receiverId 是相对应的哈。  
19 - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
20 - private Long fromId; // 根据 conversationType 区分  
21 -  
22 - // TODO @hao:昵称和头像,也直接发给接收人好了;  
23 -  
24 - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")  
25 - private Long messageId;  
26 -  
27 - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
28 - private Integer contentType; // 参见 ImMessageTypeEnum 枚举  
29 -  
30 - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)  
31 - private String content;  
32 -  
33 - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)  
34 - private LocalDateTime sendTime;  
35 -  
36 - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)  
37 - private Long sequence;  
38 -  
39 -}  
40 \ No newline at end of file 0 \ No newline at end of file
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/message/ImSendMessage.java deleted
1 -package cn.iocoder.yudao.module.im.websocket.message;  
2 -  
3 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
4 -import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;  
5 -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;  
6 -import io.swagger.v3.oas.annotations.media.Schema;  
7 -import lombok.Data;  
8 -  
9 -@Schema(description = "管理后台 - IM 消息发送 send")  
10 -@Data  
11 -public class ImSendMessage {  
12 -  
13 - @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")  
14 - private String clientMessageId;  
15 -  
16 - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
17 - @InEnum(ConversationTypeEnum.class)  
18 - private Integer conversationType;  
19 -  
20 - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
21 - private Long receiverId; // 根据 conversationType 区分  
22 -  
23 - @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
24 - @InEnum(MessageContentTypeEnum.class)  
25 - private Integer contentType;  
26 -  
27 - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)  
28 - private String content;  
29 -  
30 -}  
31 \ No newline at end of file 0 \ No newline at end of file