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

@@ -105,5 +105,15 @@ public interface ITencentDocService {
* @return 用户信息
*/
JSONObject getUserInfo(String accessToken);
/**
* 批量更新表格batchUpdate API
*
* @param accessToken 访问令牌
* @param fileId 文件ID
* @param requestBody batchUpdate 请求体,包含 requests 数组
* @return 更新结果
*/
JSONObject batchUpdate(String accessToken, String fileId, JSONObject requestBody);
}

View File

@@ -403,5 +403,33 @@ public class TencentDocServiceImpl implements ITencentDocService {
throw new RuntimeException("获取用户信息失败: " + e.getMessage(), e);
}
}
@Override
public JSONObject batchUpdate(String accessToken, String fileId, JSONObject requestBody) {
try {
// 获取用户信息包含Open-Id
JSONObject userInfo = TencentDocApiUtil.getUserInfo(accessToken);
JSONObject data = userInfo.getJSONObject("data");
if (data == null) {
throw new RuntimeException("无法获取用户数据请检查Access Token是否有效");
}
String openId = data.getString("openID");
if (openId == null || openId.isEmpty()) {
throw new RuntimeException("无法获取Open-Id请检查Access Token是否有效");
}
return TencentDocApiUtil.batchUpdate(
accessToken,
tencentDocConfig.getAppId(),
openId,
fileId,
requestBody,
tencentDocConfig.getApiBaseUrl()
);
} catch (Exception e) {
log.error("批量更新表格失败 - fileId: {}", fileId, e);
throw new RuntimeException("批量更新表格失败: " + e.getMessage(), e);
}
}
}

View File

@@ -18,37 +18,37 @@ import java.util.List;
@Component
public class LogisticsScanTask {
private static final Logger logger = LoggerFactory.getLogger(LogisticsScanTask.class);
@Resource
private IJDOrderService jdOrderService;
@Resource
private ILogisticsService logisticsService;
/**
* 定时任务每1小时执行一次
* Cron表达式0 0 * * * ? 表示每小时的第0分钟执行
*/
@Scheduled(cron = "0 0 * * * ?")
@Scheduled(cron = "0 */30 * * * ?")
public void scanAndFetchLogistics() {
logger.info("========== 开始执行物流信息扫描定时任务 ==========");
try {
// 查询分销标记为F或PDD且有物流链接的订单
List<JDOrder> orders = jdOrderService.selectJDOrderListByDistributionMarkFOrPDD();
if (orders == null || orders.isEmpty()) {
logger.info("未找到需要处理的订单");
return;
}
logger.info("找到 {} 个需要处理的订单", orders.size());
int processedCount = 0;
int skippedCount = 0;
int successCount = 0;
int failedCount = 0;
// 串行处理订单(避免并发调用接口)
for (JDOrder order : orders) {
try {
@@ -58,13 +58,13 @@ public class LogisticsScanTask {
skippedCount++;
continue;
}
logger.info("开始处理订单 - 订单ID: {}, 订单号: {}, 分销标识: {}",
logger.info("开始处理订单 - 订单ID: {}, 订单号: {}, 分销标识: {}",
order.getId(), order.getOrderId(), order.getDistributionMark());
// 获取物流信息并推送(串行执行,不并发)
boolean success = logisticsService.fetchLogisticsAndPush(order);
if (success) {
successCount++;
logger.info("订单处理成功 - 订单ID: {}, 订单号: {}", order.getId(), order.getOrderId());
@@ -72,12 +72,12 @@ public class LogisticsScanTask {
failedCount++;
logger.warn("订单处理失败 - 订单ID: {}, 订单号: {}", order.getId(), order.getOrderId());
}
processedCount++;
// 添加短暂延迟,避免请求过于频繁
Thread.sleep(500); // 每次请求间隔500毫秒
} catch (InterruptedException e) {
logger.error("定时任务被中断", e);
Thread.currentThread().interrupt();
@@ -88,11 +88,11 @@ public class LogisticsScanTask {
// 继续处理下一个订单
}
}
logger.info("========== 物流信息扫描定时任务执行完成 ==========");
logger.info("总订单数: {}, 已处理: {}, 跳过: {}, 成功: {}, 失败: {}",
logger.info("总订单数: {}, 已处理: {}, 跳过: {}, 成功: {}, 失败: {}",
orders.size(), processedCount, skippedCount, successCount, failedCount);
} catch (Exception e) {
logger.error("执行物流信息扫描定时任务时发生异常", e);
}

View File

@@ -435,6 +435,28 @@ public class TencentDocApiUtil {
return callApi(accessToken, appId, openId, apiUrl, "POST", requestBody.toJSONString());
}
/**
* 批量更新表格batchUpdate API
* 根据官方文档https://docs.qq.com/open/document/app/openapi/v3/sheet/batchupdate/update.html
*
* @param accessToken 访问令牌
* @param appId 应用ID
* @param openId 开放平台用户ID
* @param fileId 文件ID
* @param requestBody 请求体,包含 requests 数组
* @param apiBaseUrl API基础地址
* @return 更新结果
*/
public static JSONObject batchUpdate(String accessToken, String appId, String openId, String fileId, JSONObject requestBody, String apiBaseUrl) {
String apiUrl = String.format("%s/files/%s/batchUpdate", apiBaseUrl, fileId);
log.info("批量更新表格batchUpdate- fileId: {}, requests数量: {}",
fileId, requestBody.getJSONArray("requests") != null ? requestBody.getJSONArray("requests").size() : 0);
log.debug("批量更新表格 - 请求体: {}", requestBody.toJSONString());
return callApi(accessToken, appId, openId, apiUrl, "POST", requestBody.toJSONString());
}
/**
* 解析 A1 表示法为行列索引
* 例如: