gaoluyang
17 小时以前 bc9d77f6061a5c7f7deceaabc7c5ed6c17ad8c2f
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
package cn.iocoder.yudao.module.mes.service.wm.miscissue;
 
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.miscissue.vo.line.MesWmMiscIssueLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue.MesWmMiscIssueLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscissue.MesWmMiscIssueLineMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.unitconvert.MesWmItemUnitConvertService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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.WM_MISC_ISSUE_LINE_NOT_EXISTS;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_MISC_ISSUE_LINE_QUANTITY_REQUIRED;
 
/**
 * MES 杂项出库单行 Service 实现类
 */
@Service
@Validated
public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService {
 
    @Resource
    private MesWmMiscIssueLineMapper miscIssueLineMapper;
 
    @Resource
    @Lazy
    private MesWmMiscIssueService miscIssueService;
    @Resource
    @Lazy
    private MesWmMiscIssueDetailService miscIssueDetailService;
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesWmWarehouseAreaService warehouseAreaService;
    @Resource
    private MesWmItemUnitConvertService itemUnitConvertService;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createMiscIssueLine(MesWmMiscIssueLineSaveReqVO createReqVO) {
        // 1. 校验数据
        validateMiscIssueLineSaveData(createReqVO.getIssueId(), createReqVO);
 
        // 2. 双单位换算:按录入单位换算为物料主单位数量
        fillPrimaryQuantity(createReqVO);
 
        // 3. 新增行
        MesWmMiscIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmMiscIssueLineDO.class);
        miscIssueLineMapper.insert(line);
 
        // 4.自动创建明细
        createReqVO.setId(line.getId());
        miscIssueDetailService.createMiscIssueDetail(createReqVO);
        return line.getId();
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateMiscIssueLine(MesWmMiscIssueLineSaveReqVO updateReqVO) {
        // 1.1 校验存在
        MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(updateReqVO.getId());
        // 1.2 校验数据
        validateMiscIssueLineSaveData(line.getIssueId(), updateReqVO);
 
        // 2. 双单位换算:按录入单位换算为物料主单位数量
        fillPrimaryQuantity(updateReqVO);
 
        // 3. 更新行
        MesWmMiscIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscIssueLineDO.class);
        miscIssueLineMapper.updateById(updateObj);
 
        // 4. 更新明细(基于行信息)
        miscIssueDetailService.updateMiscIssueDetail(updateReqVO);
    }
 
    /**
     * 双单位换算:选择了录入单位时,按「录入数量 × 换算比率」得到物料主单位口径的出库数量
     *
     * 换算结果写回请求参数,使行与 1:1 明细的口径保持一致;未按辅单位录入时必须直接填写出库数量
     */
    private void fillPrimaryQuantity(MesWmMiscIssueLineSaveReqVO reqVO) {
        if (reqVO.getEnterUnitMeasureId() != null) {
            BigDecimal primaryQuantity = itemUnitConvertService.convertToPrimaryUnit(
                    reqVO.getItemId(), reqVO.getItemModelId(),
                    reqVO.getEnterUnitMeasureId(), reqVO.getEnterQuantity());
            if (primaryQuantity != null) {
                reqVO.setQuantity(primaryQuantity);
            }
        }
        if (reqVO.getQuantity() == null) {
            throw exception(WM_MISC_ISSUE_LINE_QUANTITY_REQUIRED);
        }
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteMiscIssueLine(Long id) {
        // 校验存在
        MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(id);
        // 校验父单据存在且为可编辑状态
        miscIssueService.validateMiscIssueEditable(line.getIssueId());
 
        // 删除行
        miscIssueLineMapper.deleteById(id);
        // 删除明细
        miscIssueDetailService.deleteMiscIssueDetailByLineId(id);
    }
 
    @Override
    public MesWmMiscIssueLineDO getMiscIssueLine(Long id) {
        return miscIssueLineMapper.selectById(id);
    }
 
    @Override
    public PageResult<MesWmMiscIssueLineDO> getMiscIssueLinePage(MesWmMiscIssueLinePageReqVO pageReqVO) {
        return miscIssueLineMapper.selectPage(pageReqVO);
    }
 
    @Override
    public List<MesWmMiscIssueLineDO> getMiscIssueLineListByIssueId(Long issueId) {
        return miscIssueLineMapper.selectListByIssueId(issueId);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteMiscIssueLineByIssueId(Long issueId) {
        // 删除明细
        miscIssueDetailService.deleteMiscIssueDetailByIssueId(issueId);
        // 删除行
        miscIssueLineMapper.deleteByIssueId(issueId);
    }
 
    @Override
    public void validateMiscIssueLineExists(Long id) {
        if (miscIssueLineMapper.selectById(id) == null) {
            throw exception(WM_MISC_ISSUE_LINE_NOT_EXISTS);
        }
    }
 
    private MesWmMiscIssueLineDO validateAndGetMiscIssueLine(Long id) {
        MesWmMiscIssueLineDO line = miscIssueLineMapper.selectById(id);
        if (line == null) {
            throw exception(WM_MISC_ISSUE_LINE_NOT_EXISTS);
        }
        return line;
    }
 
    private void validateMiscIssueLineSaveData(Long issueId, MesWmMiscIssueLineSaveReqVO reqVO) {
        // 校验父单据存在且为可编辑状态
        miscIssueService.validateMiscIssueEditable(issueId);
        // 校验物料存在
        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
        // 校验仓库、库区、库位的父子关系
        warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(),
                reqVO.getLocationId(), reqVO.getAreaId());
    }
 
}