Browse Source

修改Transfer订单重试按钮名称为重新处理

- 将单个订单操作按钮从'重试'改为'重新处理'
- 将批量操作工具标题从'重试订单'改为'重新处理'
- 更新相关错误提示和确认对话框文本
- 消除'重试'名称的歧义,更准确地描述功能作用
- 重新处理是指重新执行失败订单的处理流程
AI Assistant 6 tháng trước cách đây
mục cha
commit
4bc0d0990f

+ 197 - 0
AiWork/202506/182332-WebhookDispatchController日志记录功能实现.md

@@ -0,0 +1,197 @@
+# WebhookDispatchController日志记录功能实现
+
+## 任务概述
+为WebhookDispatchController添加RequestLogger日志记录功能,参考ProtobufController的实现,将webhook请求记录到request_log表中。
+
+## 完成时间
+2025-06-18 23:32
+
+## 实现内容
+
+### 🎯 主要功能
+为WebhookDispatchController的dispatch方法添加了完整的请求日志记录功能,包括:
+- 请求信息记录
+- 运行时间统计
+- 错误信息记录
+- 路由信息设置
+
+### 📋 参考实现
+参考了ProtobufController中RequestLogger的使用方式:
+- 初始化RequestLogger实例
+- 设置路由信息
+- 记录运行时间
+- 处理错误信息
+
+### 🔧 具体修改
+
+#### 1. 添加RequestLogger初始化
+```php
+// 初始化请求日志记录器
+$requestLogger = new \App\Module\System\Services\RequestLogger($request);
+$requestLogger->setRouter("webhook/{$packageName}/{$handlerRoute}");
+```
+
+#### 2. 添加运行时间记录
+```php
+$startTime = microtime(true);
+
+// 成功处理后
+$requestLogger->setRunTime($startTime);
+
+// 异常处理中
+$requestLogger->setRunTime($startTime);
+```
+
+#### 3. 添加错误信息记录
+```php
+catch (\Exception $e) {
+    // 记录错误信息和运行时间
+    $requestLogger->setError($e->getMessage());
+    $requestLogger->setRunTime($startTime);
+    
+    // ... 其他错误处理
+}
+```
+
+### 📊 记录的信息
+
+#### 1. 基本请求信息
+- **路径**: `thirdParty/webhook/{packageName}/{handlerRoute}`
+- **方法**: POST/GET等HTTP方法
+- **Headers**: 完整的请求头信息
+- **IP地址**: 客户端IP
+- **主机**: 请求的主机名
+- **请求体**: Base64编码的原始请求数据
+
+#### 2. 路由信息
+- **Router**: `webhook/{packageName}/{handlerRoute}`格式
+- 便于识别具体的webhook处理器
+
+#### 3. 性能信息
+- **运行时间**: 毫秒级精度的处理时间
+- **开始时间**: 请求开始处理的时间戳
+
+#### 4. 错误信息
+- **错误消息**: 异常的详细信息
+- **错误类型**: 验证错误、处理错误等
+
+### 🧪 功能验证
+
+#### 1. 测试请求
+```bash
+curl -X POST http://kku_laravel.local.gd/thirdParty/webhook/test/handler \
+     -H "Content-Type: application/json" \
+     -d '{"test": "data"}'
+```
+
+#### 2. 响应结果
+```json
+{
+    "success": false,
+    "error": "包 test 对应的服务配置不存在,请先在thirdparty_services表中注册",
+    "request_id": "webhook_dispatch_6852dc0d237922.88063124"
+}
+```
+
+#### 3. 日志记录验证
+```sql
+SELECT id, router, path, method, run_ms, error, created_at 
+FROM kku_sys_request_logs 
+ORDER BY id DESC LIMIT 1;
+```
+
+**记录结果**:
+- **ID**: 68993381
+- **Router**: `webhook/test/handler`
+- **Path**: `thirdParty/webhook/test/handler`
+- **Method**: `POST`
+- **Run_ms**: 167毫秒
+- **Error**: 正确记录错误信息
+- **Created_at**: 2025-06-18T23:32:29.000Z
+
+### 🎯 技术要点
+
+#### 1. RequestLogger服务
+- 使用系统统一的RequestLogger服务
+- 自动处理请求信息的收集和存储
+- 支持异步写入,不影响响应性能
+
+#### 2. 路由格式统一
+- 使用`webhook/{packageName}/{handlerRoute}`格式
+- 便于日志分析和问题排查
+- 与其他模块的路由格式保持一致
+
+#### 3. 错误处理集成
+- 在异常处理中同样记录日志
+- 确保所有请求都有完整的记录
+- 错误信息详细记录便于调试
+
+#### 4. 性能监控
+- 精确记录处理时间
+- 便于性能分析和优化
+- 支持慢请求识别
+
+### 📈 使用价值
+
+#### 1. 问题排查
+- 完整的请求记录便于问题复现
+- 错误信息详细记录便于调试
+- 时间戳信息便于关联分析
+
+#### 2. 性能监控
+- 运行时间统计便于性能分析
+- 识别慢请求和性能瓶颈
+- 支持性能优化决策
+
+#### 3. 安全审计
+- 完整的访问记录
+- IP地址和请求头信息
+- 支持安全分析和审计
+
+#### 4. 业务分析
+- 请求频率统计
+- 错误率分析
+- 使用模式识别
+
+### 🔍 与ProtobufController的对比
+
+#### 相同点
+- 都使用RequestLogger服务
+- 都记录运行时间和错误信息
+- 都设置路由信息便于识别
+
+#### 不同点
+- **Protobuf**: 处理复杂的protobuf协议解析
+- **Webhook**: 处理简单的HTTP请求分发
+- **Protobuf**: 有用户ID记录
+- **Webhook**: 主要记录包名和处理器路由
+
+### 🎯 后续优化建议
+
+#### 1. 用户识别
+- 如果webhook请求包含用户信息,可以记录user_id
+- 便于用户相关的请求追踪
+
+#### 2. 请求分类
+- 可以根据packageName进行请求分类
+- 便于不同服务的日志分析
+
+#### 3. 监控告警
+- 基于错误率设置告警
+- 基于响应时间设置性能告警
+
+#### 4. 日志清理
+- 定期清理过期的请求日志
+- 保持数据库性能
+
+## 总结
+
+WebhookDispatchController的RequestLogger集成完全成功,实现了:
+
+1. ✅ **完整的请求记录**: 所有webhook请求都会记录到request_log表
+2. ✅ **详细的错误信息**: 异常情况下的完整错误记录
+3. ✅ **精确的性能数据**: 毫秒级的运行时间统计
+4. ✅ **统一的日志格式**: 与系统其他模块保持一致
+5. ✅ **功能验证通过**: 实际测试确认功能正常
+
+这个功能大大提升了webhook服务的可观测性和可维护性,为问题排查、性能优化和安全审计提供了强有力的支持。

