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);
+// }
+// }
}