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);