buhuazhen
3 天以前 0d7c3e7923c420ae6d3f8feff280bf4fcaac5ce7
feat 人员合同、设备定时保养、排班之后APP推送通知
已添加1个文件
已修改2个文件
273 ■■■■■ 文件已修改
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/task/StaffContractReminderTask.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -1,8 +1,15 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.pojo.MaintenanceTask;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -17,9 +24,11 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.ArrayList;
@Component
@DisallowConcurrentExecution
@Slf4j
public class MaintenanceTaskJob implements Job, Serializable {
    private static final long serialVersionUID = 1L;
@@ -28,6 +37,15 @@
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private StaffOnJobMapper staffOnJobMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private ISysNoticeService sysNoticeService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
@@ -52,6 +70,9 @@
            // 2. åˆ›å»ºå¹¶ä¿å­˜å·¡æ£€ä»»åŠ¡è®°å½• - è¿™å°±æ˜¯æ‚¨æä¾›çš„代码应该放的位置
            DeviceMaintenance deviceMaintenance = createInspectionTask(timingTask);
            deviceMaintenanceService.save(deviceMaintenance);
            // å‘送保养提醒通知
            sendMaintenanceReminder(timingTask);
            // 3. æ›´æ–°å®šæ—¶ä»»åŠ¡çš„æ‰§è¡Œæ—¶é—´
            if (!tasks.isEmpty()) {
@@ -243,4 +264,51 @@
        return days;
    }
    /**
     * å‘送设备保养提醒通知
     * @param timingTask ä¿å…»ä»»åŠ¡
     */
    private void sendMaintenanceReminder(MaintenanceTask timingTask) {
        try {
            if (timingTask.getMaintenancePerson() == null || timingTask.getMaintenancePerson().isEmpty()) {
                log.warn("保养任务 {} æœªæŒ‡å®šä¿å…»äººï¼Œè·³è¿‡æŽ¨é€", timingTask.getTaskName());
                return;
            }
            // é€šè¿‡ä¿å…»äººå§“名查询员工档案
            List<StaffOnJob> staffList = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery()
                    .eq(StaffOnJob::getStaffName, timingTask.getMaintenancePerson())
                    .eq(StaffOnJob::getStaffState, 1)
                    .last("LIMIT 1"));
            if (staffList.isEmpty()) {
                log.warn("未找到保养人 {} çš„员工档案", timingTask.getMaintenancePerson());
                return;
            }
            StaffOnJob staff = staffList.get(0);
            // é€šè¿‡å‘˜å·¥ç¼–号查询系统用户
            SysUser sysUser = sysUserMapper.selectUserByUserName(staff.getStaffNo());
            if (sysUser == null) {
                log.warn("保养人 {} æœªæ‰¾åˆ°å¯¹åº”的系统用户账号", staff.getStaffName());
                return;
            }
            // æž„建通知内容
            String title = "设备保养提醒";
            String message = String.format("您好,设备【%s】需要进行保养,请及时处理。",
                    timingTask.getTaskName());
            // å‘送通知
            List<Long> userIds = new ArrayList<>();
            userIds.add(sysUser.getUserId());
            sysNoticeService.simpleNoticeByUser(title, message, userIds, "/deviceMaintenance");
            log.info("已向保养人 {} å‘送设备保养提醒", timingTask.getMaintenancePerson());
        } catch (Exception e) {
            log.error("发送设备保养提醒失败:{}", e.getMessage(), e);
        }
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java
@@ -2,17 +2,24 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.staff.dto.SaveStaffSchedulingDto;
import com.ruoyi.staff.dto.StaffSchedulingDto;
import com.ruoyi.staff.mapper.StaffSchedulingMapper;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.pojo.StaffScheduling;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.service.StaffSchedulingService;
import com.ruoyi.staff.vo.SearchSchedulingVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -20,18 +27,27 @@
import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author buhuazhen
 * @description é’ˆå¯¹è¡¨ã€staff_scheduling】的数据库操作Service实现
 * @createDate 2025-09-03 14:50:34
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class StaffSchedulingServiceImpl extends ServiceImpl<StaffSchedulingMapper, StaffScheduling>
        implements StaffSchedulingService {
    private final StaffSchedulingMapper staffSchedulingMapper;
    private final StaffOnJobMapper staffOnJobMapper;
    private final SysUserMapper sysUserMapper;
    private final ISysNoticeService sysNoticeService;
    @Lazy
    @Resource
@@ -49,6 +65,91 @@
        // minutes = minutes < 0.5 ? 0 : 0.5; å…¬å¸ä¸€èˆ¬ä»¥0.5为标准计算
        staffScheduling.setWorkHours(BigDecimal.valueOf(hours + minutes));
        staffSchedulingService.saveOrUpdate(staffScheduling);
        // å‘送排班通知
        sendSchedulingNotification(staffScheduling);
    }
    /**
     * å‘送排班通知给被排班人员
     * @param staffScheduling æŽ’班信息
     */
    private void sendSchedulingNotification(StaffScheduling staffScheduling) {
        try {
            if (staffScheduling.getStaffId() == null || staffScheduling.getStaffId().isEmpty()) {
                return;
            }
            // è§£æžå‘˜å·¥ID列表
            List<Long> staffIds = Arrays.stream(staffScheduling.getStaffId().split(","))
                    .map(String::trim)
                    .filter(s -> !s.isEmpty())
                    .map(Long::parseLong)
                    .collect(Collectors.toList());
            if (staffIds.isEmpty()) {
                return;
            }
            // æŸ¥è¯¢å‘˜å·¥æ¡£æ¡ˆ
            List<StaffOnJob> staffList = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery()
                    .in(StaffOnJob::getId, staffIds)
                    .eq(StaffOnJob::getStaffState, 1));
            if (staffList.isEmpty()) {
                return;
            }
            // èŽ·å–å‘˜å·¥ç¼–å·åˆ—è¡¨
            List<String> staffNos = staffList.stream()
                    .map(StaffOnJob::getStaffNo)
                    .filter(s -> s != null && !s.isEmpty())
                    .collect(Collectors.toList());
            if (staffNos.isEmpty()) {
                return;
            }
            // æŸ¥è¯¢ç³»ç»Ÿç”¨æˆ·
            List<SysUser> users = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery()
                    .in(SysUser::getUserName, staffNos)
                    .eq(SysUser::getStatus, "0"));
            if (users.isEmpty()) {
                log.warn("排班通知:未找到对应的系统用户");
                return;
            }
            // æ ¼å¼åŒ–日期时间
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
            String workDateStr = staffScheduling.getWorkDate() != null
                    ? new java.text.SimpleDateFormat("yyyy-MM-dd").format(staffScheduling.getWorkDate())
                    : "";
            String startTimeStr = staffScheduling.getWorkStartTime() != null
                    ? staffScheduling.getWorkStartTime().format(timeFormatter)
                    : "";
            String endTimeStr = staffScheduling.getWorkEndTime() != null
                    ? staffScheduling.getWorkEndTime().format(timeFormatter)
                    : "";
            // æž„建通知内容
            String title = "排班通知";
            String message = String.format("您好,您已被安排在 %s ä¸Šç­ï¼Œå·¥ä½œæ—¶é—´ï¼š%s - %s",
                    workDateStr, startTimeStr, endTimeStr);
            // å‘送通知给所有被排班人员
            List<Long> userIds = users.stream()
                    .map(SysUser::getUserId)
                    .collect(Collectors.toList());
            sysNoticeService.simpleNoticeByUser(title, message, userIds, "/scheduling");
            log.info("已向 {} åå‘˜å·¥å‘送排班通知", userIds.size());
        } catch (Exception e) {
            log.error("发送排班通知失败:{}", e.getMessage(), e);
        }
    }
    @Override
