This commit is contained in:
2025-11-06 12:03:48 +08:00
parent 3448cde99d
commit 4527dc0ecd
6 changed files with 618 additions and 37 deletions

View File

@@ -537,23 +537,35 @@ public class TencentDocController extends BaseController {
}
// 自动识别列位置(如果未指定)
Integer arrangedColumn = null; // "是否安排"列
Integer markColumn = null; // "标记"列
if (orderNoColumn == null || logisticsLinkColumn == null) {
JSONArray headerRowData = headerValues.getJSONArray(0);
if (headerRowData == null || headerRowData.isEmpty()) {
return AjaxResult.error("无法识别表头,请手动指定列位置");
}
// 查找单号列和物流链接
// 查找所有相关
for (int i = 0; i < headerRowData.size(); i++) {
String cellValue = headerRowData.getString(i);
if (cellValue != null) {
String cellValueLower = cellValue.toLowerCase().trim();
if (orderNoColumn == null && (cellValueLower.contains("单号") || cellValueLower.contains("order"))) {
String cellValueTrim = cellValue.trim();
if (orderNoColumn == null && cellValueTrim.contains("单号")) {
orderNoColumn = i;
log.info("识别到 '单号' 列:第 {} 列(索引{}", i + 1, i);
}
if (logisticsLinkColumn == null && (cellValueLower.contains("物流链接") ||
(cellValueLower.contains("物流") && cellValueLower.contains("链接")))) {
if (logisticsLinkColumn == null && (cellValueTrim.contains("物流单号") || cellValueTrim.contains("物流链接"))) {
logisticsLinkColumn = i;
log.info("识别到 '物流单号' 列:第 {} 列(索引{}", i + 1, i);
}
if (arrangedColumn == null && cellValueTrim.contains("是否安排")) {
arrangedColumn = i;
log.info("识别到 '是否安排' 列:第 {} 列(索引{}", i + 1, i);
}
if (markColumn == null && cellValueTrim.contains("标记")) {
markColumn = i;
log.info("识别到 '标记' 列:第 {} 列(索引{}", i + 1, i);
}
}
}
@@ -675,6 +687,9 @@ public class TencentDocController extends BaseController {
// 批量更新表格
if (!updates.isEmpty()) {
// 获取今天的日期格式yyMMdd251105
String today = new java.text.SimpleDateFormat("yyMMdd").format(new java.util.Date());
// 将更新按行分组,批量写入
Map<Integer, JSONObject> rowUpdates = new java.util.HashMap<>();
for (int i = 0; i < updates.size(); i++) {
@@ -683,31 +698,43 @@ public class TencentDocController extends BaseController {
rowUpdates.put(row, update);
}
// 批量写入(每行单独写入,因为腾讯文档API可能不支持批量更新不同行
// 批量写入(每行单独写入,同时更新多个字段
int successUpdates = 0;
for (Map.Entry<Integer, JSONObject> entry : rowUpdates.entrySet()) {
try {
int row = entry.getKey();
JSONObject update = entry.getValue();
String logisticsLink = update.getString("logisticsLink");
String orderNo = update.getString("orderNo");
// 计算列字母A, B, C...
String columnLetter = getColumnLetter(logisticsLinkColumn);
String cellRange = columnLetter + row;
// 使用 batchUpdate 一次性更新多个字段
JSONArray requests = new JSONArray();
// 构建写入数据(二维数组格式)
JSONArray writeValues = new JSONArray();
JSONArray writeRow = new JSONArray();
writeRow.add(logisticsLink);
writeValues.add(writeRow);
// 1. 更新物流单号
requests.add(buildUpdateCellRequest(sheetId, row - 1, logisticsLinkColumn, logisticsLink));
// 写入单个单元格
tencentDocService.writeSheetData(accessToken, fileId, sheetId, cellRange, writeValues);
// 2. 更新"是否安排"列(如果存在)
if (arrangedColumn != null) {
requests.add(buildUpdateCellRequest(sheetId, row - 1, arrangedColumn, "2"));
}
// 3. 更新"标记"列(如果存在)
if (markColumn != null) {
requests.add(buildUpdateCellRequest(sheetId, row - 1, markColumn, today));
}
// 构建完整的 batchUpdate 请求体
JSONObject batchUpdateBody = new JSONObject();
batchUpdateBody.put("requests", requests);
// 调用 batchUpdate API
tencentDocService.batchUpdate(accessToken, fileId, batchUpdateBody);
successUpdates++;
log.info("成功写入物流链接 - 单元格: {}, 单号: {}, 物流链接: {}", cellRange, update.getString("orderNo"), logisticsLink);
log.info("成功写入数据 - 行: {}, 单号: {}, 物流链接: {}, 是否安排: 2, 标记: {}",
row, orderNo, logisticsLink, today);
} catch (Exception e) {
log.error("写入物流链接失败 - 行: {}", entry.getKey(), e);
log.error("写入数据失败 - 行: {}", entry.getKey(), e);
errorCount++;
}
@@ -748,6 +775,50 @@ public class TencentDocController extends BaseController {
}
}
/**
* 构建单个单元格的更新请求(用于 batchUpdate
*
* @param sheetId 工作表ID
* @param rowIndex 行索引从0开始
* @param columnIndex 列索引从0开始
* @param value 要写入的值
* @return updateRangeRequest 对象
*/
private JSONObject buildUpdateCellRequest(String sheetId, int rowIndex, int columnIndex, String value) {
// 构建 updateRangeRequest
JSONObject updateRangeRequest = new JSONObject();
updateRangeRequest.put("sheetId", sheetId);
// 构建 gridData
JSONObject gridData = new JSONObject();
gridData.put("startRow", rowIndex);
gridData.put("startColumn", columnIndex);
// 构建 rows 数组
JSONArray rows = new JSONArray();
JSONObject rowData = new JSONObject();
JSONArray cellValues = new JSONArray();
// 构建单元格数据
JSONObject cellData = new JSONObject();
JSONObject cellValue = new JSONObject();
cellValue.put("text", value);
cellData.put("cellValue", cellValue);
cellValues.add(cellData);
rowData.put("values", cellValues);
rows.add(rowData);
gridData.put("rows", rows);
updateRangeRequest.put("gridData", gridData);
// 包装为 request 对象
JSONObject request = new JSONObject();
request.put("updateRangeRequest", updateRangeRequest);
return request;
}
/**
* 将列索引转换为Excel列字母0->A, 1->B, ..., 25->Z, 26->AA, ...
*/