推送项目重构代码

This commit is contained in:
2026-05-29 19:52:32 +08:00
parent 95141d0e1f
commit 3dafaceef2
65 changed files with 3762 additions and 583 deletions

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.oa.domain.OaSalaryMaster;
import com.ruoyi.oa.domain.SysOaRemind;
import com.ruoyi.oa.im.ImSendService;
import com.ruoyi.oa.mapper.OaSalaryMasterMapper;
import com.ruoyi.oa.mapper.SysOaRemindMapper;
import lombok.RequiredArgsConstructor;
@@ -19,6 +20,7 @@ public class OaSalaryRemindScheduler {
private final OaSalaryMasterMapper salaryMasterMapper;
private final SysOaRemindMapper remindMapper;
private final ImSendService imSendService;
// 老板用户ID
private static final Long BOSS_USER_ID = 1859252208375152641L;
@@ -60,6 +62,15 @@ public class OaSalaryRemindScheduler {
remind.setRemark(master.getRemark());
remindMapper.insert(remind);
// 同时通过 IM 推送给老板
imSendService.sendToOaUser(
BOSS_USER_ID,
"工资审批提醒",
remind.getContent(),
"salary", master.getMasterId(),
"/finance/salary/list"
);
}
}
}

View File

@@ -0,0 +1,82 @@
package com.ruoyi.oa.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.oa.domain.SysOaProject;
import com.ruoyi.oa.im.ImSendService;
import com.ruoyi.oa.mapper.SysOaProjectMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 项目到期提醒:每天 09:00 扫描 finishTime 在 [today, today+THRESHOLD_DAYS] 区间且未完结的项目,
* 通过 OpenIM 推送给项目负责人。
*
* @author wangyu
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class ProjectExpiryRemindScheduler {
/** 提前多少天提醒 */
private static final int THRESHOLD_DAYS = 3;
private final SysOaProjectMapper projectMapper;
private final SysUserMapper userMapper;
private final ImSendService imSendService;
@Scheduled(cron = "0 0 9 * * ?")
public void notifyExpiringProjects() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0);
Date start = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, THRESHOLD_DAYS + 1);
Date end = cal.getTime();
LambdaQueryWrapper<SysOaProject> qw = Wrappers.lambdaQuery();
qw.between(SysOaProject::getFinishTime, start, end);
// 已结项的不推("3" 通常表示已完结,按你们的字典调整)
qw.ne(SysOaProject::getProjectStatus, "3");
List<SysOaProject> projects = projectMapper.selectList(qw);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (SysOaProject p : projects) {
String nickName = p.getFunctionary();
if (nickName == null || nickName.isEmpty()) { continue; }
// functionary 存的是 nickName反查 user_id
SysUser user = userMapper.selectOne(
Wrappers.<SysUser>lambdaQuery()
.eq(SysUser::getNickName, nickName)
.eq(SysUser::getDelFlag, "0")
.last("limit 1")
);
if (user == null) {
log.debug("[ProjectExpiry] nickName={} 未找到对应用户,跳过", nickName);
continue;
}
String title = "项目即将到期";
String desc = String.format("项目【%s】将于 %s 到期,请及时跟进",
p.getProjectName(), sdf.format(p.getFinishTime()));
imSendService.sendToOaUser(
user.getUserId(), title, desc,
"project", p.getProjectId(),
"/oa/project?projectId=" + p.getProjectId()
);
}
log.info("[ProjectExpiry] 推送 {} 个即将到期项目", projects.size());
}
}