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.*;
|
|
/**
|
* <p>
|
* 生产订单BOM产品结构 服务实现类
|
* </p>
|
*
|
* @author 芯导软件(江苏)有限公司
|
* @since 2026-04-21 03:55:52
|
*/
|
@Service
|
@RequiredArgsConstructor()
|
public class ProductionBomStructureServiceImpl extends ServiceImpl<ProductionBomStructureMapper, ProductionBomStructure> implements ProductionBomStructureService {
|
|
private final ProductionBomStructureMapper productionBomStructureMapper;
|
|
/**
|
* 根据BOM查询并组装结构树。
|
*/
|
@Override
|
public List<ProductionBomStructureVo> listByBomId(Long bomId) {
|
List<ProductionBomStructureVo> list = productionBomStructureMapper.listByBomId(bomId);
|
Map<Long, ProductionBomStructureVo> map = new HashMap<>();
|
for (ProductionBomStructureVo node : list) {
|
node.setChildren(new ArrayList<>());
|
map.put(node.getId(), node);
|
}
|
|
List<ProductionBomStructureVo> 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<ProductionBomStructureDto> flatDtoList = new ArrayList<>();
|
flattenTree(dto.getChildren(), flatDtoList);
|
|
List<ProductionBomStructure> dbList = this.list(new LambdaQueryWrapper<ProductionBomStructure>()
|
.eq(ProductionBomStructure::getProductionOrderBomId, orderBomId));
|
|
Set<Long> frontendIds = new HashSet<>();
|
for (ProductionBomStructureDto item : flatDtoList) {
|
if (item.getId() != null) {
|
frontendIds.add(item.getId());
|
}
|
}
|
|
Set<Long> deleteIds = new HashSet<>();
|
for (ProductionBomStructure dbItem : dbList) {
|
if (!frontendIds.contains(dbItem.getId())) {
|
deleteIds.add(dbItem.getId());
|
}
|
}
|
if (!deleteIds.isEmpty()) {
|
this.removeByIds(deleteIds);
|
}
|
|
List<ProductionBomStructure> insertList = new ArrayList<>();
|
List<ProductionBomStructure> updateList = new ArrayList<>();
|
Map<String, ProductionBomStructure> 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<ProductionBomStructure> 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<ProductionBomStructureDto> source, List<ProductionBomStructureDto> result) {
|
if (source == null) {
|
return;
|
}
|
for (ProductionBomStructureDto node : source) {
|
result.add(node);
|
flattenTree(node.getChildren(), result);
|
}
|
}
|
|
}
|