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 6  
7 7 import java.util.Arrays;
8 8  
9   -// TODO @anhaohao:IM 前缀还是要的哈
10 9 /**
11 10 * IM 会话类型枚举
12 11 * 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档
... ... @@ -15,13 +14,13 @@ import java.util.Arrays;
15 14 */
16 15 @Getter
17 16 @AllArgsConstructor
18   -public enum ConversationTypeEnum implements IntArrayValuable {
  17 +public enum ImConversationTypeEnum implements IntArrayValuable {
19 18  
20 19 SINGLE(1, "单聊"),
21 20 GROUP(3, "群聊"),
22 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 32 */
34 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 40 * @param conversationType 会话类型
46 41 * @return 会话编号
47 42 */
48 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 45 return "s_" + fromUserId + "_" + receiverId;
51   - } else if (conversationType.equals(ConversationTypeEnum.GROUP.getType())) {
  46 + } else if (conversationType.equals(ImConversationTypeEnum.GROUP.getType())) {
52 47 return "g_" + receiverId;
53 48 }
54 49 return null;
55 50 }
56 51  
  52 + @Override
  53 + public int[] array() {
  54 + return ARRAYS;
  55 + }
  56 +
57 57 }
58 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 6  
7 7 import java.util.Arrays;
8 8  
9   -// TODO @anhaohao:IM 前缀还是要的哈
10 9 /**
11 10 * IM 消息的类型枚举
12 11 * <p>
... ... @@ -16,7 +15,7 @@ import java.util.Arrays;
16 15 */
17 16 @Getter
18 17 @AllArgsConstructor
19   -public enum MessageContentTypeEnum implements IntArrayValuable {
  18 +public enum ImMessageContentTypeEnum implements IntArrayValuable {
20 19  
21 20 TEXT(101, "文本消息"),
22 21 PICTURE(102, "图片消息"),
... ... @@ -57,7 +56,7 @@ public enum MessageContentTypeEnum implements IntArrayValuable {
57 56 BURN_CHANGE(1701, "阅后即焚开启或关闭通知"),
58 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 6  
7 7 import java.util.Arrays;
8 8  
9   -// TODO @anhaohao:IM 前缀还是要的哈
10 9 /**
11 10 * IM 消息的消息来源
12 11 */
13 12 @RequiredArgsConstructor
14 13 @Getter
15   -public enum MessageSourceEnum implements IntArrayValuable {
  14 +public enum ImMessageSourceEnum implements IntArrayValuable {
16 15  
17 16 USER_SEND(100, "用户发送"),
18 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 6  
7 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 10 * IM 消息的状态枚举
20 11 */
21 12 @RequiredArgsConstructor
22 13 @Getter
23   -public enum MessageStatusEnum implements IntArrayValuable {
  14 +public enum ImMessageStatusEnum implements IntArrayValuable {
24 15  
  16 + DRAFT(0, "草稿"),
25 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 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 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 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 9 import cn.iocoder.yudao.module.im.service.conversation.ConversationService;
10 10 import io.swagger.v3.oas.annotations.Operation;
11 11 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -17,13 +17,13 @@ import org.springframework.web.bind.annotation.*;
17 17 import java.util.List;
18 18  
19 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 22 @Tag(name = "管理后台 - IM 会话")
23 23 @RestController
24 24 @RequestMapping("/im/conversation")
25 25 @Validated
26   -public class ConversationController {
  26 +public class ImConversationController {
27 27  
28 28 @Resource
29 29 private ConversationService conversationService;
... ... @@ -31,23 +31,21 @@ public class ConversationController {
31 31 @GetMapping("/list")
32 32 @Operation(summary = "获得用户的会话列表")
33 33 public CommonResult<List<ImConversationRespVO>> getConversationList() {
34   - List<ConversationDO> conversationList = conversationService.getConversationList();
  34 + List<ImConversationDO> conversationList = conversationService.getConversationList();
35 35 return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class));
36 36 }
37 37  
38   - // TODO @hao:这个接口,需要单独的 VO 哈;
39 38 @PostMapping("/update-pinned")
40 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 42 return success(true);
44 43 }
45 44  
46   - // TODO @hao:这个接口,需要单独的 VO 哈;
47 45 @PostMapping("/update-last-read-time")
48 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 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 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 5 import io.swagger.v3.oas.annotations.media.Schema;
4   -import jakarta.validation.constraints.NotEmpty;
5 6 import jakarta.validation.constraints.NotNull;
6 7 import lombok.Data;
7 8  
8 9 import java.time.LocalDateTime;
9 10  
10   -// TODO @anhaohao:改成 ConversationUpdateLastReadTimeReqVO,项目目前都是动名词哈。更新置顶
11 11 @Schema(description = "管理后台 - 会话最后已读时间 Request VO")
12 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 15 @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00")
21 16 @NotNull(message = "最后已读时间不能为空")
22 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 19 @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
29 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 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 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 5 import io.swagger.v3.oas.annotations.media.Schema;
5   -import jakarta.validation.constraints.NotEmpty;
6 6 import jakarta.validation.constraints.NotNull;
7 7 import lombok.Data;
8 8  
9   -import java.time.LocalDateTime;
10   -
11   -// TODO @anhaohao:改成 ConversationUpdatePinnedReqVO,项目目前都是动名词哈。更新置顶
12 9 @Schema(description = "管理后台 - 会话置顶 Request VO")
13 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 13 @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
22 14 @NotNull(message = "是否置顶不能为空")
23 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 17 @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
30 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 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 25 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
26 26  
27 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 31 // TODO @芋艿:得看看 create、update、delete、get、page 这几个接口,要保留哪些
32 32 @Tag(name = "管理后台 - 群")
... ... @@ -36,20 +36,20 @@ import cn.iocoder.yudao.module.im.service.group.ImGroupService;
36 36 public class ImGroupController {
37 37  
38 38 @Resource
39   - private ImGroupService imGroupService;
  39 + private GroupService groupService;
40 40  
41 41 @PostMapping("/create")
42 42 @Operation(summary = "创建群")
43 43 @PreAuthorize("@ss.hasPermission('im:group:create')")
44 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 48 @PutMapping("/update")
49 49 @Operation(summary = "更新群")
50 50 @PreAuthorize("@ss.hasPermission('im:group:update')")
51 51 public CommonResult<Boolean> updateGroup(@Valid @RequestBody ImGroupSaveReqVO updateReqVO) {
52   - imGroupService.updateGroup(updateReqVO);
  52 + groupService.updateGroup(updateReqVO);
53 53 return success(true);
54 54 }
55 55  
... ... @@ -58,7 +58,7 @@ public class ImGroupController {
58 58 @Parameter(name = "id", description = "编号", required = true)
59 59 @PreAuthorize("@ss.hasPermission('im:group:delete')")
60 60 public CommonResult<Boolean> deleteGroup(@RequestParam("id") Long id) {
61   - imGroupService.deleteGroup(id);
  61 + groupService.deleteGroup(id);
62 62 return success(true);
63 63 }
64 64  
... ... @@ -67,7 +67,7 @@ public class ImGroupController {
67 67 @Parameter(name = "id", description = "编号", required = true, example = "1024")
68 68 @PreAuthorize("@ss.hasPermission('im:group:query')")
69 69 public CommonResult<ImGroupRespVO> getGroup(@RequestParam("id") Long id) {
70   - GroupDO group = imGroupService.getGroup(id);
  70 + ImGroupDO group = groupService.getGroup(id);
71 71 return success(BeanUtils.toBean(group, ImGroupRespVO.class));
72 72 }
73 73  
... ... @@ -75,22 +75,8 @@ public class ImGroupController {
75 75 @Operation(summary = "获得群分页")
76 76 @PreAuthorize("@ss.hasPermission('im:group:query')")
77 77 public CommonResult<PageResult<ImGroupRespVO>> getGroupPage(@Valid ImGroupPageReqVO pageReqVO) {
78   - PageResult<GroupDO> pageResult = imGroupService.getGroupPage(pageReqVO);
  78 + PageResult<ImGroupDO> pageResult = groupService.getGroupPage(pageReqVO);
79 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 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 9 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
10 10 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO;
11 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 13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
14 14 import io.swagger.v3.oas.annotations.Operation;
15 15 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -66,7 +66,7 @@ public class ImGroupMemberController {
66 66 @Parameter(name = "id", description = "编号", required = true, example = "1024")
67 67 @PreAuthorize("@ss.hasPermission('im:group-member:query')")
68 68 public CommonResult<ImGroupMemberRespVO> getGroupMember(@RequestParam("id") Long id) {
69   - GroupMemberDO groupMember = groupMemberService.getGroupMember(id);
  69 + ImGroupMemberDO groupMember = groupMemberService.getGroupMember(id);
70 70 return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class));
71 71 }
72 72  
... ... @@ -74,7 +74,7 @@ public class ImGroupMemberController {
74 74 @Operation(summary = "获得群成员分页")
75 75 @PreAuthorize("@ss.hasPermission('im:group-member:query')")
76 76 public CommonResult<PageResult<ImGroupMemberRespVO>> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) {
77   - PageResult<GroupMemberDO> pageResult = groupMemberService.getGroupMemberPage(pageReqVO);
  77 + PageResult<ImGroupMemberDO> pageResult = groupMemberService.getGroupMemberPage(pageReqVO);
78 78 return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class));
79 79 }
80 80  
... ... @@ -85,7 +85,7 @@ public class ImGroupMemberController {
85 85 public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO,
86 86 HttpServletResponse response) throws IOException {
87 87 pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
88   - List<GroupMemberDO> list = groupMemberService.getGroupMemberPage(pageReqVO).getList();
  88 + List<ImGroupMemberDO> list = groupMemberService.getGroupMemberPage(pageReqVO).getList();
89 89 // 导出 Excel
90 90 ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class,
91 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 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 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 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 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 10 import cn.iocoder.yudao.module.im.service.message.MessageService;
11 11 import io.swagger.v3.oas.annotations.Operation;
12 12 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -25,35 +25,33 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
25 25 @RestController
26 26 @RequestMapping("/im/message")
27 27 @Validated
28   -public class MessageController {
  28 +public class ImMessageController {
29 29  
30 30 @Resource
31 31 private MessageService messageService;
32 32  
33 33 @PostMapping("/send")
34 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 42 @Parameter(name = "sequence", description = "序号", required = true, example = "1")
43 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 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 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 6 import io.swagger.v3.oas.annotations.media.Schema;
4 7 import lombok.Data;
5 8  
6 9 import java.time.LocalDateTime;
7 10  
8   -@Schema(description = "管理后台 - 收件箱保存消息 Request VO")
  11 +@Schema(description = "管理后台 - 消息 Response VO")
9 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 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 25 @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
19 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 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 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 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 42 private LocalDateTime sendTime;
38 43  
39   - @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
  44 + @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
40 45 private Long sequence;
41 46  
42 47 }
43 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 1 package cn.iocoder.yudao.module.im.controller.admin.message.vo;
2 2  
3 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 6 import io.swagger.v3.oas.annotations.media.Schema;
  7 +import jakarta.validation.constraints.NotNull;
8 8 import lombok.Data;
9 9  
10   -// TODO @anhaohao:MessageSendReqVO,消息发送
11   -
12   -// TODO @anhaohao:不应该有 excel 相关的注解
13   -
14 10 @Schema(description = "管理后台 - 发送消息 Request VO")
15 11 @Data
16   -@ExcelIgnoreUnannotated
17   -public class SendMessageReqVO {
  12 +public class ImMessageSendReqVO {
18 13  
19 14 @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
20   - @ExcelProperty("客户端消息编号 uuid,用于排重")
  15 + @NotNull(message = "客户端消息编号不能为空")
21 16 private String clientMessageId;
22 17  
23 18 @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494")
24   - @ExcelProperty("接收人编号")
  19 + @NotNull(message = "接收人编号不能为空")
25 20 private Long receiverId;
26 21  
27 22 @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
28   - @ExcelProperty("会话类型")
  23 + @InEnum(value = ImConversationTypeEnum.class)
  24 + @NotNull(message = "会话类型不能为空")
29 25 private Integer conversationType;
30 26  
31 27 @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
32   - @ExcelProperty("消息类型")
33   - @InEnum(MessageContentTypeEnum.class)
  28 + @InEnum(ImMessageContentTypeEnum.class)
  29 + @NotNull(message = "消息类型不能为空")
34 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 34 private String content;
39 35  
40 36 }
41 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 10  
11 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 13 @Schema(description = "管理后台 - 发送消息 Response VO")
16 14 @Data
17 15 @AllArgsConstructor
18 16 @NoArgsConstructor
19   -public class SendMessageRespVO {
  17 +public class ImMessageSendRespVO {
20 18  
21 19 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
22 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 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 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 1 package cn.iocoder.yudao.module.im.dal.dataobject.conversation;
2 2  
3 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 5 import com.baomidou.mybatisplus.annotation.KeySequence;
6 6 import com.baomidou.mybatisplus.annotation.TableId;
7 7 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -9,7 +9,6 @@ import lombok.*;
9 9  
10 10 import java.time.LocalDateTime;
11 11  
12   -// TODO @anhaohao:还是有 IM 前缀哈
13 12 /**
14 13 * IM 会话 DO
15 14 *
... ... @@ -23,7 +22,7 @@ import java.time.LocalDateTime;
23 22 @Builder
24 23 @NoArgsConstructor
25 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 38 /**
40 39 * 会话类型
41 40 * <p>
42   - * 枚举 {@link ConversationTypeEnum}
  41 + * 枚举 {@link ImConversationTypeEnum}
43 42 */
44 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 6 import com.baomidou.mybatisplus.annotation.TableName;
7 7 import lombok.*;
8 8  
9   -// TODO @anhaohao:还是要有 IM
10 9 /**
11 10 * IM 群信息 DO
12 11 *
... ... @@ -20,7 +19,7 @@ import lombok.*;
20 19 @Builder
21 20 @NoArgsConstructor
22 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 4 import com.baomidou.mybatisplus.annotation.*;
5 5 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
6 6  
7   -// TODO @anhaohao:还是要有 IM
8 7 /**
9 8 * IM 群成员 DO
10 9 *
... ... @@ -18,7 +17,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
18 17 @Builder
19 18 @NoArgsConstructor
20 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 1 package cn.iocoder.yudao.module.im.dal.dataobject.inbox;
2 2  
3 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 5 import com.baomidou.mybatisplus.annotation.KeySequence;
6 6 import com.baomidou.mybatisplus.annotation.TableId;
7 7 import com.baomidou.mybatisplus.annotation.TableName;
8 8 import lombok.*;
9 9  
10   -// TODO @anhaohao:还是要有 IM
11 10 // TODO 我们要不要改成 ImMessageQueue 队列?从理解上,概念上,可能都更清晰一点哈。每个用户一个消息队列;
  11 +
12 12 /**
13 13 * IM 收件箱 DO
14 14 *
... ... @@ -22,7 +22,7 @@ import lombok.*;
22 22 @Builder
23 23 @NoArgsConstructor
24 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 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 37 private Long userId;
38 38 /**
39 39 * 消息编号
40   - *
41   - * 关联 {@link MessageDO#getId()}
  40 + * <p>
  41 + * 关联 {@link ImMessageDO#getId()}
42 42 */
43 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 1 package cn.iocoder.yudao.module.im.dal.dataobject.message;
2 2  
3 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 8 import com.baomidou.mybatisplus.annotation.KeySequence;
9 9 import com.baomidou.mybatisplus.annotation.TableId;
10 10 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -12,7 +12,6 @@ import lombok.*;
12 12  
13 13 import java.time.LocalDateTime;
14 14  
15   -// TODO @anhaohao:还是要有 IM
16 15 /**
17 16 * IM 消息 DO
18 17 *
... ... @@ -26,7 +25,7 @@ import java.time.LocalDateTime;
26 25 @Builder
27 26 @NoArgsConstructor
28 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 59 */
61 60 private String senderAvatar;
62 61 /**
63   - * 会话类型 枚举 {@link ConversationTypeEnum}
  62 + * 会话类型 枚举 {@link ImConversationTypeEnum}
64 63 */
65 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 70 private String conversationNo;
72 71 /**
73 72 * 消息类型
74   - *
75   - * 枚举 {@link MessageContentTypeEnum}
  73 + * <p>
  74 + * 枚举 {@link ImMessageContentTypeEnum}
76 75 */
77 76 private Integer contentType;
78 77 /**
79 78 * 消息内容
80   - *
  79 + * <p>
81 80 * JSON 格式 对应 dal/dataobject/message/content 包
82 81 */
83 82 private String content;
... ... @@ -87,14 +86,14 @@ public class MessageDO extends BaseDO {
87 86 private LocalDateTime sendTime;
88 87 /**
89 88 * 消息来源
90   - *
91   - * 枚举 {@link MessageSourceEnum}
  89 + * <p>
  90 + * 枚举 {@link ImMessageSourceEnum}
92 91 */
93 92 private Integer sendFrom;
94 93 /**
95 94 * 消息状态
96   - *
97   - * 枚举 {@link MessageStatusEnum}
  95 + * <p>
  96 + * 枚举 {@link ImMessageStatusEnum}
98 97 */
99 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 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 4 import lombok.AllArgsConstructor;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
... ... @@ -8,7 +8,7 @@ import lombok.NoArgsConstructor;
8 8 // TODO @anhaohao:要有 IM;
9 9 // TODO @芋艿:后续要挪到 api 包下,主要是给外部接口使用
10 10 /**
11   - * 语音消息的 {@link MessageDO 字段 content} 的内容
  11 + * 语音消息的 {@link ImMessageDO 字段 content} 的内容
12 12 *
13 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 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 4 import lombok.AllArgsConstructor;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
7 7  
8 8 /**
9   - * 名片消息的 {@link MessageDO 字段 content} 的内容
  9 + * 名片消息的 {@link ImMessageDO 字段 content} 的内容
10 10 *
11 11 * @author anhaohao
12 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 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 4 import lombok.AllArgsConstructor;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
7 7  
8 8 /**
9   - * 文件消息的 {@link MessageDO 字段 content} 的内容
  9 + * 文件消息的 {@link ImMessageDO 字段 content} 的内容
10 10 *
11 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 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 4 import lombok.AllArgsConstructor;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
7 7  
8 8 /**
9   - * 图片消息的 {@link MessageDO 字段 content} 的内容
  9 + * 图片消息的 {@link ImMessageDO 字段 content} 的内容
10 10 *
11 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 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 4 import lombok.AllArgsConstructor;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
7 7  
8 8 /**
9   - * 地址位置消息的 {@link MessageDO 字段 content} 的内容
  9 + * 地址位置消息的 {@link ImMessageDO 字段 content} 的内容
10 10 *
11 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 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 4 import lombok.AllArgsConstructor;
5 5 import lombok.Data;
6 6 import lombok.NoArgsConstructor;
7 7  
8 8 /**
9   - * 文本消息的 {@link MessageDO 字段 content} 的内容
  9 + * 文本消息的 {@link ImMessageDO 字段 content} 的内容
10 10 *
11 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 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 4 import lombok.Data;
5 5  
6 6 /**
7   - * 视频消息的 {@link MessageDO 字段 content} 的内容
  7 + * 视频消息的 {@link ImMessageDO 字段 content} 的内容
8 8 *
9 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 1 package cn.iocoder.yudao.module.im.dal.mysql.conversation;
2 2  
3 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 5 import org.apache.ibatis.annotations.Mapper;
7 6  
8 7 /**
... ... @@ -11,9 +10,9 @@ import org.apache.ibatis.annotations.Mapper;
11 10 * @author 芋道源码
12 11 */
13 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 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 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 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 7 import org.apache.ibatis.annotations.Mapper;
8 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 13 * @author 芋道源码
14 14 */
15 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 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 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 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 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 import java.util.List;
... ... @@ -15,21 +15,21 @@ import java.util.List;
15 15 * @author 芋道源码
16 16 */
17 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 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 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 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 6 import org.apache.ibatis.annotations.Mapper;
7 7  
8 8 import java.util.List;
... ... @@ -13,27 +13,14 @@ import java.util.List;
13 13 * @author 芋道源码
14 14 */
15 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 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 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 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 6 import org.apache.ibatis.annotations.Mapper;
10 7  
11 8 import java.util.List;
... ... @@ -16,13 +13,12 @@ import java.util.List;
16 13 * @author 芋道源码
17 14 */
18 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 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 1 package cn.iocoder.yudao.module.im.dal.redis.inbox;
2 2  
3 3 import jakarta.annotation.Resource;
4   -import org.redisson.api.RedissonClient;
5 4 import org.springframework.data.redis.core.RedisTemplate;
6 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 14 * @author anhaohao
16 15 */
17 16 @Repository
18   -public class SequenceRedisDao {
  17 +public class SequenceRedisDAO {
19 18  
20 19 @Resource
21 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 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 7 import java.util.List;
8 8  
... ... @@ -18,20 +18,22 @@ public interface ConversationService {
18 18 *
19 19 * @return 会话列表
20 20 */
21   - List<ConversationDO> getConversationList();
  21 + List<ImConversationDO> getConversationList();
22 22  
23 23 /**
24 24 * 置顶会话
25 25 *
  26 + * @param loginUserId 登录用户编号
26 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 35 * @param updateReqVO 更新信息
34 36 */
35   - void updateLastReadTime(ConversationLastTimeReqVO updateReqVO);
  37 + void updateLastReadTime(Long loginUserId, ImConversationUpdateLastReadTimeReqVO updateReqVO);
36 38  
37 39 }
38 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 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 6 import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper;
  7 +import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
8 8 import cn.iocoder.yudao.module.im.service.inbox.InboxService;
9 9 import jakarta.annotation.Resource;
10 10 import org.springframework.stereotype.Service;
... ... @@ -27,50 +27,50 @@ public class ConversationServiceImpl implements ConversationService {
27 27 private InboxService inboxService;
28 28  
29 29 @Override
30   - public List<ConversationDO> getConversationList() {
  30 + public List<ImConversationDO> getConversationList() {
31 31 return conversationMapper.selectList();
32 32 }
33 33  
34 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 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 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 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 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 2  
3 3 import jakarta.validation.*;
4 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 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 10 *
11 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 40 * @param id 编号
41 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 48 * @param pageReqVO 分页查询
49 49 * @return 群分页
50 50 */
51   - PageResult<GroupDO> getGroupPage(ImGroupPageReqVO pageReqVO);
  51 + PageResult<ImGroupDO> getGroupPage(ImGroupPageReqVO pageReqVO);
52 52  
53 53 }
54 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 5 import org.springframework.validation.annotation.Validated;
6 6  
7 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 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 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 14 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
15 15 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 22 @Service
23 23 @Validated
24   -public class ImGroupServiceImpl implements ImGroupService {
  24 +public class GroupServiceImpl implements GroupService {
25 25  
26 26 @Resource
27   - private ImGroupMapper imGroupMapper;
  27 + private GroupMapper groupMapper;
28 28  
29 29 @Override
30 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 35 return group.getId();
36 36 }
... ... @@ -40,8 +40,8 @@ public class ImGroupServiceImpl implements ImGroupService {
40 40 // 校验存在
41 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 47 @Override
... ... @@ -49,23 +49,23 @@ public class ImGroupServiceImpl implements ImGroupService {
49 49 // 校验存在
50 50 validateGroupExists(id);
51 51 // 删除
52   - imGroupMapper.deleteById(id);
  52 + groupMapper.deleteById(id);
53 53 }
54 54  
55 55 private void validateGroupExists(Long id) {
56   - if (imGroupMapper.selectById(id) == null) {
  56 + if (groupMapper.selectById(id) == null) {
57 57 throw exception(GROUP_NOT_EXISTS);
58 58 }
59 59 }
60 60  
61 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 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 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 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberPageReqVO;
5 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 7 import jakarta.validation.Valid;
8 8  
9 9 import java.util.List;
... ... @@ -43,7 +43,7 @@ public interface GroupMemberService {
43 43 * @param id 编号
44 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 51 * @param pageReqVO 分页查询
52 52 * @return 群成员分页
53 53 */
54   - PageResult<GroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO);
  54 + PageResult<ImGroupMemberDO> getGroupMemberPage(ImGroupMemberPageReqVO pageReqVO);
55 55  
56 56 /**
57 57 * 根据群组id查询群成员
... ... @@ -59,5 +59,5 @@ public interface GroupMemberService {
59 59 * @param groupId 群组id
60 60 * @return 群成员列表
61 61 */
62   - List<GroupMemberDO> selectByGroupId(Long groupId);
  62 + List<ImGroupMemberDO> selectByGroupId(Long groupId);
63 63 }
64 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 5 import org.springframework.validation.annotation.Validated;
6 6  
7 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 9 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 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 14 import java.util.List;
15 15  
... ... @@ -26,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
26 26 public class GroupMemberServiceImpl implements GroupMemberService {
27 27  
28 28 @Resource
29   - private ImGroupMemberMapper imGroupMemberMapper;
  29 + private GroupMemberMapper groupMemberMapper;
30 30  
31 31 @Override
32 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 37 return groupMember.getId();
38 38 }
... ... @@ -42,8 +42,8 @@ public class GroupMemberServiceImpl implements GroupMemberService {
42 42 // 校验存在
43 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 49 @Override
... ... @@ -51,28 +51,28 @@ public class GroupMemberServiceImpl implements GroupMemberService {
51 51 // 校验存在
52 52 validateGroupMemberExists(id);
53 53 // 删除
54   - imGroupMemberMapper.deleteById(id);
  54 + groupMemberMapper.deleteById(id);
55 55 }
56 56  
57 57 private void validateGroupMemberExists(Long id) {
58   - if (imGroupMemberMapper.selectById(id) == null) {
  58 + if (groupMemberMapper.selectById(id) == null) {
59 59 throw exception(GROUP_MEMBER_NOT_EXISTS);
60 60 }
61 61 }
62 62  
63 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 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 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 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 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 5 import java.util.List;
6 6  
... ... @@ -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 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 2  
3 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 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 9 import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper;
10 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 13 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
14 14 import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
15 15 import jakarta.annotation.Resource;
16 16 import org.dromara.hutool.core.date.DateUnit;
  17 +import org.springframework.scheduling.annotation.Async;
17 18 import org.springframework.stereotype.Service;
18 19 import org.springframework.validation.annotation.Validated;
19 20  
... ... @@ -33,50 +34,60 @@ public class InboxServiceImpl implements InboxService {
33 34  
34 35 @Resource
35 36 private InboxMapper inboxMapper;
  37 +
36 38 @Resource
37   - private SequenceRedisDao sequenceRedisDao; // 序列生成器Redis DAO
  39 + private SequenceRedisDAO sequenceRedisDAO;
38 40 @Resource
39   - private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO
  41 + private InboxLockRedisDAO inboxLockRedisDAO;
  42 +
40 43 @Resource
41 44 private WebSocketSenderApi webSocketSenderApi;
42 45 @Resource
43 46 private GroupMemberService groupMemberService;
44 47  
45   - // TODO @anhaohao:下面的逻辑,最好是,1. 保存收件箱 + 发送消息给用户; 2. xxx;这样看的人,会更有感觉哈;
46 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 63 @Override
60 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 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 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 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 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 7 import java.util.List;
9 8  
... ... @@ -17,26 +16,28 @@ public interface MessageService {
17 16 /**
18 17 * 获得历史消息
19 18 *
20   - * @param pageReqVO 分页查询
  19 + * @param loginUserId 登录用户编号
  20 + * @param listReqVO 分页查询
21 21 * @return 消息分页
22 22 */
23   - List<MessageDO> getHistoryMessage(MessagePageReqVO pageReqVO);
  23 + List<ImMessageDO> getMessageList(Long loginUserId, ImMessageListReqVO listReqVO);
24 24  
25 25 /**
26 26 * 拉取消息-大于 seq 的消息
27 27 *
28   - * @param userId 用户id
29   - * @param sequence 序列号
30   - * @param size 数量
  28 + * @param loginUserId 登录用户编号
  29 + * @param sequence 序列号
  30 + * @param size 数量
31 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 38 * @param loginUserId 登录用户编号
38   - * @param message 消息
  39 + * @param message 消息
39 40 * @return 消息编号
40 41 */
41   - SendMessageRespVO sendMessage(Long loginUserId, SendMessageReqVO message);
  42 + ImMessageDO sendMessage(Long loginUserId, ImMessageSendReqVO message);
42 43 }
43 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 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 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 12 import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
14 13 import cn.iocoder.yudao.module.im.service.inbox.InboxService;
15 14 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
... ... @@ -38,92 +37,66 @@ public class MessageServiceImpl implements MessageService {
38 37 @Resource
39 38 private MessageMapper messageMapper;
40 39 @Resource
41   - private InboxService inboxService;
42   - @Resource
43 40 private AdminUserApi adminUserApi;
44 41 @Resource
  42 + private InboxService inboxService;
  43 + @Resource
45 44 private GroupMemberService groupMemberService;
46 45  
47 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 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 59 List<Long> messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size);
55 60 return messageMapper.selectBatchIds(messageIds);
56 61 }
57 62  
58 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 74 validateReceiverIdExists(message);
75   - // 查询发送人昵称和发送人头像
  75 + // 2. 查询发送人信息
76 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 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 92 AdminUserRespDTO receiverUser = adminUserApi.getUser(message.getReceiverId());
120 93 if (receiverUser == null) {
121 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 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 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 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 0 \ No newline at end of file