package com.ruoyi.basic.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.AddStandardTreeNodeDto; import com.ruoyi.basic.dto.SampleTypeDto; import com.ruoyi.basic.dto.StandardLibraryTreeNodeDto; import com.ruoyi.basic.dto.StandardLibraryTreeRowDto; import com.ruoyi.basic.dto.UpdateStandardTreeNodeDto; import com.ruoyi.basic.dto.StandardTreeTemplateBindingDto; import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo; import com.ruoyi.basic.dto.TemplateBindingItemDto; import com.ruoyi.basic.dto.TemplateInspectionItemDto; import com.ruoyi.basic.mapper.LaboratoryMapper; import com.ruoyi.basic.mapper.StandardProductListMapper; import com.ruoyi.basic.mapper.StandardTreeMapper; import com.ruoyi.basic.mapper.StandardTreeTemplateBindingMapper; import com.ruoyi.basic.mapper.StructureItemParameterMapper; import com.ruoyi.basic.mapper.StructureTestObjectMapper; import com.ruoyi.basic.pojo.Laboratory; import com.ruoyi.basic.pojo.StandardProductList; import com.ruoyi.basic.pojo.StandardTree; import com.ruoyi.basic.pojo.StandardTemplate; import com.ruoyi.basic.pojo.StandardTreeTemplateBinding; import com.ruoyi.basic.pojo.StructureItemParameter; import com.ruoyi.basic.pojo.StructureTestObject; import com.ruoyi.basic.service.StandardTreeService; import com.ruoyi.basic.service.StandardTemplateService; import com.ruoyi.basic.utils.StandardTreePath; import com.ruoyi.basic.utils.StandardTreePathParser; import com.ruoyi.basic.utils.StandardTemplateInspectionItemParser; import com.ruoyi.common.exception.base.BaseException; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.HashSet; import java.util.Comparator; import java.util.Set; /** * @author Administrator * @description 针对表【standard_tree(标准树)】的数据库操作Service实现 * @createDate 2024-03-01 15:06:44 */ @Service @AllArgsConstructor public class StandardTreeServiceImpl extends ServiceImpl implements StandardTreeService { private StandardTreeMapper standardTreeMapper; private StandardProductListMapper standardProductListMapper; private StructureItemParameterMapper structureItemParameterMapper; private StructureTestObjectMapper structureTestObjectMapper; private LaboratoryMapper laboratoryMapper; private StandardTreeTemplateBindingMapper standardTreeTemplateBindingMapper; private StandardTemplateService standardTemplateService; @Override public List selectStandardTreeList() { List rows = standardTreeMapper.selectStandardLibraryTree(); List industries = new ArrayList<>(); Map industryMap = new LinkedHashMap<>(); for (StandardLibraryTreeRowDto row : rows) { StandardLibraryTreeNodeDto industry = industryMap.get(row.getIndustryId()); if (industry == null) { industry = new StandardLibraryTreeNodeDto(); industry.setId(row.getIndustryId()); industry.setLabel(row.getIndustryName()); industry.setValue(row.getIndustryName()); industry.setCode("[1]"); industry.setChildren(new ArrayList<>()); industryMap.put(row.getIndustryId(), industry); industries.add(industry); } if (row.getStandardId() != null) { StandardLibraryTreeNodeDto standard = new StandardLibraryTreeNodeDto(); standard.setId(row.getStandardId()); standard.setLabel(row.getStandardCode()); standard.setValue(row.getStandardLabel()); standard.setCode("[2]"); standard.setSampleEn(row.getStandardNameEn()); standard.setStandardMethodId(row.getStandardMethodId()); standard.setStandardCode(row.getStandardCode()); standard.setStandardName(row.getStandardName()); standard.setChildren(null); industry.getChildren().add(standard); } } return industries; } @Override @Transactional(rollbackFor = Exception.class) public int addStandardTree(AddStandardTreeNodeDto dto) { if (dto == null) { throw new BaseException("标准树路径格式错误"); } String name = StandardTreePathParser.normalizeNodeName(dto.getName()); if (StringUtils.isBlank(dto.getParentTree())) { // 新增行业节点 Long count = laboratoryMapper.selectCount(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, name)); if (count > 0) { throw new BaseException("行业名称已存在"); } Laboratory laboratory = new Laboratory(); laboratory.setLaboratoryName(name); laboratory.setSort(0); return laboratoryMapper.insert(laboratory); } throw new BaseException("二级标准请在“标准维护”中通过行业绑定进行维护"); /* // 在行业下新增标准节点 StandardTreePath path = StandardTreePathParser.parse(dto.getParentTree()); if (path.getStandard() != null) { throw new BaseException("标准节点下不能继续新增"); } String industry = path.getIndustry(); Long labCount = laboratoryMapper.selectCount(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, industry)); if (labCount == 0) { throw new BaseException("行业不存在"); } Long stdCount = standardTreeMapper.selectCount(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, industry) .eq(StandardTree::getSample, name) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel)); if (stdCount > 0) { throw new BaseException("该行业下标准名称已存在"); } StandardTree tree = new StandardTree(); tree.setLaboratory(industry); tree.setSample(name); tree.setFactory(null); tree.setSampleType(null); tree.setModel(null); tree.setSort(0); return standardTreeMapper.insert(tree); */ } @Override @Transactional(rollbackFor = Exception.class) public int delStandardTree(String tree) { StandardTreePath path = StandardTreePathParser.parse(tree); String industry = path.getIndustry(); String standard = path.getStandard(); if (standard != null) { throw new BaseException("二级标准请在“标准维护”中通过行业绑定进行维护"); } if (standard == null) { // 删除行业:行业下仍有标准时拒绝删除 Long count = standardTreeMapper.selectCount(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, industry) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel)); if (count > 0) { throw new BaseException("该行业下仍有标准,请先删除标准"); } Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, industry)); if (laboratory == null) { throw new BaseException("行业不存在"); } Long objectCount = structureTestObjectMapper.selectCount(Wrappers.lambdaQuery() .eq(StructureTestObject::getLaboratoryId, laboratory.getId())); if (objectCount > 0) { throw new BaseException("该行业已绑定检测对象,禁止删除"); } int deleted = laboratoryMapper.delete(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, industry)); if (deleted == 0) { throw new BaseException("行业不存在"); } return deleted; } // 删除标准及其标准库配置(不可达,保留历史实现说明) StandardTree standardTree = standardTreeMapper.selectOne(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, industry) .eq(StandardTree::getSample, standard) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel)); if (standardTree == null) { throw new BaseException("标准不存在"); } standardTreeTemplateBindingMapper.delete(Wrappers.lambdaQuery() .eq(StandardTreeTemplateBinding::getStandardTreeId, standardTree.getId())); standardTreeMapper.deleteById(standardTree.getId()); standardProductListMapper.delete(Wrappers.lambdaQuery() .eq(StandardProductList::getLaboratory, industry) .eq(StandardProductList::getSample, standard) .isNull(StandardProductList::getSampleType) .isNull(StandardProductList::getModel)); return 1; } @Override public List getStandardTree2() { return standardTreeMapper.getStandardTree2(); } @Override @Transactional(rollbackFor = Exception.class) public int upStandardProducts(Map product) { List ids = JSON.parseArray(product.get("ids") + ""); StandardProductList productList = JSON.parseObject(JSON.toJSONString(product.get("standardProductList")), StandardProductList.class); if (productList.getMethodS() != null) { standardProductListMapper.update(productList, Wrappers.lambdaUpdate().in(StandardProductList::getId, ids).like(StandardProductList::getMethod, productList.getMethodS())); return 1; } if (productList.getRadiusList() != null) { standardProductListMapper.update(productList, Wrappers.lambdaUpdate().in(StandardProductList::getId, ids).like(StandardProductList::getRadiusList, productList.getRadius())); return 1; } standardProductListMapper.update(productList, Wrappers.lambdaUpdate().in(StandardProductList::getId, ids)); return 1; } @Override @Transactional(rollbackFor = Exception.class) public boolean updateTreeSort(List list) { List trees = new ArrayList<>(); int industrySort = 0; for (StandardLibraryTreeNodeDto industry : list) { Laboratory lab = new Laboratory(); lab.setId(industry.getId()); lab.setSort(industrySort); laboratoryMapper.updateById(lab); industrySort++; List children = industry.getChildren(); if (children != null) { int standardSort = 0; for (StandardLibraryTreeNodeDto standard : children) { StandardTree tree = new StandardTree(); tree.setId(standard.getId()); tree.setSort(standardSort); trees.add(tree); standardSort++; } } } if (!trees.isEmpty()) { this.updateBatchById(trees); } return true; } /** * 修改标准树节点名 */ @Override @Transactional(rollbackFor = Exception.class) public int updateStandardTree(UpdateStandardTreeNodeDto dto) { if (dto == null) { throw new BaseException("标准树路径格式错误"); } String name = StandardTreePathParser.normalizeNodeName(dto.getName()); String oldLabel = StandardTreePathParser.normalizeNodeName(dto.getOldLabel()); if (StringUtils.isBlank(dto.getParentTree())) { return updateIndustry(oldLabel, name); } throw new BaseException("二级标准请在“标准维护”中通过行业绑定进行维护"); } private int updateIndustry(String oldName, String newName) { if (Objects.equals(oldName, newName)) { return ensureIndustryExists(oldName); } Long count = laboratoryMapper.selectCount(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, newName)); if (count > 0) { throw new BaseException("行业名称已存在"); } Laboratory old = laboratoryMapper.selectOne(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, oldName)); if (old == null) { throw new BaseException("行业不存在"); } Laboratory update = new Laboratory(); update.setId(old.getId()); update.setLaboratoryName(newName); if (laboratoryMapper.updateById(update) == 0) { throw new BaseException("行业不存在"); } // 级联标准树规范化记录 standardTreeMapper.update(null, Wrappers.lambdaUpdate() .eq(StandardTree::getLaboratory, oldName) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel) .set(StandardTree::getLaboratory, newName)); // 级联标准库配置 standardTreeMapper.updateProductListIndustry(oldName, newName); // 级联基础检验项 structureItemParameterMapper.update(null, Wrappers.lambdaUpdate() .eq(StructureItemParameter::getLaboratory, oldName) .set(StructureItemParameter::getLaboratory, newName)); // 级联未完成订单 standardTreeMapper.updateInsOrderIndustry(oldName, newName); standardTreeMapper.updateInsSampleIndustry(oldName, newName); standardTreeMapper.updateInsProductIndustry(oldName, newName); return 1; } private int updateStandard(String industry, String oldName, String newName) { if (Objects.equals(oldName, newName)) { return ensureStandardExists(industry, oldName); } Long count = standardTreeMapper.selectCount(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, industry) .eq(StandardTree::getSample, newName) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel)); if (count > 0) { throw new BaseException("该行业下标准名称已存在"); } StandardTree old = standardTreeMapper.selectOne(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, industry) .eq(StandardTree::getSample, oldName) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel)); if (old == null) { throw new BaseException("标准不存在"); } StandardTree update = new StandardTree(); update.setId(old.getId()); update.setSample(newName); if (standardTreeMapper.updateById(update) == 0) { throw new BaseException("标准不存在"); } // 级联标准库配置 standardTreeMapper.updateProductListStandard(industry, oldName, newName); // 级联未完成订单 standardTreeMapper.updateInsOrderStandard(industry, oldName, newName); standardTreeMapper.updateInsSampleStandard(industry, oldName, newName); standardTreeMapper.updateInsProductStandard(industry, oldName, newName); return 1; } private int ensureIndustryExists(String industry) { Long count = laboratoryMapper.selectCount(Wrappers.lambdaQuery() .eq(Laboratory::getLaboratoryName, industry)); if (count == 0) { throw new BaseException("行业不存在"); } return 1; } private int ensureStandardExists(String industry, String standard) { Long count = standardTreeMapper.selectCount(Wrappers.lambdaQuery() .eq(StandardTree::getLaboratory, industry) .eq(StandardTree::getSample, standard) .isNull(StandardTree::getSampleType) .isNull(StandardTree::getModel)); if (count == 0) { throw new BaseException("标准不存在"); } return 1; } @Override public List selectTemplateBindings(Integer standardTreeId) { ensureTwoLevelStandard(standardTreeId); List bindings = standardTreeTemplateBindingMapper.selectList( Wrappers.lambdaQuery() .eq(StandardTreeTemplateBinding::getStandardTreeId, standardTreeId) .orderByAsc(StandardTreeTemplateBinding::getSort, StandardTreeTemplateBinding::getId)); List result = new ArrayList<>(); for (StandardTreeTemplateBinding binding : bindings) { StandardTemplate template = standardTemplateService.getById(binding.getTemplateId()); if (template == null) { continue; } StandardTreeTemplateBindingVo vo = new StandardTreeTemplateBindingVo(); vo.setTemplateId(template.getId()); vo.setName(template.getName()); vo.setNumber(template.getNumber()); vo.setRemark(template.getRemark()); vo.setSort(binding.getSort()); result.add(vo); } return result; } @Override @Transactional(rollbackFor = Exception.class) public boolean saveTemplateBindings(StandardTreeTemplateBindingDto dto) { if (dto == null || dto.getStandardTreeId() == null) { throw new BaseException("标准不能为空"); } ensureTwoLevelStandard(dto.getStandardTreeId()); List templates = dto.getTemplates() == null ? new ArrayList<>() : dto.getTemplates(); Set templateIds = new HashSet<>(); List bindings = new ArrayList<>(); int index = 0; for (TemplateBindingItemDto item : templates) { if (item == null || item.getTemplateId() == null || !templateIds.add(item.getTemplateId())) { throw new BaseException("原始记录模板不能重复绑定"); } StandardTemplate template = standardTemplateService.getById(item.getTemplateId()); if (template == null) { throw new BaseException("原始记录模板不存在"); } StandardTreeTemplateBinding binding = new StandardTreeTemplateBinding(); binding.setStandardTreeId(dto.getStandardTreeId()); binding.setTemplateId(item.getTemplateId()); binding.setSort(item.getSort() == null ? index : item.getSort()); bindings.add(binding); index++; } standardTreeTemplateBindingMapper.delete(Wrappers.lambdaQuery() .eq(StandardTreeTemplateBinding::getStandardTreeId, dto.getStandardTreeId())); for (StandardTreeTemplateBinding binding : bindings) { standardTreeTemplateBindingMapper.insert(binding); } return true; } @Override public List selectTemplateInspectionItems(Integer standardTreeId) { List bindings = selectTemplateBindings(standardTreeId); List result = new ArrayList<>(); for (StandardTreeTemplateBindingVo binding : bindings) { List items = StandardTemplateInspectionItemParser.parse(binding.getTemplateId(), binding.getSort(), standardTemplateService.getStandTempThingById(binding.getTemplateId())); result.addAll(items); } result.sort(Comparator.comparing(TemplateInspectionItemDto::getTemplateSort) .thenComparing(TemplateInspectionItemDto::getTemplateRowIndex)); return result; } private StandardTree ensureTwoLevelStandard(Integer standardTreeId) { StandardTree standardTree = this.getById(standardTreeId); if (standardTree == null || StringUtils.isBlank(standardTree.getSample()) || standardTree.getSampleType() != null || standardTree.getModel() != null) { throw new BaseException("请选择标准库二级标准"); } return standardTree; } }