1
This commit is contained in:
@@ -1789,26 +1789,56 @@ public class TencentDocController extends BaseController {
|
|||||||
return AjaxResult.error("无法识别表头列,请确保表头包含'单号'和'物流单号'列");
|
return AjaxResult.error("无法识别表头列,请确保表头包含'单号'和'物流单号'列");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 读取数据行
|
|
||||||
String dataRange = String.format("A%d:Z%d", startRow, endRow);
|
|
||||||
log.info("读取数据范围: {}", dataRange);
|
|
||||||
|
|
||||||
JSONObject dataResponse = tencentDocService.readSheetData(accessToken, fileId, sheetId, dataRange);
|
|
||||||
if (dataResponse == null || !dataResponse.containsKey("values")) {
|
|
||||||
return AjaxResult.error("读取数据失败");
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray rows = dataResponse.getJSONArray("values");
|
|
||||||
if (rows == null || rows.isEmpty()) {
|
|
||||||
return AjaxResult.error("数据为空");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 统计结果
|
// 统计结果
|
||||||
int successCount = 0;
|
int successCount = 0;
|
||||||
int skippedCount = 0;
|
int skippedCount = 0;
|
||||||
int errorCount = 0;
|
int errorCount = 0;
|
||||||
|
|
||||||
// 处理每一行
|
// 分批读取数据,每批200行(避免单次读取过多数据导致API限制)
|
||||||
|
final int BATCH_SIZE = 200;
|
||||||
|
int currentStartRow = startRow;
|
||||||
|
int totalBatches = (int) Math.ceil((double)(endRow - startRow + 1) / BATCH_SIZE);
|
||||||
|
int currentBatch = 0;
|
||||||
|
|
||||||
|
log.info("开始分批处理,共 {} 批,每批 {} 行", totalBatches, BATCH_SIZE);
|
||||||
|
|
||||||
|
while (currentStartRow <= endRow) {
|
||||||
|
currentBatch++;
|
||||||
|
int currentEndRow = Math.min(currentStartRow + BATCH_SIZE - 1, endRow);
|
||||||
|
|
||||||
|
log.info("正在处理第 {}/{} 批:第 {} 行到第 {} 行", currentBatch, totalBatches, currentStartRow, currentEndRow);
|
||||||
|
|
||||||
|
// 读取当前批次的数据行
|
||||||
|
String dataRange = String.format("A%d:Z%d", currentStartRow, currentEndRow);
|
||||||
|
log.info("读取数据范围: {}", dataRange);
|
||||||
|
|
||||||
|
JSONObject dataResponse = null;
|
||||||
|
try {
|
||||||
|
dataResponse = tencentDocService.readSheetData(accessToken, fileId, sheetId, dataRange);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("读取第 {} 批数据失败({} - {} 行)", currentBatch, currentStartRow, currentEndRow, e);
|
||||||
|
errorCount += (currentEndRow - currentStartRow + 1);
|
||||||
|
// 继续处理下一批
|
||||||
|
currentStartRow = currentEndRow + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataResponse == null || !dataResponse.containsKey("values")) {
|
||||||
|
log.warn("第 {} 批数据读取返回空({} - {} 行),跳过", currentBatch, currentStartRow, currentEndRow);
|
||||||
|
currentStartRow = currentEndRow + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray rows = dataResponse.getJSONArray("values");
|
||||||
|
if (rows == null || rows.isEmpty()) {
|
||||||
|
log.info("第 {} 批数据为空({} - {} 行),跳过", currentBatch, currentStartRow, currentEndRow);
|
||||||
|
currentStartRow = currentEndRow + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("第 {} 批读取到 {} 行数据", currentBatch, rows.size());
|
||||||
|
|
||||||
|
// 处理当前批次的每一行
|
||||||
for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
|
for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
|
||||||
JSONArray row = rows.getJSONArray(rowIndex);
|
JSONArray row = rows.getJSONArray(rowIndex);
|
||||||
if (row == null || row.size() <= Math.max(orderNoColumn, logisticsLinkColumn)) {
|
if (row == null || row.size() <= Math.max(orderNoColumn, logisticsLinkColumn)) {
|
||||||
@@ -1816,7 +1846,12 @@ public class TencentDocController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int actualRow = startRow + rowIndex;
|
int actualRow = currentStartRow + rowIndex;
|
||||||
|
// 确保不超过结束行
|
||||||
|
if (actualRow > endRow) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
String logisticsLink = row.getString(logisticsLinkColumn);
|
String logisticsLink = row.getString(logisticsLinkColumn);
|
||||||
String orderNoFromDoc = row.getString(orderNoColumn);
|
String orderNoFromDoc = row.getString(orderNoColumn);
|
||||||
|
|
||||||
@@ -1903,6 +1938,22 @@ public class TencentDocController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("第 {}/{} 批处理完成,当前统计 - 成功: {}, 跳过: {}, 错误: {}",
|
||||||
|
currentBatch, totalBatches, successCount, skippedCount, errorCount);
|
||||||
|
|
||||||
|
// 移动到下一批
|
||||||
|
currentStartRow = currentEndRow + 1;
|
||||||
|
|
||||||
|
// 批次之间的延迟,避免API调用频率过高
|
||||||
|
if (currentStartRow <= endRow) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(200); // 批次之间延迟200ms
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
JSONObject result = new JSONObject();
|
||||||
result.put("batchId", batchId);
|
result.put("batchId", batchId);
|
||||||
result.put("startRow", startRow);
|
result.put("startRow", startRow);
|
||||||
|
|||||||
Reference in New Issue
Block a user