gaoluyang
2026-10-26 33ea58c636110537269eab1af3c820099ab14e7f
fix(attendance): 周末和法定节假日不再生成缺勤记录

判断昨日是否为工作日:假期设置为调休上班(adjustment)算工作日,
其他假期算休息日,无假期配置时按自然周排除周六周日。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已修改1个文件
26 ■■■■■ 文件已修改
src/main/java/com/ruoyi/staff/task/PersonalAttendanceRecordsTask.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/task/PersonalAttendanceRecordsTask.java
@@ -2,6 +2,8 @@
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.approve.mapper.HolidaySettingsMapper;
import com.ruoyi.approve.pojo.HolidaySettings;
import com.ruoyi.staff.dto.PerformanceShiftAddDto;
import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper;
import com.ruoyi.staff.mapper.PersonalAttendanceRecordsMapper;
@@ -42,6 +44,7 @@
    private final PersonalAttendanceLocationConfigMapper personalAttendanceLocationConfigMapper;
    private final StaffOnJobMapper staffOnJobMapper;
    private final PersonalShiftService personalShiftService;
    private final HolidaySettingsMapper holidaySettingsMapper;
    /**
     * 每天凌晨生成昨日的缺勤记录
@@ -53,6 +56,12 @@
        try {
            // 获取昨日日期
            LocalDate yesterday = LocalDate.now().minusDays(1);
            // 周末、法定节假日是休息日,不生成缺勤记录
            if (!isWorkingDay(yesterday)) {
                log.info("昨日{}为周末或法定节假日,跳过缺勤记录生成", yesterday);
                return;
            }
            // 直接查询昨天没有考勤记录的在职员工(排除今天刚入职的)
            LocalDateTime todayStart = LocalDate.now().atStartOfDay();
@@ -88,6 +97,23 @@
    }
    /**
     * 判断某天是否为工作日。
     * 假期设置里“调休上班”(adjustment) 算工作日;其他假期(法定节假日等)算休息日;
     * 没有配置假期的日期按自然周判断,周六、周日休息。
     */
    private boolean isWorkingDay(LocalDate date) {
        List<HolidaySettings> holidays = holidaySettingsMapper.selectList(
                Wrappers.<HolidaySettings>lambdaQuery()
                        .eq(HolidaySettings::getStatus, "active")
                        .le(HolidaySettings::getStartDate, date)
                        .ge(HolidaySettings::getEndDate, date));
        if (CollectionUtil.isNotEmpty(holidays)) {
            return holidays.stream().anyMatch(h -> "adjustment".equals(h.getType()));
        }
        return date.getDayOfWeek().getValue() < 6;
    }
    /**
     * 定时任务,每个月1号的00:00:00给下一个月排班
     * 给每个人都进行排班(默认早班)
     */