diff --git a/ruoyi-oa/pom.xml b/ruoyi-oa/pom.xml
index fea45dc..96dd6cb 100644
--- a/ruoyi-oa/pom.xml
+++ b/ruoyi-oa/pom.xml
@@ -67,6 +67,11 @@
kfpt-sdk
1.0.0
+
+ com.xuxueli
+ xxl-job-core
+
+
diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaRemindServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaRemindServiceImpl.java
index c10dd3a..f1835e2 100644
--- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaRemindServiceImpl.java
+++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaRemindServiceImpl.java
@@ -1,7 +1,9 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -18,7 +20,10 @@ import com.ruoyi.oa.domain.vo.SysOaTaskVo;
import com.ruoyi.oa.service.IOaProgressService;
import com.ruoyi.oa.service.ISysOaProjectService;
import com.ruoyi.oa.service.ISysOaTaskService;
+import com.ruoyi.system.mapper.SysUserMapper;
+import com.xxl.job.core.util.DateUtil;
import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.SysOaRemindBo;
@@ -48,6 +53,8 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
private final ISysOaProjectService projectService;
private final IOaProgressService progressService;
+ @Autowired
+ private SysUserMapper sysUserMapper;
/**
* 查询事件提醒
@@ -162,20 +169,33 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
@Override
public List queryRecentRemindList(SysOaRemindBo bo) {
+ // 过滤:仅当天创建、到期在未来0~3天、未处理的任务/项目提醒
LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
lqw.in(SysOaRemind::getRemindType, Arrays.asList("task", "project"));
lqw.eq(SysOaRemind::getTaskStatus, "0");
- // 只查当天
+
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new java.util.Date());
+ // 只查当天创建
lqw.apply("DATE_FORMAT(create_time, '%Y-%m-%d') = {0}", today);
- lqw.orderByAsc(SysOaRemind::getEndTime);
+ // 到期在未来0~3天(含当天、含第3天)
+ lqw.apply("DATEDIFF(end_time, {0}) BETWEEN 0 AND 3", today);
+
if (bo != null && bo.getTargetUserId() != null) {
lqw.eq(SysOaRemind::getTargetUserId, bo.getTargetUserId());
}
+ // 为了后续按 (type, detailId) 去重保留最新,先按创建时间倒序
+ lqw.orderByDesc(SysOaRemind::getCreateTime);
+
List remindList = baseMapper.selectList(lqw);
- List voList = new ArrayList<>();
+
+ // 按 (remind_type, detail_id) 去重:由于已按 create_time 倒序,只保留第一次出现(最新)
+ Map latestMap = new LinkedHashMap<>();
for (SysOaRemind remind : remindList) {
+ String key = (remind.getRemindType() == null ? "" : remind.getRemindType()) + "_" + (remind.getDetailId() == null ? "" : remind.getDetailId());
+ if (latestMap.containsKey(key)) {
+ continue;
+ }
SysOaRemindVo vo = new SysOaRemindVo();
vo.setRemindId(remind.getRemindId());
vo.setTaskTitle(remind.getTaskTitle());
@@ -197,7 +217,6 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
long diffMillis = remind.getEndTime().getTime() - System.currentTimeMillis();
long remainSeconds = diffMillis / 1000;
vo.setRemainTime(remainSeconds);
- // 格式化为天时分秒
long days = remainSeconds / (60 * 60 * 24);
long hours = (remainSeconds / (60 * 60)) % 24;
long minutes = (remainSeconds / 60) % 60;
@@ -209,9 +228,9 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
sb.append(seconds).append("秒");
vo.setRemark(sb.toString());
}
- voList.add(vo);
+ latestMap.put(key, vo);
}
- return voList;
+ return new ArrayList<>(latestMap.values());
}
private LambdaQueryWrapper buildQueryWrapper(SysOaRemindBo bo) {
@@ -306,7 +325,7 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
remind.setTargetUserId(task.getWorkerId());
remind.setTaskTitle(task.getTaskTitle());
remind.setContent(task.getContent());
- remind.setTaskTime(now);
+ remind.setTaskTime(null);
remind.setTaskStatus("0");
remind.setEndTime(endTime);
remind.setCreateBy(task.getCreateBy());
@@ -339,11 +358,25 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
remind.setUpdateBy(""); // 无updateBy
remind.setAccessory(project.getAccessory());
remind.setRemark(project.getRemark());
- // 项目提醒targetUserId可为空或负责人id
- remind.setTargetUserId(null);
+ // 项目提醒targetUserId可为空或负责人id 负责人id需要模糊查询sys_user表
+ LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ sysUserLambdaQueryWrapper.like(SysUser::getNickName, project.getFunctionary());
+ SysUser sysUser = sysUserMapper.selectOne(sysUserLambdaQueryWrapper);
+ if (sysUser != null ) {
+ // 如果找到用户,设置第一个用户的ID(或者根据实际需求选择合适的用户)
+ remind.setTargetUserId(sysUser.getUserId());
+ } else {
+ // 如果没找到匹配的用户,可以设置为null或者其他默认值
+ remind.setTargetUserId(null);
+ }
baseMapper.insert(remind);
}
}
}
+// 把三天前的提醒任务状态改为已处理
+ LambdaUpdateWrapper sysOaRemindLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ sysOaRemindLambdaUpdateWrapper.lt(SysOaRemind::getCreateTime, DateUtil.addDays(new Date(), -3));
+ sysOaRemindLambdaUpdateWrapper.set(SysOaRemind::getTaskStatus, "1");
+ baseMapper.update(null, sysOaRemindLambdaUpdateWrapper);
}
}
diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml
index 1785d04..892dc85 100644
--- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml
+++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml
@@ -65,6 +65,7 @@
+
@@ -587,7 +588,8 @@
postpone_time,
color,
trade_type,
- pre_pay
+ pre_pay,
+ TIMESTAMPDIFF(DAY, NOW(), sop.postpone_time) AS remainTime
from sys_oa_project sop
where sop.project_id = #{projectId}