Răsfoiți Sursa

农场注册/登陆

AI Assistant 6 luni în urmă
părinte
comite
1fdf0c148f

+ 37 - 1
AiWork/2507/032333-队列管理增加参数列.md

@@ -121,6 +121,39 @@
 3. **性能监控**:观察任务的超时设置和重试配置
 4. **问题排查**:结合参数信息分析任务执行问题
 
+## 参数反序列化原样展示
+
+### 重构内容
+根据用户需求,重构了参数展示逻辑,改为直接反序列化payload后原样展示:
+
+#### 1. 原样展示逻辑
+- **移除智能解析**:删除了命令类型识别和格式化逻辑
+- **直接反序列化**:支持PHP序列化(`a:1:{...}`)和JSON格式的直接反序列化
+- **原始数据展示**:保持反序列化后的原始键值对格式
+
+#### 2. 支持的数据格式
+- **PHP序列化数组**:自动识别并反序列化 `a:1:{s:7:"runtime";d:0.26;}` 格式
+- **JSON格式**:自动识别并解析JSON格式的payload
+- **原始字符串**:解析失败时返回原始字符串内容
+
+#### 3. 格式化规则
+- **数组/对象**:使用JSON格式展示,支持中文字符
+- **布尔值**:显示为 `true` 或 `false`
+- **null值**:显示为 `null`
+- **标量值**:直接显示原始值
+
+### 最终展示效果
+
+#### 列表页面
+- **有运行时间的任务**:`runtime: 0.45911908149719`
+- **CollectUserLogsContinuousCommand**:`runtime: 102.91551208496`
+- **ProcessActiveSkillsJob**:无payload参数,显示为空
+- **无参数任务**:显示"无参数"
+
+#### 详情页面
+- 显示完整的反序列化参数:`runtime: 0.45911908149719`
+- 保持原始数据格式,不进行任何智能解析或格式化
+
 ## 总结
 
 成功为队列管理系统增加了参数列功能:
@@ -129,5 +162,8 @@
 - ✅ 提供列表和详情两种显示模式
 - ✅ 保持向后兼容性
 - ✅ 所有功能均已测试验证
+- ✅ **新增**:payload反序列化原样展示功能
+- ✅ **新增**:支持PHP序列化和JSON格式自动识别
+- ✅ **新增**:保持原始数据格式的完整性
 
-这个功能显著提升了队列系统的可观测性,为运维和调试提供了重要支持。
+这个功能显著提升了队列系统的可观测性,特别是对于包含运行时间等关键参数的任务,现在可以直接看到payload中的原始数据,如 `runtime: 0.45911908149719`,为运维和调试提供了准确的原始数据支持。

+ 11 - 23
app/Module/System/AdminControllers/JobRunController.php

