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.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.production.dto.ProductionOrderRouteItemDto; import com.ruoyi.production.mapper.ProductionOrderRouteItemMapper; import com.ruoyi.production.pojo.ProcessRouteItemParam; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductionOrderRouteItem; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; import com.ruoyi.production.service.IProductionOrderRouteItemParamService; import com.ruoyi.production.service.IProductionOrderRouteItemService; import com.ruoyi.production.service.ProcessRouteItemParamService; import com.ruoyi.production.service.ProductProcessService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; /** *

* 生产订单绑定的工艺路线--工序表 服务实现类 *

* * @author deslrey * @since 2026-03-20 */ @Slf4j @Service public class ProductionOrderRouteItemServiceImpl extends ServiceImpl implements IProductionOrderRouteItemService { @Resource private ProductProcessService productProcessService; @Resource private IProductionOrderRouteItemParamService productionOrderRouteItemParamService; @Resource private ProcessRouteItemParamService processRouteItemParamService; @Override public List getProcessItem(Long orderId) { List list = list(new LambdaQueryWrapper() .eq(ProductionOrderRouteItem::getOrderId, orderId) .orderByAsc(ProductionOrderRouteItem::getDragSort)); return list.stream().map(item -> { ProductionOrderRouteItemDto dto = new ProductionOrderRouteItemDto(); BeanUtils.copyProperties(item, dto); if (item.getProcessId() != null) { ProductProcess process = productProcessService.getById(item.getProcessId()); if (process != null) { dto.setProcessName(process.getName()); } } return dto; }).collect(Collectors.toList()); } @Override public void addProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null) { throw new ServiceException("新增数据不能为空"); } if (dto.getOrderId() == null) { throw new ServiceException("生产订单ID不能为空"); } if (dto.getProcessId() == null) { throw new ServiceException("工序ID不能为空"); } ProductionOrderRouteItem entity = new ProductionOrderRouteItem(); BeanUtils.copyProperties(dto, entity); entity.setId(null); entity.setTenantId(SecurityUtils.getLoginUser().getTenantId()); entity.setCreateTime(LocalDateTime.now()); // 取当前订单下最大 dragSort + 1 ProductionOrderRouteItem maxSortItem = getOne(new LambdaQueryWrapper() .eq(ProductionOrderRouteItem::getOrderId, dto.getOrderId()) .orderByDesc(ProductionOrderRouteItem::getDragSort) .last("limit 1")); entity.setDragSort(maxSortItem != null && maxSortItem.getDragSort() != null ? maxSortItem.getDragSort() + 1 : 1); save(entity); } @Override public void updateProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("更新数据或ID不能为空"); } ProductionOrderRouteItem old = getById(dto.getId()); if (old == null) { throw new ServiceException("数据不存在"); } // 工序变更,删除旧参数附表,迁移新工序参数 if (dto.getProcessId() != null && !dto.getProcessId().equals(old.getProcessId())) { // 删除工艺路线工序参数附表 productionOrderRouteItemParamService.remove(new LambdaQueryWrapper() .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, old.getId())); // 迁移新工序的 process_route_item_param List routeItemParams = processRouteItemParamService.list( new LambdaQueryWrapper().eq(ProcessRouteItemParam::getRouteItemId, old.getId())); if (!routeItemParams.isEmpty()) { List newInstances = routeItemParams.stream().map(p -> { ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(p, instance, "id"); instance.setOrderId(old.getOrderId()); return instance; }).collect(Collectors.toList()); productionOrderRouteItemParamService.saveBatch(newInstances); } } ProductionOrderRouteItem entity = new ProductionOrderRouteItem(); BeanUtils.copyProperties(dto, entity); entity.setUpdateTime(LocalDateTime.now()); updateById(entity); } @Override public void deleteProcessItem(Long id) { if (id == null) { throw new ServiceException("ID不能为空"); } ProductionOrderRouteItem old = getById(id); if (old == null) { throw new ServiceException("数据不存在"); } // 删除工艺路线工序参数附表 productionOrderRouteItemParamService.remove(new LambdaQueryWrapper() .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, id)); removeById(id); } @Override public void sortProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("数据或ID不能为空"); } ProductionOrderRouteItem old = getById(dto.getId()); if (old == null) { throw new ServiceException("数据不存在"); } List items = list(new LambdaQueryWrapper() .eq(ProductionOrderRouteItem::getOrderId, old.getOrderId()) .orderByAsc(ProductionOrderRouteItem::getDragSort)); Integer targetPosition = dto.getDragSort(); if (targetPosition != null && targetPosition >= 1) { items.removeIf(item -> item.getId().equals(old.getId())); items.add(targetPosition - 1, old); for (int i = 0; i < items.size(); i++) { ProductionOrderRouteItem item = items.get(i); int newSort = i + 1; if (!item.getId().equals(old.getId())) { if (!Integer.valueOf(newSort).equals(item.getDragSort())) { item.setDragSort(newSort); updateById(item); } } else { old.setDragSort(newSort); updateById(old); } } } } }