tuqin
6 天以前 5ea3ccadce91cb9e7a760da8d0d34b316a977d78
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package cn.iocoder.yudao.module.mes.service.safety;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketApproveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketCloseReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.ticket.MesSafetyWorkTicketSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyWorkTicketDO;
import cn.iocoder.yudao.module.mes.dal.mysql.safety.MesSafetyWorkTicketMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
 
import java.time.LocalDateTime;
import java.util.Objects;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 
/**
 * 安全生产 - 特种作业票证 Service 实现
 *
 * @author 超级管理员
 */
@Service
@Validated
public class MesSafetyWorkTicketServiceImpl implements MesSafetyWorkTicketService {
 
    @Resource
    private MesSafetyWorkTicketMapper ticketMapper;
 
    @Override
    public PageResult<MesSafetyWorkTicketDO> getTicketPage(MesSafetyWorkTicketPageReqVO pageReqVO) {
        return ticketMapper.selectPage(pageReqVO);
    }
 
    @Override
    public MesSafetyWorkTicketDO getTicket(Long id) {
        return ticketMapper.selectById(id);
    }
 
    @Override
    public Long createTicket(MesSafetyWorkTicketSaveReqVO createReqVO) {
        validateCodeUnique(null, createReqVO.getCode());
        validateTimeRange(createReqVO.getPlanStartTime(), createReqVO.getPlanEndTime());
        MesSafetyWorkTicketDO ticket = BeanUtils.toBean(createReqVO, MesSafetyWorkTicketDO.class);
        // 新建即待审批
        ticket.setStatus(MesSafetyWorkTicketDO.STATUS_PENDING);
        ticket.setGuardianConfirm(false);
        ticketMapper.insert(ticket);
        return ticket.getId();
    }
 
    @Override
    public void updateTicket(MesSafetyWorkTicketSaveReqVO updateReqVO) {
        MesSafetyWorkTicketDO exists = validateTicketExists(updateReqVO.getId());
        // 审批通过后不允许再改作业信息,需作废重开
        if (!MesSafetyWorkTicketDO.STATUS_PENDING.equals(exists.getStatus())
                && !MesSafetyWorkTicketDO.STATUS_REJECTED.equals(exists.getStatus())) {
            throw exception(MES_SAFETY_TICKET_STATUS_INVALID);
        }
        validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
        validateTimeRange(updateReqVO.getPlanStartTime(), updateReqVO.getPlanEndTime());
        MesSafetyWorkTicketDO updateObj = BeanUtils.toBean(updateReqVO, MesSafetyWorkTicketDO.class);
        // 状态与审批/归档信息不走此接口
        updateObj.setStatus(null);
        updateObj.setApproverUserId(null);
        updateObj.setApproveTime(null);
        updateObj.setApproveComment(null);
        updateObj.setRejectReason(null);
        updateObj.setCloseTime(null);
        updateObj.setCloseUserId(null);
        updateObj.setCloseRemark(null);
        updateObj.setActualStartTime(null);
        updateObj.setActualEndTime(null);
        // 重新提交时清空驳回原因
        if (MesSafetyWorkTicketDO.STATUS_REJECTED.equals(exists.getStatus())) {
            updateObj.setStatus(MesSafetyWorkTicketDO.STATUS_PENDING);
            updateObj.setRejectReason("");
        }
        ticketMapper.updateById(updateObj);
    }
 
    @Override
    public void deleteTicket(Long id) {
        MesSafetyWorkTicketDO exists = validateTicketExists(id);
        // 已批准及之后的作业票不允许删除(需保留追溯记录)
        if (MesSafetyWorkTicketDO.STATUS_APPROVED.equals(exists.getStatus())
                || MesSafetyWorkTicketDO.STATUS_FINISHED.equals(exists.getStatus())
                || MesSafetyWorkTicketDO.STATUS_ARCHIVED.equals(exists.getStatus())) {
            throw exception(MES_SAFETY_TICKET_STATUS_INVALID);
        }
        ticketMapper.deleteById(id);
    }
 
