1
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 表示法为行列索引
|
||||
* 例如:
|
||||
|
||||
Reference in New Issue
Block a user