18 小时以前 7a681887e5a8e1aab49acc886974d354c69a280e
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java
@@ -6,10 +6,12 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.qc.indicator.vo.MesQcIndicatorPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.indicator.vo.MesQcIndicatorSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicator.MesQcIndicatorMapper;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcIndicatorItemTypeEnum;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -38,6 +40,8 @@
    @Override
    public Long createIndicator(MesQcIndicatorSaveReqVO createReqVO) {
        // 规范化层级字段
        normalizeHierarchyFields(createReqVO);
        // 校验相关参数
        validateIndicatorSaveData(null, createReqVO);
@@ -51,6 +55,8 @@
    public void updateIndicator(MesQcIndicatorSaveReqVO updateReqVO) {
        // 校验存在
        validateIndicatorExists(updateReqVO.getId());
        // 规范化层级字段
        normalizeHierarchyFields(updateReqVO);
        // 校验相关参数
        validateIndicatorSaveData(updateReqVO.getId(), updateReqVO);
@@ -62,24 +68,72 @@
    @Override
    public void deleteIndicator(Long id) {
        // 校验存在
        validateIndicatorExists(id);
        MesQcIndicatorDO indicator = validateIndicatorExists(id);
        // 校验无子项
        Long childCount = indicatorMapper.selectCount(new LambdaQueryWrapperX<MesQcIndicatorDO>()
                .eq(MesQcIndicatorDO::getParentId, id));
        if (childCount != null && childCount > 0) {
            throw exception(QC_INDICATOR_EXISTS_CHILDREN, indicator.getName());
        }
        // 删除
        indicatorMapper.deleteById(id);
    }
    private void normalizeHierarchyFields(MesQcIndicatorSaveReqVO saveReqVO) {
        if (saveReqVO.getParentId() == null) {
            saveReqVO.setParentId(0L);
        }
        if (saveReqVO.getItemType() == null) {
            saveReqVO.setItemType(MesQcIndicatorItemTypeEnum.RECORD.getType());
        }
        if (saveReqVO.getSortOrder() == null) {
            saveReqVO.setSortOrder(0);
        }
    }
    private void validateIndicatorSaveData(Long id, MesQcIndicatorSaveReqVO saveReqVO) {
        // 校验编码唯一
        validateIndicatorCodeUnique(id, saveReqVO.getCode());
        // 校验名称唯一
        validateIndicatorNameUnique(id, saveReqVO.getName());
        // 校验同层级名称唯一(不同分组下允许同名参数行,如"试样体积V/mL")
        validateIndicatorNameUnique(id, saveReqVO.getName(), saveReqVO.getParentId());
        // 校验层级合法性(父项存在、父项为分组项、最多两级)
        validateIndicatorHierarchy(id, saveReqVO);
        // 录入项必须指定结果值类型
        if (ObjUtil.notEqual(MesQcIndicatorItemTypeEnum.GROUP.getType(), saveReqVO.getItemType())
                && saveReqVO.getResultType() == null) {
            throw exception(QC_INDICATOR_RESULT_TYPE_REQUIRED);
        }
        // 校验结果值属性
        validateResultSpecification(saveReqVO.getResultType(), saveReqVO.getResultSpecification());
    }
    private void validateIndicatorExists(Long id) {
        if (indicatorMapper.selectById(id) == null) {
    private void validateIndicatorHierarchy(Long id, MesQcIndicatorSaveReqVO saveReqVO) {
        Long parentId = saveReqVO.getParentId();
        if (parentId == null || parentId == 0L) {
            return;
        }
        if (ObjUtil.equal(parentId, id)) {
            throw exception(QC_INDICATOR_PARENT_NOT_GROUP, saveReqVO.getName());
        }
        MesQcIndicatorDO parent = indicatorMapper.selectById(parentId);
        if (parent == null) {
            throw exception(QC_INDICATOR_NOT_EXISTS);
        }
        if (ObjUtil.notEqual(MesQcIndicatorItemTypeEnum.GROUP.getType(), parent.getItemType())) {
            throw exception(QC_INDICATOR_PARENT_NOT_GROUP, parent.getName());
        }
        // 仅允许两级:父分组本身必须是顶级
        if (ObjUtil.defaultIfNull(parent.getParentId(), 0L) != 0L) {
            throw exception(QC_INDICATOR_PARENT_LEVEL_EXCEEDED, parent.getName());
        }
    }
    private MesQcIndicatorDO validateIndicatorExists(Long id) {
        MesQcIndicatorDO indicator = indicatorMapper.selectById(id);
        if (indicator == null) {
            throw exception(QC_INDICATOR_NOT_EXISTS);
        }
        return indicator;
    }
    private void validateIndicatorCodeUnique(Long id, String code) {
@@ -92,12 +146,12 @@
        }
    }
    private void validateIndicatorNameUnique(Long id, String name) {
        MesQcIndicatorDO indicator = indicatorMapper.selectByName(name);
        if (indicator == null) {
            return;
        }
        if (ObjUtil.notEqual(indicator.getId(), id)) {
    private void validateIndicatorNameUnique(Long id, String name, Long parentId) {
        Long count = indicatorMapper.selectCount(new LambdaQueryWrapperX<MesQcIndicatorDO>()
                .eq(MesQcIndicatorDO::getName, name)
                .eq(MesQcIndicatorDO::getParentId, ObjUtil.defaultIfNull(parentId, 0L))
                .ne(id != null, MesQcIndicatorDO::getId, id));
        if (count != null && count > 0) {
            throw exception(QC_INDICATOR_NAME_DUPLICATE);
        }
    }