AI Assistant 6 months ago
parent
commit
a30da6570a

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

@@ -0,0 +1,133 @@
+# 队列管理增加参数列
+
+**时间**: 2025年07月03日 23:33  
+**任务**: 为队列任务管理和队列运行记录管理页面增加"参数列"
+
+## 任务概述
+
+为Laravel队列管理后台页面增加"任务参数"列,用于显示队列任务的执行参数,提升队列监控和调试能力。
+
+## 实现内容
+
+### 1. 模型层增强
+
+#### Job模型 (`app/Module/System/Models/Job.php`)
+- 添加 `job_parameters` 访问器:解析payload中的参数信息
+- 添加 `job_parameters_short` 访问器:用于列表显示的简化版本
+- 更新 `$appends` 数组包含新的访问器
+
+**参数解析逻辑**:
+- 提取 `maxTries`(最大尝试次数)
+- 提取 `timeout`(超时时间)
+- 识别序列化对象类型
+- 格式化为用户友好的显示格式
+
+#### JobRun模型 (`app/Module/System/Models/JobRun.php`)
+- 添加 `job_parameters` 访问器:解析payload中的运行参数
+- 添加 `job_parameters_short` 访问器:用于列表显示
+- 支持PHP序列化数组和JSON格式的参数解析
+- 更新 `$appends` 数组
+
+**参数解析特性**:
+- 自动识别PHP序列化格式 (`a:1:{...}`)
+- 自动识别JSON格式
+- 特殊处理 `runtime` 参数,显示为秒数
+- 异常处理确保解析失败时不影响页面显示
+
+### 2. 控制器层更新
+
+#### JobController (`app/Module/System/AdminControllers/JobController.php`)
+- 在Grid列表中添加 `job_parameters_short` 列
+- 在Show详情页面添加 `job_parameters` 字段
+- 设置列宽限制为50字符,超出显示省略号
+
+#### JobRunController (`app/Module/System/AdminControllers/JobRunController.php`)
+- 在Grid列表中添加 `job_parameters_short` 列
+- 在Show详情页面添加 `job_parameters` 字段
+- 参数列位置在"运行时间"之后,"描述"之前
+
+### 3. 功能特性
+
+#### 参数显示格式
+- **有参数任务**:显示格式化的参数信息,如"运行时间: 0.26s"
+- **无参数任务**:显示"无参数"
+- **列表显示**:超过50字符自动截断并添加"..."
+- **详情显示**:显示完整的参数信息
+
+#### 数据兼容性
+- 兼容现有的payload数据格式
+- 支持空payload的任务
+- 异常处理确保向后兼容
+
+## 测试验证
+
+### 1. 队列运行记录管理页面
+✅ **列表页面**:
+- 成功显示"任务参数"列
+- 正确解析运行时间参数(如"运行时间: 0.26s")
+- 无参数任务显示"无参数"
+- 参数过长时正确截断
+
+✅ **详情页面**:
+- 成功显示"任务参数"字段
+- 参数信息完整显示
+- 布局合理,位置适当
+
+### 2. 队列任务管理页面
+✅ **列表页面**:
+- 成功添加"任务参数"列
+- 表头显示正确
+- 当前无待处理任务,但结构正常
+
+✅ **详情页面**:
+- 成功添加"任务参数"字段
+- 准备好处理有参数的任务
+
+### 3. 数据解析测试
+✅ **PHP序列化格式**:
+- 正确解析 `"a:1:{s:7:\"runtime\";d:0.26;}"` 格式
+- 提取runtime参数并格式化为秒数
+
+✅ **JSON格式**:
+- 支持JSON格式的payload解析
+- 提取maxTries、timeout等标准参数
+
+✅ **异常处理**:
+- 解析失败时不影响页面显示
+- 向后兼容现有数据
+
+## 技术亮点
+
+### 1. 智能参数解析
+- 自动识别多种数据格式(PHP序列化、JSON)
+- 特殊参数的友好显示(如运行时间格式化)
+- 容错机制确保稳定性
+
+### 2. 用户体验优化
+- 列表显示简化版本,详情显示完整信息
+- 合理的字符长度限制
+- 清晰的"无参数"提示
+
+### 3. 代码质量
+- 遵循Laravel访问器模式
+- 良好的异常处理
+- 代码复用性强
+
+## 使用效果
+
+管理员现在可以通过后台界面:
+1. **快速识别**:在列表中快速识别任务的关键参数
+2. **调试支持**:查看任务的详细执行参数
+3. **性能监控**:观察任务的超时设置和重试配置
+4. **问题排查**:结合参数信息分析任务执行问题
+
+## 总结
+
+成功为队列管理系统增加了参数列功能:
+- ✅ 两个管理页面均已添加参数列
+- ✅ 支持多种参数格式的智能解析
+- ✅ 提供列表和详情两种显示模式
+- ✅ 保持向后兼容性
+- ✅ 所有功能均已测试验证
+
+这个功能显著提升了队列系统的可观测性,为运维和调试提供了重要支持。

+ 6 - 2
app/Module/System/AdminControllers/JobController.php

@@ -45,7 +45,7 @@ class JobController extends AdminController
             });
             
             $grid->column('attempts', '尝试次数')->label('info');
