# 安全测试 ERP 任务创建 · 需求文档（PRD）

> **文档状态**：初稿 · **版本**：v1.0 · **最后更新**：2026-08-17  
> **维护者**：czj · **所属模块**：安全测试  
> **参考实现**：`E:\GithubData\ubains-module-test\develop\AuxiliaryTool\ScriptTool\ApiSecurityTest\utils\task_creator.py`、`erp_client.py`、`report_parser.py`

---

## 一、需求背景与目标

### 1.1 背景

当前安全测试模块已完成以下流程：
- ✅ 安全测试执行（OWASP API Security Top 10）
- ✅ 安全测试报告生成（Markdown 7 章节）
- ✅ 报告上传 ERP（DOCX → HTML → 测试单/项目资料/协作文档）

但缺少**ERP 任务指派跟踪**环节。参考工具 `ApiSecurityTest` 在安全测试完成后，会调用 ERP 的 `/openclaw/task` 接口创建任务，指定责任人、关联需求、设置截止时间，从而实现完整的测试闭环管理。

当前平台需要在安全测试模块中集成 ERP 任务创建功能，使得用户在执行完安全测试后，可以在报告中心一键创建 ERP 任务进行跟踪管理。

### 1.2 目标

在安全测试报告中心新增「创建 ERP 任务」功能，提供以下能力：

1. **自动解析报告摘要**：从已生成的 Markdown 报告中提取测试目标、漏洞数量、测试时间等信息
2. **获取 ERP 基础数据**：任务类型、任务状态、人员列表（含缓存）
3. **搜索关联需求**：根据配置的关键词搜索 ERP 中关联的需求
4. **构建任务数据**：根据漏洞数量自动计算紧急程度，生成任务名称和 HTML 描述
5. **创建 ERP 任务**：调用 `/openclaw/task` 接口创建任务
6. **任务参数可配置**：支持用户指定责任人、创建人、截止天数、紧急程度等

### 1.3 范围

| 范围 | 包含 | 不包含 |
|------|------|--------|
| ERP 任务创建 | 创建任务到 ERP 系统 | 修改/删除 ERP 任务 |
| 报告解析 | 从 Markdown 报告提取摘要 | 从其他格式报告解析 |
| 基础数据获取 | 任务类型、状态、人员列表 | 其他 ERP 基础数据 |
| 需求搜索 | 按关键词搜索关联需求 | 需求 CRUD 管理 |
| 任务参数配置 | 前端对话框配置责任人/创建人/截止时间 | 持久化任务配置模板 |
| 网盘上传 | — | 任务描述中引用网盘路径（当前平台不走网盘） |

---

## 二、功能需求

### 2.1 功能清单

| 编号 | 功能模块 | 子功能 | 优先级 | 说明 |
|------|---------|--------|--------|------|
| F1 | 任务创建 | 一键创建 ERP 任务 | P0 | 从报告摘要自动创建任务 |
| F2 | 任务创建 | 报告解析 | P0 | 从已生成的 Markdown 报告提取测试目标、漏洞统计、测试时间 |
| F3 | 任务创建 | 基础数据获取 | P0 | 获取任务类型、状态、人员列表（带缓存） |
| F4 | 任务创建 | 需求搜索 | P1 | 按配置关键词搜索关联需求 |
| F5 | 任务创建 | 紧急程度自动计算 | P0 | 根据漏洞数量自动计算 1-5 级 |
| F6 | 任务创建 | 任务名称自动生成 | P0 | 格式：`{IP}接口安全测试及漏洞修复_{日期}` |
| F7 | 任务参数配置 | 责任人选择 | P0 | 下拉选择 ERP 人员列表 |
| F8 | 任务参数配置 | 创建人选择 | P0 | 下拉选择 ERP 人员列表 |
| F9 | 任务参数配置 | 截止天数配置 | P1 | 数字输入框，默认 7 天 |
| F10 | 任务参数配置 | 紧急程度覆盖 | P1 | 手动覆盖自动计算值 |
| F11 | 任务参数配置 | 期望工时配置 | P1 | 数字输入框，默认 21 小时 |
| F12 | 任务参数配置 | 关联需求显示 | P1 | 显示搜索到的需求名称 |

### 2.2 功能详细描述

#### 2.2.1 报告解析（F2）

从 `SecurityReportService` 生成的 Markdown 报告中提取以下信息：

| 提取字段 | Markdown 格式 | 示例 |
|---------|---------------|------|
| 测试目标 | `> **测试目标**：https://192.168.5.44` | `https://192.168.5.44` |
| 测试时间 | `\| 测试时间 \| 2026-08-17 10:00:00 ~ 2026-08-17 11:30:00 \|` | `2026-08-17 10:00:00` |
| 高危漏洞数 | `\| 🔴 高危漏洞 \| **3** \|` | 3 |
| 中危漏洞数 | `\| 🟠 中危漏洞 \| **7** \|` | 7 |
| 低危漏洞数 | `\| 🟡 低危漏洞 \| **4** \|` | 4 |
| 信息类 | `\| 🔵 信息类 \| **2** \|` | 2 |
| 安全项 | `\| 🟢 已验证安全 \| **123** \|` | 123 |
| 测试用例总数 | `\| 测试用例总数 \| **145** \|` | 145 |

