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
169
170
171
172
173
package cn.iocoder.yudao.module.mdm.service.item;
 
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemModelPageReqVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemModelSaveReqVO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemModelDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO;
import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemModelMapper;
import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*;
 
/**
 * MDM 物料型号 Service 实现类
 *
 * @author 超级管理员
 */
@Service
@Validated
public class MdmItemModelServiceImpl implements MdmItemModelService {
 
    @Resource
    private MdmItemModelMapper itemModelMapper;
 
    @Resource
    private MdmItemService itemService;
    @Resource
    private MdmUnitMeasureService unitMeasureService;
 
    @Override
    public Long createItemModel(MdmItemModelSaveReqVO createReqVO) {
        validateItemModelSaveData(null, createReqVO);
 
        MdmItemModelDO itemModel = BeanUtils.toBean(createReqVO, MdmItemModelDO.class);
        if (itemModel.getStatus() == null) {
            itemModel.setStatus(CommonStatusEnum.ENABLE.getStatus());
        }
        itemModelMapper.insert(itemModel);
        return itemModel.getId();
    }
 
    @Override
    public void updateItemModel(MdmItemModelSaveReqVO updateReqVO) {
        validateItemModelExists(updateReqVO.getId());
        validateItemModelSaveData(updateReqVO.getId(), updateReqVO);
 
        itemModelMapper.updateById(BeanUtils.toBean(updateReqVO, MdmItemModelDO.class));
    }
 
    private void validateItemModelSaveData(Long id, MdmItemModelSaveReqVO reqVO) {
        // 校验物料存在
        MdmItemDO item = itemService.validateItemExists(reqVO.getItemId());
        // 校验型号单位存在
        unitMeasureService.validateUnitMeasureExists(reqVO.getUnitMeasureId());
        // 校验换算比率大于 0
        if (reqVO.getUnitMeasureRate() == null
                || reqVO.getUnitMeasureRate().compareTo(BigDecimal.ZERO) <= 0) {
            throw exception(MDM_ITEM_MODEL_RATE_INVALID, reqVO.getModel(), reqVO.getUnitMeasureRate());
        }
        // 校验同一物料下型号名称唯一
        if (StrUtil.isNotBlank(reqVO.getModel())) {
            MdmItemModelDO exists = itemModelMapper.selectByItemIdAndModel(reqVO.getItemId(), reqVO.getModel());
            if (exists != null && ObjUtil.notEqual(exists.getId(), id)) {
                throw exception(MDM_ITEM_MODEL_NAME_DUPLICATE, reqVO.getModel());
            }
        }
        // 型号单位与物料主单位一致时,比率必须为 1(否则换算无意义且易误配)
        if (ObjUtil.equal(item.getUnitMeasureId(), reqVO.getUnitMeasureId())
                && reqVO.getUnitMeasureRate().compareTo(BigDecimal.ONE) != 0) {
            throw exception(MDM_ITEM_MODEL_RATE_MUST_BE_ONE, reqVO.getModel(),
                    unitName(reqVO.getUnitMeasureId()), unitName(item.getUnitMeasureId()));
        }
    }
 
    private String unitName(Long unitMeasureId) {
        MdmUnitMeasureDO unit = unitMeasureService.getUnitMeasure(unitMeasureId);
        return unit != null ? unit.getName() : "ID=" + unitMeasureId;
    }
 
    @Override
    public void deleteItemModel(Long id) {
        validateItemModelExists(id);
        itemModelMapper.deleteById(id);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveItemModelList(Long itemId, List<MdmItemModelSaveReqVO> modelList) {
        itemService.validateItemExists(itemId);
        // 第一步,删除旧的型号
        itemModelMapper.deleteByItemId(itemId);
        if (CollUtil.isEmpty(modelList)) {
            return;
        }
        // 第二步,插入新的型号
        for (MdmItemModelSaveReqVO reqVO : modelList) {
            reqVO.setItemId(itemId);
            reqVO.setId(null);
            createItemModel(reqVO);
        }
    }
 
    @Override
    public MdmItemModelDO getItemModel(Long id) {
        return itemModelMapper.selectById(id);
    }
 
    @Override
    public List<MdmItemModelDO> getItemModelList(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return Collections.emptyList();
        }
        return itemModelMapper.selectBatchIds(ids);
    }
 
    @Override
    public List<MdmItemModelDO> getItemModelListByItemId(Long itemId) {
        return itemModelMapper.selectListByItemId(itemId);
    }
 
    @Override
    public List<MdmItemModelDO> getItemModelListByItemIds(Collection<Long> itemIds) {
        if (CollUtil.isEmpty(itemIds)) {
            return Collections.emptyList();
        }
        return itemModelMapper.selectListByItemIds(itemIds);
    }
 
    @Override
    public PageResult<MdmItemModelDO> getItemModelPage(MdmItemModelPageReqVO pageReqVO) {
        return itemModelMapper.selectPage(pageReqVO);
    }
 
    @Override
    public MdmItemModelDO validateItemModelExists(Long id) {
        MdmItemModelDO itemModel = itemModelMapper.selectById(id);
        if (itemModel == null) {
            throw exception(MDM_ITEM_MODEL_NOT_EXISTS);
        }
        return itemModel;
    }
 
    @Override
    public MdmItemModelDO validateItemModelExistsAndEnable(Long id) {
        MdmItemModelDO itemModel = validateItemModelExists(id);
        if (CommonStatusEnum.isDisable(itemModel.getStatus())) {
            throw exception(MDM_ITEM_MODEL_IS_DISABLE);
        }
        return itemModel;
    }
 
    @Override
    public void deleteItemModelListByItemId(Long itemId) {
        itemModelMapper.deleteByItemId(itemId);
    }
 
}