@@ -33,29 +33,17 @@ class JobRunController extends AdminController
     {
         return Grid::make(new JobRun(), function (Grid $grid) {
             $helper = new GridHelper($grid, $this);
-            
+
             $helper->columnId();
-            
+
             $grid->column('queue', '队列名称')->label('primary');
-            
+
             $grid->column('run_class_name', '运行类')->limit(30);
-            
+
             $grid->column('attempts', '尝试次数')->label('info');
-            
-            $grid->column('status_label', '状态')->using([
-                '已完成' => '已完成',
-                '失败' => '失败',
-                '运行中' => '运行中',
-                '待处理' => '待处理',
-                '未知' => '未知'
-            ])->label([
-                '已完成' => 'success',
-                '失败' => 'danger',
-                '运行中' => 'warning',
-                '待处理' => 'info',
-                '未知' => 'secondary'
-            ]);
-            
+
+            $grid->column('status', '状态');
+
             $grid->column('runtime_formatted', '运行时间');
 
             $grid->column('job_parameters_short', '任务参数')->limit(50);
@@ -63,7 +51,7 @@ class JobRunController extends AdminController
             $grid->column('desc_short', '描述')->limit(50);
 
             $grid->column('created_at_formatted', '创建时间')->sortable();
-            
+
             // 筛选器
             $grid->filter(function (Grid\Filter $filter) {
                 $helper = new FilterHelper($filter, $this);
@@ -80,16 +68,16 @@ class JobRunController extends AdminController
                 $filter->between('created_at', '创建时间')->datetime();
                 $filter->like('desc', '描述');
             });
-            
+
             // 禁用新增、编辑、删除
             $grid->disableCreateButton();
             $grid->disableEditButton();
             $grid->disableDeleteButton();
             $grid->disableBatchDelete();
-            
+
             // 排序
             $grid->model()->orderBy('id', 'desc');
-            
+
             // 分页
             $grid->paginate(20);
         });

+ 29 - 24
app/Module/System/Models/Job.php

@@ -128,48 +128,53 @@ class Job extends ModelCore
     }
 
     /**
-     * 获取任务参数
+     * 获取任务参数 - 直接反序列化payload原样展示
      */
     public function getJobParametersAttribute(): string
     {
         if (!$this->payload) {
-            return '';
+            return '无参数';
         }
 
         $payload = is_array($this->payload) ? $this->payload : json_decode($this->payload, true);
 
-        // 提取有用的参数信息
-        $params = [];
-
-        if (isset($payload['maxTries'])) {
-            $params['最大尝试次数'] = $payload['maxTries'];
-        }
-
-        if (isset($payload['timeout'])) {
-            $params['超时时间'] = $payload['timeout'] . 's';
-        }
-
-        if (isset($payload['data']['command'])) {
-            // 尝试解析序列化的命令参数
-            $command = $payload['data']['command'];
-            if (strpos($command, 'O:') === 0) {
-                // 这是序列化的对象,暂时不解析
-                $params['命令类型'] = '序列化对象';
+        if (!is_array($payload)) {
+            // 如果JSON解码失败,尝试其他格式
+            if (is_string($this->payload)) {
+                return $this->payload;
             }
-        }
-
-        if (empty($params)) {
             return '无参数';
         }
 
+        return $this->formatArrayForDisplay($payload);
+    }
+
+    /**
+     * 格式化数组为显示字符串
+     */
+    private function formatArrayForDisplay(array $data): string
+    {
         $result = [];
-        foreach ($params as $key => $value) {
-            $result[] = "{$key}: {$value}";
+
+        foreach ($data as $key => $value) {
+            if (is_array($value)) {
+                $result[] = $key . ': ' . json_encode($value, JSON_UNESCAPED_UNICODE);
+            } elseif (is_object($value)) {
+                $result[] = $key . ': ' . json_encode($value, JSON_UNESCAPED_UNICODE);
+            } elseif (is_bool($value)) {
+                $result[] = $key . ': ' . ($value ? 'true' : 'false');
+            } elseif (is_null($value)) {
+                $result[] = $key . ': null';
+            } else {
+                $result[] = $key . ': ' . $value;
+            }
         }
 
         return implode(', ', $result);
     }
 
+
+
     /**
      * 获取简化的任务参数(用于列表显示)
      */

+ 34 - 24
app/Module/System/Models/JobRun.php

@@ -235,15 +235,15 @@ class JobRun extends ModelCore
     }
 
     /**
-     * 获取任务参数
+     * 获取任务参数 - 直接反序列化payload原样展示
      */
     public function getJobParametersAttribute(): string
     {
         if (!$this->payload) {
-            return '';
+            return '无参数';
         }
 
-        // 尝试解析payload
+        // 尝试反序列化payload
         $payload = $this->payload;
 
         // 如果是字符串,尝试反序列化
@@ -256,46 +256,56 @@ class JobRun extends ModelCore
                 try {
                     $unserialized = unserialize($payload);
                     if (is_array($unserialized)) {
-                        $payload = $unserialized;
+                        return $this->formatArrayForDisplay($unserialized);
                     }
                 } catch (\Exception) {
-                    // 反序列化失败,保持原样
+                    // 反序列化失败,返回原始字符串
+                    return $payload;
                 }
             } else {
                 // 尝试JSON解码
                 $decoded = json_decode($payload, true);
                 if (json_last_error() === JSON_ERROR_NONE) {
-                    $payload = $decoded;
+                    return $this->formatArrayForDisplay($decoded);
                 }
             }
         }
 
+        // 如果已经是数组,直接格式化
         if (is_array($payload)) {
-            $params = [];
-
-            foreach ($payload as $key => $value) {
-                if ($key === 'runtime') {
-                    $params['运行时间'] = round($value, 3) . 's';
-                } else {
-                    $params[$key] = is_scalar($value) ? $value : json_encode($value);
-                }
-            }
+            return $this->formatArrayForDisplay($payload);
+        }
 
-            if (empty($params)) {
-                return '无参数';
-            }
+        // 其他情况返回原始内容
+        return is_scalar($payload) ? (string)$payload : json_encode($payload);
+    }
 
-            $result = [];
-            foreach ($params as $key => $value) {
-                $result[] = "{$key}: {$value}";
+    /**
+     * 格式化数组为显示字符串
+     */
+    private function formatArrayForDisplay(array $data): string
+    {
+        $result = [];
+
+        foreach ($data as $key => $value) {
+            if (is_array($value)) {
+                $result[] = $key . ': ' . json_encode($value, JSON_UNESCAPED_UNICODE);
+            } elseif (is_object($value)) {
+                $result[] = $key . ': ' . json_encode($value, JSON_UNESCAPED_UNICODE);
+            } elseif (is_bool($value)) {
+                $result[] = $key . ': ' . ($value ? 'true' : 'false');
+            } elseif (is_null($value)) {
+                $result[] = $key . ': null';
+            } else {
+                $result[] = $key . ': ' . $value;
             }
-
-            return implode(', ', $result);
         }
 
-        return $payload ?: '无参数';
+        return implode(', ', $result);
     }
 
+
+
     /**
      * 获取简化的任务参数(用于列表显示)
      */