2026-04-20 72c42057992d79a40a8ed790d5329c2f463e34c1
refactor(technology): 优化工艺路线服务实现并修复附件过滤逻辑

- 使用 AtomicReference 替代 final List 解决流处理中的并发问题
- 为工艺路线控制器添加完整的 JavaDoc 注释文档
- 将更新方法从 updateById 替换为自定义 updateTechnologyRouting 方法
- 实现基于 BOM 的工艺路线工序同步功能
- 添加 BOM 结构到工艺路线工序的映射和去重逻辑
- 移除未使用的 Arrays 导入并整理代码依赖
- 优化附件文件过滤性能,按需动态设置附件列表
已修改4个文件
119 ■■■■■ 文件已修改
src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -33,6 +33,7 @@
import java.io.IOException;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -132,7 +133,7 @@
        if(commonFiles == null){
            commonFiles = new ArrayList<>();
        }
        List<CommonFile> finalCommonFiles = commonFiles;
        AtomicReference<List<CommonFile>> finalCommonFiles = new AtomicReference<>(commonFiles);
        List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> {
            InspectionTaskDto dto = new InspectionTaskDto();
@@ -160,11 +161,11 @@
            }
            dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            finalCommonFiles.set(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getCommonId().equals(inspectionTask.getId())).collect(Collectors.toList()));
            // 初始化三个附件列表
            dto.setCommonFileList(finalCommonFiles.stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION.getValue())).collect(Collectors.toList()));
            dto.setCommonFileListAfter(finalCommonFiles.stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_AFTER.getValue())).collect(Collectors.toList()));
            dto.setCommonFileListBefore(finalCommonFiles.stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue())).collect(Collectors.toList()));
            dto.setCommonFileList(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION.getValue())).collect(Collectors.toList()));
            dto.setCommonFileListAfter(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_AFTER.getValue())).collect(Collectors.toList()));
            dto.setCommonFileListBefore(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue())).collect(Collectors.toList()));
            return dto;
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -12,7 +12,6 @@
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@RestController
@@ -23,30 +22,45 @@
    private final TechnologyRoutingService technologyRoutingService;
    /**
     * 分页查询工艺路线。
     */
    @GetMapping("/page")
    @ApiOperation("工艺路线分页查询")
    public R<IPage<TechnologyRoutingVo>> page(Page<TechnologyRoutingDto> page, TechnologyRoutingDto technologyRoutingDto) {
        return R.ok(technologyRoutingService.pageTechnologyRouting(page, technologyRoutingDto));
    }
    /**
     * 查询工艺路线详情。
     */
    @GetMapping("/{id}")
    @ApiOperation("工艺路线详情")
    public R<TechnologyRoutingVo> getInfo(@PathVariable("id") Long id) {
        return R.ok(technologyRoutingService.getTechnologyRoutingInfo(id));
    }
    /**
     * 新增工艺路线。
     */
    @PostMapping
    @ApiOperation("新增工艺路线")
    public R add(@RequestBody TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.saveTechnologyRouting(technologyRouting));
    }
    /**
     * 修改工艺路线。
     */
    @PutMapping
    @ApiOperation("修改工艺路线")
    public R edit(@RequestBody TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.updateById(technologyRouting));
        return R.ok(technologyRoutingService.updateTechnologyRouting(technologyRouting));
    }
    /**
     * 批量删除工艺路线。
     */
    @DeleteMapping("/delete")
    @ApiOperation("删除工艺路线")
    public R remove(@RequestBody List<Long> ids) {
src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java
@@ -11,11 +11,30 @@
public interface TechnologyRoutingService extends IService<TechnologyRouting> {
    /**
     * 工艺路线分页查询,查询参数使用 DTO,返回数据使用 VO。
     */
    IPage<TechnologyRoutingVo> pageTechnologyRouting(Page<TechnologyRoutingDto> page, TechnologyRoutingDto technologyRoutingDto);
    /**
     * 查询工艺路线详情。
     */
    TechnologyRoutingVo getTechnologyRoutingInfo(Long id);
    /**
     * 新增工艺路线。
     * 选择了 BOM 时,会自动把 BOM 中配置的工序同步到工艺路线工序表。
     */
    Long saveTechnologyRouting(TechnologyRouting technologyRouting);
    /**
     * 修改工艺路线。
     * 当 BOM 发生变化时,会重新同步工艺路线工序表。
     */
    boolean updateTechnologyRouting(TechnologyRouting technologyRouting);
    /**
     * 删除工艺路线,并级联删除工艺路线工序。
     */
    boolean removeTechnologyRouting(List<Long> ids);
}
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -9,8 +9,12 @@
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.technology.bean.dto.TechnologyRoutingDto;
import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
import com.ruoyi.technology.mapper.TechnologyBomStructureMapper;
import com.ruoyi.technology.mapper.TechnologyOperationMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
import com.ruoyi.technology.pojo.TechnologyBomStructure;
import com.ruoyi.technology.pojo.TechnologyOperation;
import com.ruoyi.technology.pojo.TechnologyRouting;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import com.ruoyi.technology.service.TechnologyRoutingService;
@@ -20,7 +24,9 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Service
@Transactional(rollbackFor = Exception.class)
@@ -30,6 +36,10 @@
    private final TechnologyRoutingMapper technologyRoutingMapper;
    private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
    private final TechnologyBomStructureMapper technologyBomStructureMapper;
    private final TechnologyOperationMapper technologyOperationMapper;
    @Override
    public IPage<TechnologyRoutingVo> pageTechnologyRouting(Page<TechnologyRoutingDto> page, TechnologyRoutingDto technologyRoutingDto) {
@@ -57,8 +67,19 @@
    public Long saveTechnologyRouting(TechnologyRouting technologyRouting) {
        String code = OrderUtils.countTodayByCreateTime(technologyRoutingMapper, "GYLX", "process_route_code");
        technologyRouting.setProcessRouteCode(code);
        this.save(technologyRouting);
        // 带入bom产品结构
        syncRoutingOperationsByBom(technologyRouting);
        return technologyRouting.getId();
    }
    @Override
    public boolean updateTechnologyRouting(TechnologyRouting technologyRouting) {
        boolean updated = this.updateById(technologyRouting);
        if (updated) {
            TechnologyRouting currentRouting = this.getById(technologyRouting.getId());
            syncRoutingOperationsByBom(currentRouting);
        }
        return updated;
    }
    @Override
@@ -71,6 +92,54 @@
        return this.removeByIds(ids);
    }
    /**
     * 按当前选择的 BOM 重建工艺路线工序:
     * 1. 先删除该工艺路线下已有工序
     * 2. 读取 BOM 结构中的 operation_id
     * 3. 按 BOM 出现顺序去重后重新写入工艺路线工序表
     */
    private void syncRoutingOperationsByBom(TechnologyRouting technologyRouting) {
        technologyRoutingOperationMapper.delete(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRouting.getId()));
        if (technologyRouting.getBomId() == null) {
            return;
        }
        List<TechnologyBomStructure> bomStructures = technologyBomStructureMapper.selectList(
                Wrappers.<TechnologyBomStructure>lambdaQuery()
                        .eq(TechnologyBomStructure::getBomId, Long.valueOf(technologyRouting.getBomId()))
                        .isNotNull(TechnologyBomStructure::getOperationId)
                        .orderByAsc(TechnologyBomStructure::getId)
        );
        if (bomStructures.isEmpty()) {
            return;
        }
        // 同一个 BOM 中可能重复引用相同工序,这里按首次出现顺序去重。
        Map<Long, TechnologyBomStructure> uniqueOperationMap = new LinkedHashMap<>();
        for (TechnologyBomStructure bomStructure : bomStructures) {
            uniqueOperationMap.putIfAbsent(bomStructure.getOperationId(), bomStructure);
        }
        int dragSort = 1;
        for (TechnologyBomStructure bomStructure : uniqueOperationMap.values()) {
            TechnologyRoutingOperation routingOperation = new TechnologyRoutingOperation();
            routingOperation.setTechnologyRoutingId(technologyRouting.getId());
            routingOperation.setProductModelId(technologyRouting.getProductModelId());
            routingOperation.setTechnologyOperationId(bomStructure.getOperationId());
            routingOperation.setDragSort(dragSort++);
            routingOperation.setIsQuality(getOperationQuality(bomStructure.getOperationId()));
            technologyRoutingOperationMapper.insert(routingOperation);
        }
    }
    /**
     * 质检标识以工序基础表定义为准。
     */
    private Boolean getOperationQuality(Long operationId) {
        TechnologyOperation technologyOperation = technologyOperationMapper.selectById(operationId);
        return technologyOperation != null ? technologyOperation.getIsQuality() : null;
    }
    private String buildProcessRouteCode(Long id) {
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", id);