diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java index 6276c15640..35478c1d7e 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/ConversationController.java @@ -2,15 +2,15 @@ package cn.iocoder.yudao.module.im.controller.admin.conversation; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationRespVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; import cn.iocoder.yudao.module.im.service.conversation.ConversationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -18,33 +18,27 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -// TODO @hao: 管理后台 - IM 会话 @Tag(name = "管理后台 - IM 会话") @RestController @RequestMapping("/im/conversation") @Validated public class ConversationController { - // TODO @hao: conversationService 即可 @Resource private ConversationService conversationService; - // TODO @hao:/list 会话列表;一般 get 是给单个对象,或者 get-count 这种;然后 conversation 已经是模块名了,所以可以简化 - @GetMapping("/get-conversation") + @GetMapping("/list") @Operation(summary = "获得用户的会话列表") - @PreAuthorize("hasAuthority('im:conversation:query')") // TODO @hao:不用权限哈 public CommonResult> getConversationList() { List conversationList = conversationService.getConversationList(); return success(BeanUtils.toBean(conversationList, ImConversationRespVO.class)); } - // TODO @hao:/update-pinned 保持和 db 字段一致哈; // TODO @hao:这个接口,需要单独的 VO 哈; - @PostMapping("/update-top") + @PostMapping("/update-pinned") @Operation(summary = "置顶会话") - @PreAuthorize("hasAuthority('im:conversation:update')") // TODO @hao:不用权限哈;因为肯定会判断是不是自己的 - public CommonResult updateTop(@Valid @RequestBody ImConversationSaveReqVO updateReqVO) { - conversationService.updateTop(updateReqVO); + public CommonResult updatePinned(@Valid @RequestBody ConversationPinnedReqVO updateReqVO) { + conversationService.updatePinned(updateReqVO); return success(true); } @@ -52,8 +46,7 @@ public class ConversationController { // TODO @hao:这个接口,需要单独的 VO 哈; @PostMapping("/update-last-read-time") @Operation(summary = "更新最后已读时间") - @PreAuthorize("hasAuthority('im:conversation:update')") // TODO @hao:不用权限哈;因为肯定会判断是不是自己的 - public CommonResult updateLastReadTime(@Valid @RequestBody ImConversationSaveReqVO updateReqVO) { + public CommonResult updateLastReadTime(@Valid @RequestBody ConversationLastTimeReqVO updateReqVO) { conversationService.updateLastReadTime(updateReqVO); return success(true); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java new file mode 100755 index 0000000000..dd516d50d6 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationLastTimeReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会话最后已读时间 Request VO") +@Data +public class ConversationLastTimeReqVO { + + @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2") + @NotEmpty(message = "会话标志不能为空") + private String no; + + @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00") + @NotNull(message = "最后已读时间不能为空") + private LocalDateTime lastReadTime; + + @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long userId; + + @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Long targetId; + + @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; //枚举 ConversationTypeEnum + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java new file mode 100755 index 0000000000..f84a3219ca --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ConversationPinnedReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 会话置顶 Request VO") +@Data +public class ConversationPinnedReqVO { + + @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2") + @NotEmpty(message = "会话标志不能为空") + private String no; + + @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "是否置顶不能为空") + private Boolean pinned; + + @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long userId; + + @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Long targetId; + + @Schema(description = "会话类型",requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; //枚举 ConversationTypeEnum + + + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java deleted file mode 100755 index e1308d840c..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationPageReqVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -// TODO @hao:这个貌似业务上,暂时用不到,可以考虑删除哈。 -@Schema(description = "管理后台 - IM 会话分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ImConversationPageReqVO extends PageParam { - - @Schema(description = "所属用户", example = "11545") - private Long userId; - - @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", example = "1") - private Integer type; - - @Schema(description = "单聊时,用户编号;群聊时,群编号", example = "21454") - private Long targetId; - - @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId") - private String no; - - @Schema(description = "是否置顶 0否 1是") - private Boolean pinned; - - @Schema(description = "最后已读时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] lastReadTime; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java index ee9a7248f3..31d118008d 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationRespVO.java @@ -9,45 +9,30 @@ import java.time.LocalDateTime; @Schema(description = "管理后台 - 会话 Response VO") @Data -@ExcelIgnoreUnannotated // TODO @hao:excel 的注解可以先删除 public class ImConversationRespVO { - // TODO @hao:example 都写下 - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905") - @ExcelProperty("编号") private Long id; - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "11545") - @ExcelProperty("所属用户") + @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long userId; - // TODO @hao:@Schema 可以改成“会话类型”,不用把具体的数字写在上面哈。这样后续改动,会比较难改 - @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("类型:1 单聊;2 群聊;4 通知会话(预留)") + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer conversationType; - // TODO @hao:只写,聊天对象编号 - @Schema(description = "单聊时,用户编号;群聊时,群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21454") - @ExcelProperty("单聊时,用户编号;群聊时,群编号") + @Schema(description = "聊天对象编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") private Long targetId; - // TODO @hao:只写 no 即可。 - @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId") + @Schema(description = "会话标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "s_1_2") private String no; - // TODO @hao:只写 是否置顶;0 1 是数据库的结果哈; - @Schema(description = "是否置顶 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("是否置顶 0否 1是") + @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Boolean pinned; - @Schema(description = "最后已读时间") - @ExcelProperty("最后已读时间") + @Schema(description = "最后已读时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-03-01 00:00:00") private LocalDateTime lastReadTime; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") private LocalDateTime createTime; } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java deleted file mode 100755 index b226f16c07..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/conversation/vo/ImConversationSaveReqVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.conversation.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; - -// TODO @hao:这个貌似业务上,暂时用不到,可以考虑删除哈。 -@Schema(description = "管理后台 - 会话新增/修改 Request VO") -@Data -public class ImConversationSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13905") - private Long id; - - @Schema(description = "所属用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "11545") - @NotNull(message = "所属用户不能为空") - private Long userId; - - @Schema(description = "类型:1 单聊;2 群聊;4 通知会话(预留)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "类型:1 单聊;2 群聊;4 通知会话(预留)不能为空") - private Integer type; - - @Schema(description = "单聊时,用户编号;群聊时,群编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "21454") - @NotEmpty(message = "单聊时,用户编号;群聊时,群编号不能为空") - private Long targetId; - - @Schema(description = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "会话标志 单聊:s_{userId}_{targetId},需要排序 userId 和 targetId 群聊:g_groupId不能为空") - private String no; - - @Schema(description = "是否置顶 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "是否置顶 0否 1是不能为空") - private Boolean pinned; - - @Schema(description = "最后已读时间") - private LocalDateTime lastReadTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java index 1a70ebbff4..3e63bcdc64 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/groupmember/ImGroupMemberController.java @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberP import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberRespVO; import cn.iocoder.yudao.module.im.controller.admin.groupmember.vo.ImGroupMemberSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; -import cn.iocoder.yudao.module.im.service.groupmember.ImGroupMemberService; +import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -34,20 +34,20 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E public class ImGroupMemberController { @Resource - private ImGroupMemberService imGroupMemberService; + private GroupMemberService groupMemberService; @PostMapping("/create") @Operation(summary = "创建群成员") @PreAuthorize("@ss.hasPermission('im:group-member:create')") public CommonResult createGroupMember(@Valid @RequestBody ImGroupMemberSaveReqVO createReqVO) { - return success(imGroupMemberService.createGroupMember(createReqVO)); + return success(groupMemberService.createGroupMember(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新群成员") @PreAuthorize("@ss.hasPermission('im:group-member:update')") public CommonResult updateGroupMember(@Valid @RequestBody ImGroupMemberSaveReqVO updateReqVO) { - imGroupMemberService.updateGroupMember(updateReqVO); + groupMemberService.updateGroupMember(updateReqVO); return success(true); } @@ -56,7 +56,7 @@ public class ImGroupMemberController { @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('im:group-member:delete')") public CommonResult deleteGroupMember(@RequestParam("id") Long id) { - imGroupMemberService.deleteGroupMember(id); + groupMemberService.deleteGroupMember(id); return success(true); } @@ -65,7 +65,7 @@ public class ImGroupMemberController { @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('im:group-member:query')") public CommonResult getGroupMember(@RequestParam("id") Long id) { - GroupMemberDO groupMember = imGroupMemberService.getGroupMember(id); + GroupMemberDO groupMember = groupMemberService.getGroupMember(id); return success(BeanUtils.toBean(groupMember, ImGroupMemberRespVO.class)); } @@ -73,7 +73,7 @@ public class ImGroupMemberController { @Operation(summary = "获得群成员分页") @PreAuthorize("@ss.hasPermission('im:group-member:query')") public CommonResult> getGroupMemberPage(@Valid ImGroupMemberPageReqVO pageReqVO) { - PageResult pageResult = imGroupMemberService.getGroupMemberPage(pageReqVO); + PageResult pageResult = groupMemberService.getGroupMemberPage(pageReqVO); return success(BeanUtils.toBean(pageResult, ImGroupMemberRespVO.class)); } @@ -84,7 +84,7 @@ public class ImGroupMemberController { public void exportGroupMemberExcel(@Valid ImGroupMemberPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = imGroupMemberService.getGroupMemberPage(pageReqVO).getList(); + List list = groupMemberService.getGroupMemberPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "群成员.xls", "数据", ImGroupMemberRespVO.class, BeanUtils.toBean(list, ImGroupMemberRespVO.class)); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java deleted file mode 100755 index 4459d49af8..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.inbox; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxRespVO; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; -import cn.iocoder.yudao.module.im.service.inbox.ImInboxService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; - -@Tag(name = "管理后台 - 收件箱") -@RestController -@RequestMapping("/im/inbox") -@Validated -public class ImInboxController { - - @Resource - private ImInboxService imInboxService; - - @PostMapping("/create") - @Operation(summary = "创建收件箱") - @PreAuthorize("@ss.hasPermission('im:inbox:create')") - public CommonResult createInbox(@Valid @RequestBody InboxSaveReqVO createReqVO) { - return success(imInboxService.createInbox(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新收件箱") - @PreAuthorize("@ss.hasPermission('im:inbox:update')") - public CommonResult updateInbox(@Valid @RequestBody InboxSaveReqVO updateReqVO) { - imInboxService.updateInbox(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除收件箱") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('im:inbox:delete')") - public CommonResult deleteInbox(@RequestParam("id") Long id) { - imInboxService.deleteInbox(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得收件箱") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('im:inbox:query')") - public CommonResult getInbox(@RequestParam("id") Long id) { - InboxDO inbox = imInboxService.getInbox(id); - return success(BeanUtils.toBean(inbox, ImInboxRespVO.class)); - } - - @GetMapping("/page") - @Operation(summary = "获得收件箱分页") - @PreAuthorize("@ss.hasPermission('im:inbox:query')") - public CommonResult> getInboxPage(@Valid ImInboxPageReqVO pageReqVO) { - PageResult pageResult = imInboxService.getInboxPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, ImInboxRespVO.class)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出收件箱 Excel") - @PreAuthorize("@ss.hasPermission('im:inbox:export')") - @OperateLog(type = EXPORT) - public void exportInboxExcel(@Valid ImInboxPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = imInboxService.getInboxPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "收件箱.xls", "数据", ImInboxRespVO.class, - BeanUtils.toBean(list, ImInboxRespVO.class)); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/package-info.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/package-info.java new file mode 100644 index 0000000000..513fe46d08 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/package-info.java @@ -0,0 +1,5 @@ +/** + * @author anhaohao + * @since 2024/3/27 下午11:36 + */ +package cn.iocoder.yudao.module.im.controller.admin.inbox; \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java deleted file mode 100755 index 2fd371e4b9..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -// TODO @hao:这个是不是删除掉,应该不会有这个 VO 哈 -@Schema(description = "管理后台 - 收件箱分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class ImInboxPageReqVO extends PageParam { - - @Schema(description = "用户编号", example = "3979") - private Long userId; - - @Schema(description = "消息编号", example = "12454") - private Long messageId; - - @Schema(description = "序号,按照 user 递增") - private Long sequence; - - @Schema(description = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java deleted file mode 100755 index eec1242c70..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -// TODO @hao:这个是不是删除掉,应该不会有这个 VO 哈;应该给前端的,是要屏蔽掉这个表,最终返回的都是 Message 哈;说白了,这个 inbox 是后端的内部实现 -@Schema(description = "管理后台 - 收件箱 Response VO") -@Data -@ExcelIgnoreUnannotated -public class ImInboxRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18389") - @ExcelProperty("编号") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3979") - @ExcelProperty("用户编号") - private Long userId; - - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") - @ExcelProperty("消息编号") - private Long messageId; - - @Schema(description = "序号,按照 user 递增", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("序号,按照 user 递增") - private Long sequence; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveReqVO.java deleted file mode 100755 index b44a2b7c7b..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.inbox.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -// TODO @hao:这个是不是删除掉,应该不会有这个 VO 哈 -@Schema(description = "管理后台 - 收件箱新增/修改 Request VO") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class InboxSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18389") - private Long id; - - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3979") - @NotNull(message = "用户编号不能为空") - private Long userId; - - @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") - @NotNull(message = "消息编号不能为空") - private Long messageId; - - @Schema(description = "序号,按照 user 递增", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "序号,按照 user 递增不能为空") - private Long sequence; - - public InboxSaveReqVO(Long userId, Long messageId, Long sequence) { - this.userId = userId; - this.messageId = messageId; - this.sequence = sequence; - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java index fc5d33a806..1325cbd1c0 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/MessageController.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.im.controller.admin.message; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessagePageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageReqVO; +import cn.iocoder.yudao.module.im.controller.admin.message.vo.MessageReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageReqVO; import cn.iocoder.yudao.module.im.controller.admin.message.vo.SendMessageRespVO; import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO; @@ -40,18 +40,18 @@ public class MessageController { @Operation(summary = "拉取大于 sequence 的消息列表") @Parameter(name = "sequence", description = "序号", required = true, example = "1") @Parameter(name = "size", description = "条数", required = true, example = "10") - public CommonResult> loadMessage(@RequestParam("sequence") Long sequence, - @RequestParam("size") Integer size) { + public CommonResult> getMessageListBySequence(@RequestParam("sequence") Long sequence, + @RequestParam("size") Integer size) { List messages = messageService.getMessageListBySequence(getLoginUserId(), sequence, size); - return success(BeanUtils.toBean(messages, ImMessageReqVO.class)); + return success(BeanUtils.toBean(messages, MessageReqVO.class)); } - @GetMapping("/page") - @Operation(summary = "查询聊天记录-分页") - public CommonResult> getMessagePage(@Valid MessagePageReqVO pageReqVO) { + @GetMapping("/history") + @Operation(summary = "查询聊天记录-根据会话标志和发送时间进行分页查询") + public CommonResult> getHistoryMessage(@Valid MessagePageReqVO pageReqVO) { //根据会话标志和发送时间进行分页查询 - List messagePage = messageService.getMessagePage(pageReqVO); - return success(BeanUtils.toBean(messagePage, ImMessageReqVO.class)); + List messagePage = messageService.getHistoryMessage(pageReqVO); + return success(BeanUtils.toBean(messagePage, MessageReqVO.class)); } } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageReqVO.java deleted file mode 100755 index 0f0d4f20cc..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo; - -import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 消息 Request VO") -@Data -@ExcelIgnoreUnannotated -public class ImMessageReqVO { - - @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") - @ExcelProperty("客户端消息编号 uuid,用于排重") - private String clientMessageId; - - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") - @ExcelProperty("接收人编号") - private Long receiverId; - - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @ExcelProperty("会话类型") - private Integer conversationType; - - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("消息类型") - @InEnum(MessageContentTypeEnum.class) - private Integer contentType; - - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("消息内容") - private String content; - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java deleted file mode 100755 index 53d6f13d27..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/ImMessageSaveReqVO.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.iocoder.yudao.module.im.controller.admin.message.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 消息新增/修改 Request VO") -@Data -public class ImMessageSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30713") - private Long id; - - @Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331") - @NotEmpty(message = "客户端消息编号 uuid,用于排重不能为空") - private String clientMessageId; - - @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23239") - @NotNull(message = "发送人编号不能为空") - private Long senderId; - - @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") - @NotNull(message = "接收人编号不能为空") - private Long receiverId; - - @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") - @NotEmpty(message = "发送人昵称不能为空") - private String senderNickname; - - @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "发送人头像不能为空") - private String senderAvatar; - - @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - @NotNull(message = "会话类型不能为空") - private Integer conversationType; - - @Schema(description = "会话标志 conversation_no = a_b", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "会话标志不能为空") - private String conversationNo; - - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "消息类型不能为空") - private Integer contentType; - - @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "消息内容不能为空") - private String content; - - @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime sendTime; - - @Schema(description = "消息来源 100-用户发送;200-系统发送(一般是通知);", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "消息来源 100-用户发送;200-系统发送(一般是通知);不能为空") - private Integer sendFrom; - - @Schema(description = "消息状态 1 发送中、2 发送成功、3 发送失败、4 已删除、5 已撤回", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "消息状态不能为空") - private Integer messageStatus; -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java new file mode 100755 index 0000000000..16ec8c512e --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/vo/MessageReqVO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.im.controller.admin.message.vo; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 消息 Request VO") +@Data +public class MessageReqVO { + + @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454") + private Long id; + + @Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer conversationType; // 对应 ImConversationTypeEnum 枚举 + + @Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long fromId; // 根据 conversationType 区分 + + @Schema(description = "发送人昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + private String senderNickname; + + @Schema(description = "发送人头像", requiredMode = Schema.RequiredMode.REQUIRED) + private String senderAvatar; + + @Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "32494") + private Long receiverId; + + @Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer contentType; // 参见 ImMessageTypeEnum 枚举 + + @Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED) + private String content; + + @Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime sendTime; + + @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long sequence; + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java index 73ade2ed93..0121470a87 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ConversationMapper.java @@ -1,9 +1,7 @@ package cn.iocoder.yudao.module.im.dal.mysql.conversation; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; import org.apache.ibatis.annotations.Mapper; @@ -15,20 +13,7 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ConversationMapper extends BaseMapperX { - default PageResult selectPage(ImConversationPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(ConversationDO::getUserId, reqVO.getUserId()) - .eqIfPresent(ConversationDO::getType, reqVO.getType()) - .eqIfPresent(ConversationDO::getTargetId, reqVO.getTargetId()) - .eqIfPresent(ConversationDO::getNo, reqVO.getNo()) - .eqIfPresent(ConversationDO::getPinned, reqVO.getPinned()) - .betweenIfPresent(ConversationDO::getLastReadTime, reqVO.getLastReadTime()) - .betweenIfPresent(ConversationDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(ConversationDO::getId)); - } - - // TODO @hao:1)no) {,要有空格哈;2)可以直接 selectOne(ImConversationDO::getNo, no) 父类做了封装 default ConversationDO selectByNo(String no){ - return selectOne(new LambdaQueryWrapperX().eq(ConversationDO::getNo, no)); + return selectOne(ConversationDO::getNo, no); } } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java deleted file mode 100755 index 15c427e470..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.im.dal.mysql.inbox; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxPageReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * IM 收件箱 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface ImInboxMapper extends BaseMapperX { - - default PageResult selectPage(ImInboxPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(InboxDO::getUserId, reqVO.getUserId()) - .eqIfPresent(InboxDO::getMessageId, reqVO.getMessageId()) - .eqIfPresent(InboxDO::getSequence, reqVO.getSequence()) - .betweenIfPresent(InboxDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(InboxDO::getId)); - } - -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java new file mode 100755 index 0000000000..26c1145930 --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.im.dal.mysql.inbox; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * IM 收件箱 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface InboxMapper extends BaseMapperX { + + default List selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) { + return selectList(new LambdaQueryWrapperX() + .gt(InboxDO::getUserId, userId) + .gt(InboxDO::getSequence, sequence) + .orderByAsc(InboxDO::getSequence) + .last("limit 0," + size)) + .stream() + .map(InboxDO::getMessageId) + .toList(); + } + +// default PageResult selectPage(ImInboxPageReqVO reqVO) { +// return selectPage(reqVO, new LambdaQueryWrapperX() +// .eqIfPresent(InboxDO::getUserId, reqVO.getUserId()) +// .eqIfPresent(InboxDO::getMessageId, reqVO.getMessageId()) +// .eqIfPresent(InboxDO::getSequence, reqVO.getSequence()) +// .betweenIfPresent(InboxDO::getCreateTime, reqVO.getCreateTime()) +// .orderByDesc(InboxDO::getId)); +// } + +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java index 90fa620967..bd99fb661e 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/MessageMapper.java @@ -18,30 +18,7 @@ import java.util.List; @Mapper public interface MessageMapper extends BaseMapperX { - // TODO @hao:不链表哈;先从 ImInboxDO 查询出 messageId,然后再到 ImMessageDO 里 IN - default List getGreaterThanSequenceMessage(Long userId, Long sequence, Integer size) { - //查询 inbox 表中,大于 sequence 的消息,关联 message 表,按照 inbox 表 sequence 升序 - return selectJoinList(MessageDO.class, new MPJLambdaWrapper() - .selectAll(MessageDO.class) - .innerJoin(InboxDO.class, InboxDO::getMessageId, MessageDO::getId) - .eq(InboxDO::getUserId, userId) - .gt(InboxDO::getSequence, sequence) - .orderByAsc(InboxDO::getSequence) - .last("limit 0," + size)); - } - - // TODO @hao:在 dao 里,使用 selectListByUserId,查询用 select,条件用 by,这个算是 spring data 的 method dsl - default List getAllMessage(Long userId, Integer size) { - //查询 inbox 表中,100条消息,关联 message 表,按照 inbox 表 sequence 降序 - return selectJoinList(MessageDO.class, new MPJLambdaWrapper() - .selectAll(MessageDO.class) - .innerJoin(InboxDO.class, InboxDO::getMessageId, MessageDO::getId) - .eq(InboxDO::getUserId, userId) - .orderByDesc(InboxDO::getSequence) - .last("limit 0," + size)); - } - - default List getMessagePage(MessagePageReqVO pageReqVO) { + default List getHistoryMessage(MessagePageReqVO pageReqVO) { return selectList(new LambdaQueryWrapperX() .eqIfPresent(MessageDO::getConversationNo, pageReqVO.getConversationNo()) .betweenIfPresent(MessageDO::getSendTime, pageReqVO.getSendTime()) diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java index 0fa3a47908..200ae695f1 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationService.java @@ -1,10 +1,8 @@ package cn.iocoder.yudao.module.im.service.conversation; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; -import jakarta.validation.Valid; import java.util.List; @@ -15,45 +13,6 @@ import java.util.List; */ public interface ConversationService { - /** - * 创建会话 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createConversation(@Valid ImConversationSaveReqVO createReqVO); - - /** - * 更新会话 - * - * @param updateReqVO 更新信息 - */ - void updateConversation(@Valid ImConversationSaveReqVO updateReqVO); - - /** - * 删除会话 - * - * @param id 编号 - */ - void deleteConversation(Long id); - - /** - * 获得会话 - * - * @param id 编号 - * @return 会话 - */ - ConversationDO getConversation(Long id); - - /** - * 获得会话分页 - * - * @param pageReqVO 分页查询 - * @return 会话分页 - */ - PageResult getConversationPage(ImConversationPageReqVO pageReqVO); - - /** * 获得用户的会话列表 * @@ -66,13 +25,13 @@ public interface ConversationService { * * @param updateReqVO 更新信息 */ - void updateTop(ImConversationSaveReqVO updateReqVO); + void updatePinned(ConversationPinnedReqVO updateReqVO); /** * 更新最后已读时间 * * @param updateReqVO 更新信息 */ - void updateLastReadTime(ImConversationSaveReqVO updateReqVO); + void updateLastReadTime(ConversationLastTimeReqVO updateReqVO); } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java index 7b1bd9a699..a01e30d6ae 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ConversationServiceImpl.java @@ -1,21 +1,18 @@ package cn.iocoder.yudao.module.im.service.conversation; -import cn.hutool.core.date.DateUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationLastTimeReqVO; +import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ConversationPinnedReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.conversation.ConversationDO; import cn.iocoder.yudao.module.im.dal.mysql.conversation.ConversationMapper; +import cn.iocoder.yudao.module.im.service.inbox.InboxService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import java.util.Date; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.CONVERSATION_NOT_EXISTS; /** * IM 会话 Service 实现类 @@ -26,52 +23,10 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.CONVERSATION_N @Validated public class ConversationServiceImpl implements ConversationService { - // TODO @hao: 自己模块的注入,不用带 im 前缀哈; @Resource private ConversationMapper conversationMapper; - - // TODO @hao: 这个方法,是不是不需要哈 - @Override - public Long createConversation(ImConversationSaveReqVO createReqVO) { - ConversationDO conversation = BeanUtils.toBean(createReqVO, ConversationDO.class); - conversationMapper.insert(conversation); - return conversation.getId(); - } - - // TODO @hao: 这个方法,是不是不需要哈 - @Override - public void updateConversation(ImConversationSaveReqVO updateReqVO) { - // 校验存在 - validateConversationExists(updateReqVO.getId()); - // 更新 - ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class); - conversationMapper.updateById(updateObj); - } - - // TODO @hao: 考虑到可能和端上不同步,可以不校验是不是存储。另外,不基于 id 删除。要基于 no + userId 删除哈。说白了,对端上要屏蔽 id 字段 - @Override - public void deleteConversation(Long id) { - // 校验存在 - validateConversationExists(id); - // 删除 - conversationMapper.deleteById(id); - } - - private void validateConversationExists(Long id) { - if (conversationMapper.selectById(id) == null) { - throw exception(CONVERSATION_NOT_EXISTS); - } - } - - @Override - public ConversationDO getConversation(Long id) { - return conversationMapper.selectById(id); - } - - @Override - public PageResult getConversationPage(ImConversationPageReqVO pageReqVO) { - return conversationMapper.selectPage(pageReqVO); - } + @Resource + private InboxService inboxService; @Override public List getConversationList() { @@ -79,31 +34,39 @@ public class ConversationServiceImpl implements ConversationService { } @Override - public void updateTop(ImConversationSaveReqVO updateReqVO) { - createOrUpdateConversation(updateReqVO); - } - - @Override - public void updateLastReadTime(ImConversationSaveReqVO updateReqVO) { - createOrUpdateConversation(updateReqVO); - } - - // TODO @hao:updateTop 和 updateLastReadTime 使用独立的逻辑实现,不使用统一的 ImConversationSaveReqVO; - // TODO 大体步骤建议: - // 1. 先 getOrderCreateConversation,查询会话,不存在则插入; - // 2. 更新对应的字段 - // 3. 做对应更新的 notify 推送 - private void createOrUpdateConversation(ImConversationSaveReqVO updateReqVO) { - // 操作会话(已读、置顶)时,才会延迟创建,要先判断是否存在,根据 no 查询是否存在,不存在则新增 + public void updatePinned(ConversationPinnedReqVO updateReqVO) { + // TODO @hao:updateTop 和 updateLastReadTime 使用独立的逻辑实现,不使用统一的 ImConversationSaveReqVO; + // TODO 大体步骤建议: + // 1. 先 getOrderCreateConversation,查询会话,不存在则插入; + // 2. 更新对应的字段 + // 3. 做对应更新的 notify 推送 ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo()); if (conversation == null) { ConversationDO conversationDO = new ConversationDO(); conversationDO.setNo(updateReqVO.getNo()); + conversationDO.setPinned(updateReqVO.getPinned()); + conversationDO.setUserId(updateReqVO.getUserId()); + conversationDO.setTargetId(updateReqVO.getTargetId()); + conversationDO.setType(updateReqVO.getType()); + conversationMapper.insert(conversationDO); + } else { + // 更新 + ConversationDO updateObj = BeanUtils.toBean(updateReqVO, ConversationDO.class); + conversationMapper.updateById(updateObj); + } + + } + + @Override + public void updateLastReadTime(ConversationLastTimeReqVO updateReqVO) { + ConversationDO conversation = conversationMapper.selectByNo(updateReqVO.getNo()); + if (conversation == null) { + ConversationDO conversationDO = new ConversationDO(); + conversationDO.setNo(updateReqVO.getNo()); + conversationDO.setLastReadTime(updateReqVO.getLastReadTime()); conversationDO.setUserId(updateReqVO.getUserId()); conversationDO.setTargetId(updateReqVO.getTargetId()); conversationDO.setType(updateReqVO.getType()); - conversationDO.setPinned(updateReqVO.getPinned()); - conversationDO.setLastReadTime(DateUtil.toLocalDateTime(new Date())); conversationMapper.insert(conversationDO); } else { // 更新 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/ImGroupMemberService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java similarity index 97% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/ImGroupMemberService.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java index 4c27936c0d..e003a23eb1 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/ImGroupMemberService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberService.java @@ -13,7 +13,7 @@ import java.util.List; * * @author 芋道源码 */ -public interface ImGroupMemberService { +public interface GroupMemberService { /** * 创建群成员 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/ImGroupMemberServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java similarity index 96% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/ImGroupMemberServiceImpl.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java index f4ebd31862..def340012d 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/ImGroupMemberServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/groupmember/GroupMemberServiceImpl.java @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*; */ @Service @Validated -public class ImGroupMemberServiceImpl implements ImGroupMemberService { +public class GroupMemberServiceImpl implements GroupMemberService { @Resource private ImGroupMemberMapper imGroupMemberMapper; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java deleted file mode 100755 index 948b5541e0..0000000000 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.iocoder.yudao.module.im.service.inbox; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxPageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; -import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; -import jakarta.validation.Valid; - -// TODO @hao:不用的方法,删除下哈; -/** - * IM 收件箱 Service 接口 - * - * @author 芋道源码 - */ -public interface ImInboxService { - - /** - * 创建收件箱 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createInbox(@Valid InboxSaveReqVO createReqVO); - - /** - * 更新收件箱 - * - * @param updateReqVO 更新信息 - */ - void updateInbox(@Valid InboxSaveReqVO updateReqVO); - - /** - * 删除收件箱 - * - * @param id 编号 - */ - void deleteInbox(Long id); - - /** - * 获得收件箱 - * - * @param id 编号 - * @return 收件箱 - */ - InboxDO getInbox(Long id); - - /** - * 获得收件箱分页 - * - * @param pageReqVO 分页查询 - * @return 收件箱分页 - */ - PageResult getInboxPage(ImInboxPageReqVO pageReqVO); - - /** - * 保存收件箱和发送消息 - * @param inboxSaveMessageReqVO 收件箱保存消息 Request VO - */ - void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessageReqVO); -} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java new file mode 100755 index 0000000000..b1715e0b4b --- /dev/null +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.im.service.inbox; + +import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; + +import java.util.List; + +/** + * IM 收件箱 Service 接口 + * + * @author 芋道源码 + */ +public interface InboxService { + + /** + * 保存收件箱和发送消息 + * + * @param inboxSaveMessageReqVO 收件箱保存消息 Request VO + */ + void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessageReqVO); + + /** + * 获得大于 sequence 的消息ids + * + * @param userId 用户编号 + * @param sequence 序列号 + * @param size 数量 + * @return 消息编号列表 + */ + List selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size); +} \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java similarity index 59% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java index f7bea8c510..472d297fc8 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java @@ -1,20 +1,17 @@ package cn.iocoder.yudao.module.im.service.inbox; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxPageReqVO; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveMessageReqVO; -import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO; import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSendMessageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.GroupMemberDO; import cn.iocoder.yudao.module.im.dal.dataobject.inbox.InboxDO; -import cn.iocoder.yudao.module.im.dal.mysql.inbox.ImInboxMapper; +import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper; import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO; import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao; import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; -import cn.iocoder.yudao.module.im.service.groupmember.ImGroupMemberService; +import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; import jakarta.annotation.Resource; import org.dromara.hutool.core.date.DateUnit; import org.springframework.stereotype.Service; @@ -22,9 +19,6 @@ import org.springframework.validation.annotation.Validated; import java.util.List; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.INBOX_NOT_EXISTS; - /** * 收件箱 Service 实现类 * @@ -32,13 +26,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.INBOX_NOT_EXIS */ @Service @Validated -public class ImInboxServiceImpl implements ImInboxService { +public class InboxServiceImpl implements InboxService { private static final Long INBOX_LOCK_TIMEOUT = 120 * DateUnit.SECOND.getMillis(); private static final String IM_MESSAGE_RECEIVE = "im-message-receive"; @Resource - private ImInboxMapper imInboxMapper; + private InboxMapper inboxMapper; @Resource private SequenceRedisDao sequenceRedisDao; // 序列生成器Redis DAO @Resource @@ -46,47 +40,7 @@ public class ImInboxServiceImpl implements ImInboxService { @Resource private WebSocketMessageSender webSocketMessageSender; // WebSocket消息发送器 @Resource - private ImGroupMemberService imGroupMemberService; - - @Override - public Long createInbox(InboxSaveReqVO createReqVO) { - InboxDO inbox = BeanUtils.toBean(createReqVO, InboxDO.class); - imInboxMapper.insert(inbox); - return inbox.getId(); - } - - @Override - public void updateInbox(InboxSaveReqVO updateReqVO) { - // 校验存在 - validateInboxExists(updateReqVO.getId()); - // 更新 - InboxDO updateObj = BeanUtils.toBean(updateReqVO, InboxDO.class); - imInboxMapper.updateById(updateObj); - } - - @Override - public void deleteInbox(Long id) { - // 校验存在 - validateInboxExists(id); - // 删除 - imInboxMapper.deleteById(id); - } - - private void validateInboxExists(Long id) { - if (imInboxMapper.selectById(id) == null) { - throw exception(INBOX_NOT_EXISTS); - } - } - - @Override - public InboxDO getInbox(Long id) { - return imInboxMapper.selectById(id); - } - - @Override - public PageResult getInboxPage(ImInboxPageReqVO pageReqVO) { - return imInboxMapper.selectPage(pageReqVO); - } + private GroupMemberService groupMemberService; @Override public void saveInboxAndSendMessage(InboxSaveMessageReqVO inboxSaveMessage) { @@ -96,11 +50,16 @@ public class ImInboxServiceImpl implements ImInboxService { if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.SINGLE.getType())) { saveInboxAndSendMessageForUser(inboxSaveMessage.getReceiverId(), inboxSaveMessage); } else if (inboxSaveMessage.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) { - List groupMembers = imGroupMemberService.selectByGroupId(inboxSaveMessage.getReceiverId()); + List groupMembers = groupMemberService.selectByGroupId(inboxSaveMessage.getReceiverId()); groupMembers.forEach(groupMemberDO -> saveInboxAndSendMessageForUser(groupMemberDO.getUserId(), inboxSaveMessage)); } } + @Override + public List selectMessageIdsByUserIdAndSequence(Long userId, Long sequence, Integer size) { + return inboxMapper.selectMessageIdsByUserIdAndSequence(userId, sequence, size); + } + private void saveInboxAndSendMessageForUser(Long userId, InboxSaveMessageReqVO inboxSaveMessage) { inboxLockRedisDAO.lock(userId, INBOX_LOCK_TIMEOUT, () -> { Long userSequence = sequenceRedisDao.generateSequence(userId); @@ -108,12 +67,8 @@ public class ImInboxServiceImpl implements ImInboxService { inbox.setUserId(userId); inbox.setMessageId(inboxSaveMessage.getMessageId()); inbox.setSequence(userSequence); - imInboxMapper.insert(inbox); + inboxMapper.insert(inbox); - //是发送人不发送 - if (userId.equals(inboxSaveMessage.getFromId())) { - return; - } InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class); message.setSequence(userSequence); webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java index 82b03dc767..ee58f42cbe 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageService.java @@ -15,13 +15,12 @@ import java.util.List; public interface MessageService { /** - * 获得消息分页 + * 获得历史消息 * * @param pageReqVO 分页查询 * @return 消息分页 */ - List getMessagePage(MessagePageReqVO pageReqVO); - + List getHistoryMessage(MessagePageReqVO pageReqVO); /** * 拉取消息-大于 seq 的消息 diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java index 76d2623852..4f837b0c53 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/MessageServiceImpl.java @@ -10,8 +10,8 @@ import cn.iocoder.yudao.module.im.dal.mysql.message.MessageMapper; import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum; import cn.iocoder.yudao.module.im.enums.message.MessageSourceEnum; import cn.iocoder.yudao.module.im.enums.message.MessageStatusEnum; -import cn.iocoder.yudao.module.im.service.groupmember.ImGroupMemberService; -import cn.iocoder.yudao.module.im.service.inbox.ImInboxService; +import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService; +import cn.iocoder.yudao.module.im.service.inbox.InboxService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; @@ -38,20 +38,21 @@ public class MessageServiceImpl implements MessageService { @Resource private MessageMapper messageMapper; @Resource - private ImInboxService imInboxService; // IM收件箱服务 + private InboxService inboxService; @Resource private AdminUserApi adminUserApi; @Resource - private ImGroupMemberService imGroupMemberService; + private GroupMemberService groupMemberService; @Override - public List getMessagePage(MessagePageReqVO pageReqVO) { - return messageMapper.getMessagePage(pageReqVO); + public List getHistoryMessage(MessagePageReqVO pageReqVO) { + return messageMapper.getHistoryMessage(pageReqVO); } @Override public List getMessageListBySequence(Long userId, Long sequence, Integer size) { - return messageMapper.getGreaterThanSequenceMessage(userId, sequence, size); + List messageIds = inboxService.selectMessageIdsByUserIdAndSequence(userId, sequence, size); + return messageMapper.selectBatchIds(messageIds); } @Override @@ -61,7 +62,7 @@ public class MessageServiceImpl implements MessageService { SendMessageRespVO sendMessageRespVO = saveMessage(fromUserId, message, inboxSaveMessageReqVO); // 保存收件箱 + 发送消息给用户 - imInboxService.saveInboxAndSendMessage(inboxSaveMessageReqVO); + inboxService.saveInboxAndSendMessage(inboxSaveMessageReqVO); return sendMessageRespVO; } @@ -112,7 +113,7 @@ public class MessageServiceImpl implements MessageService { } else if (message.getConversationType().equals(ConversationTypeEnum.GROUP.getType())) { //校验群聊是否存在; - List groupMemberDOS = imGroupMemberService.selectByGroupId(message.getReceiverId()); + List groupMemberDOS = groupMemberService.selectByGroupId(message.getReceiverId()); if (groupMemberDOS.isEmpty()) { throw exception(MESSAGE_RECEIVER_NOT_EXISTS); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/inbox/ImInboxMapper.xml b/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/inbox/InboxMapper.xml similarity index 85% rename from yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/inbox/ImInboxMapper.xml rename to yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/inbox/InboxMapper.xml index f78d7a77a5..5d6bd36ec3 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/inbox/ImInboxMapper.xml +++ b/yudao-module-im/yudao-module-im-biz/src/main/resources/mapper/inbox/InboxMapper.xml @@ -1,6 +1,6 @@ - +