package com.ruoyi.production.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.ruoyi.basic.service.BaseParamService;
|
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.production.pojo.*;
|
import com.ruoyi.production.service.*;
|
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* <br>
|
*
|
* </br>
|
*
|
* @author deslrey
|
* @version 1.0
|
* @since 2026/03/20
|
*/
|
@Slf4j
|
@Service
|
public class ProductionOrderAppendixServiceImpl implements IProductionOrderAppendixService {
|
|
@Resource
|
private IProductionOrderRouteItemService productionOrderRouteItemService;
|
|
@Resource
|
private IProductionOrderRouteItemParamService productionOrderRouteItemParamService;
|
|
@Resource
|
private IProductionOrderStructureService productionOrderStructureService;
|
|
@Resource
|
private BaseParamService baseParamService;
|
|
@Resource
|
private ProcessRouteService processRouteService;
|
|
@Resource
|
private ProcessRouteItemService processRouteItemService;
|
|
@Resource
|
private ProcessRouteItemParamService processRouteItemParamService;
|
|
@Resource
|
private ProductStructureService productStructureService;
|
|
@Resource
|
private ProductOrderService productOrderService;
|
|
@Override
|
public Long populateBlocks(Long orderId, ProductionPlanDto productionPlanDto) {
|
if (productionPlanDto == null) {
|
throw new ServiceException("下发数据不能为空");
|
}
|
if (StringUtils.isEmpty(productionPlanDto.getStrength())) {
|
throw new ServiceException("砌块的产品类型不能为空");
|
}
|
ProcessRoute processRoute = processRouteService.latestTypeDate(productionPlanDto.getProductName(), productionPlanDto.getStrength());
|
if (processRoute == null) {
|
log.info("下发产品【{}】未查询出工艺路线", productionPlanDto.getProductName());
|
return null;
|
}
|
migration(orderId, processRoute);
|
return processRoute.getId();
|
}
|
|
@Override
|
public Long populatePlates(Long orderId, ProductionPlanDto productionPlanDto) {
|
if (productionPlanDto == null) {
|
throw new ServiceException("下发数据不能为空");
|
}
|
// 板材不区分强度,strength传null
|
ProcessRoute processRoute = processRouteService.latestTypeDate(productionPlanDto.getProductName(), null);
|
if (processRoute == null) {
|
log.info("下发产品【{}】未查询出工艺路线", productionPlanDto.getProductName());
|
return null;
|
}
|
migration(orderId, processRoute);
|
return processRoute.getId();
|
}
|
|
@Override
|
public void populateData(ProductOrder productOrder) {
|
if (productOrder == null) {
|
throw new ServiceException("绑定失败.数据不能为空");
|
}
|
if (productOrder.getId() == null || productOrder.getRouteId() == null) {
|
throw new ServiceException("绑定失败,生产订单或工艺路线不能为空");
|
}
|
ProcessRoute processRoute = processRouteService.getById(productOrder.getRouteId());
|
if (processRoute == null) {
|
throw new ServiceException("该工艺路线不存在,绑定失败");
|
}
|
migration(productOrder.getId(), processRoute);
|
|
// 回写工艺路线id到生产订单
|
productOrderService.updateById(productOrder);
|
}
|
|
@Override
|
public void deleteData(Long orderId, Long processRouteId) {
|
// 删除工艺路线工序参数附表
|
productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>()
|
.eq(ProductionOrderRouteItemParam::getOrderId, orderId));
|
|
// 删除工艺路线子集附表
|
productionOrderRouteItemService.remove(new LambdaQueryWrapper<ProductionOrderRouteItem>()
|
.eq(ProductionOrderRouteItem::getOrderId, orderId)
|
.eq(ProductionOrderRouteItem::getRouteId, processRouteId));
|
|
// 删除BOM子集附表
|
ProcessRoute processRoute = processRouteService.getById(processRouteId);
|
if (processRoute != null && processRoute.getBomId() != null) {
|
productionOrderStructureService.remove(new LambdaQueryWrapper<ProductionOrderStructure>()
|
.eq(ProductionOrderStructure::getOrderId, orderId)
|
.eq(ProductionOrderStructure::getBomId, processRoute.getBomId()));
|
}
|
}
|
|
/**
|
* 根据工艺路线迁移附表数据
|
*/
|
private void migration(Long orderId, ProcessRoute processRoute) {
|
// 迁移工艺路线子集表数据,返回旧id->新instance映射
|
List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(
|
new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
|
Map<Long, ProductionOrderRouteItem> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList);
|
|
// 迁移工艺路线内绑定的工序参数
|
if (processRouteItemList != null && !processRouteItemList.isEmpty()) {
|
for (ProcessRouteItem item : processRouteItemList) {
|
ProductionOrderRouteItem newInstance = routeItemOldIdMap.get(item.getId());
|
Long newRouteItemInstanceId = newInstance != null ? newInstance.getId() : item.getId();
|
|
List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(
|
new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, item.getId()));
|
migrationProcessRouteItemParam(orderId, paramList, newRouteItemInstanceId);
|
}
|
}
|
|
// 迁移BOM子集表数据
|
if (processRoute.getBomId() != null) {
|
List<ProductStructure> structureList = productStructureService.list(
|
new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, processRoute.getBomId()));
|
migrationProductStructure(orderId, structureList);
|
}
|
}
|
|
private Map<Long, ProductionOrderRouteItem> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) {
|
Map<Long, ProductionOrderRouteItem> oldIdMap = new HashMap<>();
|
if (list == null || list.isEmpty()) {
|
return oldIdMap;
|
}
|
List<ProductionOrderRouteItem> instances = list.stream().map(item -> {
|
ProductionOrderRouteItem instance = new ProductionOrderRouteItem();
|
BeanUtils.copyProperties(item, instance, "id");
|
instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0);
|
instance.setOrderId(orderId);
|
if (item.getId() != null) {
|
oldIdMap.put(item.getId(), instance);
|
}
|
return instance;
|
}).collect(Collectors.toList());
|
productionOrderRouteItemService.saveBatch(instances);
|
return oldIdMap;
|
}
|
|
private void migrationProcessRouteItemParam(Long orderId, List<ProcessRouteItemParam> list, Long newRouteItemInstanceId) {
|
if (list == null || list.isEmpty()) {
|
return;
|
}
|
List<ProductionOrderRouteItemParam> instances = list.stream().map(item -> {
|
ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam();
|
BeanUtils.copyProperties(item, instance, "id");
|
instance.setOrderId(orderId);
|
instance.setRouteItemId(newRouteItemInstanceId);
|
return instance;
|
}).collect(Collectors.toList());
|
productionOrderRouteItemParamService.saveBatch(instances);
|
}
|
|
private void migrationProductStructure(Long orderId, List<ProductStructure> list) {
|
if (list == null || list.isEmpty()) {
|
return;
|
}
|
Map<Long, ProductionOrderStructure> oldIdMap = new HashMap<>();
|
List<ProductionOrderStructure> instances = list.stream().map(item -> {
|
ProductionOrderStructure instance = new ProductionOrderStructure();
|
BeanUtils.copyProperties(item, instance, "id");
|
instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null);
|
instance.setOrderId(orderId);
|
if (item.getId() != null) {
|
oldIdMap.put(item.getId(), instance);
|
}
|
return instance;
|
}).collect(Collectors.toList());
|
productionOrderStructureService.saveBatch(instances);
|
|
// 新增后有id,旧id->新id,修正parentId
|
Map<Long, Long> oldToNewId = new HashMap<>();
|
list.forEach(item -> {
|
if (item.getId() != null && oldIdMap.containsKey(item.getId())) {
|
oldToNewId.put(item.getId(), oldIdMap.get(item.getId()).getId());
|
}
|
});
|
|
List<ProductionOrderStructure> toUpdate = instances.stream()
|
.filter(i -> i.getParentId() != null && oldToNewId.containsKey(i.getParentId()))
|
.peek(i -> i.setParentId(oldToNewId.get(i.getParentId())))
|
.collect(Collectors.toList());
|
if (!toUpdate.isEmpty()) {
|
productionOrderStructureService.updateBatchById(toUpdate);
|
}
|
}
|
}
|