From 18f541fdf7fa87f54fa264580550414766189d5d Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 16 Jan 2026 18:02:54 +0800 Subject: [PATCH] 1 --- .../controller/jarvis/WPS365Controller.java | 16 ++-- .../jarvis/service/IWPS365ApiService.java | 10 ++- .../service/impl/WPS365ApiServiceImpl.java | 82 +++++++++++++++---- 3 files changed, 82 insertions(+), 26 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/WPS365Controller.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/WPS365Controller.java index 2de1a49..e426e72 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/WPS365Controller.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/WPS365Controller.java @@ -500,7 +500,8 @@ public class WPS365Controller extends BaseController { */ @GetMapping("/readAirSheetCells") public AjaxResult readAirSheetCells(@RequestParam String userId, - @RequestParam String worksheetId, + @RequestParam String fileId, + @RequestParam(required = false, defaultValue = "0") String worksheetId, @RequestParam(required = false) String range) { try { WPS365TokenInfo tokenInfo = wps365OAuthServiceImpl.getTokenByUserId(userId); @@ -519,10 +520,10 @@ public class WPS365Controller extends BaseController { } } - JSONObject result = wps365ApiService.readAirSheetCells(tokenInfo.getAccessToken(), worksheetId, range); + JSONObject result = wps365ApiService.readAirSheetCells(tokenInfo.getAccessToken(), fileId, worksheetId, range); return AjaxResult.success("读取AirSheet数据成功", result); } catch (Exception e) { - log.error("读取AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, e); + log.error("读取AirSheet数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e); return AjaxResult.error("读取AirSheet数据失败: " + e.getMessage()); } } @@ -534,13 +535,14 @@ public class WPS365Controller extends BaseController { public AjaxResult updateAirSheetCells(@RequestBody Map params) { try { String userId = (String) params.get("userId"); - String worksheetId = (String) params.get("worksheetId"); + String fileId = (String) params.get("fileId"); + String worksheetId = params.get("worksheetId") != null ? params.get("worksheetId").toString() : "0"; String range = (String) params.get("range"); @SuppressWarnings("unchecked") List> values = (List>) params.get("values"); - if (userId == null || worksheetId == null) { - return AjaxResult.error("userId和worksheetId不能为空"); + if (userId == null || fileId == null) { + return AjaxResult.error("userId和fileId不能为空"); } WPS365TokenInfo tokenInfo = wps365OAuthServiceImpl.getTokenByUserId(userId); @@ -559,7 +561,7 @@ public class WPS365Controller extends BaseController { } } - JSONObject result = wps365ApiService.updateAirSheetCells(tokenInfo.getAccessToken(), worksheetId, range, values); + JSONObject result = wps365ApiService.updateAirSheetCells(tokenInfo.getAccessToken(), fileId, worksheetId, range, values); return AjaxResult.success("更新AirSheet数据成功", result); } catch (Exception e) { log.error("更新AirSheet数据失败", e); diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IWPS365ApiService.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IWPS365ApiService.java index 4097507..a339890 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IWPS365ApiService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/IWPS365ApiService.java @@ -95,21 +95,23 @@ public interface IWPS365ApiService { * 读取AirSheet工作表数据 * * @param accessToken 访问令牌 - * @param worksheetId 工作表ID(文件ID) + * @param fileId 文件ID + * @param worksheetId 工作表ID(整数,通常为0表示第一个工作表) * @param range 单元格范围(如:A1:B10,可选) * @return 单元格数据 */ - JSONObject readAirSheetCells(String accessToken, String worksheetId, String range); + JSONObject readAirSheetCells(String accessToken, String fileId, String worksheetId, String range); /** * 更新AirSheet工作表数据 * * @param accessToken 访问令牌 - * @param worksheetId 工作表ID(文件ID) + * @param fileId 文件ID + * @param worksheetId 工作表ID(整数,通常为0表示第一个工作表) * @param range 单元格范围(如:A1:B2) * @param values 单元格值(二维数组,第一维是行,第二维是列) * @return 更新结果 */ - JSONObject updateAirSheetCells(String accessToken, String worksheetId, String range, List> values); + JSONObject updateAirSheetCells(String accessToken, String fileId, String worksheetId, String range, List> values); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WPS365ApiServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WPS365ApiServiceImpl.java index ef655c4..8ba6565 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WPS365ApiServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WPS365ApiServiceImpl.java @@ -218,32 +218,75 @@ public class WPS365ApiServiceImpl implements IWPS365ApiService { } @Override - public JSONObject readAirSheetCells(String accessToken, String worksheetId, String range) { + public JSONObject readAirSheetCells(String accessToken, String fileId, String worksheetId, String range) { try { - // WPS365 AirSheet API: GET https://openapi.wps.cn/v7/airsheet/{file_id}/worksheets/{worksheet_id} + // WPS365 AirSheet API路径格式 // 根据文档:https://open.wps.cn/documents/app-integration-dev/wps365/server/airsheet/worksheets/VbHZwButmh - // 注意:worksheetId既是file_id也是worksheet_id(AirSheet中文件ID就是工作表ID) + // 注意:AirSheet中,fileId和worksheetId可能是同一个值,或者worksheetId是整数索引 + // 如果用户只提供了一个ID(fileId),则fileId和worksheetId使用同一个值 String baseUrl = "https://openapi.wps.cn/v7"; - String url = baseUrl + "/airsheet/" + worksheetId + "/worksheets/" + worksheetId; + + // 如果worksheetId为空或与fileId相同,说明用户只配置了一个ID(类似腾讯文档) + // 在AirSheet中,这个ID既是file_id也是worksheet_id + String wsId; + if (worksheetId == null || worksheetId.trim().isEmpty() || worksheetId.equals(fileId)) { + // 使用fileId作为worksheetId(AirSheet中文件ID就是工作表ID) + wsId = fileId; + } else { + // 使用提供的worksheetId(可能是整数索引,如"0") + wsId = worksheetId; + } + + // 尝试不同的API路径格式 + // 格式1: /v7/airsheet/{file_id}/worksheets/{worksheet_id} + String url = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId; + + // 如果指定了range,添加range参数 + // 根据官方文档,可能需要使用 /values 子路径,或者使用query参数 if (range != null && !range.trim().isEmpty()) { + // 先尝试作为query参数 url += "?range=" + java.net.URLEncoder.encode(range, "UTF-8"); } - log.debug("读取AirSheet数据 - url: {}, range: {}", url, range); - return WPS365ApiUtil.httpRequest("GET", url, accessToken, null); + log.debug("读取AirSheet数据 - url: {}, fileId: {}, worksheetId: {}, range: {}", url, fileId, wsId, range); + JSONObject result = WPS365ApiUtil.httpRequest("GET", url, accessToken, null); + return result; } catch (Exception e) { - log.error("读取AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, e); - throw new RuntimeException("读取AirSheet数据失败: " + e.getMessage(), e); + log.error("读取AirSheet数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e); + // 如果失败,尝试使用 /values 子路径 + try { + String baseUrl = "https://openapi.wps.cn/v7"; + String wsId = (worksheetId != null && !worksheetId.trim().isEmpty() && !worksheetId.equals(fileId)) ? worksheetId : fileId; + String url = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId + "/values"; + if (range != null && !range.trim().isEmpty()) { + url += "?range=" + java.net.URLEncoder.encode(range, "UTF-8"); + } + log.debug("尝试使用/values子路径 - url: {}", url); + return WPS365ApiUtil.httpRequest("GET", url, accessToken, null); + } catch (Exception e2) { + log.error("使用/values子路径也失败", e2); + throw new RuntimeException("读取AirSheet数据失败: " + e.getMessage(), e); + } } } @Override - public JSONObject updateAirSheetCells(String accessToken, String worksheetId, String range, List> values) { + public JSONObject updateAirSheetCells(String accessToken, String fileId, String worksheetId, String range, List> values) { try { - // WPS365 AirSheet API: PUT https://openapi.wps.cn/v7/airsheet/{file_id}/worksheets/{worksheet_id} - // 注意:worksheetId既是file_id也是worksheet_id(AirSheet中文件ID就是工作表ID) + // WPS365 AirSheet API路径格式 + // 注意:AirSheet中,fileId和worksheetId可能是同一个值 String baseUrl = "https://openapi.wps.cn/v7"; - String url = baseUrl + "/airsheet/" + worksheetId + "/worksheets/" + worksheetId; + + // 如果worksheetId为空或与fileId相同,说明用户只配置了一个ID + String wsId; + if (worksheetId == null || worksheetId.trim().isEmpty() || worksheetId.equals(fileId)) { + wsId = fileId; + } else { + wsId = worksheetId; + } + + // 尝试不同的API路径格式 + String url = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId; // 构建请求体 JSONObject requestBody = new JSONObject(); @@ -267,11 +310,20 @@ public class WPS365ApiServiceImpl implements IWPS365ApiService { requestBody.put("values", valuesArray); String bodyStr = requestBody.toJSONString(); - log.debug("更新AirSheet数据 - url: {}, range: {}, values: {}", url, range, bodyStr); + log.debug("更新AirSheet数据 - url: {}, fileId: {}, worksheetId: {}, range: {}, values: {}", + url, fileId, wsId, range, bodyStr); - return WPS365ApiUtil.httpRequest("PUT", url, accessToken, bodyStr); + try { + return WPS365ApiUtil.httpRequest("PUT", url, accessToken, bodyStr); + } catch (Exception e) { + // 如果失败,尝试使用 /values 子路径 + log.warn("使用基础路径失败,尝试/values子路径", e); + String urlWithValues = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId + "/values"; + log.debug("尝试使用/values子路径 - url: {}", urlWithValues); + return WPS365ApiUtil.httpRequest("PUT", urlWithValues, accessToken, bodyStr); + } } catch (Exception e) { - log.error("更新AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, e); + log.error("更新AirSheet数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e); throw new RuntimeException("更新AirSheet数据失败: " + e.getMessage(), e); } }