diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdMaterialBomController.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdMaterialBomController.java index 5bed053d..f39abd88 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdMaterialBomController.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdMaterialBomController.java @@ -107,9 +107,20 @@ public class ProdMaterialBomController extends BaseController { /** * 下拉框查询物料BOM信息列表 */ - @GetMapping("getProdMaterialBomList") + @GetMapping("/getProdMaterialBomList") public R> getProdMaterialBomlist(ProdMaterialBomBo bo) { List list = prodMaterialBomService.queryList(bo); return R.ok(list); } + + /** + * 新增物料BOM信息 + */ + @SaCheckPermission("mes:materialBom:add") + @Log(title = "物料BOM信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/addBatchMaterialBom") + public R addBatchMaterialBom(@RequestBody List boList) { + return toAjax(prodMaterialBomService.insertBatchByBoList(boList)); + } } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdMaterialBomService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdMaterialBomService.java index 206eab7b..40e261e3 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdMaterialBomService.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdMaterialBomService.java @@ -56,4 +56,12 @@ public interface IProdMaterialBomService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量新增物料BOM信息 + * + * @param boList 物料BOM信息列表 + * @return 是否新增成功 + */ + Boolean insertBatchByBoList(List boList); } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java index bb32d5da..24e72f46 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdMaterialBomServiceImpl.java @@ -15,6 +15,14 @@ import org.dromara.mes.service.IProdMaterialBomService; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.HashMap; + +import org.springframework.transaction.annotation.Transactional; +import cn.hutool.core.collection.CollUtil; +import org.dromara.common.core.exception.ServiceException; + /** * 物料BOM信息Service业务层处理 @@ -154,4 +162,100 @@ public class ProdMaterialBomServiceImpl implements IProdMaterialBomService { } } + + + /** + * 批量插入物料清单BOM。 + * @param boList 需要插入的物料清单BOM列表。 + * @return 如果所有节点都成功插入,返回true;否则抛出异常。 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertBatchByBoList(List boList) { + if (CollUtil.isEmpty(boList)) { + return false; + } + + try { + // 按层级分组(根据parentId分组) + Map> levelMap = new HashMap<>(); + + // 1. 首先找出所有顶级节点 + List topNodes = boList.stream() + .filter(bo -> bo.getParentId() == null || bo.getParentId() == 0) + .collect(Collectors.toList()); + + // 2. 其他节点按parentId分组 + Map> childrenMap = boList.stream() + .filter(bo -> bo.getParentId() != null && bo.getParentId() != 0) + .collect(Collectors.groupingBy(bo -> Math.abs(bo.getParentId()))); + + // 存储临时ID到实际ID的映射 + Map idMapping = new HashMap<>(); + + // 3. 先处理顶级节点 + for (ProdMaterialBomBo topNode : topNodes) { + Long tempId = Math.abs(topNode.getMaterialBomId()); + topNode.setMaterialBomId(null); // 清除临时ID + topNode.setParentId(0L); // 确保顶级节点parentId为0 + topNode.setAncestors("0"); // 顶级节点的ancestors为"0" + + // 插入顶级节点 + ProdMaterialBom add = MapstructUtils.convert(topNode, ProdMaterialBom.class); + if (baseMapper.insert(add) <= 0) { + throw new ServiceException("插入顶级节点失败"); + } + + // 记录映射关系 + idMapping.put(tempId, add.getMaterialBomId()); + } + + // 4. 处理子节点,直到所有节点都处理完 + while (!childrenMap.isEmpty()) { + // 找出当前可以处理的节点(父节点已经在idMapping中的节点) + List processableParentIds = new ArrayList<>(childrenMap.keySet()); + boolean processed = false; + + for (Long parentTempId : processableParentIds) { + // 检查父节点是否已处理 + if (idMapping.containsKey(parentTempId)) { + List children = childrenMap.remove(parentTempId); + + // 处理同一父节点的所有子节点 + for (ProdMaterialBomBo child : children) { + Long childTempId = Math.abs(child.getMaterialBomId()); + child.setMaterialBomId(null); // 清除临时ID + + // 设置实际的父节点ID + Long actualParentId = idMapping.get(parentTempId); + child.setParentId(actualParentId); + + // 设置祖级列表 + ProdMaterialBom parent = baseMapper.selectById(actualParentId); + child.setAncestors(parent.getAncestors() + "," + actualParentId); + + // 插入子节点 + ProdMaterialBom add = MapstructUtils.convert(child, ProdMaterialBom.class); + if (baseMapper.insert(add) <= 0) { + throw new ServiceException("插入子节点失败"); + } + + // 记录映射关系 + idMapping.put(childTempId, add.getMaterialBomId()); + } + processed = true; + } + } + + // 如果一轮循环没有处理任何节点,说明数据有问题 + if (!processed && !childrenMap.isEmpty()) { + throw new ServiceException("存在无法处理的节点,可能是父节点丢失"); + } + } + + return true; + } catch (Exception e) { + throw new ServiceException("批量插入失败: " + e.getMessage()); + } + } }