From 2d052ea75291815081a9f4e77d4e795a02a655dc Mon Sep 17 00:00:00 2001
From: 安浩浩 <1036606149@qq.com>
Date: Wed, 13 Mar 2024 22:48:18 +0800
Subject: [PATCH] 修改:私聊消息存库
---
yudao-module-im/yudao-module-im-biz/pom.xml | 5 +++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java | 93 ---------------------------------------------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java | 33 +++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java | 35 +++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java | 36 ++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxPageReqVO.java | 33 ---------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxRespVO.java | 35 -----------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveReqVO.java | 26 --------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java | 6 ------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/InboxMapper.java | 4 ++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/RedisKeyConstants.java | 17 +++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java | 28 ++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java | 1 +
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java | 54 ------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java | 70 ----------------------------------------------------------------------
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java | 12 ++++++++----
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java | 24 ++++++++++++++++++++++--
yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java | 52 ++++++++++------------------------------------------
yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImplTest.java | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java | 135 ---------------------------------------------------------------------------------------------------------------------------------------
23 files changed, 549 insertions(+), 502 deletions(-)
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxPageReqVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxRespVO.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveReqVO.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/RedisKeyConstants.java
create mode 100644 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
create mode 100755 yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImplTest.java
delete mode 100755 yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java
diff --git a/yudao-module-im/yudao-module-im-biz/pom.xml b/yudao-module-im/yudao-module-im-biz/pom.xml
index 76c1a8b..9c6eba3 100644
--- a/yudao-module-im/yudao-module-im-biz/pom.xml
+++ b/yudao-module-im/yudao-module-im-biz/pom.xml
@@ -60,6 +60,11 @@
cn.iocoder.boot
yudao-spring-boot-starter-websocket
+
+
+ org.redisson
+ redisson-spring-boot-starter
+
\ 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/ImInboxController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java
new file mode 100755
index 0000000..4912f72
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java
@@ -0,0 +1,93 @@
+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.ImInboxSaveReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
+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 ImInboxSaveReqVO createReqVO) {
+ return success(imInboxService.createInbox(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新收件箱")
+ @PreAuthorize("@ss.hasPermission('im:inbox:update')")
+ public CommonResult updateInbox(@Valid @RequestBody ImInboxSaveReqVO 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) {
+ ImInboxDO 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/InboxController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java
deleted file mode 100755
index 63a62f1..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.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.InboxPageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxRespVO;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
-import cn.iocoder.yudao.module.im.service.inbox.InboxService;
-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 InboxController {
-
- @Resource
- private InboxService inboxService;
-
- @PostMapping("/create")
- @Operation(summary = "创建收件箱")
- @PreAuthorize("@ss.hasPermission('im:inbox:create')")
- public CommonResult createInbox(@Valid @RequestBody InboxSaveReqVO createReqVO) {
- return success(inboxService.createInbox(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新收件箱")
- @PreAuthorize("@ss.hasPermission('im:inbox:update')")
- public CommonResult updateInbox(@Valid @RequestBody InboxSaveReqVO updateReqVO) {
- inboxService.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) {
- inboxService.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) {
- ImInboxDO inbox = inboxService.getInbox(id);
- return success(BeanUtils.toBean(inbox, InboxRespVO.class));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得收件箱分页")
- @PreAuthorize("@ss.hasPermission('im:inbox:query')")
- public CommonResult> getInboxPage(@Valid InboxPageReqVO pageReqVO) {
- PageResult pageResult = inboxService.getInboxPage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, InboxRespVO.class));
- }
-
- @GetMapping("/export-excel")
- @Operation(summary = "导出收件箱 Excel")
- @PreAuthorize("@ss.hasPermission('im:inbox:export')")
- @OperateLog(type = EXPORT)
- public void exportInboxExcel(@Valid InboxPageReqVO pageReqVO,
- HttpServletResponse response) throws IOException {
- pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
- List list = inboxService.getInboxPage(pageReqVO).getList();
- // 导出 Excel
- ExcelUtils.write(response, "收件箱.xls", "数据", InboxRespVO.class,
- BeanUtils.toBean(list, InboxRespVO.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/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
new file mode 100755
index 0000000..edd77c9
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java
@@ -0,0 +1,33 @@
+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;
+
+@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
new file mode 100755
index 0000000..e2a4243
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java
@@ -0,0 +1,35 @@
+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;
+
+@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/ImInboxSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java
new file mode 100755
index 0000000..3750491
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java
@@ -0,0 +1,36 @@
+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;
+
+@Schema(description = "管理后台 - 收件箱新增/修改 Request VO")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ImInboxSaveReqVO {
+
+ @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 ImInboxSaveReqVO(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/inbox/vo/InboxPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxPageReqVO.java
deleted file mode 100755
index 7eba083..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxPageReqVO.java
+++ /dev/null
@@ -1,33 +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;
-
-@Schema(description = "管理后台 - 收件箱分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class InboxPageReqVO 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/InboxRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxRespVO.java
deleted file mode 100755
index b098ce5..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxRespVO.java
+++ /dev/null
@@ -1,35 +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;
-
-@Schema(description = "管理后台 - 收件箱 Response VO")
-@Data
-@ExcelIgnoreUnannotated
-public class InboxRespVO {
-
- @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 cb6e38a..0000000
--- 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,26 +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.Data;
-
-@Schema(description = "管理后台 - 收件箱新增/修改 Request VO")
-@Data
-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;
-
-}
\ 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/ImMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
index f0ca03d..eabe62b 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java
@@ -90,10 +90,4 @@ public class ImMessageController {
BeanUtils.toBean(list, ImMessageRespVO.class));
}
- @PostMapping("/send")
- @Operation(summary = "发送私聊消息")
- public CommonResult sendMessage(@Valid @RequestBody ImMessageSaveReqVO imMessageSaveReqVO) {
- return success(imMessageService.sendPrivateMessage(imMessageSaveReqVO));
- }
-
}
\ 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
index fe861c5..90426d0 100755
--- 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
@@ -3,7 +3,7 @@ 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.InboxPageReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxPageReqVO;
import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
import org.apache.ibatis.annotations.Mapper;
@@ -15,7 +15,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface InboxMapper extends BaseMapperX {
- default PageResult selectPage(InboxPageReqVO reqVO) {
+ default PageResult selectPage(ImInboxPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX()
.eqIfPresent(ImInboxDO::getUserId, reqVO.getUserId())
.eqIfPresent(ImInboxDO::getMessageId, reqVO.getMessageId())
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/RedisKeyConstants.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/RedisKeyConstants.java
new file mode 100644
index 0000000..906c892
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/RedisKeyConstants.java
@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.im.dal.redis;
+
+
+/**
+ * im Redis Key 枚举类
+ *
+ * @author 芋道源码
+ */
+public interface RedisKeyConstants {
+
+ /**
+ * 收件箱序号生成器
+ * KEY 格式: im:inbox:sequence:{userId}
+ * VALUE 数据类型: String
+ */
+ String INBOX_SEQUENCE = "im_inbox_sequence:%s";
+}
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java
new file mode 100644
index 0000000..ff6dd71
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java
@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.im.dal.redis.inbox;
+
+import jakarta.annotation.Resource;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Repository;
+
+import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUENCE;
+
+/**
+ * 序号生成器 Redis DAO
+ *
+ * @author anhaohao
+ */
+@Repository
+public class SequenceGeneratorRedisDao {
+
+ @Resource
+ private RedisTemplate redisTemplate;
+
+ private static String formatKey(Long userId) {
+ return String.format(INBOX_SEQUENCE, userId);
+ }
+
+ public Long generateSequence(Long userId) {
+ return redisTemplate.opsForValue().increment(formatKey(userId), 1);
+ }
+
+}
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java
index 0980a92..504591d 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java
@@ -51,4 +51,5 @@ public interface ImConversationService {
*/
PageResult getConversationPage(ImConversationPageReqVO pageReqVO);
+
}
\ 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/ImInboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java
new file mode 100755
index 0000000..45fc80d
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java
@@ -0,0 +1,54 @@
+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.ImInboxSaveReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
+import jakarta.validation.Valid;
+
+/**
+ * 收件箱 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface ImInboxService {
+
+ /**
+ * 创建收件箱
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createInbox(@Valid ImInboxSaveReqVO createReqVO);
+
+ /**
+ * 更新收件箱
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateInbox(@Valid ImInboxSaveReqVO updateReqVO);
+
+ /**
+ * 删除收件箱
+ *
+ * @param id 编号
+ */
+ void deleteInbox(Long id);
+
+ /**
+ * 获得收件箱
+ *
+ * @param id 编号
+ * @return 收件箱
+ */
+ ImInboxDO getInbox(Long id);
+
+ /**
+ * 获得收件箱分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 收件箱分页
+ */
+ PageResult getInboxPage(ImInboxPageReqVO pageReqVO);
+
+}
\ 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/ImInboxServiceImpl.java
new file mode 100755
index 0000000..eabaaa9
--- /dev/null
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java
@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.im.service.inbox;
+
+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.inbox.vo.ImInboxPageReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxSaveReqVO;
+import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
+import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.INBOX_NOT_EXISTS;
+
+/**
+ * 收件箱 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class ImInboxServiceImpl implements ImInboxService {
+
+ @Resource
+ private InboxMapper inboxMapper;
+
+ @Override
+ public Long createInbox(ImInboxSaveReqVO createReqVO) {
+ // 插入
+ ImInboxDO inbox = BeanUtils.toBean(createReqVO, ImInboxDO.class);
+ inboxMapper.insert(inbox);
+ // 返回
+ return inbox.getId();
+ }
+
+ @Override
+ public void updateInbox(ImInboxSaveReqVO updateReqVO) {
+ // 校验存在
+ validateInboxExists(updateReqVO.getId());
+ // 更新
+ ImInboxDO updateObj = BeanUtils.toBean(updateReqVO, ImInboxDO.class);
+ inboxMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteInbox(Long id) {
+ // 校验存在
+ validateInboxExists(id);
+ // 删除
+ inboxMapper.deleteById(id);
+ }
+
+ private void validateInboxExists(Long id) {
+ if (inboxMapper.selectById(id) == null) {
+ throw exception(INBOX_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public ImInboxDO getInbox(Long id) {
+ return inboxMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getInboxPage(ImInboxPageReqVO pageReqVO) {
+ return inboxMapper.selectPage(pageReqVO);
+ }
+
+}
\ 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
deleted file mode 100755
index ba28404..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java
+++ /dev/null
@@ -1,54 +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.InboxPageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
-import jakarta.validation.Valid;
-
-/**
- * 收件箱 Service 接口
- *
- * @author 芋道源码
- */
-public interface InboxService {
-
- /**
- * 创建收件箱
- *
- * @param createReqVO 创建信息
- * @return 编号
- */
- Long createInbox(@Valid InboxSaveReqVO createReqVO);
-
- /**
- * 更新收件箱
- *
- * @param updateReqVO 更新信息
- */
- void updateInbox(@Valid InboxSaveReqVO updateReqVO);
-
- /**
- * 删除收件箱
- *
- * @param id 编号
- */
- void deleteInbox(Long id);
-
- /**
- * 获得收件箱
- *
- * @param id 编号
- * @return 收件箱
- */
- ImInboxDO getInbox(Long id);
-
- /**
- * 获得收件箱分页
- *
- * @param pageReqVO 分页查询
- * @return 收件箱分页
- */
- PageResult getInboxPage(InboxPageReqVO pageReqVO);
-
-}
\ 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/InboxServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
deleted file mode 100755
index 350cde3..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package cn.iocoder.yudao.module.im.service.inbox;
-
-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.inbox.vo.InboxPageReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.InboxSaveReqVO;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
-import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper;
-import jakarta.annotation.Resource;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.INBOX_NOT_EXISTS;
-
-/**
- * 收件箱 Service 实现类
- *
- * @author 芋道源码
- */
-@Service
-@Validated
-public class InboxServiceImpl implements InboxService {
-
- @Resource
- private InboxMapper inboxMapper;
-
- @Override
- public Long createInbox(InboxSaveReqVO createReqVO) {
- // 插入
- ImInboxDO inbox = BeanUtils.toBean(createReqVO, ImInboxDO.class);
- inboxMapper.insert(inbox);
- // 返回
- return inbox.getId();
- }
-
- @Override
- public void updateInbox(InboxSaveReqVO updateReqVO) {
- // 校验存在
- validateInboxExists(updateReqVO.getId());
- // 更新
- ImInboxDO updateObj = BeanUtils.toBean(updateReqVO, ImInboxDO.class);
- inboxMapper.updateById(updateObj);
- }
-
- @Override
- public void deleteInbox(Long id) {
- // 校验存在
- validateInboxExists(id);
- // 删除
- inboxMapper.deleteById(id);
- }
-
- private void validateInboxExists(Long id) {
- if (inboxMapper.selectById(id) == null) {
- throw exception(INBOX_NOT_EXISTS);
- }
- }
-
- @Override
- public ImInboxDO getInbox(Long id) {
- return inboxMapper.selectById(id);
- }
-
- @Override
- public PageResult getInboxPage(InboxPageReqVO pageReqVO) {
- return inboxMapper.selectPage(pageReqVO);
- }
-
-}
\ 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/message/ImMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java
index 37af3a1..6a53f61 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessagePageReqVO;
import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO;
import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
+import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
import jakarta.validation.Valid;
/**
@@ -51,10 +52,13 @@ public interface ImMessageService {
*/
PageResult getMessagePage(ImMessagePageReqVO pageReqVO);
+
/**
- * 发送私聊消息
- * @param imMessageSaveReqVO 消息信息
- * @return 消息编号
+ * 保存私聊消息
+ *
+ * @param imSendMessage 消息信息
+ * @param fromUserId 发送人编号
+ * @return id
*/
- Long sendPrivateMessage(ImMessageSaveReqVO imMessageSaveReqVO);
+ Long savePrivateMessage(ImSendMessage imSendMessage, Long fromUserId);
}
\ 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/message/ImMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java
index 81ab538..2110503 100755
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java
@@ -6,6 +6,9 @@ import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessagePageReqVO
import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO;
import cn.iocoder.yudao.module.im.dal.dataobject.message.ImMessageDO;
import cn.iocoder.yudao.module.im.dal.mysql.message.ImMessageMapper;
+import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@@ -24,6 +27,8 @@ public class ImMessageServiceImpl implements ImMessageService {
@Resource
private ImMessageMapper imMessageMapper;
+ @Resource
+ private AdminUserApi adminUserApi;
@Override
public Long createMessage(ImMessageSaveReqVO createReqVO) {
@@ -67,9 +72,24 @@ public class ImMessageServiceImpl implements ImMessageService {
return imMessageMapper.selectPage(pageReqVO);
}
+
@Override
- public Long sendPrivateMessage(ImMessageSaveReqVO imMessageSaveReqVO) {
- return 0L;
+ public Long savePrivateMessage(ImSendMessage message, Long fromUserId) {
+ ImMessageSaveReqVO imMessageSaveReqVO = new ImMessageSaveReqVO();
+ imMessageSaveReqVO.setClientMessageId(message.getClientMessageId());
+ imMessageSaveReqVO.setSenderId(fromUserId);
+ imMessageSaveReqVO.setReceiverId(message.getReceiverId());
+ //查询发送人昵称和发送人头像
+ AdminUserRespDTO user = adminUserApi.getUser(fromUserId);
+ imMessageSaveReqVO.setSenderNickname(user.getNickname());
+ imMessageSaveReqVO.setSenderAvatar(user.getAvatar());
+ imMessageSaveReqVO.setConversationType(message.getConversationType());
+ imMessageSaveReqVO.setContentType(message.getContentType());
+ imMessageSaveReqVO.setConversationNo("1");
+ imMessageSaveReqVO.setContent(message.getContent());
+ //消息来源 100-用户发送;200-系统发送(一般是通知);不能为空
+ imMessageSaveReqVO.setSendFrom(100);
+ return createMessage(imMessageSaveReqVO);
}
}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java
index b035884..17bf9e6 100644
--- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java
+++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java
@@ -4,15 +4,14 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener;
import cn.iocoder.yudao.framework.websocket.core.sender.WebSocketMessageSender;
import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;
-import cn.iocoder.yudao.module.im.controller.admin.conversation.vo.ImConversationSaveReqVO;
-import cn.iocoder.yudao.module.im.controller.admin.message.vo.ImMessageSaveReqVO;
+import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxSaveReqVO;
+import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceGeneratorRedisDao;
import cn.iocoder.yudao.module.im.enums.conversation.ImConversationTypeEnum;
import cn.iocoder.yudao.module.im.service.conversation.ImConversationService;
+import cn.iocoder.yudao.module.im.service.inbox.ImInboxService;
import cn.iocoder.yudao.module.im.service.message.ImMessageService;
import cn.iocoder.yudao.module.im.websocket.message.ImReceiveMessage;
import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
-import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
-import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
@@ -30,54 +29,23 @@ public class ImWebSocketMessageListener implements WebSocketMessageListener {
+ o.setId(dbInbox.getId()); // 设置更新的 ID
+ });
+
+ // 调用
+ inboxService.updateInbox(updateReqVO);
+ // 校验是否更新正确
+ ImInboxDO inbox = inboxMapper.selectById(updateReqVO.getId()); // 获取最新的
+ assertPojoEquals(updateReqVO, inbox);
+ }
+
+ @Test
+ public void testUpdateInbox_notExists() {
+ // 准备参数
+ ImInboxSaveReqVO updateReqVO = randomPojo(ImInboxSaveReqVO.class);
+
+ // 调用, 并断言异常
+ assertServiceException(() -> inboxService.updateInbox(updateReqVO), INBOX_NOT_EXISTS);
+ }
+
+ @Test
+ public void testDeleteInbox_success() {
+ // mock 数据
+ ImInboxDO dbInbox = randomPojo(ImInboxDO.class);
+ inboxMapper.insert(dbInbox);// @Sql: 先插入出一条存在的数据
+ // 准备参数
+ Long id = dbInbox.getId();
+
+ // 调用
+ inboxService.deleteInbox(id);
+ // 校验数据不存在了
+ assertNull(inboxMapper.selectById(id));
+ }
+
+ @Test
+ public void testDeleteInbox_notExists() {
+ // 准备参数
+ Long id = randomLongId();
+
+ // 调用, 并断言异常
+ assertServiceException(() -> inboxService.deleteInbox(id), INBOX_NOT_EXISTS);
+ }
+
+ @Test
+ @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+ public void testGetInboxPage() {
+ // mock 数据
+ ImInboxDO dbInbox = randomPojo(ImInboxDO.class, o -> { // 等会查询到
+ o.setUserId(null);
+ o.setMessageId(null);
+ o.setSequence(null);
+ o.setCreateTime(null);
+ });
+ inboxMapper.insert(dbInbox);
+ // 测试 userId 不匹配
+ inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setUserId(null)));
+ // 测试 messageId 不匹配
+ inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setMessageId(null)));
+ // 测试 sequence 不匹配
+ inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setSequence(null)));
+ // 测试 createTime 不匹配
+ inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setCreateTime(null)));
+ // 准备参数
+ ImInboxPageReqVO reqVO = new ImInboxPageReqVO();
+ reqVO.setUserId(null);
+ reqVO.setMessageId(null);
+ reqVO.setSequence(null);
+ reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+ // 调用
+ PageResult pageResult = inboxService.getInboxPage(reqVO);
+ // 断言
+ assertEquals(1, pageResult.getTotal());
+ assertEquals(1, pageResult.getList().size());
+ assertPojoEquals(dbInbox, pageResult.getList().get(0));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java b/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java
deleted file mode 100755
index 229448b..0000000
--- a/yudao-module-im/yudao-module-im-biz/src/test/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImplTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package cn.iocoder.yudao.module.im.service.inbox;
-
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import jakarta.annotation.Resource;
-
-import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
-
-import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.*;
-import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO;
-import cn.iocoder.yudao.module.im.dal.mysql.inbox.InboxMapper;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-
-import org.springframework.context.annotation.Import;
-
-import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.*;
-import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
-import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*;
-import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * {@link InboxServiceImpl} 的单元测试类
- *
- * @author 芋道源码
- */
-@Import(InboxServiceImpl.class)
-public class InboxServiceImplTest extends BaseDbUnitTest {
-
- @Resource
- private InboxServiceImpl inboxService;
-
- @Resource
- private InboxMapper inboxMapper;
-
- @Test
- public void testCreateInbox_success() {
- // 准备参数
- InboxSaveReqVO createReqVO = randomPojo(InboxSaveReqVO.class).setId(null);
-
- // 调用
- Long inboxId = inboxService.createInbox(createReqVO);
- // 断言
- assertNotNull(inboxId);
- // 校验记录的属性是否正确
- ImInboxDO inbox = inboxMapper.selectById(inboxId);
- assertPojoEquals(createReqVO, inbox, "id");
- }
-
- @Test
- public void testUpdateInbox_success() {
- // mock 数据
- ImInboxDO dbInbox = randomPojo(ImInboxDO.class);
- inboxMapper.insert(dbInbox);// @Sql: 先插入出一条存在的数据
- // 准备参数
- InboxSaveReqVO updateReqVO = randomPojo(InboxSaveReqVO.class, o -> {
- o.setId(dbInbox.getId()); // 设置更新的 ID
- });
-
- // 调用
- inboxService.updateInbox(updateReqVO);
- // 校验是否更新正确
- ImInboxDO inbox = inboxMapper.selectById(updateReqVO.getId()); // 获取最新的
- assertPojoEquals(updateReqVO, inbox);
- }
-
- @Test
- public void testUpdateInbox_notExists() {
- // 准备参数
- InboxSaveReqVO updateReqVO = randomPojo(InboxSaveReqVO.class);
-
- // 调用, 并断言异常
- assertServiceException(() -> inboxService.updateInbox(updateReqVO), INBOX_NOT_EXISTS);
- }
-
- @Test
- public void testDeleteInbox_success() {
- // mock 数据
- ImInboxDO dbInbox = randomPojo(ImInboxDO.class);
- inboxMapper.insert(dbInbox);// @Sql: 先插入出一条存在的数据
- // 准备参数
- Long id = dbInbox.getId();
-
- // 调用
- inboxService.deleteInbox(id);
- // 校验数据不存在了
- assertNull(inboxMapper.selectById(id));
- }
-
- @Test
- public void testDeleteInbox_notExists() {
- // 准备参数
- Long id = randomLongId();
-
- // 调用, 并断言异常
- assertServiceException(() -> inboxService.deleteInbox(id), INBOX_NOT_EXISTS);
- }
-
- @Test
- @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
- public void testGetInboxPage() {
- // mock 数据
- ImInboxDO dbInbox = randomPojo(ImInboxDO.class, o -> { // 等会查询到
- o.setUserId(null);
- o.setMessageId(null);
- o.setSequence(null);
- o.setCreateTime(null);
- });
- inboxMapper.insert(dbInbox);
- // 测试 userId 不匹配
- inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setUserId(null)));
- // 测试 messageId 不匹配
- inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setMessageId(null)));
- // 测试 sequence 不匹配
- inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setSequence(null)));
- // 测试 createTime 不匹配
- inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setCreateTime(null)));
- // 准备参数
- InboxPageReqVO reqVO = new InboxPageReqVO();
- reqVO.setUserId(null);
- reqVO.setMessageId(null);
- reqVO.setSequence(null);
- reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-
- // 调用
- PageResult pageResult = inboxService.getInboxPage(reqVO);
- // 断言
- assertEquals(1, pageResult.getTotal());
- assertEquals(1, pageResult.getList().size());
- assertPojoEquals(dbInbox, pageResult.getList().get(0));
- }
-
-}
\ No newline at end of file
--
libgit2 0.21.4