| | |
| | | import com.ruoyi.technology.mapper.TechnologyRoutingMapper; |
| | | import com.ruoyi.technology.pojo.TechnologyBom; |
| | | import com.ruoyi.technology.pojo.TechnologyBomStructure; |
| | | import com.ruoyi.technology.pojo.TechnologyOperation; |
| | | import com.ruoyi.technology.pojo.TechnologyRouting; |
| | | import com.ruoyi.technology.service.TechnologyBomService; |
| | | import com.ruoyi.technology.service.TechnologyBomStructureService; |
| | | import com.ruoyi.technology.service.TechnologyOperationService; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private final TechnologyRoutingMapper technologyRoutingMapper; |
| | | private final IProductService productService; |
| | | private final TechnologyBomStructureMapper technologyBomStructureMapper; |
| | | private final TechnologyOperationService technologyOperationService; |
| | | |
| | | /** |
| | | * 分页查询BOM列表。 |
| | |
| | | dto.setParentSpec(clean(dto.getParentSpec())); |
| | | dto.setChildName(clean(dto.getChildName())); |
| | | dto.setChildSpec(clean(dto.getChildSpec())); |
| | | dto.setProcess(clean(dto.getProcess())); |
| | | }); |
| | | handleProcess(list); |
| | | // Map<String, Long> processMap = productProcessService.list().stream() |
| | | // .collect(Collectors.toMap(ProductProcess::getName, ProductProcess::getId, (k1, k2) -> k1)); |
| | | |
| | | // 创建 BOM 数据 |
| | | BomImportDto first = list.get(0); |
| | | ProductModel rootModel = findModel(first.getParentName(), first.getParentSpec()); |
| | | TechnologyBom bom = new TechnologyBom(); |
| | | bom.setProductModelId(rootModel.getId()); |
| | | bom.setVersion("1.0"); |
| | | technologyBomMapper.insert(bom); |
| | | bom.setBomNo("BM." + String.format("%05d", bom.getId())); |
| | | technologyBomMapper.updateById(bom); |
| | | // 工序名称 -> 工序ID(technology_operation 表),导入时绑定到 BOM 结构节点 |
| | | Map<String, Long> processMap = technologyOperationService.list().stream() |
| | | .collect(Collectors.toMap(TechnologyOperation::getName, TechnologyOperation::getId, (k1, k2) -> k1)); |
| | | |
| | | // 记录已经插入结构的节点:Key = "名称+规格", Value = structure_id |
| | | // 每遇到一个根节点行会重置,支持一次导入多个 BOM |
| | | Map<String, Long> treePathMap = new HashMap<>(); |
| | | // 当前正在处理的 BOM,遇到根节点行时重新创建 |
| | | TechnologyBom bom = null; |
| | | |
| | | for (int i = 0; i < list.size(); i++) { |
| | | BomImportDto dto = list.get(i); |
| | | String parentKey = dto.getParentName() + "|" + dto.getParentSpec(); |
| | | String childKey = dto.getChildName() + "|" + dto.getChildSpec(); |
| | | |
| | | //处理根节点,第一行且子项为空 |
| | | if (i == 0 && StringUtils.isBlank(dto.getChildName())) { |
| | | // 根节点行: 工序、子项名称、子项规格全为空,属于一个新的 BOM 的父节点 |
| | | if (StringUtils.isBlank(dto.getProcess()) |
| | | && StringUtils.isBlank(dto.getChildName()) |
| | | && StringUtils.isBlank(dto.getChildSpec())) { |
| | | if (StringUtils.isBlank(dto.getParentName())) { |
| | | throw new ServiceException("导入失败: 第" + (i + 1) + "行父项名称为空"); |
| | | } |
| | | |
| | | // 创建新的 BOM |
| | | ProductModel rootModel = findModel(dto.getParentName(), dto.getParentSpec()); |
| | | bom = new TechnologyBom(); |
| | | bom.setProductModelId(rootModel.getId()); |
| | | bom.setVersion("1.0"); |
| | | technologyBomMapper.insert(bom); |
| | | bom.setBomNo("BM." + String.format("%05d", bom.getId())); |
| | | technologyBomMapper.updateById(bom); |
| | | |
| | | // 插入根结构节点,重置节点 Map,开始记录这个 BOM 的树 |
| | | TechnologyBomStructure rootNode = new TechnologyBomStructure(); |
| | | rootNode.setBomId(bom.getId().longValue()); |
| | | rootNode.setParentId(null); // 顶层没有父节点 |
| | |
| | | rootNode.setUnit(rootModel.getUnit()); |
| | | technologyBomStructureService.save(rootNode); |
| | | |
| | | treePathMap = new HashMap<>(); |
| | | treePathMap.put(parentKey, rootNode.getId()); |
| | | continue; |
| | | } |
| | | |
| | | // 处理子层级节点 |
| | | if (bom == null) { |
| | | throw new ServiceException("导入失败: 首行必须是BOM父节点(父项信息行),子项前需先定义父项"); |
| | | } |
| | | // 找到父节点在数据库里的 ID |
| | | Long parentStructureId = treePathMap.get(parentKey); |
| | | if (parentStructureId == null) { |
| | |
| | | node.setProductModelId(childModel.getId()); |
| | | node.setUnitQuantity(dto.getUnitQty()); |
| | | node.setUnit(childModel.getUnit()); |
| | | // if (processMap.containsKey(dto.getProcess())) { |
| | | // node.setProcessId(processMap.get(dto.getProcess())); |
| | | // } |
| | | // 绑定投料工序(technology_operation),工序不存在时给出明确提示 |
| | | if (StringUtils.isNotBlank(dto.getProcess())) { |
| | | Long operationId = processMap.get(dto.getProcess()); |
| | | if (operationId == null) { |
| | | throw new ServiceException("导入失败: 工序[" + dto.getProcess() + "]不存在,请先维护工序"); |
| | | } |
| | | node.setOperationId(operationId); |
| | | } |
| | | technologyBomStructureService.save(node); |
| | | |
| | | // 把当前子项记录到 Map,作为以后更深层级的父项查找依据 |
| | |
| | | treePathMap.put(childKey, node.getId()); |
| | | } |
| | | |
| | | // 整个文件没有任何根节点行 |
| | | if (bom == null) { |
| | | return R.fail("导入失败: 未找到BOM父节点行"); |
| | | } |
| | | |
| | | return R.ok("BOM导入成功"); |
| | | } |
| | | |