sfd
2025-05-26 2a64b537e8e3bce9ce030585a3da17d48379c0ad
aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlate/ApsPlateProcessShopStatServiceImpl.java
@@ -147,6 +147,7 @@
        // 查询相关数据
        ApsPlatePlan platePlan = new ApsPlatePlan();
        platePlan.setPlant(plant);
        log.info("开始执行钣金计划大表");
        List<ApsPlatePlan> planList = apsPlatePlanMapper.selectApsPlatePlanList(platePlan);
        ApsShop apsShop = new ApsShop();
@@ -160,9 +161,11 @@
        List<ApsStandardProcess> shopProcesses = standardProcessMapper.selectApsStandardProcessList(process);
        if (!planList.isEmpty() &&  !shopList.isEmpty() &&  !shopProcesses.isEmpty()) {
            // 开始之前先删除所有历史数据
            log.info("钣金计划大表:删除所有历史数据");
            apsPlateProcessStatMapper.deleteAll();
            apsPlateProcessShopStatMapper.deleteAll();
            log.info("钣金计划大表:推算倒排钣金工序计划完工日期和计划开工时间");
            List<ApsPlateProcessStat> statList =apsPlateProcessStatService.computePlateProcessStat();
                // 构建车间名称到工序名称的映射
            Map<String, List<String>> shopToProcessNames = shopProcesses.stream().filter(x -> null!=x.getWorkShop())
@@ -170,30 +173,38 @@
                            Collectors.mapping(ApsStandardProcess::getProcessName, Collectors.toList())
                    ));
            // 批量插入统计数据
            log.info("钣金计划大表:计算每个工单中每个车间的开始、结束时间");
            List<ApsPlateProcessShopStat> statsToInsert = new ArrayList<>();
            for (ApsPlatePlan plan : planList) {
                for (ApsShop shop : shopList) {
            log.info("钣金计划大表V1:开始计算每个工单车间工时");
            planList.stream().parallel().forEach(plan -> {
                shopList.stream().parallel().forEach(shop -> {
                    ApsPlateProcessShopStat stat = createShopStat(plan, shop, shopToProcessNames, statList);
                    statsToInsert.add(stat);
                }
            }
                });
            });
            log.info("钣金计划大表:批量保存工序开工和完工时间");
            List<List<ApsPlateProcessStat>> processStatBatchList = ListUtil.split(statList, 1000);
            processStatBatchList.forEach(batch -> apsPlateProcessStatMapper.batchInsertPlateStat(batch));
            processStatBatchList.stream().parallel().forEach(batch -> apsPlateProcessStatMapper.batchInsertPlateStat(batch));
            log.info("钣金计划大表:批量保存工单-车间时间信息");
            List<List<ApsPlateProcessShopStat>> shopStatBatchList = ListUtil.split(statsToInsert, 1000);
            shopStatBatchList.forEach(batch -> apsPlateProcessShopStatMapper.batchInsert(batch));
            shopStatBatchList.stream().parallel().forEach(batch -> apsPlateProcessShopStatMapper.batchInsert(batch));
        }else {
            if(shopProcesses.isEmpty()){
                log.error("钣金计划大表:未找到标准工序数据!");
                throw  new RuntimeException("未找到标准工序数据!");
            }
            if(shopList.isEmpty()){
                log.error("钣金计划大表:未找到车间数据!");
                throw  new RuntimeException("未找到车间数据!");
            }
            if(planList.isEmpty()){
                log.error("钣金计划大表:未找到工单数据!");
                throw  new RuntimeException("未找到工单数据!");
            }
        }
        log.info("钣金计划大表:完成");
    }
    /**
@@ -253,7 +264,7 @@
                }
            }
        } catch (Exception e) {
            log.error("computer error:"+ JSONObject.toJSONString(stat));
            log.error("钣金计划大表 error:"+ JSONObject.toJSONString(stat));
            throw new RuntimeException("计算车间统计数据异常!");
        }
        return stat;
@@ -293,7 +304,7 @@
        List<SysDictData> documentStatusDic = DictUtils.getDictCache("aps_document_status");
        // 构建结果列表
        planList.forEach(
        planList.stream().parallel().forEach(
                 plan -> {
                    // 根据 docNo 获取对应的 shopStatList
                    List<ApsPlateProcessShopStat> shopStatList = shopStatesByDocNo.getOrDefault(plan.getDocumentNumber(), Collections.emptyList());