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