liyong
9 天以前 88e384da863bb2f7324cb1e1474885df3b7cce91
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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());
    }
 
}