    @Override
    public void approveTicket(Long userId, MesSafetyWorkTicketApproveReqVO reqVO) {
        MesSafetyWorkTicketDO ticket = validateTicketExists(reqVO.getId());
        if (!MesSafetyWorkTicketDO.STATUS_PENDING.equals(ticket.getStatus())) {
            throw exception(MES_SAFETY_TICKET_STATUS_INVALID);
        }
        MesSafetyWorkTicketDO updateObj = new MesSafetyWorkTicketDO();
        updateObj.setId(reqVO.getId());
        updateObj.setApproverUserId(userId);
        updateObj.setApproveTime(LocalDateTime.now());
        updateObj.setApproveComment(reqVO.getApproveComment());
        if (Boolean.TRUE.equals(reqVO.getPass())) {
            updateObj.setStatus(MesSafetyWorkTicketDO.STATUS_APPROVED);
            updateObj.setRejectReason("");
        } else {
            if (reqVO.getRejectReason() == null || reqVO.getRejectReason().trim().isEmpty()) {
                throw exception(MES_SAFETY_TICKET_REJECT_REASON_REQUIRED);
            }
            updateObj.setStatus(MesSafetyWorkTicketDO.STATUS_REJECTED);
            updateObj.setRejectReason(reqVO.getRejectReason());
        }
        ticketMapper.updateById(updateObj);
    }
 
    @Override
    public void closeTicket(Long userId, MesSafetyWorkTicketCloseReqVO reqVO) {
        MesSafetyWorkTicketDO ticket = validateTicketExists(reqVO.getId());
        Integer status = ticket.getStatus();
        // 已批准 → 完工;已完工 → 归档
        boolean canFinish = MesSafetyWorkTicketDO.STATUS_APPROVED.equals(status);
        boolean canArchive = MesSafetyWorkTicketDO.STATUS_FINISHED.equals(status);
        if (!canFinish && !canArchive) {
            throw exception(MES_SAFETY_TICKET_STATUS_INVALID);
        }
        MesSafetyWorkTicketDO updateObj = new MesSafetyWorkTicketDO();
        updateObj.setId(reqVO.getId());
        updateObj.setActualStartTime(reqVO.getActualStartTime());
        updateObj.setActualEndTime(reqVO.getActualEndTime());
        if (reqVO.getCloseRemark() != null) {
            updateObj.setCloseRemark(reqVO.getCloseRemark());
        }
        if (canFinish) {
            // 完工登记;若同时选择归档则直接进入已归档
            boolean archiveNow = Boolean.TRUE.equals(reqVO.getArchive());
            updateObj.setStatus(archiveNow
                    ? MesSafetyWorkTicketDO.STATUS_ARCHIVED
                    : MesSafetyWorkTicketDO.STATUS_FINISHED);
            if (archiveNow) {
                updateObj.setCloseTime(LocalDateTime.now());
                updateObj.setCloseUserId(userId);
            }
        } else {
            // 已完工 → 归档
            updateObj.setStatus(MesSafetyWorkTicketDO.STATUS_ARCHIVED);
            updateObj.setCloseTime(LocalDateTime.now());
            updateObj.setCloseUserId(userId);
        }
        ticketMapper.updateById(updateObj);
    }
 
    @Override
    public MesSafetyWorkTicketDO validateTicketExists(Long id) {
        if (id == null) {
            throw exception(MES_SAFETY_TICKET_NOT_EXISTS);
        }
        MesSafetyWorkTicketDO ticket = ticketMapper.selectById(id);
        if (ticket == null) {
            throw exception(MES_SAFETY_TICKET_NOT_EXISTS);
        }
        return ticket;
    }
 
    /**
     * 校验计划时间区间合法
     */
    private void validateTimeRange(LocalDateTime start, LocalDateTime end) {
        if (start != null && end != null && !end.isAfter(start)) {
            throw exception(MES_SAFETY_TICKET_TIME_INVALID);
        }
    }
 
    private void validateCodeUnique(Long id, String code) {
        MesSafetyWorkTicketDO exists = ticketMapper.selectByCode(code);
        if (exists == null) {
            return;
        }
        if (id == null || !Objects.equals(exists.getId(), id)) {
            throw exception(MES_SAFETY_TICKET_CODE_DUPLICATE);
        }
    }
 
}