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<HrmAttendanceExceptionDO> 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());
|
}
|
|
}
|