2026-04-16 a383e7dbc619cdb468979d4863349c43550a9af2
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -1,17 +1,32 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProcessRouteService;
import com.ruoyi.production.service.ProductStructureService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@@ -21,9 +36,103 @@
    @Autowired
    private ProcessRouteMapper processRouteMapper;
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Autowired
    private ProductStructureService productStructureService;
    @Override
    public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
        return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
    }
    @Override
    public Integer saveProcessRoute(ProcessRoute processRoute) {
        normalizeProductModelIds(processRoute);
        this.save(processRoute);
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", processRoute.getId());
        String routeCode = "GYLX" + dateStr + idStr;
        processRoute.setProcessRouteCode(routeCode);
        List<ProductStructureDto> productStructureDtos = productStructureService.listDetailBybomId(processRoute.getBomId());
        if (CollectionUtils.isNotEmpty(productStructureDtos)) {
            AtomicInteger i = new AtomicInteger(1);
            productStructureDtos.forEach(productStructureDto -> {
                ProcessRouteItem processRouteItem = new ProcessRouteItem();
                processRouteItem.setRouteId(processRoute.getId());
                processRouteItem.setProcessId(productStructureDto.getProcessId());
                processRouteItem.setProductModelId(processRoute.getProductModelId());
                processRouteItem.setProductModelIds(processRoute.getProductModelIds());
                processRouteItem.setDragSort(i.get());
                processRouteItem.setIsQuality(false);
                processRouteItemMapper.insert(processRouteItem);
                i.getAndIncrement();
            });
        }
        return processRouteMapper.updateById(processRoute);
    }
    @Override
    public int batchDelete(List<Long> ids) {
        List<ProductOrder> productOrders = productOrderMapper.selectList(
                Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids)
        );
        if (!productOrders.isEmpty()) {
            throw new RuntimeException("该工艺路线已被生产订单引用,不能删除");
        }
        processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
        return processRouteMapper.deleteBatchIds(ids);
    }
    private void normalizeProductModelIds(ProcessRoute processRoute) {
        if (processRoute == null) {
            return;
        }
        String ids = joinProductModelIds(
                processRoute.getProductModelIdList(),
                processRoute.getProductModelIds(),
                processRoute.getProductModelId()
        );
        processRoute.setProductModelIds(ids);
        processRoute.setProductModelId(firstProductModelId(ids, processRoute.getProductModelId()));
    }
    private String joinProductModelIds(List<Long> idList, String ids, Long fallbackId) {
        if (CollectionUtils.isNotEmpty(idList)) {
            return idList.stream()
                    .filter(item -> item != null && item > 0)
                    .distinct()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));
        }
        if (StringUtils.hasText(ids)) {
            return Arrays.stream(ids.split(","))
                    .map(String::trim)
                    .filter(StringUtils::hasText)
                    .distinct()
                    .collect(Collectors.joining(","));
        }
        return fallbackId == null ? null : String.valueOf(fallbackId);
    }
    private Long firstProductModelId(String ids, Long fallbackId) {
        if (!StringUtils.hasText(ids)) {
            return fallbackId;
        }
        String first = ids.split(",")[0].trim();
        if (!StringUtils.hasText(first)) {
            return fallbackId;
        }
        try {
            return Long.parseLong(first);
        } catch (NumberFormatException ignore) {
            return fallbackId;
        }
    }
}