liyong
8 天以前 1ab2b329a40decba8ff7eefbeb158ff259aceb6d
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
package cn.iocoder.yudao.module.mes.service.wm.productissue;
 
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.productissue.vo.line.MesWmProductIssueLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueLineMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
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_PRODUCT_ISSUE_LINE_ITEM_NOT_IN_BOM;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_ISSUE_LINE_NOT_EXISTS;
 
/**
 * MES 领料出库单行 Service 实现类
 */
@Service
@Validated
public class MesWmProductIssueLineServiceImpl implements MesWmProductIssueLineService {
 
    @Resource
    private MesWmProductIssueLineMapper issueLineMapper;
 
    @Resource
    @Lazy
    private MesWmProductIssueService issueService;
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesProWorkOrderBomService workOrderBomService;
    @Resource
    @Lazy
    private MesWmProductIssueDetailService issueDetailService;
 
    @Override
    public Long createProductIssueLine(MesWmProductIssueLineSaveReqVO createReqVO) {
        validateProductIssueLineSaveData(createReqVO);
 
        // 插入
        MesWmProductIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmProductIssueLineDO.class);
        issueLineMapper.insert(line);
        return line.getId();
    }
 
    @Override
    public void updateProductIssueLine(MesWmProductIssueLineSaveReqVO updateReqVO) {
        // 校验存在
        validateProductIssueLineExists(updateReqVO.getId());
        validateProductIssueLineSaveData(updateReqVO);
 
        // 更新
        MesWmProductIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductIssueLineDO.class);
        issueLineMapper.updateById(updateObj);
    }
 
    @Override
    public void deleteProductIssueLine(Long id) {
        // 校验存在
        MesWmProductIssueLineDO line = validateProductIssueLineExists(id);
        // 校验主单为草稿状态才允许删除行
        issueService.validateProductIssueExistsAndPrepare(line.getIssueId());
        // 级联删除该行的明细
        issueDetailService.deleteProductIssueDetailByLineId(id);
        // 删除行
        issueLineMapper.deleteById(id);
    }
 
    @Override
    public MesWmProductIssueLineDO getProductIssueLine(Long id) {
        return issueLineMapper.selectById(id);
    }
 
    @Override
    public PageResult<MesWmProductIssueLineDO> getProductIssueLinePage(MesWmProductIssueLinePageReqVO pageReqVO) {
        return issueLineMapper.selectPage(pageReqVO);
    }
 
    @Override
    public List<MesWmProductIssueLineDO> getProductIssueLineListByIssueId(Long issueId) {
        return issueLineMapper.selectListByIssueId(issueId);
    }
 
    @Override
    public void deleteProductIssueLineByIssueId(Long issueId) {
        issueLineMapper.deleteByIssueId(issueId);
    }
 
    @Override
    public MesWmProductIssueLineDO validateProductIssueLineExists(Long id) {
        MesWmProductIssueLineDO line = issueLineMapper.selectById(id);
        if (line == null) {
            throw exception(WM_PRODUCT_ISSUE_LINE_NOT_EXISTS);
        }
        return line;
    }
 
    /**
     * 校验保存时的关联数据
     */
    private void validateProductIssueLineSaveData(MesWmProductIssueLineSaveReqVO reqVO) {
        // 校验父数据存在 + 草稿状态才允许新增/修改行
        issueService.validateProductIssueExistsAndPrepare(reqVO.getIssueId());
        // 校验物料在工单 BOM 中
        validateItemInWorkOrderBom(reqVO.getIssueId(), reqVO.getItemId());
        // 校验物料存在
        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
    }
 
    private void validateItemInWorkOrderBom(Long issueId, Long itemId) {
        // 校验领料单存在,并获取工单编号
        MesWmProductIssueDO issue = issueService.validateProductIssueExists(issueId);
        // 校验物料是否在工单 BOM 中(防错料)
        List<MesProWorkOrderBomDO> workOrderBoms = workOrderBomService.getWorkOrderBomListByWorkOrderId(issue.getWorkOrderId());
        if (CollUtil.isEmpty(workOrderBoms)) {
            return;
        }
        MesProWorkOrderBomDO workOrderBom = CollUtil.findOne(workOrderBoms,
                bom -> bom.getItemId().equals(itemId));
        if (workOrderBom == null) {
            throw exception(WM_PRODUCT_ISSUE_LINE_ITEM_NOT_IN_BOM);
        }
    }
 
}