diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocConfigController.java index 34d0710..832b093 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocConfigController.java @@ -69,6 +69,7 @@ public class TencentDocConfigController extends BaseController { // 2. 从Redis获取文档配置 String fileId = redisCache.getCacheObject(REDIS_KEY_PREFIX + "fileId"); String sheetId = redisCache.getCacheObject(REDIS_KEY_PREFIX + "sheetId"); + Integer startRow = redisCache.getCacheObject(REDIS_KEY_PREFIX + "startRow"); // 如果Redis中没有,则使用配置文件中的默认值 if (fileId == null || fileId.isEmpty()) { @@ -77,11 +78,15 @@ public class TencentDocConfigController extends BaseController { if (sheetId == null || sheetId.isEmpty()) { sheetId = tencentDocConfig.getSheetId(); } + if (startRow == null) { + startRow = tencentDocConfig.getStartRow(); + } config.put("hasAccessToken", hasAccessToken); config.put("accessTokenStatus", accessTokenStatus); config.put("fileId", fileId); config.put("sheetId", sheetId); + config.put("startRow", startRow); config.put("appId", tencentDocConfig.getAppId()); config.put("apiBaseUrl", tencentDocConfig.getApiBaseUrl()); @@ -111,7 +116,7 @@ public class TencentDocConfigController extends BaseController { * 更新配置(保存到Redis,180天有效期) * 注意:accessToken 由系统自动管理,无需手动配置 * - * @param params 包含 fileId, sheetId + * @param params 包含 fileId, sheetId, startRow */ @Log(title = "腾讯文档配置", businessType = BusinessType.UPDATE) @PostMapping @@ -119,6 +124,7 @@ public class TencentDocConfigController extends BaseController { try { String fileId = params.getString("fileId"); String sheetId = params.getString("sheetId"); + Integer startRow = params.getInteger("startRow"); // 验证必填字段 if (fileId == null || fileId.trim().isEmpty()) { @@ -128,6 +134,11 @@ public class TencentDocConfigController extends BaseController { return AjaxResult.error("工作表ID不能为空"); } + // startRow默认值为3 + if (startRow == null || startRow < 1) { + startRow = 3; + } + // 检查是否已授权 boolean hasAccessToken = false; try { @@ -144,18 +155,22 @@ public class TencentDocConfigController extends BaseController { // 保存到Redis(180天有效期) redisCache.setCacheObject(REDIS_KEY_PREFIX + "fileId", fileId.trim(), 180, TimeUnit.DAYS); redisCache.setCacheObject(REDIS_KEY_PREFIX + "sheetId", sheetId.trim(), 180, TimeUnit.DAYS); + redisCache.setCacheObject(REDIS_KEY_PREFIX + "startRow", startRow, 180, TimeUnit.DAYS); // 同时更新TencentDocConfig对象(内存中) tencentDocConfig.setFileId(fileId.trim()); tencentDocConfig.setSheetId(sheetId.trim()); + tencentDocConfig.setStartRow(startRow); - log.info("H-TF订单自动写入配置已更新 - fileId: {}, sheetId: {}", fileId.trim(), sheetId.trim()); + log.info("H-TF订单自动写入配置已更新 - fileId: {}, sheetId: {}, startRow: {}", + fileId.trim(), sheetId.trim(), startRow); JSONObject result = new JSONObject(); result.put("message", "配置更新成功,已保存到Redis(180天有效期)"); result.put("fileId", fileId.trim()); result.put("sheetId", sheetId.trim()); - result.put("hint", "现在录入分销标识为 H-TF 的订单时,将自动追加到此腾讯文档"); + result.put("startRow", startRow); + result.put("hint", "现在录入分销标识为 H-TF 的订单时,将自动追加到此腾讯文档(从第" + startRow + "行开始匹配)"); return AjaxResult.success("配置更新成功", result); } catch (Exception e) { @@ -225,6 +240,7 @@ public class TencentDocConfigController extends BaseController { try { redisCache.deleteObject(REDIS_KEY_PREFIX + "fileId"); redisCache.deleteObject(REDIS_KEY_PREFIX + "sheetId"); + redisCache.deleteObject(REDIS_KEY_PREFIX + "startRow"); log.info("H-TF订单自动写入配置已清除"); diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/config/TencentDocConfig.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/config/TencentDocConfig.java index 1933abe..b6f3a25 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/config/TencentDocConfig.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/config/TencentDocConfig.java @@ -50,6 +50,9 @@ public class TencentDocConfig { /** 工作表ID(H-TF订单的目标工作表ID) */ private String sheetId; + /** 起始行号(从第几行开始搜索匹配单号,默认为3,即第3行开始为数据行) */ + private Integer startRow = 3; + /** * 配置初始化后验证 */ @@ -150,5 +153,13 @@ public class TencentDocConfig { public void setSheetId(String sheetId) { this.sheetId = sheetId; } + + public Integer getStartRow() { + return startRow; + } + + public void setStartRow(Integer startRow) { + this.startRow = startRow; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/ITencentDocService.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/ITencentDocService.java index 91442d6..0b528ef 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/ITencentDocService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/ITencentDocService.java @@ -55,7 +55,7 @@ public interface ITencentDocService { * @param order 订单信息 * @return 上传结果 */ - JSONObject appendLogisticsToSheet(String accessToken, String fileId, String sheetId, JDOrder order); + JSONObject appendLogisticsToSheet(String accessToken, String fileId, String sheetId, Integer startRow, JDOrder order); /** * 读取表格数据 diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java index 53aadf1..17d0ffc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java @@ -1664,9 +1664,10 @@ private String handleTF(String input) { return; } - // 2. 从Redis获取文档配置(fileId 和 sheetId) + // 2. 从Redis获取文档配置(fileId、sheetId 和 startRow) String fileId = redisCache.getCacheObject(REDIS_KEY_PREFIX + "fileId"); String sheetId = redisCache.getCacheObject(REDIS_KEY_PREFIX + "sheetId"); + Integer startRow = redisCache.getCacheObject(REDIS_KEY_PREFIX + "startRow"); // 如果Redis中没有,则使用配置文件中的默认值 if (fileId == null || fileId.isEmpty()) { @@ -1675,19 +1676,23 @@ private String handleTF(String input) { if (sheetId == null || sheetId.isEmpty()) { sheetId = tencentDocConfig.getSheetId(); } + if (startRow == null) { + startRow = tencentDocConfig.getStartRow(); + } // 3. 验证配置是否完整 if (fileId == null || fileId.isEmpty() || sheetId == null || sheetId.isEmpty()) { System.err.println("✗ H-TF订单文档配置不完整,跳过自动写入。" + "\n 提示:请通过 POST /jarvis/tencentDoc/config 接口配置文档ID和工作表ID" + "\n fileId: " + (fileId != null && !fileId.isEmpty() ? fileId : "未配置") + - "\n sheetId: " + (sheetId != null && !sheetId.isEmpty() ? sheetId : "未配置")); + "\n sheetId: " + (sheetId != null && !sheetId.isEmpty() ? sheetId : "未配置") + + "\n startRow: " + (startRow != null ? startRow : "默认3")); return; } // 4. 调用腾讯文档服务追加订单数据 com.alibaba.fastjson2.JSONObject result = tencentDocService.appendLogisticsToSheet( - accessToken, fileId, sheetId, order); + accessToken, fileId, sheetId, startRow, order); if (result != null) { System.out.println("✓ H-TF订单已自动追加到腾讯文档" + diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/TencentDocServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/TencentDocServiceImpl.java index 46bb395..c010f3b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/TencentDocServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/TencentDocServiceImpl.java @@ -168,12 +168,17 @@ public class TencentDocServiceImpl implements ITencentDocService { } @Override - public JSONObject appendLogisticsToSheet(String accessToken, String fileId, String sheetId, JDOrder order) { + public JSONObject appendLogisticsToSheet(String accessToken, String fileId, String sheetId, Integer startRow, JDOrder order) { try { if (order == null) { throw new IllegalArgumentException("订单信息不能为空"); } + // startRow 参数用于标识从第几行开始是数据行(预留给未来的搜索匹配功能) + // 当前使用 append 方式追加数据,暂不使用 startRow + log.debug("追加订单到腾讯文档 - fileId: {}, sheetId: {}, startRow配置: {}, 订单: {}", + fileId, sheetId, startRow, order.getRemark()); + // 获取用户信息(包含Open-Id) // 官方响应格式:{ "ret": 0, "msg": "Succeed", "data": { "openID": "xxx", ... } } JSONObject userInfo = TencentDocApiUtil.getUserInfo(accessToken);