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);
}
}
}