| src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/staff/task/StaffContractReminderTask.java | ●●●●● 补丁 | 查看 | 原始文档 | 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()); } } } }