啊鑫
2025-06-05 e47d11017af9eff6581591d5d73c1e55676b0955
src/main/java/com/gs/xky/service/PurchaseService.java
@@ -79,8 +79,35 @@
        log.info("【syncPurchaseOrderDetails】获取到{}条采购订单数据", orderDetails.size());
        // 处理采购订单明细数据
        orderDetails.forEach(detail -> {
        // 分批处理数据,减少内存占用
        int batchSize = 100; // 每批处理100条数据
        int totalSize = orderDetails.size();
        int batchCount = (totalSize + batchSize - 1) / batchSize; // 向上取整计算批次数
        for (int i = 0; i < batchCount; i++) {
            int fromIndex = i * batchSize;
            int toIndex = Math.min((i + 1) * batchSize, totalSize);
            log.info("【syncPurchaseOrderDetails】处理第{}批数据,范围:{}-{}", i + 1, fromIndex, toIndex);
            // 获取当前批次的数据
            List<PurchaseOrderDetail> batchDetails = orderDetails.subList(fromIndex, toIndex);
            // 处理当前批次的数据
            processBatch(batchDetails);
            // 手动触发GC,释放内存(谨慎使用,仅在内存紧张时考虑)
            // System.gc();
        }
    }
    /**
     * 批量处理采购订单明细数据
     *
     * @param batchDetails 当前批次的采购订单明细数据
     */
    private void processBatch(List<PurchaseOrderDetail> batchDetails) {
        batchDetails.forEach(detail -> {
            try {
                // 根据有效标志和订单状态处理不同的业务逻辑
                if (detail.getValidFlag() != null && detail.getValidFlag() == 0) {
@@ -113,6 +140,10 @@
                // 保存SRM采购订单明细
                savePurchaseOrderDetail(detail);
                // 帮助GC回收不再使用的对象
                wrapper = null;
                erpData = null;
            } catch (Exception e) {
                log.error("【syncPurchaseOrderDetails 处理异常】订单号: {}, 项次: {}, 异常: {}",
                        detail.getPoErpNo(), detail.getLineNo(), e.getMessage(), e);