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}