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 getRanges(Long itemId, String keyword, Integer status) { return mapper.selectListByItemId(itemId, keyword, status); } /** * 生效指标:产品专属配置优先,未配置时回退通用默认项。 */ public List getEffectiveRanges(Long itemId) { List productRanges = itemId == null ? List.of() : mapper.selectEnabledByItemId(itemId); return productRanges.isEmpty() ? mapper.selectEnabledDefaults() : productRanges; } public Map getEffectiveMap(Long itemId) { Map 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; } }