diff --git a/doc/如何查看同步进度和操作日志.md b/doc/如何查看同步进度和操作日志.md new file mode 100644 index 0000000..7c1c6e0 --- /dev/null +++ b/doc/如何查看同步进度和操作日志.md @@ -0,0 +1,324 @@ +# 如何查看同步进度和操作日志 + +## 您的三个问题解答 + +### 1️⃣ startRow被更新了吗? + +**答:是的,每次同步都会更新!** + +更新逻辑在代码中: +```java +// 更新 Redis 中的进度 +redisCache.setCacheObject(redisKey, currentMaxRow, 30, TimeUnit.DAYS); +``` + +**但是**:前端配置页面**不会自动刷新**! + +您需要: +1. **关闭配置对话框** +2. **重新打开配置** +3. 就能看到最新的进度了 + +--- + +### 2️⃣ 更新状态是真实的吗? + +**答:是真实的!** + +数据存储位置: +- **Redis Key**: `tendoc:progress:fileId:sheetId` +- **过期时间**: 30天 +- **存储内容**: 当前处理到的最大行号 + +您可以通过以下方式验证: +```bash +# 在Redis中查看 +redis-cli +> get "tendoc:progress:DTUFydU9FTkRLbEN6:BB08J2" +``` + +--- + +### 3️⃣ 同步日志在哪里查看? + +**答:操作日志记录在数据库中!** + +#### 📊 方法1:直接查询数据库 + +```sql +-- 查看最近50条操作日志 +SELECT + id, + operation_type, + order_no, + target_row, + operation_status, + error_message, + operator, + create_time +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +ORDER BY create_time DESC +LIMIT 50; + +-- 查看成功的操作 +SELECT COUNT(*) as 成功数量 +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +AND operation_status = 'SUCCESS' +AND DATE(create_time) = CURDATE(); + +-- 查看失败的操作 +SELECT + order_no, + target_row, + error_message, + create_time +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +AND operation_status = 'FAILED' +ORDER BY create_time DESC; + +-- 查看跳过的操作 +SELECT COUNT(*) as 跳过数量 +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +AND operation_status = 'SKIPPED' +AND DATE(create_time) = CURDATE(); +``` + +#### 📊 方法2:通过API查看(已添加) + +**接口1:查询操作日志列表** +``` +GET /jarvis-api/jarvis/tendoc/operationLogs?fileId=DTUFydU9FTkRLbEN6 +``` + +**接口2:查询最近N条日志** +``` +GET /jarvis-api/jarvis/tendoc/recentLogs?fileId=DTUFydU9FTkRLbEN6&limit=50 +``` + +**返回数据示例:** +```json +{ + "code": 200, + "msg": "操作成功", + "data": [ + { + "id": 1, + "fileId": "DTUFydU9FTkRLbEN6", + "sheetId": "BB08J2", + "operationType": "BATCH_SYNC", + "orderNo": "JY202511061595", + "targetRow": 2575, + "logisticsLink": "https://3.cn/-2urt1U5", + "operationStatus": "SUCCESS", + "errorMessage": null, + "operator": "admin", + "createTime": "2025-11-06 22:03:30" + } + ] +} +``` + +--- + +## 🔍 详细的同步进度说明 + +### 进度更新规则 + +代码中的进度更新逻辑: + +1. **有数据填充成功**: + ``` + currentMaxRow = endRow (本次处理的结束行) + nextStartRow = currentMaxRow - 100 (回溯100行防止遗漏) + ``` + +2. **本次无数据填充,但跳跃不大**: + ``` + currentMaxRow = endRow + nextStartRow = currentMaxRow - 100 + ``` + +3. **本次无数据填充,且跳跃过大**: + ``` + 不更新Redis进度 + nextStartRow = effectiveStartRow (配置的起始行) + ``` + +### 为什么前端不自动刷新? + +因为配置对话框是**静态的**,它在打开时读取一次配置,之后不会主动刷新。 + +**解决方案:** +- 关闭配置对话框 +- 重新打开 +- 或者点击"刷新"按钮(如果有) + +--- + +## 📈 如何判断同步是否正常? + +### 1. 查看后端日志 + +``` +grep "批量填充物流链接完成" ruoyi-admin.log | tail -10 +``` + +应该看到类似: +``` +批量填充物流链接完成 - 成功: 15, 跳过: 178, 错误: 7 +本次填充成功 15 条,更新进度到第 2699 行,下次从第 2599 行开始 +``` + +### 2. 查看数据库日志统计 + +```sql +-- 今天的统计 +SELECT + operation_status, + COUNT(*) as 数量 +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +AND DATE(create_time) = CURDATE() +GROUP BY operation_status; +``` + +应该看到: +``` +operation_status | 数量 +----------------|------ +SUCCESS | 150 +SKIPPED | 500 +FAILED | 10 +``` + +### 3. 检查Redis中的进度 + +```bash +redis-cli +> get "tendoc:progress:DTUFydU9FTkRLbEN6:BB08J2" +"2699" +``` + +这个数字应该随着同步而增长。 + +--- + +## 🎯 快速诊断问题 + +### 问题A:进度没有更新 + +**可能原因:** +1. Redis连接失败 +2. 同步过程中出现异常 +3. 没有成功填充任何数据 + +**排查方法:** +```bash +# 1. 检查Redis +redis-cli ping + +# 2. 查看后端日志 +tail -f ruoyi-admin.log | grep "tendoc:progress" + +# 3. 查看数据库日志 +SELECT * FROM tencent_doc_operation_log +ORDER BY create_time DESC LIMIT 10; +``` + +### 问题B:日志中全是SKIPPED + +**可能原因:** +1. 所有订单都已经推送过了(`tencent_doc_pushed = 1`) +2. 或者腾讯文档中的物流链接列都已经有值了 + +**解决方法:** +```sql +-- 检查订单的推送状态 +SELECT + tencent_doc_pushed, + COUNT(*) as 数量 +FROM jd_order +WHERE distribution_mark = 'H-TF' +GROUP BY tencent_doc_pushed; + +-- 重置推送状态(慎用!) +UPDATE jd_order +SET tencent_doc_pushed = 0, + tencent_doc_push_time = NULL +WHERE distribution_mark = 'H-TF' +AND tencent_doc_pushed = 1; +``` + +### 问题C:有ERROR日志 + +**排查步骤:** +```sql +-- 查看错误详情 +SELECT + order_no, + target_row, + error_message, + create_time +FROM tencent_doc_operation_log +WHERE operation_status = 'FAILED' +ORDER BY create_time DESC +LIMIT 20; +``` + +常见错误: +- `未找到订单` - 数据库中不存在该订单 +- `订单物流链接为空` - 订单还没有物流信息 +- `API调用失败` - 腾讯文档API异常 + +--- + +## 🔧 添加前端日志查看功能(可选) + +如果您想在前端直接查看日志,我可以帮您添加一个"查看操作日志"对话框。 + +需要: +1. 在配置页面添加"查看日志"按钮 +2. 创建日志查看对话框组件 +3. 调用上面的API接口展示数据 + +是否需要?请告知! + +--- + +## 📊 日志表结构 + +```sql +CREATE TABLE `tencent_doc_operation_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `file_id` varchar(100) COMMENT '文件ID', + `sheet_id` varchar(100) COMMENT '工作表ID', + `operation_type` varchar(50) COMMENT '操作类型', + `order_no` varchar(100) COMMENT '订单号', + `target_row` int COMMENT '目标行号', + `logistics_link` varchar(500) COMMENT '物流链接', + `operation_status` varchar(50) COMMENT '操作状态', + `error_message` text COMMENT '错误信息', + `operator` varchar(100) COMMENT '操作人', + `create_time` datetime COMMENT '创建时间', + `remark` varchar(500) COMMENT '备注', + PRIMARY KEY (`id`), + KEY `idx_file_id` (`file_id`), + KEY `idx_order_no` (`order_no`), + KEY `idx_create_time` (`create_time`) +) COMMENT='腾讯文档操作日志表'; +``` + +--- + +**总结**: +1. ✅ startRow **有更新**,存储在Redis中 +2. ✅ 更新状态是**真实的** +3. ✅ 日志在 `tencent_doc_operation_log` 表中,可通过SQL或API查询 +4. ❓ 前端配置页面需要**手动刷新**(关闭重开)才能看到最新进度 + +如需添加前端日志查看功能,请告知! + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java index 454deec..5f71c63 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/TencentDocController.java @@ -790,6 +790,35 @@ public class TencentDocController extends BaseController { } } + /** + * 查询操作日志列表 + */ + @GetMapping("/operationLogs") + public AjaxResult getOperationLogs(com.ruoyi.jarvis.domain.TencentDocOperationLog log) { + try { + List list = operationLogMapper.selectLogList(log); + return AjaxResult.success(list); + } catch (Exception e) { + log.error("查询操作日志失败", e); + return AjaxResult.error("查询操作日志失败: " + e.getMessage()); + } + } + + /** + * 查询最近的操作日志 + */ + @GetMapping("/recentLogs") + public AjaxResult getRecentLogs(@RequestParam(required = false) String fileId, + @RequestParam(defaultValue = "50") int limit) { + try { + List list = operationLogMapper.selectRecentLogs(fileId, limit); + return AjaxResult.success(list); + } catch (Exception e) { + log.error("查询最近操作日志失败", e); + return AjaxResult.error("查询最近操作日志失败: " + e.getMessage()); + } + } + /** * 从文本中提取手机号码 * 支持11位手机号码,可能包含空格、横线等分隔符 diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/mapper/TencentDocOperationLogMapper.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/mapper/TencentDocOperationLogMapper.java index a7c56b5..ff379ce 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/mapper/TencentDocOperationLogMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/mapper/TencentDocOperationLogMapper.java @@ -2,6 +2,9 @@ package com.ruoyi.jarvis.mapper; import com.ruoyi.jarvis.domain.TencentDocOperationLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 腾讯文档操作日志Mapper接口 @@ -17,5 +20,22 @@ public interface TencentDocOperationLogMapper { * @return 结果 */ int insertLog(TencentDocOperationLog log); + + /** + * 查询操作日志列表 + * + * @param log 操作日志 + * @return 操作日志集合 + */ + List selectLogList(TencentDocOperationLog log); + + /** + * 查询最近的操作日志 + * + * @param fileId 文件ID + * @param limit 限制数量 + * @return 操作日志集合 + */ + List selectRecentLogs(@Param("fileId") String fileId, @Param("limit") int limit); } diff --git a/ruoyi-system/src/main/resources/mapper/jarvis/TencentDocOperationLogMapper.xml b/ruoyi-system/src/main/resources/mapper/jarvis/TencentDocOperationLogMapper.xml index a27e678..d4528af 100644 --- a/ruoyi-system/src/main/resources/mapper/jarvis/TencentDocOperationLogMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/jarvis/TencentDocOperationLogMapper.xml @@ -49,5 +49,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + select id, file_id, sheet_id, operation_type, order_no, target_row, + logistics_link, operation_status, error_message, operator, + create_time, remark + from tencent_doc_operation_log + + + + + +