src/main/java/com/ruoyi/staff/task/StaffContractReminderTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package com.ruoyi.staff.task;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * äººå‘˜åˆåŒåˆ°æœŸæé†’定时任务
 * æ£€æŸ¥å³å°†åˆ°æœŸçš„合同,推送通知给相关员工
 *
 * @author system
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class StaffContractReminderTask {
    private final StaffOnJobMapper staffOnJobMapper;
    private final SysUserMapper sysUserMapper;
    private final ISysNoticeService sysNoticeService;
    /**
     * æ¯å¤©æ—©ä¸Š8点执行合同到期提醒
     * æå‰30天、7天、1天提醒
     */
    @Scheduled(cron = "0 0 8 * * ?")
    public void contractExpirationReminder() {
        log.info("开始执行合同到期提醒任务...");
        try {
            LocalDate today = LocalDate.now();
            // æå‰30天提醒
            sendReminder(today.plusDays(30), "30天后到期");
            // æå‰7天提醒
            sendReminder(today.plusDays(7), "7天后到期");
            // æå‰1天提醒
            sendReminder(today.plusDays(1), "1天后到期");
            log.info("合同到期提醒任务执行完成");
        } catch (Exception e) {
            log.error("合同到期提醒任务执行失败:{}", e.getMessage(), e);
        }
    }
    /**
     * å‘送合同到期提醒
     * @param expireDate åˆ°æœŸæ—¥æœŸ
     * @param daysDesc å‰©ä½™å¤©æ•°æè¿°
     */
    private void sendReminder(LocalDate expireDate, String daysDesc) {
        Date targetDate = Date.from(expireDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
        // æŸ¥è¯¢åˆåŒåˆ°æœŸæ—¥æœŸç­‰äºŽç›®æ ‡æ—¥æœŸçš„在职员工
        List<StaffOnJob> staffList = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery()
                .eq(StaffOnJob::getStaffState, 1)
                .eq(StaffOnJob::getContractExpireTime, targetDate));
        if (CollectionUtil.isEmpty(staffList)) {
            return;
        }
        for (StaffOnJob staff : staffList) {
            try {
                // é€šè¿‡å‘˜å·¥ç¼–号查询系统用户
                SysUser sysUser = sysUserMapper.selectUserByUserName(staff.getStaffNo());
                if (sysUser == null) {
                    log.warn("员工 {} æœªæ‰¾åˆ°å¯¹åº”的系统用户账号", staff.getStaffName());
                    continue;
                }
                // æž„建通知内容
                String title = "合同到期提醒";
                String message = String.format("您好,%s çš„合同将于%s到期,请及时处理相关事宜。",
                        staff.getStaffName(), daysDesc);
                // å‘送通知
                List<Long> userIds = new ArrayList<>();
                userIds.add(sysUser.getUserId());
                sysNoticeService.simpleNoticeByUser(title, message, userIds, "/staffOnJob");
                log.info("已向员工 {} å‘送合同到期提醒", staff.getStaffName());
            } catch (Exception e) {
                log.error("向员工 {} å‘送合同到期提醒失败:{}", staff.getStaffName(), e.getMessage());
            }
        }
    }
}