+ 2 - 2
app/Module/Transfer/AdminControllers/Helper/TransferOrderHelper.php

@@ -158,9 +158,9 @@ class TransferOrderHelper
             $actions->disableDelete(); // 禁用删除
             $actions->disableEdit(); // 禁用编辑
             
-            // 重按钮
+            // 重新处理按钮
             if ($this->canRetry()) {
-                $actions->append('<a href="javascript:void(0)" class="btn btn-xs btn-outline-warning retry-order" data-id="'.$this->id.'">重</a>');
+                $actions->append('<a href="javascript:void(0)" class="btn btn-xs btn-outline-warning retry-order" data-id="'.$this->id.'">重新处理</a>');
             }
             
             // 手动完成按钮(仅转出订单)

+ 9 - 9
app/Module/Transfer/AdminControllers/Tools/RetryOrderTool.php

@@ -8,11 +8,11 @@ use Dcat\Admin\Grid\BatchAction;
 use Illuminate\Http\Request;
 
 /**
- * 重订单工具
+ * 重新处理订单工具
  */
 class RetryOrderTool extends BatchAction
 {
-    protected $title = '重试订单';
+    protected $title = '重新处理';
 
     /**
      * 处理批量操作
@@ -22,7 +22,7 @@ class RetryOrderTool extends BatchAction
         $orderIds = $this->getKey();
         
         if (empty($orderIds)) {
-            return $this->response()->error('请选择要重的订单');
+            return $this->response()->error('请选择要重新处理的订单');
         }
 
         $successCount = 0;
@@ -40,7 +40,7 @@ class RetryOrderTool extends BatchAction
                 }
 
                 if (!$order->canRetry()) {
-                    $errors[] = "订单 {$orderId} 状态不允许重";
+                    $errors[] = "订单 {$orderId} 状态不允许重新处理";
                     $failCount++;
                     continue;
                 }
@@ -50,18 +50,18 @@ class RetryOrderTool extends BatchAction
                 if ($result) {
                     $successCount++;
                 } else {
-                    $errors[] = "订单 {$orderId} 重失败";
+                    $errors[] = "订单 {$orderId} 重新处理失败";
                     $failCount++;
                 }
 
             } catch (\Exception $e) {
-                $errors[] = "订单 {$orderId} 重异常: " . $e->getMessage();
+                $errors[] = "订单 {$orderId} 重新处理异常: " . $e->getMessage();
                 $failCount++;
             }
         }
 
         // 构建响应消息
-        $message = "重完成:成功 {$successCount} 个,失败 {$failCount} 个";
+        $message = "重新处理完成:成功 {$successCount} 个,失败 {$failCount} 个";
         
         if (!empty($errors)) {
             $message .= "\n错误详情:\n" . implode("\n", array_slice($errors, 0, 5));
@@ -83,8 +83,8 @@ class RetryOrderTool extends BatchAction
     public function confirm()
     {
         return [
-            '确认重选中的订单吗?',
-            '重操作将重新处理失败的订单,请确认操作。',
+            '确认重新处理选中的订单吗?',
+            '重新处理操作将重新处理失败的订单,请确认操作。',
         ];
     }