10 天以前 106aaa378126774a2547b6c0d559c62114579f4c
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
package cn.iocoder.yudao.module.mes.service.wm.outsourceissue;
 
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.collection.CollUtil;
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.wm.outsourceissue.vo.line.MesWmOutsourceIssueLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueLineMapper;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
 
import java.util.List;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_OUTSOURCE_ISSUE_LINE_ITEM_NOT_IN_BOM;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_OUTSOURCE_ISSUE_NOT_EXISTS;
 
/**
 * MES 外协发料单行 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLineService {
 
    @Resource
    private MesWmOutsourceIssueLineMapper outsourceIssueLineMapper;
 
    @Resource
    private MesWmOutsourceIssueDetailService outsourceIssueDetailService;
    @Resource
    @Lazy
    private MesWmOutsourceIssueService outsourceIssueService;
    @Resource
    private MesMdItemService itemService;
    @Resource
    private MesWmBatchService batchService;
    @Resource
    private MesProWorkOrderBomService workOrderBomService;
 
    @Override
    public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) {
        // 校验数据
        validateOutsourceIssueLineSaveData(createReqVO);
        // 根据 batchCode 解析 batchId
        fillBatchId(createReqVO);
 
        // 插入
        MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class);
        outsourceIssueLineMapper.insert(line);
        return line.getId();
    }
 
    @Override
    public void updateOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO updateReqVO) {
        // 校验存在
        validateOutsourceIssueLineExists(updateReqVO.getId());
        // 校验数据
        validateOutsourceIssueLineSaveData(updateReqVO);
        // 根据 batchCode 解析 batchId
        fillBatchId(updateReqVO);
 
        // 更新
        MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class);
        outsourceIssueLineMapper.updateById(updateObj);
    }
 
    @Override
    public void deleteOutsourceIssueLine(Long id) {
        // 校验存在
        validateOutsourceIssueLineExists(id);
 
        // 级联删除明细
        outsourceIssueDetailService.deleteOutsourceIssueDetailByLineId(id);
        // 删除行
        outsourceIssueLineMapper.deleteById(id);
    }
 
    @Override
    public MesWmOutsourceIssueLineDO getOutsourceIssueLine(Long id) {
        return outsourceIssueLineMapper.selectById(id);
    }
 
    @Override
    public PageResult<MesWmOutsourceIssueLineDO> getOutsourceIssueLinePage(MesWmOutsourceIssueLinePageReqVO pageReqVO) {
        return outsourceIssueLineMapper.selectPage(pageReqVO);
    }
 
    @Override
    public List<MesWmOutsourceIssueLineDO> getOutsourceIssueLineListByIssueId(Long issueId) {
        return outsourceIssueLineMapper.selectListByIssueId(issueId);
    }
 
    @Override
    public void deleteOutsourceIssueLineByIssueId(Long issueId) {
        outsourceIssueLineMapper.deleteByIssueId(issueId);
    }
 
    private void validateOutsourceIssueLineExists(Long id) {
        if (outsourceIssueLineMapper.selectById(id) == null) {
            throw exception(WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS);
        }
    }
 
    private void validateOutsourceIssueLineSaveData(MesWmOutsourceIssueLineSaveReqVO saveReqVO) {
        // 校验关联的发料单存在
        MesWmOutsourceIssueDO issue = outsourceIssueService.getOutsourceIssue(saveReqVO.getIssueId());
        if (issue == null) {
            throw exception(WM_OUTSOURCE_ISSUE_NOT_EXISTS);
        }
        // 校验关联的物料存在
        itemService.validateItemExistsAndEnable(saveReqVO.getItemId());
        // 校验物料是否在工单 BOM 中
        validateItemInWorkOrderBom(issue.getWorkOrderId(), saveReqVO.getItemId());
    }
 
    private void validateItemInWorkOrderBom(Long workOrderId, Long itemId) {
        if (workOrderId == null) {
            return;
        }
        // 获取当前外协工单的 BOM 列表
        List<MesProWorkOrderBomDO> workOrderBoms = workOrderBomService.getWorkOrderBomListByWorkOrderId(workOrderId);
        if (CollUtil.isEmpty(workOrderBoms)) {
            return;
        }
        // 检查发料的物料是否在 BOM 列表中
        MesProWorkOrderBomDO workOrderBom = CollUtil.findOne(workOrderBoms,
                bom -> bom.getItemId().equals(itemId));
        if (workOrderBom == null) {
            throw exception(WM_OUTSOURCE_ISSUE_LINE_ITEM_NOT_IN_BOM);
        }
    }
 
    /**
     * 根据 batchCode 解析 batchId
     */
    private void fillBatchId(MesWmOutsourceIssueLineSaveReqVO reqVO) {
        if (StrUtil.isBlank(reqVO.getBatchCode())) {
            reqVO.setBatchId(null);
            return;
        }
        MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode());
        reqVO.setBatchId(batch != null ? batch.getId() : null);
    }
 
}