#### 2.2.2 基础数据获取（F3）

调用 ERP 接口获取以下数据，带 1 小时缓存：

| 数据 | ERP 接口 | 用途 |
|------|----------|------|
| 任务类型列表 | `GET /openclaw/tasktype` | 选择任务类型（默认 3=后端开发） |
| 任务状态列表 | `GET /openclaw/taskstatus` | 选择任务状态（默认 1=新建） |
| 人员列表 | `GET /openclaw/stuff` | 选择责任人/创建人 |

#### 2.2.3 紧急程度自动计算（F5）

| 条件 | 级别 | 说明 |
|------|------|------|
| 高危漏洞 > 0 | 5 | 最紧急 |
| 中危漏洞 > 0 | 4 | 高优先级 |
| 低危漏洞 > 0 | 3 | 中优先级 |
| 仅有信息类 | 2 | 正常优先级 |
| 无漏洞 | 1 | 低优先级 |

#### 2.2.4 任务名称自动生成（F6）

格式：`{目标IP}接口安全测试及漏洞修复_{YYYYMMDD}`

示例：`192.168.5.44接口安全测试及漏洞修复_20260817`

#### 2.2.5 任务描述 HTML 生成

任务描述（`content` 字段）为 HTML 格式，包含以下内容：

1. **测试概览**：测试目标、测试时间、测试标准（OWASP API Security Top 10）
2. **漏洞统计**：总计/高危/中危/低危/信息类/安全的表格
3. **高危漏洞详情**：列出高危漏洞列表（如有）
4. **中危漏洞**：中危漏洞数量提示
5. **修复建议**：标准修复建议模板
6. **紧急度说明**：根据计算级别显示对应的说明文字

#### 2.2.6 任务参数配置（F7-F12）

在创建任务前，用户可通过前端对话框配置以下参数：

| 参数 | 控件类型 | 默认值 | 说明 |
|------|---------|--------|------|
| 任务类型 | 下拉选择 | 3（后端开发） | 从 ERP 获取的类型列表 |
| 任务状态 | 下拉选择 | 1（新建） | 从 ERP 获取的状态列表 |
| 责任人 | 下拉选择 | 用户配置 | 从 ERP 人员列表选择 |
| 创建人 | 下拉选择 | 用户配置 | 从 ERP 人员列表选择 |
| 紧急程度 | 下拉选择/数字 | 自动计算 | 1-5，可手动覆盖 |
| 期望工时 | 数字输入 | 21 小时 | 任务的预估工时 |
| 截止天数 | 数字输入 | 7 天 | 从当前时间 + N 天 |
| 关联需求 | 文本显示 | 搜索匹配 | 显示搜索到的需求名称 |

### 2.3 业务流程

```
用户操作：安全测试执行完成 → 报告中心查看报告 → 点击"创建ERP任务"

后端流程：
步骤1：获取已生成的 Markdown 报告内容
步骤2：解析报告提取摘要（目标、漏洞数、时间）
步骤3：获取 ERP 基础数据（任务类型、状态、人员）
步骤4：搜索关联需求（按配置关键词）
步骤5：返回解析结果 + 基础数据到前端

用户操作：确认/修改任务参数 → 点击"确认创建"

后端流程：
步骤6：生成任务名称（{IP}接口安全测试及漏洞修复_{日期}）
步骤7：生成任务描述 HTML
步骤8：计算截止时间（当前时间 + 截止天数）
步骤9：调用 ERP 接口 /openclaw/task 创建任务
步骤10：返回创建结果（任务ID/名称/链接）
```

---

## 三、非功能需求

### 3.1 性能要求

- 报告解析应在 1s 内完成
- 基础数据获取（含缓存）应在 3s 内返回
- 任务创建应在 5s 内返回

### 3.2 可用性要求

- 任务创建失败不影响已有报告和上传功能
- 错误信息明确提示失败原因（网络超时/ERP 配置错误/权限不足）
- 按钮显示加载状态，防止重复提交

### 3.3 兼容性要求

- 复用现有 ERP 配置（`erp_configs` 表）中的 API Key 和 Base URL
- 复用现有 `SecurityReportService` 获取报告内容
- 新增 ERP 任务相关接口，与现有报告上传接口独立

---

## 四、API 设计

### 4.1 新增后端接口

#### 4.1.1 获取任务创建预览数据

```
GET /api/security/executions/{execution_id}/task-preview
```

