Commit fa23ce144d9391c3b30b050c2ad80f6a21bcda82
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
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 |