package cn.iocoder.yudao.module.hrm.service.attendance; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionPageReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionSaveReqVO; 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.dal.redis.HrmNoRedisDAO; import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; /** * 考勤异常申请 Service 实现类 * * @author 芋道源码 */ @Service @Validated @Slf4j public class HrmAttendanceExceptionServiceImpl implements HrmAttendanceExceptionService { @Resource private HrmAttendanceExceptionMapper attendanceExceptionMapper; @Resource private HrmNoRedisDAO noRedisDAO; @Resource private BpmProcessInstanceApi bpmProcessInstanceApi; @Resource private BpmProcessDefinitionService bpmProcessDefinitionService; @Override public Long createAttendanceException(HrmAttendanceExceptionSaveReqVO createReqVO) { HrmAttendanceExceptionDO attendanceException = BeanUtils.toBean(createReqVO, HrmAttendanceExceptionDO.class); attendanceException.setNo(generateNo()); attendanceException.setStatus(HrmAuditStatusEnum.DRAFT.getStatus()); attendanceExceptionMapper.insert(attendanceException); return attendanceException.getId(); } private String generateNo() { return noRedisDAO.generate(HrmNoRedisDAO.ATTENDANCE_EXCEPTION_NO_PREFIX, 4); } @Override public void updateAttendanceException(HrmAttendanceExceptionSaveReqVO updateReqVO) { validateAttendanceExceptionExists(updateReqVO.getId()); HrmAttendanceExceptionDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceExceptionDO.class); attendanceExceptionMapper.updateById(updateObj); } @Override public void deleteAttendanceException(Long id) { validateAttendanceExceptionExists(id); attendanceExceptionMapper.deleteById(id); } private HrmAttendanceExceptionDO validateAttendanceExceptionExists(Long id) { HrmAttendanceExceptionDO attendanceException = attendanceExceptionMapper.selectById(id); if (attendanceException == null) { throw exception(ATTENDANCE_EXCEPTION_NOT_EXISTS); } return attendanceException; } @Override public PageResult getAttendanceExceptionPage(HrmAttendanceExceptionPageReqVO pageReqVO) { return attendanceExceptionMapper.selectPage(pageReqVO); } @Override public HrmAttendanceExceptionDO getAttendanceException(Long id) { return attendanceExceptionMapper.selectById(id); } @Override @Transactional(rollbackFor = Exception.class) public void submitAttendanceException(Long id, String processDefinitionKey, Long userId) { // 1. 校验异常申请存在且为草稿状态 HrmAttendanceExceptionDO exception = validateAttendanceExceptionExists(id); if (!HrmAuditStatusEnum.DRAFT.getStatus().equals(exception.getStatus())) { throw exception(ATTENDANCE_EXCEPTION_SUBMIT_FAIL_NOT_DRAFT); } // 2. 校验流程定义存在且为激活状态 if (processDefinitionKey != null) { bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); } // 3. 创建审批流程实例 String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() .setProcessDefinitionKey(processDefinitionKey) .setBusinessKey(String.valueOf(id))); // 4. 更新异常申请状态 attendanceExceptionMapper.updateById(HrmAttendanceExceptionDO.builder() .id(id) .processInstanceId(processInstanceId) .status(HrmAuditStatusEnum.PROCESS.getStatus()) .build()); } @Override @Transactional(rollbackFor = Exception.class) public void updateAttendanceExceptionAuditStatus(Long id, Integer auditStatus) { // 1. 校验异常申请存在 HrmAttendanceExceptionDO exception = validateAttendanceExceptionExists(id); // 2. 校验当前状态为审批中 if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(exception.getStatus())) { throw exception(ATTENDANCE_EXCEPTION_UPDATE_AUDIT_STATUS_FAIL); } // 3. 更新状态 attendanceExceptionMapper.updateById(HrmAttendanceExceptionDO.builder() .id(id) .status(auditStatus) .approveTime(LocalDateTime.now()) .build()); } }