liu
2026-10-23 962f78c8383e7c884ddb08c951c15e5ba6eb4cb8
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
package cn.iocoder.yudao.module.mes.service.wm.returnvendor;
 
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorDetailMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
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.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.*;
 
/**
 * MES 供应商退货明细 Service 实现类
 */
@Service
@Validated
public class MesWmReturnVendorDetailServiceImpl implements MesWmReturnVendorDetailService {
 
    @Resource
    private MesWmReturnVendorDetailMapper returnVendorDetailMapper;
 
    @Resource
    @Lazy
    private MesWmReturnVendorLineService returnVendorLineService;
    // 与 ReturnVendorServiceImpl 相互引用,须用 @Lazy 打破循环
    @Resource
    @Lazy
    private MesWmReturnVendorService returnVendorService;
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesWmMaterialStockService materialStockService;
    @Resource
    private MesWmWarehouseAreaService warehouseAreaService;
 
    @Override
    public Long createReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO createReqVO) {
        // 校验数据
        validateDetailSaveData(createReqVO);
 
        // 插入
        MesWmReturnVendorDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnVendorDetailDO.class);
        returnVendorDetailMapper.insert(detail);
        return detail.getId();
    }
 
    @Override
    public void updateReturnVendorDetail(MesWmReturnVendorDetailSaveReqVO updateReqVO) {
        // 校验存在
        validateReturnVendorDetailExists(updateReqVO.getId());
        // 校验数据
        validateDetailSaveData(updateReqVO);
 
        // 更新
        MesWmReturnVendorDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDetailDO.class);
        returnVendorDetailMapper.updateById(updateObj);
    }
 
    /**
     * 校验明细创建/修改的公共数据
     */
    private void validateDetailSaveData(MesWmReturnVendorDetailSaveReqVO reqVO) {
        // 校验父单(退货单)处于准备中状态,审批期间及之后禁止增删改明细
        returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId());
        // 校验父数据(行)存在
        MesWmReturnVendorLineDO line = returnVendorLineService.validateReturnVendorLineExists(reqVO.getLineId());
        if (ObjUtil.notEqual(line.getReturnId(), reqVO.getReturnId())) {
            throw exception(WM_RETURN_VENDOR_DETAIL_LINE_NOT_MATCH);
        }
        // 校验物料存在
        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
        // 校验物料与行物料一致
        validateItemConsistency(reqVO.getItemId(), line);
        // 校验库位存在
        warehouseAreaService.validateWarehouseAreaExists(
                reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId());
        // 校验库存记录存在且物料一致
        validateMaterialStock(reqVO, line);
    }
 
    @Override
    public void deleteReturnVendorDetail(Long id) {
        // 校验存在
        MesWmReturnVendorDetailDO detail = validateReturnVendorDetailExists(id);
        // 校验父单处于准备中状态,审批期间及之后禁止删除明细
        returnVendorService.validateReturnVendorExistsAndPrepare(detail.getReturnId());
        // 删除
        returnVendorDetailMapper.deleteById(id);
    }
 
    @Override
    public MesWmReturnVendorDetailDO getReturnVendorDetail(Long id) {
        return returnVendorDetailMapper.selectById(id);
    }
 
    @Override
    public List<MesWmReturnVendorDetailDO> getReturnVendorDetailListByLineId(Long lineId) {
        return returnVendorDetailMapper.selectListByLineId(lineId);
    }
 
    @Override
    public List<MesWmReturnVendorDetailDO> getReturnVendorDetailListByReturnId(Long returnId) {
        return returnVendorDetailMapper.selectListByReturnId(returnId);
    }
 
    @Override
    public void deleteReturnVendorDetailByReturnId(Long returnId) {
        returnVendorDetailMapper.deleteByReturnId(returnId);
    }
 
    @Override
    public void deleteReturnVendorDetailByLineId(Long lineId) {
        returnVendorDetailMapper.deleteByLineId(lineId);
    }
 
    private MesWmReturnVendorDetailDO validateReturnVendorDetailExists(Long id) {
        MesWmReturnVendorDetailDO detail = returnVendorDetailMapper.selectById(id);
        if (detail == null) {
            throw exception(WM_RETURN_VENDOR_DETAIL_NOT_EXISTS);
        }
        return detail;
    }
 
    /**
     * 校验明细物料与行物料一致
     */
    private void validateItemConsistency(Long detailItemId, MesWmReturnVendorLineDO line) {
        if (ObjUtil.notEqual(detailItemId, line.getItemId())) {
            throw exception(WM_RETURN_VENDOR_DETAIL_ITEM_MISMATCH);
        }
    }
 
    /**
     * 校验库存记录存在且物料与行物料一致
     */
    private void validateMaterialStock(MesWmReturnVendorDetailSaveReqVO reqVO, MesWmReturnVendorLineDO line) {
        materialStockService.validateSelectedStock(
                reqVO.getMaterialStockId(), reqVO.getItemId(), reqVO.getBatchId(), reqVO.getBatchCode(),
                reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId(), reqVO.getQuantity());
        if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) {
            throw exception(WM_RETURN_VENDOR_DETAIL_ITEM_MISMATCH);
        }
    }
 
}