云
2 天以前 87733eb3623593da247c051593d64b8ff9e1d3a4
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
package cn.iocoder.yudao.module.mes.service.qc.seedquality;
 
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedIndicatorRangeSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedIndicatorRangeDO;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.MesQcSeedIndicatorRangeMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
 
@Service
public class MesQcSeedIndicatorRangeService {
 
    @Resource
    private MesQcSeedIndicatorRangeMapper mapper;
    @Resource
    private MesMdmItemService mdmItemService;
 
    /** 配置页查询:itemId 为空表示通用默认项 */
    public List<MesQcSeedIndicatorRangeDO> getRanges(Long itemId, String keyword, Integer status) {
        return mapper.selectListByItemId(itemId, keyword, status);
    }
 
    /**
     * 生效指标:产品专属配置优先,未配置时回退通用默认项。
     */
    public List<MesQcSeedIndicatorRangeDO> getEffectiveRanges(Long itemId) {
        List<MesQcSeedIndicatorRangeDO> productRanges = itemId == null ? List.of() : mapper.selectEnabledByItemId(itemId);
        return productRanges.isEmpty() ? mapper.selectEnabledDefaults() : productRanges;
    }
 
    public Map<String, MesQcSeedIndicatorRangeDO> getEffectiveMap(Long itemId) {
        Map<String, MesQcSeedIndicatorRangeDO> result = new LinkedHashMap<>();
        for (MesQcSeedIndicatorRangeDO range : getEffectiveRanges(itemId)) {
            result.put(range.getIndicatorCode(), range);
        }
        return result;
    }
 
    @Transactional(rollbackFor = Exception.class)
    public Long create(MesQcSeedIndicatorRangeSaveReqVO reqVO) {
        validateProduct(reqVO.getItemId());
        validateRange(reqVO);
        if (mapper.selectByItemIdAndCode(reqVO.getItemId(), reqVO.getIndicatorCode()) != null)
            throw new IllegalArgumentException("该产品已存在相同编码的质检项:" + reqVO.getIndicatorCode());
        MesQcSeedIndicatorRangeDO row = buildRow(reqVO);
        mapper.insert(row);
        return row.getId();
    }
 
    @Transactional(rollbackFor = Exception.class)
    public void update(Long id, MesQcSeedIndicatorRangeSaveReqVO reqVO) {
        MesQcSeedIndicatorRangeDO existing = mapper.selectById(id);
        if (existing == null) throw new IllegalArgumentException("质检项不存在或已删除");
        validateProduct(reqVO.getItemId());
        validateRange(reqVO);
        MesQcSeedIndicatorRangeDO sameCode = mapper.selectByItemIdAndCode(reqVO.getItemId(), reqVO.getIndicatorCode());
        if (sameCode != null && !sameCode.getId().equals(id))
            throw new IllegalArgumentException("该产品已存在相同编码的质检项:" + reqVO.getIndicatorCode());
        MesQcSeedIndicatorRangeDO update = buildRow(reqVO);
        update.setId(id);
        mapper.updateById(update);
    }
 
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        MesQcSeedIndicatorRangeDO existing = mapper.selectById(id);
        if (existing == null) throw new IllegalArgumentException("质检项不存在或已删除");
        mapper.deleteById(id);
    }
 
    /** 将通用默认项复制到指定产品,已存在的编码跳过 */
    @Transactional(rollbackFor = Exception.class)
    public int copyDefaults(Long itemId) {
        validateProduct(itemId);
        int copied = 0;
        for (MesQcSeedIndicatorRangeDO source : mapper.selectEnabledDefaults()) {
            if (mapper.selectByItemIdAndCode(itemId, source.getIndicatorCode()) != null) continue;
            MesQcSeedIndicatorRangeDO row = new MesQcSeedIndicatorRangeDO();
            row.setItemId(itemId);
            row.setIndicatorCode(source.getIndicatorCode());
            row.setIndicatorName(source.getIndicatorName());
            row.setUnit(source.getUnit());
            row.setMinValue(source.getMinValue());
            row.setMaxValue(source.getMaxValue());
            row.setSort(source.getSort());
            row.setStatus(0);
            mapper.insert(row);
            copied++;
        }
        return copied;
    }
 
    private void validateProduct(Long itemId) {
        if (itemId == null) throw new IllegalArgumentException("请先选择产品");
        if (mdmItemService.getItem(itemId) == null) throw new IllegalArgumentException("产品不存在,请重新选择");
    }
 
    private void validateRange(MesQcSeedIndicatorRangeSaveReqVO reqVO) {
        if (reqVO.getMinValue().compareTo(reqVO.getMaxValue()) > 0)
            throw new IllegalArgumentException("合格下限不能大于上限:" + reqVO.getIndicatorName());
    }
 
    private MesQcSeedIndicatorRangeDO buildRow(MesQcSeedIndicatorRangeSaveReqVO reqVO) {
        MesQcSeedIndicatorRangeDO row = new MesQcSeedIndicatorRangeDO();
        row.setItemId(reqVO.getItemId());
        row.setIndicatorCode(reqVO.getIndicatorCode().trim());
        row.setIndicatorName(reqVO.getIndicatorName().trim());
        row.setUnit(StrUtil.blankToDefault(reqVO.getUnit(), "%"));
        row.setMinValue(reqVO.getMinValue());
        row.setMaxValue(reqVO.getMaxValue());
        row.setSort(reqVO.getSort() == null ? 0 : reqVO.getSort());
        row.setStatus(reqVO.getStatus() == null ? 0 : reqVO.getStatus());
        return row;
    }
}