package cn.iocoder.yudao.module.hrm.service.attendance.listener; import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceExceptionMapper; import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceExceptionTypeEnum; import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceExceptionService; import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceRecordService; import cn.iocoder.yudao.module.hrm.util.HrmAuditStatusUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; /** * 考勤异常申请审批的结果监听器实现类 * * @author 芋道源码 */ @Component @Slf4j public class HrmAttendanceExceptionStatusListener implements ApplicationListener { @Resource private HrmAttendanceExceptionService attendanceExceptionService; @Resource private HrmAttendanceExceptionMapper attendanceExceptionMapper; @Resource private HrmAttendanceRecordService attendanceRecordService; @Override public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { // 通过 businessKey 查询考勤异常申请 Long exceptionId; try { exceptionId = Long.parseLong(event.getBusinessKey()); } catch (NumberFormatException e) { return; } HrmAttendanceExceptionDO exception = attendanceExceptionMapper.selectById(exceptionId); if (exception == null) { return; } // 只有审批中状态的考勤异常申请才处理 if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(exception.getStatus())) { log.warn("[onApplicationEvent] 考勤异常申请({}) 不处于审批中状态,当前状态: {}", exceptionId, exception.getStatus()); return; } log.info("[onApplicationEvent] 考勤异常申请({}) 审批状态更新: {}", exceptionId, event.getStatus()); // 转换审批状态 Integer auditStatus = HrmAuditStatusUtils.convertBpmResultToAuditStatus(event.getStatus()); // 更新审批状态 attendanceExceptionService.updateAttendanceExceptionAuditStatus(exceptionId, auditStatus); // 补卡审批通过后,更新考勤记录 if (HrmAttendanceExceptionTypeEnum.SUPPLEMENT.getType().equals(exception.getType()) && HrmAuditStatusEnum.APPROVE.getStatus().equals(auditStatus)) { log.info("[onApplicationEvent] 补卡申请({}) 审批通过,开始更新考勤记录", exceptionId); attendanceRecordService.supplementClockIn(exception); } } }