liyong
2026-07-03 7085354cb7e6283f72e99d7eff8e73b8c7ba0cb9
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
package cn.iocoder.yudao.module.mes.service.dv.repair;
 
import cn.hutool.core.util.ObjUtil;
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.dv.repair.vo.MesDvRepairPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.dv.repair.MesDvRepairDO;
import cn.iocoder.yudao.module.mes.dal.mysql.dv.repair.MesDvRepairMapper;
import cn.iocoder.yudao.module.mes.enums.dv.MesDvRepairStatusEnum;
import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService;
import jakarta.annotation.Resource;
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.mes.enums.ErrorCodeConstants.*;
 
/**
 * MES 维修工单 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class MesDvRepairServiceImpl implements MesDvRepairService {
 
    @Resource
    private MesDvRepairMapper repairMapper;
 
    @Resource
    private MesDvRepairLineService repairLineService;
    @Resource
    private MesDvMachineryService machineryService;
 
    @Override
    public Long createRepair(MesDvRepairSaveReqVO createReqVO) {
        // 1. 校验保存数据
        validateSaveData(createReqVO);
 
        // 2. 插入
        MesDvRepairDO repair = BeanUtils.toBean(createReqVO, MesDvRepairDO.class);
        repair.setStatus(MesDvRepairStatusEnum.PREPARE.getStatus());
        repairMapper.insert(repair);
        return repair.getId();
    }
 
    @Override
    public void updateRepair(MesDvRepairSaveReqVO updateReqVO) {
        // 1.1 校验存在,且状态为草稿
        validateRepairPrepare(updateReqVO.getId());
        // 1.2 校验保存数据
        validateSaveData(updateReqVO);
 
        // 2. 更新
        MesDvRepairDO updateObj = BeanUtils.toBean(updateReqVO, MesDvRepairDO.class);
        repairMapper.updateById(updateObj);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteRepair(Long id) {
        // 校验存在,且状态为草稿
        validateRepairPrepare(id);
 
        // 删除
        repairMapper.deleteById(id);
        // 级联删除子表
        repairLineService.deleteByRepairId(id);
    }
 
    /**
     * 校验保存时的关联数据
     */
    private void validateSaveData(MesDvRepairSaveReqVO reqVO) {
        // 校验编码唯一
        validateCodeUnique(reqVO.getId(), reqVO.getCode());
        // 校验设备存在
        machineryService.validateMachineryExists(reqVO.getMachineryId());
    }
 
    private void validateCodeUnique(Long id, String code) {
        if (code == null) {
            return;
        }
        MesDvRepairDO repair = repairMapper.selectByCode(code);
        if (repair == null) {
            return;
        }
        if (ObjUtil.notEqual(id, repair.getId())) {
            throw exception(DV_REPAIR_CODE_DUPLICATE);
        }
    }
 
    @Override
    public MesDvRepairDO validateRepairExists(Long id) {
        MesDvRepairDO repair = repairMapper.selectById(id);
        if (repair == null) {
            throw exception(DV_REPAIR_NOT_EXISTS);
        }
        return repair;
    }
 
    @Override
    public Long getRepairCountByMachineryId(Long machineryId) {
        return repairMapper.selectCountByMachineryId(machineryId);
    }
 
    /**
     * 校验维修工单是否为草稿状态
     *
     * @param id 编号
     * @return 维修工单
     */
    public MesDvRepairDO validateRepairPrepare(Long id) {
        MesDvRepairDO repair = validateRepairExists(id);
        if (ObjUtil.notEqual(MesDvRepairStatusEnum.PREPARE.getStatus(), repair.getStatus())) {
            throw exception(DV_REPAIR_NOT_PREPARE);
        }
        return repair;
    }
 
    @Override
    public MesDvRepairDO getRepair(Long id) {
        return repairMapper.selectById(id);
    }
 
    @Override
    public PageResult<MesDvRepairDO> getRepairPage(MesDvRepairPageReqVO pageReqVO) {
        return repairMapper.selectPage(pageReqVO);
    }
 
    @Override
    public void submitRepair(Long id, Long userId) {
        // 1. 校验存在,且状态为草稿
        validateRepairPrepare(id);
 
        // 2. 更新状态为维修中,设置维修人
        repairMapper.updateById(new MesDvRepairDO().setId(id)
                .setStatus(MesDvRepairStatusEnum.CONFIRMED.getStatus()).setAcceptedUserId(userId));
    }
 
    @Override
    public void confirmRepair(cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairConfirmReqVO confirmReqVO) {
        // 1. 校验存在,且状态为维修中
        MesDvRepairDO repair = validateRepairExists(confirmReqVO.getId());
        if (ObjUtil.notEqual(MesDvRepairStatusEnum.CONFIRMED.getStatus(), repair.getStatus())) {
            throw exception(DV_REPAIR_NOT_CONFIRMED);
        }
 
        // 2. 更新状态为待验收,设置维修完成日期
        repairMapper.updateById(new MesDvRepairDO().setId(confirmReqVO.getId())
                .setStatus(MesDvRepairStatusEnum.APPROVING.getStatus()).setFinishDate(confirmReqVO.getFinishDate()));
    }
 
    @Override
    public void finishRepair(Long id, Integer result, Long userId) {
        // 1. 校验存在,且状态为待验收
        MesDvRepairDO repair = validateRepairExists(id);
        if (ObjUtil.notEqual(MesDvRepairStatusEnum.APPROVING.getStatus(), repair.getStatus())) {
            throw exception(DV_REPAIR_NOT_APPROVING);
        }
 
        // 2. 更新状态为已确认,设置验收结果、验收人和验收日期
        repairMapper.updateById(new MesDvRepairDO().setId(id)
                .setStatus(MesDvRepairStatusEnum.FINISHED.getStatus()).setResult(result)
                .setConfirmUserId(userId).setConfirmDate(LocalDateTime.now()));
    }
 
}