From 7e027b493d5b91b5a41e13ca6bcccbe3371cf9e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E4=BD=B3=E8=B1=AA?= Date: Mon, 30 Jun 2025 11:11:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81=E5=8A=A0?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- .../src/main/resources/application-dev.yml | 2 +- ruoyi-common/ruoyi-common-job/pom.xml | 2 + ruoyi-modules/ruoyi-content/pom.xml | 4 + .../controller/admin/CommentController.java | 19 +-- .../soopin/content/convert/VlogConvert.java | 16 ++ .../content/service/impl/VlogServiceImpl.java | 72 +++++++-- ruoyi-modules/ruoyi-member/pom.xml | 3 +- ruoyi-modules/ruoyi-order/pom.xml | 12 +- ruoyi-modules/ruoyi-system/pom.xml | 5 +- .../controller/SysMessageController.java | 20 +++ .../org/dromara/system/domain/SysMessage.java | 4 +- .../system/domain/bo/SysMessageBo.java | 1 + .../system/service/ISysMessageService.java | 29 ++-- .../service/impl/SysMessageServiceImpl.java | 138 ++++++++++++++---- .../system/task/MessageScheduledTask.java | 69 ++++----- 16 files changed, 286 insertions(+), 116 deletions(-) create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/convert/VlogConvert.java diff --git a/pom.xml b/pom.xml index ebc2af323..189577b76 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 3.45.1 2.2.7 4.3.1 - 1.4.0 + 1.5.0 1.4.6 0.2.0 1.18.36 @@ -306,12 +306,12 @@ com.aizuda snail-job-client-starter - ${snailjob.version} + 1.5.0 com.aizuda snail-job-client-job-core - ${snailjob.version} + 1.5.0 diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index e7610ec83..89644bb00 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -20,7 +20,7 @@ spring: --- # snail-job 配置 snail-job: - enabled: false + enabled: true # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 group: "ruoyi_group" # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表 diff --git a/ruoyi-common/ruoyi-common-job/pom.xml b/ruoyi-common/ruoyi-common-job/pom.xml index 3a4a0cbd8..041449c03 100644 --- a/ruoyi-common/ruoyi-common-job/pom.xml +++ b/ruoyi-common/ruoyi-common-job/pom.xml @@ -26,10 +26,12 @@ com.aizuda snail-job-client-starter + 1.5.0 com.aizuda snail-job-client-job-core + 1.5.0 diff --git a/ruoyi-modules/ruoyi-content/pom.xml b/ruoyi-modules/ruoyi-content/pom.xml index 7114dbdcd..ad15ce273 100644 --- a/ruoyi-modules/ruoyi-content/pom.xml +++ b/ruoyi-modules/ruoyi-content/pom.xml @@ -174,6 +174,10 @@ tencentcloud-sdk-java-common 3.1.1030 + + org.dromara + ruoyi-system + diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/CommentController.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/CommentController.java index 1cb656373..e6711ea9e 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/CommentController.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/CommentController.java @@ -49,21 +49,16 @@ public class CommentController extends BaseController { } @ApiOperation("查询视频评论列表") - @GetMapping("/vlogComments") - public TableDataInfo queryVlogComments( - @ApiParam(value = "视频ID") @RequestParam String vlogId, - @ApiParam(value = "用户ID") @RequestParam(required = false) String userId, - PageQuery pageQuery) { + @PostMapping("/vlogComments") + public R> queryVlogComments( + @RequestBody CommentBO bo, + @RequestBody Page page) { try { - return commentService.queryVlogComments(vlogId, userId, pageQuery); + Page commentPage = commentService.pageComment(page, bo); + return R.ok(commentPage); } catch (Exception e) { log.error("查询视频评论列表失败", e); - TableDataInfo errorResponse = new TableDataInfo<>(); - errorResponse.setCode(HttpStatus.ERROR); - errorResponse.setMsg("查询视频评论列表失败: " + e.getMessage()); - errorResponse.setRows(Collections.emptyList()); - errorResponse.setTotal(0L); - return errorResponse; + return R.fail("查询视频评论列表失败: " + e.getMessage()); } } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/convert/VlogConvert.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/convert/VlogConvert.java new file mode 100644 index 000000000..b50e7a51a --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/convert/VlogConvert.java @@ -0,0 +1,16 @@ +package com.wzj.soopin.content.convert; + +import com.wzj.soopin.content.domain.po.Vlog; +import com.wzj.soopin.content.domain.vo.IndexVlogVO; +import com.wzj.soopin.content.domain.bo.VlogBO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = "spring") +public interface VlogConvert { + VlogConvert INSTANCE = Mappers.getMapper(VlogConvert.class); + + IndexVlogVO toVO(Vlog vlog); + + Vlog toEntity(VlogBO vlogBO); +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java index fb409828e..b1057ee42 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java @@ -27,11 +27,16 @@ import com.wzj.soopin.content.utils.RedisOperator; import com.wzj.soopin.content.utils.Sid; import com.wzj.soopin.content.utils.TencentCloudUtil; import com.wzj.soopin.member.service.IFansService; +import com.wzj.soopin.content.convert.VlogConvert; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.dromara.system.service.ISysMessageService; +import org.dromara.system.service.ISysMessageTemplateService; +import org.dromara.system.domain.bo.SysMessageBo; +import org.dromara.system.domain.vo.SysMessageTemplateVo; import java.time.Instant; import java.time.LocalDateTime; @@ -63,6 +68,12 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { private TencentCloudUtil tencentCloudUtil; @Autowired private UsersMapper usersMapper; + @Autowired + private VlogConvert vlogConvert; + @Autowired + private ISysMessageService sysMessageService; + @Autowired + private ISysMessageTemplateService templateService; @Transactional @Override @@ -72,6 +83,31 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { .set(Vlog::getStatus, status) .set(Vlog::getReason, reason); vlogMapper.update(null, updateWrapper); + + // 1. 获取视频信息,找到上传者 + Vlog vlog = vlogMapper.selectByFileId(fileId); + if (vlog == null) return; + String uploaderId = vlog.getVlogerId(); + + // 2. 选择模板(假设你有模板ID,实际可配置到常量或数据库) + Long templateId = (status == 1) ? 1001L : 1002L; // 1001=审核通过模板,1002=驳回模板 + SysMessageTemplateVo template = templateService.selectTemplateById(templateId); + if (template == null) return; + + // 3. 参数替换 + String content = template.getTemplateContent() + .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) + .replace("${reason}", reason == null ? "" : reason); + + // 4. 构造消息对象 + SysMessageBo messageBo = new SysMessageBo(); + messageBo.setTitle(template.getTitle()); + messageBo.setContent(content); + messageBo.setSenderId(1L); // 系统管理员 + // 可根据需要设置更多字段 + + // 5. 发送消息 + sysMessageService.sendMessageToUser(messageBo, Long.valueOf(uploaderId)); } @Transactional @@ -88,9 +124,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { @Override public void createVlog(VlogBO vlogBO) { String vid = sid.nextShort(); - Vlog vlog = new Vlog(); - BeanUtils.copyProperties(vlogBO, vlog); - + Vlog vlog = vlogConvert.toEntity(vlogBO); vlog.setId(vid); vlog.setLikeCounts(0); vlog.setCommentsCounts(0); @@ -165,8 +199,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { List vlogList = vlogPage.getRecords(); List voList = vlogList.stream().map(v -> { - IndexVlogVO vo = new IndexVlogVO(); - BeanUtils.copyProperties(v, vo); + IndexVlogVO vo = vlogConvert.toVO(v); if (StringUtils.isNotBlank(userId)) { vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(Long.valueOf(userId), Long.valueOf(v.getVlogerId()))); @@ -211,8 +244,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { return null; } - IndexVlogVO vo = new IndexVlogVO(); - BeanUtils.copyProperties(vlog, vo); + IndexVlogVO vo = vlogConvert.toVO(vlog); if (StringUtils.isNotBlank(userId)) { vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(userId, vlog.getVlogerId())); @@ -256,8 +288,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { List vlogList = vlogPage.getRecords(); List voList = vlogList.stream().map(v -> { - IndexVlogVO vo = new IndexVlogVO(); - BeanUtils.copyProperties(v, vo); + IndexVlogVO vo = vlogConvert.toVO(v); if (StringUtils.isNotBlank(myId)) { vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(myId, v.getVlogerId())); @@ -289,6 +320,26 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { redis.increment(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); // 保存用户和视频的喜欢关系 redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId, "1"); + + // 发送点赞通知 + Vlog vlog = vlogMapper.selectById(vlogId); + if (vlog != null) { + String vlogerId = vlog.getVlogerId(); + if (!userId.equals(vlogerId)) { // 不给自己发 + Long templateId = 1003L; // 假设1003是点赞通知模板 + SysMessageTemplateVo template = templateService.selectTemplateById(templateId); + if (template != null) { + String content = template.getTemplateContent() + .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) + .replace("${liker}", userId); // 可查昵称 + SysMessageBo messageBo = new SysMessageBo(); + messageBo.setTitle(template.getTitle()); + messageBo.setContent(content); + messageBo.setSenderId(Long.valueOf(userId)); + sysMessageService.sendMessageToUser(messageBo, Long.valueOf(vlogerId)); + } + } + } } @Override @@ -336,8 +387,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { return null; } - IndexVlogVO vo = new IndexVlogVO(); - BeanUtils.copyProperties(vlog, vo); + IndexVlogVO vo = vlogConvert.toVO(vlog); if (StringUtils.isNotBlank(myId)) { vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(myId, vlog.getVlogerId())); diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml index 4bd40fbc6..0e1cbf41d 100644 --- a/ruoyi-modules/ruoyi-member/pom.xml +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -100,7 +100,8 @@ ruoyi-common-sse - + + diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml index a162ef5a7..8a3035b2d 100644 --- a/ruoyi-modules/ruoyi-order/pom.xml +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -157,15 +157,11 @@ hutool-all 5.8.22 - - org.dromara - ruoyi-content - - - org.dromara - ruoyi-content - + + org.dromara + ruoyi-content + diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index 69ab71a07..3f92aa590 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -27,7 +27,10 @@ org.dromara ruoyi-common-doc - + + org.dromara + ruoyi-common-job + org.dromara ruoyi-common-mybatis diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMessageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMessageController.java index 523b1cae5..99af4512e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMessageController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMessageController.java @@ -279,6 +279,26 @@ public class SysMessageController extends BaseController { return R.fail("未找到消息接收者"); } + // 判断是否为定时消息,若是则注册SnailJob单次任务 +// if (bo.getScheduledTime() != null && bo.getScheduledTime().after(new java.util.Date())) { +// // 先保存消息,获取ID +// SysMessage entity = bo.toEntity(); +// entity.setStatus("0"); // 未发送 +// messageService.getBaseMapper().insert(entity); +// // 创建SnailJob单次任务 +// org.dromara.system.job.SnailJobApiUtil.createSingleJob(entity.getId(), entity.getScheduledTime()); +// // 关联用户 +// for (String userId : userIdStrings) { +// org.dromara.system.domain.SysMessageUser messageUser = new org.dromara.system.domain.SysMessageUser(); +// messageUser.setMessageId(entity.getId()); +// messageUser.setUserId(Long.valueOf(userId)); +// messageUser.setIsRead(false); +// // 这里假设有messageUserMapper可用,实际应通过service或mapper注入 +// // messageUserMapper.insert(messageUser); +// } +// return toAjax(1); +// } + return toAjax(messageService.sendMessageToUsers(bo, userIdStrings)); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMessage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMessage.java index d924b9cd5..2166e66c6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMessage.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMessage.java @@ -48,8 +48,8 @@ public class SysMessage extends BaseAudit { /** 定时发送时间 */ private Date scheduledTime; -// /** 状态(0正常 1停用) */ -// private String status; + /** 状态(0未发送 1已发送) */ + private String status; /** 扩展参数 */ @TableField(exist = false) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java index c11009710..575165f4f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java @@ -60,6 +60,7 @@ public class SysMessageBo extends BaseAudit { /** 定时发送时间 */ @ExcelProperty(value = "定时发送时间") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "Asia/Shanghai") private Date scheduledTime; /** 发送范围(all:全部用户, userType:按用户类型, userIds:指定用户) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMessageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMessageService.java index c8956ca11..524880ce2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMessageService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMessageService.java @@ -51,15 +51,6 @@ public interface ISysMessageService extends IService { */ int sendMessageToUserByStringId(SysMessageBo message, String userId); - /** - * 向多个用户发送消息 - * - * @param message 消息信息 - * @param userIds 用户ID列表 (Long类型) - * @return 结果 - */ -// int sendMessageToUsers(SysMessageBo message, List userIds); - /** * 向多个用户发送消息 * @@ -161,5 +152,25 @@ public interface ISysMessageService extends IService { */ LambdaQueryWrapper toWrapper(SysMessageBo bo); + /** + * 查询所有未发送且到期的定时消息 + * @param now 当前时间 + * @return 待发送的定时消息列表 + */ + List getScheduledMessagesToSend(java.util.Date now); + + /** + * 更新消息状态 + * @param messageId 消息ID + * @param status 状态(0未发送 1已发送) + */ + void updateMessageStatus(Long messageId, String status); + + /** + * 查询消息实体对象 + * @param id 消息ID + * @return SysMessage 实体 + */ + SysMessage selectEntityById(Long id); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java index 0414ad8a2..0cc97661d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java @@ -14,6 +14,7 @@ import org.dromara.system.domain.SysMessageUser; import org.dromara.system.domain.bo.SysMessageBo; import org.dromara.system.domain.event.MessageEvent; import org.dromara.system.domain.vo.SysMessageVo; +//import org.dromara.system.job.SnailJobApiUtil; import org.dromara.system.mapper.SysMessageMapper; import org.dromara.system.mapper.SysMessageUserMapper; import org.dromara.system.service.ISysMessageService; @@ -22,6 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -87,18 +89,40 @@ public class SysMessageServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysMessageUser::getMessageId, entity.getId()) +// .eq(SysMessageUser::getUserId, userId); +// int count = Math.toIntExact(messageUserMapper.selectCount(queryWrapper)); +// int rows = 0; +// if (count == 0) { +// SysMessageUser messageUser = new SysMessageUser(); +// messageUser.setMessageId(entity.getId()); +// messageUser.setUserId(userId); +// messageUser.setIsRead(false); +// rows = messageUserMapper.insert(messageUser); +// } else { +// log.info("消息与用户关联已存在,跳过创建: messageId={}, userId={}", entity.getId(), userId); +// rows = 1; +// } +// // 定时消息不发布事件 +// return rows; +// } else { + entity.setStatus("1"); // 已发送 messageMapper.insert(entity); - // 检查消息与用户关联是否已存在 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysMessageUser::getMessageId, entity.getId()) .eq(SysMessageUser::getUserId, userId); int count = Math.toIntExact(messageUserMapper.selectCount(queryWrapper)); - - // 只有当关联不存在时才创建 int rows = 0; if (count == 0) { - // 创建消息用户关联 SysMessageUser messageUser = new SysMessageUser(); messageUser.setMessageId(entity.getId()); messageUser.setUserId(userId); @@ -106,16 +130,15 @@ public class SysMessageServiceImpl extends ServiceImpl 0) { SysMessageVo messageVo = MapstructUtils.convert(entity, SysMessageVo.class); eventPublisher.publishEvent(new MessageEvent(this, messageVo, userId)); } return rows; +// } } @Override @@ -124,23 +147,71 @@ public class SysMessageServiceImpl extends ServiceImpl validUserIds = new ArrayList<>(); +// Map userIdStrMap = new HashMap<>(); +// for (String userIdStr : userIds) { +// if (StringUtils.isBlank(userIdStr)) { +// continue; +// } +// try { +// Long userId = Long.parseLong(userIdStr); +// validUserIds.add(userId); +// userIdStrMap.put(userId, userIdStr); +// } catch (NumberFormatException e) { +// log.error("无法将String类型的用户ID转换为Long: {}", userIdStr); +// } +// } +// if (!validUserIds.isEmpty()) { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysMessageUser::getMessageId, entity.getId()) +// .in(SysMessageUser::getUserId, validUserIds); +// List existingRecords = messageUserMapper.selectList(queryWrapper); +// Set existingUserIds = existingRecords.stream() +// .map(SysMessageUser::getUserId) +// .collect(Collectors.toSet()); +// log.info("已存在的消息关联记录数: {}", existingUserIds.size()); +// for (Long userId : validUserIds) { +// if (!existingUserIds.contains(userId)) { +// try { +// SysMessageUser messageUser = new SysMessageUser(); +// messageUser.setMessageId(entity.getId()); +// messageUser.setUserId(userId); +// messageUser.setIsRead(false); +// int rows = messageUserMapper.insert(messageUser); +// if (rows > 0) { +// count++; +// } +// } catch (Exception e) { +// log.error("创建消息用户关联失败: messageId={}, userId={}, error={}", +// entity.getId(), userId, e.getMessage()); +// } +// } else { +// log.info("消息与用户关联已存在,跳过创建: messageId={}, userId={}", entity.getId(), userId); +// count++; +// } +// } +// } +// // 定时消息不发布事件 +// return count; +// } else { + entity.setStatus("1"); // 已发送 messageMapper.insert(entity); - // 批量创建消息用户关联 int count = 0; - - // 先过滤有效的用户ID List validUserIds = new ArrayList<>(); Map userIdStrMap = new HashMap<>(); - for (String userIdStr : userIds) { if (StringUtils.isBlank(userIdStr)) { continue; } - try { Long userId = Long.parseLong(userIdStr); validUserIds.add(userId); @@ -149,22 +220,15 @@ public class SysMessageServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysMessageUser::getMessageId, entity.getId()) .in(SysMessageUser::getUserId, validUserIds); List existingRecords = messageUserMapper.selectList(queryWrapper); - - // 创建已存在用户ID的集合 Set existingUserIds = existingRecords.stream() .map(SysMessageUser::getUserId) .collect(Collectors.toSet()); - log.info("已存在的消息关联记录数: {}", existingUserIds.size()); - - // 对不存在关联的用户批量插入 for (Long userId : validUserIds) { if (!existingUserIds.contains(userId)) { try { @@ -177,29 +241,24 @@ public class SysMessageServiceImpl extends ServiceImpl 0) { SysMessageVo messageVo = MapstructUtils.convert(entity, SysMessageVo.class); - // 为所有有效用户ID组装一个逗号分隔的字符串 - String batchUserIds = validUserIds.stream() - .map(String::valueOf) - .collect(Collectors.joining(",")); - // 发布一个批量事件,在MessageEvent和MessageEventListener中进行处理 - eventPublisher.publishEvent(MessageEvent.createWithStringUserId(this, messageVo, batchUserIds)); + for (Long userId : validUserIds) { + eventPublisher.publishEvent(new MessageEvent(this, messageVo, userId)); + } } - return count; +// } } @Override @@ -313,4 +372,25 @@ public class SysMessageServiceImpl extends ServiceImpl getScheduledMessagesToSend(java.util.Date now) { + return this.lambdaQuery() + .eq(SysMessage::getStatus, "0") + .le(SysMessage::getScheduledTime, now) + .list(); + } + + @Override + public void updateMessageStatus(Long messageId, String status) { + this.lambdaUpdate() + .eq(SysMessage::getId, messageId) + .set(SysMessage::getStatus, status) + .update(); + } + + @Override + public SysMessage selectEntityById(Long id) { + return messageMapper.selectById(id); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/task/MessageScheduledTask.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/task/MessageScheduledTask.java index 9c4778efe..44d5124ad 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/task/MessageScheduledTask.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/task/MessageScheduledTask.java @@ -36,43 +36,34 @@ public class MessageScheduledTask { /** * 每分钟执行一次,处理待发送的消息 */ - @Scheduled(cron = "0 */1 * * * ?") - @Transactional(rollbackFor = Exception.class) - public void processScheduledMessages() { - log.info("开始处理定时消息..."); - try { - // 查询待发送的消息 - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); -// lqw.eq(SysMessage::getStatus, "0") -// .le(SysMessage::getScheduledTime, LocalDateTime.now()) -// .isNotNull(SysMessage::getScheduledTime); - - List messages = messageMapper.selectList(lqw); - - for (SysMessage message : messages) { - // 查询消息接收者 - LambdaQueryWrapper userLqw = new LambdaQueryWrapper<>(); - userLqw.eq(SysMessageUser::getMessageId, message.getId()); - List messageUsers = messageUserMapper.selectList(userLqw); - - // 发送消息 - SysMessageVo messageVo = MapstructUtils.convert(message, SysMessageVo.class); - for (SysMessageUser messageUser : messageUsers) { - try { - messageWebSocketServer.sendMessage(messageUser.getUserId(), String.valueOf(messageVo)); - } catch (Exception e) { - log.error("发送消息失败,消息ID:{},用户ID:{}", message.getId(), messageUser.getUserId(), e); - } - } - - // 更新消息状态为已发送 -// message.setStatus("1"); - messageMapper.updateById(message); - } - - log.info("定时消息处理完成,共处理{}条消息", messages.size()); - } catch (Exception e) { - log.error("处理定时消息时发生错误", e); - } - } +// @Scheduled(cron = "0 */1 * * * ?") +// @Transactional(rollbackFor = Exception.class) +// public void processScheduledMessages() { +// log.info("开始处理定时消息..."); +// try { +// // 查询待发送的消息 +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// List messages = messageMapper.selectList(lqw); +// for (SysMessage message : messages) { +// // 查询消息接收者 +// LambdaQueryWrapper userLqw = new LambdaQueryWrapper<>(); +// userLqw.eq(SysMessageUser::getMessageId, message.getId()); +// List messageUsers = messageUserMapper.selectList(userLqw); +// // 发送消息 +// SysMessageVo messageVo = MapstructUtils.convert(message, SysMessageVo.class); +// for (SysMessageUser messageUser : messageUsers) { +// try { +// messageWebSocketServer.sendMessage(messageUser.getUserId(), String.valueOf(messageVo)); +// } catch (Exception e) { +// log.error("发送消息失败,消息ID:{},用户ID:{}", message.getId(), messageUser.getUserId(), e); +// } +// } +// // 更新消息状态为已发送 +// messageMapper.updateById(message); +// } +// log.info("定时消息处理完成,共处理{}条消息", messages.size()); +// } catch (Exception e) { +// log.error("处理定时消息时发生错误", e); +// } +// } }