| | |
| | | |
| | | 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) { |
| | |
| | | |
| | | // 保存SRM采购订单明细 |
| | | savePurchaseOrderDetail(detail); |
| | | |
| | | // 帮助GC回收不再使用的对象 |
| | | wrapper = null; |
| | | erpData = null; |
| | | } catch (Exception e) { |
| | | log.error("【syncPurchaseOrderDetails 处理异常】订单号: {}, 项次: {}, 异常: {}", |
| | | detail.getPoErpNo(), detail.getLineNo(), e.getMessage(), e); |