-            
+
             $grid->column('status', '状态')->using([
                 '已保留' => '已保留',
                 '延迟中' => '延迟中',
@@ -55,7 +55,9 @@ class JobController extends AdminController
                 '延迟中' => 'info',
                 '待处理' => 'success'
             ]);
-            
+
+            $grid->column('job_parameters_short', '任务参数')->limit(50);
+
             $grid->column('created_at_formatted', '创建时间')->sortable();
             $grid->column('available_at_formatted', '可用时间');
             
@@ -103,6 +105,8 @@ class JobController extends AdminController
             $show->field('available_at_formatted', '可用时间');
             $show->field('reserved_at_formatted', '保留时间');
 
+            $show->field('job_parameters', '任务参数');
+
             $show->field('payload', '任务载荷')->json();
 
             // 禁用编辑和删除

+ 5 - 2
app/Module/System/AdminControllers/JobRunController.php

@@ -57,9 +57,11 @@ class JobRunController extends AdminController
             ]);
             
             $grid->column('runtime_formatted', '运行时间');
-            
+
+            $grid->column('job_parameters_short', '任务参数')->limit(50);
+
             $grid->column('desc_short', '描述')->limit(50);
-            
+
             $grid->column('created_at_formatted', '创建时间')->sortable();
             
             // 筛选器
@@ -111,6 +113,7 @@ class JobRunController extends AdminController
             $show->field('attempts', '尝试次数');
             $show->field('status_label', '状态');
             $show->field('runtime_formatted', '运行时间');
+            $show->field('job_parameters', '任务参数');
             $show->field('desc', '描述信息');
             $show->field('created_at_formatted', '创建时间');
             $show->field('available_at_formatted', '可用时间');

+ 59 - 2
app/Module/System/Models/Job.php

@@ -47,7 +47,9 @@ class Job extends ModelCore
         'available_at_formatted',
         'reserved_at_formatted',
         'status',
-        'job_class'
+        'job_class',
+        'job_parameters',
+        'job_parameters_short'
     ];
 
     //attrlist start
@@ -120,8 +122,63 @@ class Job extends ModelCore
         if (!$this->payload) {
             return '';
         }
-        
+
         $payload = is_array($this->payload) ? $this->payload : json_decode($this->payload, true);
         return $payload['displayName'] ?? $payload['job'] ?? '';
     }
+
+    /**
+     * 获取任务参数
+     */
+    public function getJobParametersAttribute(): string
+    {
+        if (!$this->payload) {
+            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 (empty($params)) {
+            return '无参数';
+        }
+
+        $result = [];
+        foreach ($params as $key => $value) {
+            $result[] = "{$key}: {$value}";
+        }
+
+        return implode(', ', $result);
+    }
+
+    /**
+     * 获取简化的任务参数(用于列表显示)
+     */
+    public function getJobParametersShortAttribute(): string
+    {
+        $params = $this->job_parameters;
+        if (mb_strlen($params) > 50) {
+            return mb_substr($params, 0, 50) . '...';
+        }
+        return $params;
+    }
 }

+ 78 - 2
app/Module/System/Models/JobRun.php

@@ -60,7 +60,9 @@ class JobRun extends ModelCore
         'status_color',
         'runtime_formatted',
         'job_class',
-        'desc_short'
+        'desc_short',
+        'job_parameters',
+        'job_parameters_short'
     ];
 
     //attrlist start
@@ -228,7 +230,81 @@ class JobRun extends ModelCore
         if (!$this->desc) {
             return '';
         }
-        
+
         return mb_strlen($this->desc) > 100 ? mb_substr($this->desc, 0, 100) . '...' : $this->desc;
     }
+
+    /**
+     * 获取任务参数
+     */
+    public function getJobParametersAttribute(): string
+    {
+        if (!$this->payload) {
+            return '';
+        }
+
+        // 尝试解析payload
+        $payload = $this->payload;
+
+        // 如果是字符串,尝试反序列化
+        if (is_string($payload)) {
+            // 去掉外层引号
+            $payload = trim($payload, '"');
+
+            // 尝试反序列化PHP数组
+            if (strpos($payload, 'a:') === 0) {
+                try {
+                    $unserialized = unserialize($payload);
+                    if (is_array($unserialized)) {
+                        $payload = $unserialized;
+                    }
+                } catch (\Exception) {
+                    // 反序列化失败,保持原样
+                }
+            } else {
+                // 尝试JSON解码
+                $decoded = json_decode($payload, true);
+                if (json_last_error() === JSON_ERROR_NONE) {
+                    $payload = $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);
+                }
+            }
+
+            if (empty($params)) {
+                return '无参数';
+            }
+
+            $result = [];
+            foreach ($params as $key => $value) {
+                $result[] = "{$key}: {$value}";
+            }
+
+            return implode(', ', $result);
+        }
+
+        return $payload ?: '无参数';
+    }
+
+    /**
+     * 获取简化的任务参数(用于列表显示)
+     */
+    public function getJobParametersShortAttribute(): string
+    {
+        $params = $this->job_parameters;
+        if (mb_strlen($params) > 50) {
+            return mb_substr($params, 0, 50) . '...';
+        }
+        return $params;
+    }
 }

File diff suppressed because it is too large
+ 514 - 47
app/tree.md


Some files were not shown because too many files changed in this diff