**说明**：在创建任务前，获取报告解析结果和 ERP 基础数据，供前端预览和配置。

**响应**：
```json
{
  "summary": {
    "target": "https://192.168.5.44",
    "server_ip": "192.168.5.44",
    "start_time": "2026-08-17 10:00:00",
    "end_time": "2026-08-17 11:30:00",
    "total": 145,
    "high": 3,
    "medium": 7,
    "low": 4,
    "info": 2,
    "safe": 129
  },
  "task_name": "192.168.5.44接口安全测试及漏洞修复_20260817",
  "calculated_level": 5,
  "task_types": [{"id": 1, "name": "UI设计"}, ...],
  "task_statuses": [{"id": 1, "name": "新建"}, ...],
  "staff_list": [{"id": 101, "name": "李立键"}, ...],
  "requirement": {"id": 128, "name": "【新统一平台】公司内部安全测试扫描及修复验证"},
  "default_config": {
    "type_id": 3,
    "status_id": 1,
    "level": 4,
    "excepthour": 21,
    "user_id": 101,
    "createuser_id": 441,
    "deadline_days": 7
  }
}
```

#### 4.1.2 创建 ERP 任务

```
POST /api/security/executions/{execution_id}/create-task
```

**请求体**：
```json
{
  "type_id": 3,
  "status_id": 1,
  "level": 5,
  "excepthour": 21,
  "user_id": 101,
  "createuser_id": 441,
  "deadline_days": 7,
  "develop_id": 128
}
```

**响应**：
```json
{
  "success": true,
  "task_id": 1024,
  "task_name": "192.168.5.44接口安全测试及漏洞修复_20260817",
  "message": "ERP任务创建成功"
}
```

### 4.2 ERP 对接接口

| 方法 | 端点 | 用途 |
|------|------|------|
| GET | `/openclaw/tasktype` | 获取任务类型列表 |
| GET | `/openclaw/taskstatus` | 获取任务状态列表 |
| GET | `/openclaw/stuff` | 获取人员列表 |
| GET | `/openclaw/develop?search_str=xxx` | 搜索需求列表 |
| POST | `/openclaw/task` | 创建任务 |

---

## 五、数据模型

### 5.1 复用现有模型

| 模型/表 | 用途 |
|---------|------|
| `ErpConfig` (`erp_configs`) | 提供 ERP API Key 和 Base URL |
| `Execution` (`executions`) | 获取执行记录信息 |
| `VulnerabilityResult` (`vulnerability_results`) | 获取漏洞统计数据 |
| 安全测试 Markdown 报告 | 解析报告摘要 |

### 5.2 不新增数据表

ERP 任务创建不持久化到本地数据库，所有任务数据直接发送到 ERP 系统。

---

## 六、用户界面

### 6.1 入口位置

安全测试 → 报告中心 → 报告详情弹窗 → 「创建ERP任务」按钮

### 6.2 对话框布局

点击「创建ERP任务」后弹出对话框，包含：

**上半部分：报告摘要（只读）**
- 测试目标
- 测试时间
- 漏洞统计（高危/中危/低危/信息类/安全）

**下半部分：任务参数配置**
- 任务名称（自动生成，可编辑）
- 任务类型（下拉选择）
- 任务状态（下拉选择）
- 责任人（下拉选择，从人员列表）
- 创建人（下拉选择，从人员列表）
- 紧急程度（自动计算，可手动覆盖）
- 期望工时（数字输入）
- 截止时间（自动计算，显示具体日期）
- 关联需求（自动搜索匹配，显示名称）

**操作按钮**
- 取消
- 确认创建（loading 状态）

---

## 七、风险与依赖

| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| ERP API 不可用 | 任务创建失败 | 失败不影响现有功能，提示明确错误 |
| 人员列表获取失败 | 无法选择责任人/创建人 | 使用默认配置回退值 |
| 需求搜索无结果 | 任务无关联需求 | 可选字段，允许跳过 |
| 报告解析格式变更 | 解析失败 | 正则匹配宽松，失败时使用默认值 |
| ERP API Key 权限不足 | 创建任务失败 | 错误提示中说明权限问题 |

---

## 八、参考实现对照

| 参考文件 | 功能 | 本次实现 |
|---------|------|---------|
| `utils/erp_client.py` | ERP 任务 API 客户端（含缓存） | 扩展 `ErpService` 或新建 `ErpTaskService` |
| `utils/task_creator.py` | 任务创建协调器 | 新建 `SecurityErpTaskService` |
| `utils/report_parser.py` | Markdown 报告解析 | 复用 `SecurityReportService` 或新建解析器 |
| `run_all.py` → `upload_to_erp()` | 主流程调用 | 在 Reports.vue 中新增按钮和对话框 |

---

*本文档为安全测试 ERP 任务创建功能需求规格说明，供开发和测试参考。*