package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.production.bean.dto.ProductionBomStructureDto; import com.ruoyi.production.bean.vo.ProductionBomStructureVo; import com.ruoyi.production.mapper.ProductionBomStructureMapper; import com.ruoyi.production.pojo.ProductionBomStructure; import com.ruoyi.production.service.ProductionBomStructureService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** *

* 生产订单BOM产品结构 服务实现类 *

* * @author 芯导软件(江苏)有限公司 * @since 2026-04-21 03:55:52 */ @Service @RequiredArgsConstructor() public class ProductionBomStructureServiceImpl extends ServiceImpl implements ProductionBomStructureService { private final ProductionBomStructureMapper productionBomStructureMapper; /** * 根据BOM查询并组装结构树。 */ @Override public List listByBomId(Long bomId) { List list = productionBomStructureMapper.listByBomId(bomId); Map map = new HashMap<>(); for (ProductionBomStructureVo node : list) { node.setChildren(new ArrayList<>()); map.put(node.getId(), node); } List tree = new ArrayList<>(); for (ProductionBomStructureVo node : list) { Long parentId = node.getParentId(); if (parentId == null || parentId == 0L) { tree.add(node); continue; } ProductionBomStructureVo parent = map.get(parentId); if (parent != null) { parent.getChildren().add(node); } } return tree; } @Override @Transactional(rollbackFor = Exception.class) public Boolean addProductionBomStructure(ProductionBomStructureDto dto) { Long orderBomId = dto.getProductionOrderBomId(); List flatDtoList = new ArrayList<>(); flattenTree(dto.getChildren(), flatDtoList); List dbList = this.list(new LambdaQueryWrapper() .eq(ProductionBomStructure::getProductionOrderBomId, orderBomId)); Set frontendIds = new HashSet<>(); for (ProductionBomStructureDto item : flatDtoList) { if (item.getId() != null) { frontendIds.add(item.getId()); } } Set deleteIds = new HashSet<>(); for (ProductionBomStructure dbItem : dbList) { if (!frontendIds.contains(dbItem.getId())) { deleteIds.add(dbItem.getId()); } } if (!deleteIds.isEmpty()) { this.removeByIds(deleteIds); } List insertList = new ArrayList<>(); List updateList = new ArrayList<>(); Map tempEntityMap = new HashMap<>(); for (ProductionBomStructureDto item : flatDtoList) { ProductionBomStructure entity = new ProductionBomStructure(); BeanUtils.copyProperties(item, entity); entity.setProductionOrderBomId(orderBomId); if (item.getId() == null) { entity.setParentId(null); insertList.add(entity); tempEntityMap.put(item.getTempId(), entity); } else { updateList.add(entity); } } if (!insertList.isEmpty()) { this.saveBatch(insertList); } List parentFixList = new ArrayList<>(); for (ProductionBomStructureDto item : flatDtoList) { if (item.getId() == null && item.getParentTempId() != null) { ProductionBomStructure child = tempEntityMap.get(item.getTempId()); if (child == null) { continue; } ProductionBomStructure parent = tempEntityMap.get(item.getParentTempId()); Long realParentId = parent != null ? parent.getId() : Long.valueOf(item.getParentTempId()); child.setParentId(realParentId); parentFixList.add(child); } } if (!parentFixList.isEmpty()) { this.updateBatchById(parentFixList); } if (!updateList.isEmpty()) { this.updateBatchById(updateList); } return true; } /** * 将树形结构拍平成列表,便于统一保存。 */ private void flattenTree(List source, List result) { if (source == null) { return; } for (ProductionBomStructureDto node : source) { result.add(node); flattenTree(node.getChildren(), result); } } }