diff --git a/doc/操作日志功能-快速上手.md b/doc/操作日志功能-快速上手.md new file mode 100644 index 0000000..7a4fa2d --- /dev/null +++ b/doc/操作日志功能-快速上手.md @@ -0,0 +1,301 @@ +# 操作日志查看功能 - 快速上手指南 + +## 🚀 快速部署 + +### 1️⃣ 重新编译前端 + +```bash +cd d:\code\ruoyi-vue +npm run build:prod +``` + +或者开发模式: +```bash +npm run dev +``` + +### 2️⃣ 重新编译后端(如果还没编译) + +```bash +cd d:\code\RuoYi-Vue-master\ruoyi-java +mvn clean package -DskipTests +``` + +### 3️⃣ 重启服务 + +重启前端和后端服务。 + +### 4️⃣ 清除浏览器缓存 + +按 `Ctrl + F5` 强制刷新页面。 + +--- + +## 📍 如何打开日志页面 + +### 方法:从配置对话框打开 + +1. 打开**订单列表**页面 + +2. 点击顶部的 **"H-TF自动写入配置"** 按钮(绿色) + +3. 在弹出的配置对话框底部,找到 **"查看操作日志"** 按钮(蓝色,带文档图标) + +4. 点击后即可查看操作日志 + +--- + +## 📊 功能演示 + +### 界面布局 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 腾讯文档操作日志 [X] │ +├─────────────────────────────────────────────────────────────────┤ +│ 搜索框: [订单号] [操作类型▼] [操作状态▼] [搜索] [重置] │ +├─────────────────────────────────────────────────────────────────┤ +│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ +│ │ 成功 │ │ 跳过 │ │ 失败 │ │ 总计 │ │ +│ │ 150 │ │ 500 │ │ 10 │ │ 660 │ │ +│ └───────┘ └───────┘ └───────┘ └───────┘ │ +├─────────────────────────────────────────────────────────────────┤ +│ 序号 | 操作类型 | 订单号 | 行号 | 物流链接 | 状态 | 时间 │ +│ ────┼──────────┼────────┼──────┼──────────┼──────┼──────── │ +│ 1 | 批量同步 | JY123 | 2575 | https... | 成功 | 22:03:30 │ +│ 2 | 批量同步 | JY124 | 2576 | https... | 跳过 | 22:03:31 │ +│ 3 | 批量同步 | JY125 | 2577 | https... | 失败 | 22:03:32 │ +├─────────────────────────────────────────────────────────────────┤ +│ 总计 660 条 [10▼] [<] [1] [2] [3] ... [66] [>] │ +├─────────────────────────────────────────────────────────────────┤ +│ [关闭] [刷新] │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 🔍 使用场景 + +### 场景1:查看今天的同步情况 + +1. 打开日志页面 +2. 查看顶部统计卡片 +3. 成功数 = 今天成功同步的订单数 +4. 跳过数 = 今天跳过的订单数(如已有数据) +5. 失败数 = 今天失败的订单数 + +### 场景2:查找为什么某个订单没有同步 + +1. 在"订单号"输入框输入订单号,例如:`JY202511061595` +2. 点击"搜索" +3. 查看该订单的操作记录: + - **成功** ✅ - 已经同步 + - **跳过** ⚠️ - 被跳过(查看原因) + - **失败** ❌ - 同步失败(查看错误信息) + - **无记录** - 没有尝试同步该订单 + +### 场景3:查看所有失败的订单 + +1. 在"操作状态"下拉框选择"失败" +2. 点击"搜索" +3. 查看所有失败记录的"错误信息"列 +4. 根据错误信息进行处理: + - "未找到订单" → 检查订单是否存在 + - "订单物流链接为空" → 补充物流信息 + - "API调用失败" → 检查网络或API + +### 场景4:检查某个订单是否重复推送 + +1. 在"订单号"输入框输入订单号 +2. 点击"搜索" +3. 查看记录数量: + - 只有1条"成功"记录 ✅ - 正常 + - 有多条"成功"记录 ❌ - 可能重复推送 + - 有"跳过"记录 ✅ - 防重机制生效 + +--- + +## 💡 快速技巧 + +### 技巧1:快速刷新 + +点击底部的 **"刷新"** 按钮即可重新加载最新数据。 + +### 技巧2:查看物流链接 + +点击"物流链接"列的链接,会在新标签页打开物流链接。 + +### 技巧3:分页查看 + +- 默认每页显示20条 +- 可以选择10/20/50/100条每页 +- 使用页码快速跳转 + +### 技巧4:重置筛选 + +点击 **"重置"** 按钮清除所有搜索条件,显示所有日志。 + +--- + +## 🎯 数据解读 + +### 操作类型 + +- **批量同步**:通过"批量同步物流"按钮触发的同步 +- **单个写入**:单个订单的写入操作(如果有) + +### 操作状态 + +- **成功** (绿色): + - 物流链接已写入腾讯文档 + - 订单推送状态已更新为"已推送" + - 操作完全成功 + +- **跳过** (橙色): + - 订单已推送(数据库标记为已推送) + - 腾讯文档中该行已有物流链接 + - 分布式锁获取失败(其他请求正在处理) + - 这是**正常现象**,防止重复推送 + +- **失败** (红色): + - 未找到订单 + - 订单物流链接为空 + - 腾讯文档API调用失败 + - 其他异常 + - 需要**人工处理** + +### 统计数字含义 + +假设统计卡片显示: +``` +成功: 150 跳过: 500 失败: 10 总计: 660 +``` + +解读: +- 今天尝试同步了660个订单 +- 成功同步150个(22.7%) +- 跳过500个(75.8%)- 这些订单可能已经同步过了 +- 失败10个(1.5%)- 需要检查这些订单 + +**正常情况下:** +- 首次同步:成功比例较高(60-80%) +- 二次同步:跳过比例较高(80-95%) +- 失败比例:应该很低(<5%) + +--- + +## 🔧 故障排查 + +### 问题1:看不到日志 + +**检查步骤:** +1. 是否已经执行过批量同步? +2. 后端是否正常运行? +3. 数据库表 `tencent_doc_operation_log` 是否有数据? + +**验证SQL:** +```sql +SELECT COUNT(*) FROM tencent_doc_operation_log; +``` + +### 问题2:日志不完整 + +**可能原因:** +- 后端日志记录失败 +- 数据库连接异常 + +**检查方法:** +查看后端日志中是否有 "记录操作日志失败" 的错误。 + +### 问题3:"查看操作日志"按钮点击无反应 + +**解决方法:** +1. 按 F12 打开浏览器控制台 +2. 查看是否有JavaScript错误 +3. 清除浏览器缓存后重试 +4. 确保前端已重新编译 + +--- + +## 📊 数据库直接查询(备用方案) + +如果前端页面有问题,可以直接查询数据库: + +### 查看最近50条日志 +```sql +SELECT + id, + operation_type AS 操作类型, + order_no AS 订单号, + target_row AS 目标行, + operation_status AS 状态, + error_message AS 错误信息, + operator AS 操作人, + create_time AS 时间 +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' -- 替换为您的fileId +ORDER BY create_time DESC +LIMIT 50; +``` + +### 查看今天的统计 +```sql +SELECT + operation_status AS 状态, + COUNT(*) AS 数量 +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +AND DATE(create_time) = CURDATE() +GROUP BY operation_status; +``` + +### 查找某个订单的记录 +```sql +SELECT * +FROM tencent_doc_operation_log +WHERE order_no = 'JY202511061595' +ORDER BY create_time DESC; +``` + +--- + +## 🎉 使用效果 + +使用日志查看功能后,您可以: + +✅ **实时监控**:随时查看同步状态 +✅ **快速定位**:找出问题订单 +✅ **追溯历史**:查看操作记录 +✅ **错误诊断**:分析失败原因 +✅ **效率统计**:评估同步效率 + +--- + +## 📱 界面按钮位置 + +``` +订单列表页面 + ↓ + 顶部操作栏 + ↓ + [搜索] [重置] [导出] [H-TF自动写入配置] [批量同步物流] + ↓ + 配置对话框 + ↓ + 底部操作按钮 + ↓ + [查看操作日志] [测试配置] [清除配置] [取消] [保存配置] + ↓ + 日志查看页面 ✨ +``` + +--- + +**完成!** 🎊 + +如有问题,请查看: +- `操作日志查看功能说明.md` - 完整功能文档 +- `如何查看同步进度和操作日志.md` - 技术细节 + +祝使用愉快! 😊 + diff --git a/doc/操作日志查看功能说明.md b/doc/操作日志查看功能说明.md new file mode 100644 index 0000000..6906d6e --- /dev/null +++ b/doc/操作日志查看功能说明.md @@ -0,0 +1,251 @@ +# 腾讯文档操作日志查看功能说明 + +## 📊 功能概览 + +新增了一个**操作日志查看页面**,可以方便地查看所有腾讯文档的同步操作记录,包括成功、失败、跳过的记录。 + +## 🎯 功能特性 + +### 1. **可视化统计卡片** +- ✅ 成功数量(绿色) +- ⚠️ 跳过数量(橙色) +- ❌ 失败数量(红色) +- 📊 总计数量(蓝色) + +### 2. **强大的搜索功能** +- 按订单号搜索 +- 按操作类型筛选(批量同步/单个写入) +- 按操作状态筛选(成功/失败/跳过) + +### 3. **详细的日志展示** +- 操作类型(带标签) +- 订单号 +- 目标行号 +- 物流链接(可点击) +- 操作状态(带标签) +- 错误信息 +- 操作人 +- 操作时间 + +### 4. **分页功能** +- 支持10/20/50/100条每页 +- 总计显示 +- 页码跳转 + +## 📍 如何使用 + +### 方法1:从配置页面打开(推荐) + +1. 打开订单列表页面 +2. 点击 **"H-TF自动写入配置"** 按钮 +3. 在配置对话框底部,点击 **"查看操作日志"** 按钮(蓝色) +4. 即可查看当前文档的所有操作日志 + +### 方法2:直接在列表页面添加按钮(可选) + +如果需要,也可以在订单列表页面添加一个独立的"查看日志"按钮。 + +## 🔍 日志搜索示例 + +### 示例1:查看某个订单的操作记录 + +1. 在"订单号"输入框输入:`JY202511061595` +2. 点击"搜索" +3. 查看该订单的所有操作历史 + +### 示例2:查看今天失败的操作 + +1. 在"操作状态"下拉框选择:`失败` +2. 点击"搜索" +3. 查看所有失败的记录和错误信息 + +### 示例3:查看批量同步的记录 + +1. 在"操作类型"下拉框选择:`批量同步` +2. 点击"搜索" +3. 查看所有批量同步的操作 + +## 📊 统计卡片说明 + +页面顶部的统计卡片会**实时计算**当前筛选条件下的数据: + +- **成功**:操作成功完成的数量 +- **跳过**:因为各种原因跳过的数量(如已有数据、已推送等) +- **失败**:操作失败的数量 +- **总计**:所有记录的总数 + +## 🎨 界面截图说明 + +### 统计卡片区域 +``` +┌─────────────┬─────────────┬─────────────┬─────────────┐ +│ 成功 │ 跳过 │ 失败 │ 总计 │ +│ 150 │ 500 │ 10 │ 660 │ +│ (绿色) │ (橙色) │ (红色) │ (蓝色) │ +└─────────────┴─────────────┴─────────────┴─────────────┘ +``` + +### 日志表格 +``` +序号 | 操作类型 | 订单号 | 目标行 | 物流链接 | 状态 | 错误信息 | 操作人 | 操作时间 +-----|----------|--------|--------|----------|------|----------|--------|---------- +1 | 批量同步 | JY123 | 2575 | https... | 成功 | - | admin | 22:03:30 +2 | 批量同步 | JY124 | 2576 | https... | 跳过 | 已有数据 | admin | 22:03:30 +``` + +## 🔧 技术实现 + +### 后端接口 + +**1. 查询操作日志列表** +``` +GET /jarvis-api/jarvis/tendoc/operationLogs +参数: + - fileId: 文件ID(可选) + - sheetId: 工作表ID(可选) + - orderNo: 订单号(可选) + - operationType: 操作类型(可选) + - operationStatus: 操作状态(可选) +``` + +**2. 查询最近的操作日志** +``` +GET /jarvis-api/jarvis/tendoc/recentLogs +参数: + - fileId: 文件ID(可选) + - limit: 限制数量(默认50) +``` + +### 前端组件 + +- **组件位置**:`src/views/system/jdorder/components/TencentDocOperationLogs.vue` +- **组件名称**:`TencentDocOperationLogs` +- **依赖API**:`@/api/jarvis/tendoc.js` + +## 📝 操作状态说明 + +### SUCCESS(成功) +- 物流链接成功写入腾讯文档 +- 订单状态已更新 +- 操作日志已记录 + +### FAILED(失败) +可能的原因: +- 未找到订单 +- 订单物流链接为空 +- API调用失败 +- 写入异常 + +### SKIPPED(跳过) +可能的原因: +- 订单已推送(`tencent_doc_pushed = 1`) +- 腾讯文档中该行已有物流链接 +- 分布式锁获取失败 + +## 🚀 性能优化建议 + +1. **定期清理历史日志** +```sql +-- 清理30天前的日志 +DELETE FROM tencent_doc_operation_log +WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 DAY); +``` + +2. **添加索引优化查询** +```sql +-- 已创建的索引 +CREATE INDEX idx_file_id ON tencent_doc_operation_log(file_id); +CREATE INDEX idx_order_no ON tencent_doc_operation_log(order_no); +CREATE INDEX idx_create_time ON tencent_doc_operation_log(create_time); +``` + +## 🔒 权限控制 + +目前日志查看功能没有单独的权限控制,与腾讯文档配置功能共用权限。 + +如需单独控制,可以: +1. 在后端Controller添加权限注解 +2. 在前端路由配置中添加权限判断 + +## 📱 响应式设计 + +日志查看对话框支持响应式设计: +- 宽度:90%(自适应屏幕) +- 表格:最大高度500px,自动滚动 +- 分页:右对齐,自适应 + +## ❓ 常见问题 + +### Q1: 为什么看不到日志? + +**A:** 可能原因: +1. 还没有执行过批量同步 +2. fileId或sheetId参数不正确 +3. 后端接口异常 + +**解决方法:** +- 先执行一次批量同步 +- 检查后端日志是否有错误 +- 检查数据库表 `tencent_doc_operation_log` 是否有数据 + +### Q2: 统计数字不准确? + +**A:** 统计是基于**当前筛选条件**计算的,不是所有数据的统计。 + +例如: +- 如果筛选了"失败"状态,统计卡片只会统计失败的记录 +- 重置筛选条件后,统计会更新 + +### Q3: 能否导出日志? + +**A:** 当前版本不支持导出,但可以直接从数据库导出: + +```sql +-- 导出CSV格式 +SELECT + operation_type, + order_no, + target_row, + logistics_link, + operation_status, + error_message, + operator, + create_time +INTO OUTFILE '/tmp/tendoc_logs.csv' +FIELDS TERMINATED BY ',' +ENCLOSED BY '"' +LINES TERMINATED BY '\n' +FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6' +ORDER BY create_time DESC; +``` + +### Q4: 如何清空所有日志? + +**A:** 谨慎操作!执行以下SQL: + +```sql +-- 清空指定文档的日志 +DELETE FROM tencent_doc_operation_log +WHERE file_id = 'DTUFydU9FTkRLbEN6'; + +-- 清空所有日志(慎用!) +TRUNCATE TABLE tencent_doc_operation_log; +``` + +## 🎉 使用效果 + +使用操作日志功能后,您可以: + +1. ✅ **实时监控**同步状态 +2. ✅ **快速定位**问题订单 +3. ✅ **追溯历史**操作记录 +4. ✅ **统计分析**同步效率 +5. ✅ **错误诊断**失败原因 + +--- + +**最后更新**: 2025-11-06 22:50 +**版本**: v1.0 +**作者**: AI Assistant + diff --git a/src/api/jarvis/tendoc.js b/src/api/jarvis/tendoc.js index 3a888dc..cfa9378 100644 --- a/src/api/jarvis/tendoc.js +++ b/src/api/jarvis/tendoc.js @@ -158,3 +158,21 @@ export function getDocSheetList(fileId) { }) } +// 查询操作日志列表 +export function getOperationLogs(params) { + return request({ + url: '/jarvis/tendoc/operationLogs', + method: 'get', + params + }) +} + +// 查询最近的操作日志 +export function getRecentLogs(params) { + return request({ + url: '/jarvis/tendoc/recentLogs', + method: 'get', + params + }) +} + diff --git a/src/views/system/giftcoupon/batch.vue b/src/views/system/giftcoupon/batch.vue index 9a3324a..a25aa76 100644 --- a/src/views/system/giftcoupon/batch.vue +++ b/src/views/system/giftcoupon/batch.vue @@ -60,8 +60,8 @@ @@ -88,14 +88,14 @@ @@ -126,8 +126,8 @@ @@ -413,8 +413,9 @@ export default { this.form.selectedProduct = product this.form.queryResult = product this.form.skuName = product.skuName || product.title || product.productName || product.cleanSkuName || '' - const ownerValue = product.owner || (product.popId ? 'pop' : 'g') || 'g' - this.form.owner = ownerValue === 'p' ? 'pop' : (ownerValue === 'pop' ? 'pop' : 'g') + const ownerValue = product.owner || 'g' + // owner: 'g'/'G' = 自营, 'p'/'pop' = POP + this.form.owner = (ownerValue === 'g' || ownerValue === 'G') ? 'g' : 'pop' this.$modal.msgSuccess('已选择商品:' + this.form.skuName + '(' + (this.form.owner === 'g' ? '自营' : 'POP') + ')') }, @@ -491,8 +492,9 @@ export default { this.form.selectedProduct = selectedProduct this.form.queryResult = selectedProduct this.form.skuName = selectedProduct.skuName || selectedProduct.title || selectedProduct.productName || selectedProduct.cleanSkuName || '' - const ownerValue = selectedProduct.owner || (selectedProduct.popId ? 'pop' : 'g') || 'g' - this.form.owner = ownerValue === 'p' ? 'pop' : (ownerValue === 'pop' ? 'pop' : 'g') + const ownerValue = selectedProduct.owner || 'g' + // owner: 'g'/'G' = 自营, 'p'/'pop' = POP + this.form.owner = (ownerValue === 'g' || ownerValue === 'G') ? 'g' : 'pop' // 调用批量创建和替换 await this.handleReplace() @@ -509,8 +511,10 @@ export default { return Number(price).toFixed(2) }, - /** 格式化佣金金额 */ + /** 格式化佣金金额(已废弃:commission字段本身就是佣金金额,不需要计算) */ formatCommissionAmount(commission, price) { + // 已废弃:commission 字段已经是佣金金额(如 86.67),不是百分比 + // 直接使用 formatPrice(scope.row.commission) 即可 if (!commission || !price) return '0.00' // commission可能是百分比字符串或数值 let commissionPercent = 0 diff --git a/src/views/system/jdorder/components/TencentDocAutoWriteConfig.vue b/src/views/system/jdorder/components/TencentDocAutoWriteConfig.vue index 53bc47e..3a7cfeb 100644 --- a/src/views/system/jdorder/components/TencentDocAutoWriteConfig.vue +++ b/src/views/system/jdorder/components/TencentDocAutoWriteConfig.vue @@ -170,6 +170,9 @@
+ + 查看操作日志 + 测试配置 @@ -181,6 +184,13 @@ 保存配置
+ + + @@ -193,9 +203,13 @@ import { getDocSheetList, getTencentDocAuthUrl } from '@/api/jarvis/tendoc' +import TencentDocOperationLogs from './TencentDocOperationLogs' export default { name: 'TencentDocAutoWriteConfig', + components: { + TencentDocOperationLogs + }, props: { value: { type: Boolean, @@ -204,6 +218,7 @@ export default { }, data() { return { + showOperationLogs: false, visible: false, config: { hasAccessToken: false, diff --git a/src/views/system/jdorder/components/TencentDocOperationLogs.vue b/src/views/system/jdorder/components/TencentDocOperationLogs.vue new file mode 100644 index 0000000..1ca4454 --- /dev/null +++ b/src/views/system/jdorder/components/TencentDocOperationLogs.vue @@ -0,0 +1,304 @@ + + + + + +