9 天以前 2e84a447af471fe5ada907c28849838a6bc3a340
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
package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice;
 
import cn.hutool.core.util.BooleanUtil;
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.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
 
import java.math.BigDecimal;
import java.util.List;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 
/**
 * MES 到货通知单行 Service 实现类
 */
@Service
@Validated
public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLineService {
 
    @Resource
    private MesWmArrivalNoticeLineMapper arrivalNoticeLineMapper;
 
    @Resource
    @Lazy
    private MesWmArrivalNoticeService arrivalNoticeService;
    @Resource
    private MesMdmItemService mdmItemService;
 
    @Override
    public Long createArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO createReqVO) {
        // 校验数据
        validateArrivalNoticeLineSaveData(createReqVO);
 
        // 插入
        MesWmArrivalNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeLineDO.class);
        initQualifiedQuantityIfNoIqc(line);
        arrivalNoticeLineMapper.insert(line);
        return line.getId();
    }
 
    @Override
    public void updateArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO updateReqVO) {
        // 校验存在
        MesWmArrivalNoticeLineDO line = validateArrivalNoticeLineExists(updateReqVO.getId());
        // 校验数据
        updateReqVO.setNoticeId(line.getNoticeId());
        validateArrivalNoticeLineSaveData(updateReqVO);
 
        // 更新
        MesWmArrivalNoticeLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeLineDO.class);
        initQualifiedQuantityIfNoIqc(updateObj);
        arrivalNoticeLineMapper.updateById(updateObj);
    }
 
    private void validateArrivalNoticeLineSaveData(MesWmArrivalNoticeLineSaveReqVO reqVO) {
        // 校验父单据存在且为草稿状态
        arrivalNoticeService.validateArrivalNoticeExistsAndDraft(reqVO.getNoticeId());
        // 校验物料存在
        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
    }
 
    /**
     * 初始化合格品数量:
     * 1. 如果不需要 IQC 检验,则合格品数量直接 = 接收数量;
     * 2. 否则,合格品数量由对应的 IQC 检验单负责更新(见 {@link #updateArrivalNoticeLineWhenIqcFinish})
     */
    private void initQualifiedQuantityIfNoIqc(MesWmArrivalNoticeLineDO line) {
        if (BooleanUtil.isFalse(line.getIqcCheckFlag())) {
            line.setQualifiedQuantity(line.getArrivalQuantity());
        }
    }
 
    @Override
    public void deleteArrivalNoticeLine(Long id) {
        // 校验存在
        MesWmArrivalNoticeLineDO line = validateArrivalNoticeLineExists(id);
        // 校验父单据存在且为草稿状态
        arrivalNoticeService.validateArrivalNoticeExistsAndDraft(line.getNoticeId());
 
        // 删除
        arrivalNoticeLineMapper.deleteById(id);
    }
 
    @Override
    public MesWmArrivalNoticeLineDO getArrivalNoticeLine(Long id) {
        return arrivalNoticeLineMapper.selectById(id);
    }
 
    @Override
    public PageResult<MesWmArrivalNoticeLineDO> getArrivalNoticeLinePage(MesWmArrivalNoticeLinePageReqVO pageReqVO) {
        return arrivalNoticeLineMapper.selectPage(pageReqVO);
    }
 
    @Override
    public List<MesWmArrivalNoticeLineDO> getArrivalNoticeLineListByNoticeId(Long noticeId) {
        return arrivalNoticeLineMapper.selectListByNoticeId(noticeId);
    }
 
    @Override
    public void deleteArrivalNoticeLineByNoticeId(Long noticeId) {
        arrivalNoticeLineMapper.deleteByNoticeId(noticeId);
    }
 
    @Override
    public void updateArrivalNoticeLineWhenIqcFinish(Long lineId, Long iqcId, BigDecimal qualifiedQuantity) {
        // 校验行存在
        validateArrivalNoticeLineExists(lineId);
        // 更新
        arrivalNoticeLineMapper.updateById(new MesWmArrivalNoticeLineDO()
                .setId(lineId).setIqcId(iqcId).setQualifiedQuantity(qualifiedQuantity));
    }
 
    @Override
    public MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long id) {
        MesWmArrivalNoticeLineDO line = arrivalNoticeLineMapper.selectById(id);
        if (line == null) {
            throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS);
        }
        return line;
    }
 
    @Override
    public MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long lineId, Long noticeId) {
        MesWmArrivalNoticeLineDO line = validateArrivalNoticeLineExists(lineId);
        // 进一步校验行的 noticeId 与传入的 noticeId 是否匹配
        if (noticeId != null && ObjUtil.notEqual(line.getNoticeId(), noticeId)) {
            throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_MATCH);
        }
        return line;
    }
 
    @Override
    public void createArrivalNoticeLineFromPurchaseOrderItem(MesWmArrivalNoticeLineDO line) {
        // 内部方法,不做校验,直接插入
        initQualifiedQuantityIfNoIqc(line);
        arrivalNoticeLineMapper.insert(line);
    }
 
}