| | |
| | | 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; |
| | |
| | | |
| | | @Override |
| | | public Long createIndicator(MesQcIndicatorSaveReqVO createReqVO) { |
| | | // 规范化层级字段 |
| | | normalizeHierarchyFields(createReqVO); |
| | | // 校验相关参数 |
| | | validateIndicatorSaveData(null, createReqVO); |
| | | |
| | |
| | | public void updateIndicator(MesQcIndicatorSaveReqVO updateReqVO) { |
| | | // 校验存在 |
| | | validateIndicatorExists(updateReqVO.getId()); |
| | | // 规范化层级字段 |
| | | normalizeHierarchyFields(updateReqVO); |
| | | // 校验相关参数 |
| | | validateIndicatorSaveData(updateReqVO.getId(), updateReqVO); |
| | | |
| | |
| | | @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) { |
| | |
| | | } |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | } |