diff --git a/yudao-module-im/yudao-module-im-biz/pom.xml b/yudao-module-im/yudao-module-im-biz/pom.xml index 76c1a8b95e..9c6eba3d16 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/InboxController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java similarity index 65% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/InboxController.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/ImInboxController.java index 63a62f1869..4912f72c46 100755 --- 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/ImInboxController.java @@ -6,11 +6,11 @@ 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.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.InboxService; +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; @@ -31,23 +31,23 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E @RestController @RequestMapping("/im/inbox") @Validated -public class InboxController { +public class ImInboxController { @Resource - private InboxService inboxService; + private ImInboxService imInboxService; @PostMapping("/create") @Operation(summary = "创建收件箱") @PreAuthorize("@ss.hasPermission('im:inbox:create')") - public CommonResult createInbox(@Valid @RequestBody InboxSaveReqVO createReqVO) { - return success(inboxService.createInbox(createReqVO)); + 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 InboxSaveReqVO updateReqVO) { - inboxService.updateInbox(updateReqVO); + public CommonResult updateInbox(@Valid @RequestBody ImInboxSaveReqVO updateReqVO) { + imInboxService.updateInbox(updateReqVO); return success(true); } @@ -56,7 +56,7 @@ public class InboxController { @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('im:inbox:delete')") public CommonResult deleteInbox(@RequestParam("id") Long id) { - inboxService.deleteInbox(id); + imInboxService.deleteInbox(id); return success(true); } @@ -64,30 +64,30 @@ public class InboxController { @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)); + 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 InboxPageReqVO pageReqVO) { - PageResult pageResult = inboxService.getInboxPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, InboxRespVO.class)); + 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 InboxPageReqVO pageReqVO, + public void exportInboxExcel(@Valid ImInboxPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = inboxService.getInboxPage(pageReqVO).getList(); + List list = imInboxService.getInboxPage(pageReqVO).getList(); // 导出 Excel - ExcelUtils.write(response, "收件箱.xls", "数据", InboxRespVO.class, - BeanUtils.toBean(list, InboxRespVO.class)); + 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/vo/InboxPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java similarity index 95% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxPageReqVO.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java index 7eba083fa0..edd77c9384 100755 --- 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/ImInboxPageReqVO.java @@ -15,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class InboxPageReqVO extends PageParam { +public class ImInboxPageReqVO extends PageParam { @Schema(description = "用户编号", example = "3979") private Long userId; 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/ImInboxRespVO.java similarity index 97% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxRespVO.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java index b098ce5a00..e2a4243325 100755 --- 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/ImInboxRespVO.java @@ -10,7 +10,7 @@ import java.time.LocalDateTime; @Schema(description = "管理后台 - 收件箱 Response VO") @Data @ExcelIgnoreUnannotated -public class InboxRespVO { +public class ImInboxRespVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18389") @ExcelProperty("编号") 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/ImInboxSaveReqVO.java similarity index 74% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/InboxSaveReqVO.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java index cb6e38a874..37504919ee 100755 --- 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/ImInboxSaveReqVO.java @@ -2,11 +2,15 @@ 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 -public class InboxSaveReqVO { +@AllArgsConstructor +@NoArgsConstructor +public class ImInboxSaveReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18389") private Long id; @@ -23,4 +27,10 @@ public class InboxSaveReqVO { @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/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 f0ca03d17b..eabe62b93a 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 fe861c5532..90426d09ad 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 0000000000..906c892968 --- /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 0000000000..ff6dd71ba8 --- /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 0980a92e50..504591d95e 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/InboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java similarity index 68% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxService.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java index ba28404d39..45fc80dd05 100755 --- 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/ImInboxService.java @@ -1,8 +1,8 @@ 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.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; @@ -11,7 +11,7 @@ import jakarta.validation.Valid; * * @author 芋道源码 */ -public interface InboxService { +public interface ImInboxService { /** * 创建收件箱 @@ -19,14 +19,14 @@ public interface InboxService { * @param createReqVO 创建信息 * @return 编号 */ - Long createInbox(@Valid InboxSaveReqVO createReqVO); + Long createInbox(@Valid ImInboxSaveReqVO createReqVO); /** * 更新收件箱 * * @param updateReqVO 更新信息 */ - void updateInbox(@Valid InboxSaveReqVO updateReqVO); + void updateInbox(@Valid ImInboxSaveReqVO updateReqVO); /** * 删除收件箱 @@ -49,6 +49,6 @@ public interface InboxService { * @param pageReqVO 分页查询 * @return 收件箱分页 */ - PageResult getInboxPage(InboxPageReqVO pageReqVO); + 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/InboxServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java similarity index 80% rename from yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/InboxServiceImpl.java rename to yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java index 350cde3624..eabaaa9d62 100755 --- 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/ImInboxServiceImpl.java @@ -2,8 +2,8 @@ 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.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; @@ -20,13 +20,13 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.INBOX_NOT_EXIS */ @Service @Validated -public class InboxServiceImpl implements InboxService { +public class ImInboxServiceImpl implements ImInboxService { @Resource private InboxMapper inboxMapper; @Override - public Long createInbox(InboxSaveReqVO createReqVO) { + public Long createInbox(ImInboxSaveReqVO createReqVO) { // 插入 ImInboxDO inbox = BeanUtils.toBean(createReqVO, ImInboxDO.class); inboxMapper.insert(inbox); @@ -35,7 +35,7 @@ public class InboxServiceImpl implements InboxService { } @Override - public void updateInbox(InboxSaveReqVO updateReqVO) { + public void updateInbox(ImInboxSaveReqVO updateReqVO) { // 校验存在 validateInboxExists(updateReqVO.getId()); // 更新 @@ -63,7 +63,7 @@ public class InboxServiceImpl implements InboxService { } @Override - public PageResult getInboxPage(InboxPageReqVO pageReqVO) { + public PageResult getInboxPage(ImInboxPageReqVO pageReqVO) { return inboxMapper.selectPage(pageReqVO); } 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 37af3a10da..6a53f613be 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 81ab53819f..2110503516 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 b03588453a..17bf9e66a6 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 { + ImInboxSaveReqVO updateReqVO = randomPojo(ImInboxSaveReqVO.class, o -> { o.setId(dbInbox.getId()); // 设置更新的 ID }); @@ -69,7 +69,7 @@ public class InboxServiceImplTest extends BaseDbUnitTest { @Test public void testUpdateInbox_notExists() { // 准备参数 - InboxSaveReqVO updateReqVO = randomPojo(InboxSaveReqVO.class); + ImInboxSaveReqVO updateReqVO = randomPojo(ImInboxSaveReqVO.class); // 调用, 并断言异常 assertServiceException(() -> inboxService.updateInbox(updateReqVO), INBOX_NOT_EXISTS); @@ -118,7 +118,7 @@ public class InboxServiceImplTest extends BaseDbUnitTest { // 测试 createTime 不匹配 inboxMapper.insert(cloneIgnoreId(dbInbox, o -> o.setCreateTime(null))); // 准备参数 - InboxPageReqVO reqVO = new InboxPageReqVO(); + ImInboxPageReqVO reqVO = new ImInboxPageReqVO(); reqVO.setUserId(null); reqVO.setMessageId(null); reqVO.setSequence(null);