# 批量风险处置功能 PRD文档

## 1. 功能概述

### 1.1 功能名称
批量风险处置功能

### 1.2 功能背景
目前风险疑点的处置操作均为单条处理，当处置人或派发人面对大量疑点时，逐条操作效率低下。为提升风险处置效率，需支持批量处置功能。

### 1.3 功能目标
- 支持"提示"方式疑点的批量标记已读
- 支持"需处置"方式疑点的批量处置（提交审核）
- 支持"需处置"方式疑点的批量审核（通过/驳回）
- 支持派发人单条审核入口（审核处理情况）

### 1.4 页面职责划分

| 页面 | 使用角色 | 说明 |
|------|----------|------|
| 疑点处置-疑点详情.html | 处置人 | 查看和处理分派给自己的疑点 |
| 疑点派发-疑点详情.html | 派发人 | 查看、分派、审核疑点 |

---

## 2. 用户角色

| 角色 | 操作页面 | 操作权限 |
|------|----------|----------|
| 处置人 | 疑点处置-疑点详情.html | 批量标记已读、批量处置、提交处理结果（单条） |
| 派发人 | 疑点派发-疑点详情.html | 批量派发、批量审核（通过/驳回）、审核处理情况（单条） |

---

## 3. 功能详细说明

### 3.1 批量确认已读（提示方式）

#### 3.1.1 功能描述
处置人可一次性勾选多条"已派发未读"疑点，批量确认已读。

**操作页面：** 疑点处置-疑点详情.html（处置人页面，切换到"提示"类型）

#### 3.1.2 操作流程
```
1. 处置人进入疑点处置-疑点详情页面
2. 切换处置类型为"提示"
3. 勾选多条"已派发未读"状态的疑点
4. 点击底部"批量确认已读"按钮
5. 弹窗确认："确定将 X 条疑点标记为已读？"
6. 点击"确定"执行批量确认
7. 操作完成后，疑点状态变更为"已读完毕"，列表刷新
```

#### 3.1.3 业务规则
- 仅支持勾选"已派发未读"状态的疑点
- 已读完毕状态的疑点不可勾选（置灰）
- 批量操作后，勾选的疑点状态变更为"已读完毕"
- 操作不可撤销

---

### 3.2 批量提交处理结果（需处置方式）

#### 3.2.1 功能描述
处置人可一次性勾选多条"已派发待处置"疑点，统一填写处置说明后批量提交审核。

**操作页面：** 疑点处置-疑点详情.html（处置人页面，默认"需处置"类型）

#### 3.2.2 操作流程
```
1. 处置人进入疑点处置-疑点详情页面（默认"需处置"类型）
2. 勾选多条"已派发待处置"状态的疑点
3. 点击底部"批量提交处理结果"按钮
4. 弹窗填写处置说明（必填）
5. 弹窗显示提示："您已选择 X 条疑点，请填写处置说明后提交审核"
6. 点击"确定"批量提交审核
7. 操作完成后，疑点状态变更为"已处置待审核"，列表刷新
```

#### 3.2.3 弹窗设计
- 标题：批量提交处理结果
- 提示信息：您已选择 X 条疑点，请填写处置说明后提交审核
- 处置说明：多行文本框（必填）
- 按钮：确定、取消

#### 3.2.4 业务规则
- 仅支持勾选"已派发待处置"状态的疑点
- 其他状态的疑点不可勾选（置灰）
- 处置说明为必填项，统一应用到所有勾选的疑点
- 批量操作后，勾选的疑点状态变更为"已处置待审核"
- 操作不可撤销

---

### 3.2.5 批量退回重新分派（需处置方式）

#### 3.2.5.1 功能描述
处置人可一次性勾选多条"已派发待处置"疑点，填写退回原因后批量退回，由派发人重新分派。

**操作页面：** 疑点处置-疑点详情.html（处置人页面，默认"需处置"类型）

#### 3.2.5.2 操作流程
```
1. 处置人进入疑点处置-疑点详情页面（默认"需处置"类型）
2. 勾选多条"已派发待处置"状态的疑点
3. 点击底部"批量退回重新分派"按钮
4. 弹窗填写退回原因（必填）
5. 弹窗显示提示："您已选择 X 条疑点，请填写退回原因后确认退回"
6. 点击"确定"批量退回
7. 操作完成后，疑点从处置人列表中移除，派发人端派发状态变更为"派发驳回"
```

#### 3.2.5.3 弹窗设计
- 标题：批量退回重新分派
- 提示信息：您已选择 X 条疑点，请填写退回原因后确认退回
- 退回原因：多行文本框（必填，占位文本："请说明退回理由"）
- 按钮：确定退回、取消

#### 3.2.5.4 业务规则
- 仅支持勾选"已派发待处置"状态的疑点
- 退回原因为必填项，统一应用到所有勾选的疑点
- 批量退回后，疑点从处置人列表中移除
- 派发人端对应疑点的派发状态变更为"派发驳回"，处置情况为空
- 操作不可撤销

---

### 3.3 批量审核（需处置方式）

#### 3.3.1 功能描述
派发人可一次性勾选多条"已处置待审核"疑点，选择批量通过或批量驳回，统一填写审核意见后执行。

**操作页面：** 疑点派发-疑点详情.html（派发人页面）

#### 3.3.2 操作流程
```
1. 派发人进入疑点派发-疑点详情页面
2. 勾选多条"已处置待审核"状态的疑点
3. 点击底部"批量通过"或"批量驳回"按钮
4. 弹窗填写审核意见/驳回意见（必填）
5. 弹窗显示提示："您已选择 X 条疑点，请填写审核意见后确认通过"
6. 点击"确定"执行批量审核
7. 操作完成后刷新列表
```

#### 3.3.3 弹窗设计

**批量通过弹窗：**
- 标题：批量审核通过
- 提示信息：您已选择 X 条疑点，请填写审核意见后确认通过
- 审核意见：多行文本框（必填）
- 按钮：确定、取消

**批量驳回弹窗：**
- 标题：批量审核驳回
- 提示信息：您已选择 X 条疑点，请填写驳回意见后确认驳回
- 驳回意见：多行文本框（必填）
- 按钮：确定、取消

#### 3.3.4 业务规则
- 仅支持勾选"已处置待审核"状态的疑点
- 其他状态的疑点不可勾选（置灰）
- 审核意见/驳回意见为必填项，统一应用到所有勾选的疑点
- 批量通过后，勾选的疑点状态变更为"已关闭"
- 批量驳回后，勾选的疑点状态变更为"待处理"，处置人需重新处理
- 操作不可撤销

---

### 3.4 单条审核入口（派发人）

#### 3.4.1 功能描述
派发人在疑点派发-疑点详情页面，可对单条"已处置待审核"疑点进行审核处理。

**操作页面：** 疑点派发-疑点详情.html（派发人页面）

#### 3.4.2 操作流程
```
1. 派发人进入疑点派发-疑点详情页面
2. 在操作菜单中点击"审核处理情况"
3. 跳转至风险处置任务单页面（与待办入口相同的表单）
4. 在表单中查看处置详情，选择通过或驳回，填写意见后提交
```

#### 3.4.3 业务规则
- 仅"已处置待审核"状态的疑点显示"审核处理情况"菜单项
- 跳转目标为风险处置任务单.html（与待办入口一致）

---

### 3.5 处置类型切换（处置人页面）

#### 3.5.1 功能描述
处置人页面支持在"需处置"和"提示"两种处置类型之间切换，不同类型的处置状态和操作菜单不同。

**操作页面：** 疑点处置-疑点详情.html

#### 3.5.2 切换方式
- 面包屑行最右侧显示当前处置类型标签（蓝色"需处置"或绿色"提示"）
- 点击"切换"按钮在两种类型之间切换
- 切换后，表格数据、筛选器选项、批量操作按钮同步更新

#### 3.5.3 不同处置类型的处置状态和操作菜单

| 处置类型 | 处置状态 | 操作菜单 |
|----------|----------|----------|
| 【需处置】 | 已派发待处置 | 提交处理结果、查看完整流程、查看链上记录 |
| 【需处置】 | 已处置待审核 | 查看完整流程、查看链上记录 |
| 【提示】 | 已派发未读 | 确认已读、查看链上记录 |

#### 3.5.4 规则信息联动
- 切换到"提示"时，风险等级显示为"普通"，处置类型显示为"提示"
- 切换回"需处置"时，风险等级显示为"重大"，处置类型显示为"需处置"

---

### 3.6 操作菜单改名（处置人）

#### 3.6.1 改动说明
- 原"处置反馈"菜单项 → 改名为"提交处理结果"
- 功能和跳转不变，仅修改显示名称

---

### 3.6 派发人页面增强

#### 3.6.1 处置情况列固定显示
- 原"处置情况"在折叠列中，需展开才能看到
- 改为固定列，与"派发状态"、"疑点编号"等并列显示

#### 3.6.2 新增处置情况筛选器
- 在筛选区新增"处置情况"下拉筛选
- 选项：全部、待派发、已分派待处置、已处置待审核

#### 3.6.3 派发状态筛选器增强
- 原"派发状态"筛选器选项：全部、未派发、已派发
- 新增"派发驳回"选项
- 选项：全部、未派发、已派发、派发驳回

#### 3.6.4 操作菜单显示规则
- "疑点甄别"和"放白名单"仅在派发状态为"未派发"时显示
- "已派发"、"派发驳回"、"已处置待审核"等状态的疑点不显示这两个菜单项

---

### 3.7 处置类型切换（派发人页面）

#### 3.7.1 功能描述
派发人页面支持在"需处置"和"提示"两种处置类型之间切换，不同类型的派发状态、处置情况筛选器和操作菜单不同。

**操作页面：** 疑点派发-疑点详情.html

#### 3.7.2 切换方式
- 面包屑行最右侧显示当前处置类型标签（蓝色"需处置"或绿色"提示"）
- 点击"切换"按钮在两种类型之间切换
- 切换后，表格数据、筛选器选项、批量操作按钮同步更新

#### 3.7.3 不同处置类型的筛选器选项

| 处置类型 | 派发状态筛选器 | 处置情况筛选器 |
|----------|----------------|----------------|
| 【需处置】 | 全部、未派发、已派发、派发驳回 | 全部、待派发、已分派待处置、已处置待审核 |
| 【提示】 | 全部、未派发、已派发 | 全部、已派发未读 |

#### 3.7.4 不同处置类型的操作菜单

| 处置类型 | 派发状态 | 操作菜单 |
|----------|----------|----------|
| 【需处置】 | 未派发 | 疑点派发、放白名单、疑点甄别、查看链上记录 |
| 【需处置】 | 已派发 | 审核处理情况、查看完整流程、查看链上记录 |
| 【需处置】 | 派发驳回 | 重新派发、查看完整流程、查看链上记录 |
| 【需处置】 | 已处置待审核 | 审核处理情况、查看链上记录、查看完整流程 |
| 【提示】 | 未派发 | 疑点派发、放白名单、疑点甄别、查看链上记录 |
| 【提示】 | 已派发（已派发未读） | 查看链上记录 |

#### 3.7.5 复选框勾选规则（分组控制）

**需处置类型：**

| 组别 | 派发状态 | 可执行的批量操作 |
|------|----------|------------------|
| A组 | 未派发、派发驳回 | 批量派发、批量甄别、批量加白名单 |
| B组 | 已派发（处置情况=已处置待审核） | 批量审核通过、批量审核驳回 |

- 选中A组行 → B组行复选框置灰不可选
- 选中B组行 → A组行复选框置灰不可选
- 清空选中 → 恢复全部可勾选

**提示类型：** 仅未派发可勾选

#### 3.7.6 批量操作按钮

| 选中组 | 显示按钮 |
|--------|----------|
| A组 | 批量派发、批量甄别、批量加白名单 |
| B组 | 批量审核通过、批量审核驳回 |

**批量派发弹窗：**
- 标题：批量派发
- 提示：您已选择 X 条疑点，请确认派发
- 按钮：确定派发、取消

**批量甄别弹窗：**
- 标题：批量甄别
- 提示：确定对 X 条疑点进行甄别确认？
- 按钮：确定甄别、取消

**批量加白名单弹窗：**
- 标题：批量加白名单
- 提示：确定将 X 条疑点加入白名单？
- 按钮：确定加入、取消

**批量审核通过弹窗：**
- 标题：批量审核通过
- 提示：您已选择 X 条疑点，请填写审核意见后确认通过
- 审核意见：多行文本框（必填）
- 按钮：确定通过、取消

**批量审核驳回弹窗：**
- 标题：批量审核驳回
- 提示：您已选择 X 条疑点，请填写驳回意见后确认驳回
- 驳回意见：多行文本框（必填）
- 按钮：确定驳回、取消

---

## 4. 交互设计

### 4.1 复选框功能

#### 4.1.1 复选框列
- 位置：列表第一列
- 全选：表头复选框，支持"全选当前页"
- 单选：每行数据前的复选框

#### 4.1.2 勾选状态
- 未勾选：空心方框
- 已勾选：打勾方框
- 禁用（不可勾选）：灰色方框

#### 4.1.3 勾选规则
- 仅支持勾选可操作状态的疑点
- 不同状态的疑点不可勾选（置灰）
- 切换页面时清空已选状态

### 4.2 批量操作栏

#### 4.2.1 显示条件
- 当有疑点被勾选时，页面底部显示批量操作栏

#### 4.2.2 显示内容
- 已选数量：显示"已选 X 条"
- 操作按钮：根据疑点类型和用户角色显示对应按钮
  - 提示方式：显示"批量已读"
  - 需处置方式（处置人）：显示"批量处置"
  - 需处置方式（分派人）：显示"批量通过"、"批量驳回"

---

## 5. 页面改动说明

### 5.1 疑点列表页面

#### 5.1.1 新增元素
| 元素 | 类型 | 位置 | 说明 |
|------|------|------|------|
| 复选框列 | 列 | 列表第一列 | 支持全选当前页和单选 |
| 批量已读按钮 | 按钮 | 底部操作栏 | 仅提示方式疑点显示 |
| 批量处置按钮 | 按钮 | 底部操作栏 | 仅需处置方式疑点（处置人）显示 |
| 批量通过按钮 | 按钮 | 底部操作栏 | 仅需处置方式疑点（分派人）显示 |
| 批量驳回按钮 | 按钮 | 底部操作栏 | 仅需处置方式疑点（分派人）显示 |
| 已选数量文本 | 文本 | 底部操作栏 | 显示"已选 X 条" |

#### 5.1.2 新增弹窗
| 弹窗 | 触发条件 | 内容 |
|------|----------|------|
| 确认弹窗 | 点击"批量已读" | 确认提示文本 |
| 批量处置弹窗 | 点击"批量处置" | 处置说明输入框 |
| 批量通过弹窗 | 点击"批量通过" | 审核意见输入框 |
| 批量驳回弹窗 | 点击"批量驳回" | 驳回意见输入框 |

---

## 6. 接口设计

### 6.1 批量标记已读接口
- **URL**: `POST /core/riskRuleFiledConfig/batchRead`
- **请求参数**:
```json
{
  "doubtIds": ["疑点ID1", "疑点ID2", "疑点ID3"]
}
```
- **响应结果**:
```json
{
  "code": 200,
  "message": "批量标记已读成功",
  "data": {
    "successCount": 3,
    "failCount": 0
  }
}
```

### 6.2 批量处置接口
- **URL**: `POST /core/riskRuleFiledConfig/batchDispose`
- **请求参数**:
```json
{
  "doubtIds": ["疑点ID1", "疑点ID2", "疑点ID3"],
  "disposeOpinion": "处置说明内容"
}
```
- **响应结果**:
```json
{
  "code": 200,
  "message": "批量处置成功",
  "data": {
    "successCount": 3,
    "failCount": 0
  }
}
```

### 6.3 批量审核接口
- **URL**: `POST /core/riskRuleFiledConfig/batchAudit`
- **请求参数**:
```json
{
  "doubtIds": ["疑点ID1", "疑点ID2", "疑点ID3"],
  "auditType": "PASS/REJECT",
  "auditOpinion": "审核意见内容"
}
```
- **响应结果**:
```json
{
  "code": 200,
  "message": "批量审核成功",
  "data": {
    "successCount": 3,
    "failCount": 0
  }
}
```

---

## 7. 业务流程

### 7.1 批量标记已读流程
```
开始
  ↓
勾选疑点（未读状态）
  ↓
点击"批量已读"
  ↓
弹窗确认
  ↓
确定？
  ├─ 否 → 返回列表
  └─ 是 → 执行批量标记 → 刷新列表 → 结束
```

### 7.2 批量处置流程
```
开始
  ↓
勾选疑点（待处理状态）
  ↓
点击"批量处置"
  ↓
填写处置说明
  ↓
确定？
  ├─ 否 → 返回列表
  └─ 是 → 执行批量提交审核 → 刷新列表 → 结束
```

### 7.3 批量审核流程
```
开始
  ↓
勾选疑点（待审核状态）
  ↓
选择"批量通过"或"批量驳回"
  ↓
填写审核意见/驳回意见
  ↓
确定？
  ├─ 否 → 返回列表
  └─ 是 → 执行批量审核 → 刷新列表 → 结束
```

---

## 8. 异常处理

### 8.1 部分失败处理
- 批量操作时，如部分疑点操作失败，需提示用户
- 提示格式："成功 X 条，失败 Y 条"
- 失败原因：如疑点状态已变更、无权限等

### 8.2 并发处理
- 批量操作时需加锁，防止重复提交
- 如疑点已被其他人操作，提示用户刷新后重试

---

## 9. 非功能性需求

### 9.1 性能要求
- 批量操作响应时间 ≤ 3秒（50条以内）
- 单次批量操作上限：50条

### 9.2 用户体验
- 批量操作执行中显示加载状态
- 操作完成后显示成功/失败提示
- 操作完成后自动刷新列表

---

## 10. 实现细节（基于原型Demo）

### 10.1 页面结构分析

**当前页面结构：**
- **疑点处置-场景疑点.html** - 场景疑点列表（规则视角/业务视角）
- **疑点处置-疑点详情.html** - 具体规则的疑点列表（实际操作页面）

**疑点详情页面现状：**
- 已有表格结构，包含处置状态、疑点编号、业务字段等
- 每行有操作菜单（处置反馈、查看流程、查看链上记录）
- 已有筛选功能（处置状态、上链状态、搜索）
- 已有导出功能
- **目前没有复选框列**

---

### 10.2 批量标记已读实现方案

**页面位置：** 疑点处置-疑点详情.html（提示类型规则）

**需要修改：**

#### 10.2.1 表格头部新增复选框列
```html
<thead>
    <tr>
        <th width="40"><input type="checkbox" id="selectAll"></th>
        <th width="100">处置状态</th>
        <th width="130">疑点编号</th>
        <!-- 其他列 -->
    </tr>
</thead>
```

#### 10.2.2 每行新增复选框
```html
<tr data-id="YD20250101001" data-status="unread">
    <td><input type="checkbox" class="doubt-checkbox" data-id="YD20250101001"></td>
    <td><span class="status-badge status-unread">未读</span></td>
    <!-- 其他列 -->
</tr>
```

#### 10.2.3 按钮显示逻辑
- 只有"未读"状态的疑点可勾选，其他状态置灰
- 筛选区下方新增"批量已读"按钮（初始隐藏）
- 勾选后底部显示操作栏："已选 X 条 | 批量已读"

#### 10.2.4 弹窗设计
```html
<div class="modal-overlay" id="batchReadModal" style="display:none">
    <div class="modal-content" style="width: 400px;">
        <div class="modal-header">
            <h4 class="modal-title">批量标记已读</h4>
            <button class="modal-close" onclick="closeBatchReadModal()">&times;</button>
        </div>
        <div class="modal-body">
            <p>确定将 <span id="batchReadCount">0</span> 条疑点标记为已读？</p>
        </div>
        <div class="modal-footer">
            <button class="btn btn-outline-secondary" onclick="closeBatchReadModal()">取消</button>
            <button class="btn btn-primary" onclick="confirmBatchRead()">确定</button>
        </div>
    </div>
</div>
```

---

### 10.3 批量处置实现方案

**页面位置：** 疑点处置-疑点详情.html（需处置类型规则）

**需要修改：**

#### 10.3.1 表格头部新增复选框列
```html
<thead>
    <tr>
        <th width="40"><input type="checkbox" id="selectAll"></th>
        <th width="100">处置状态</th>
        <th width="130">疑点编号</th>
        <!-- 其他列 -->
    </tr>
</thead>
```

#### 10.3.2 每行新增复选框
```html
<tr data-id="YD20250101001" data-status="pending_disposal">
    <td><input type="checkbox" class="doubt-checkbox" data-id="YD20250101001"></td>
    <td><span class="status-badge status-pending">已派发待处置</span></td>
    <!-- 其他列 -->
</tr>
```

#### 10.3.3 按钮显示逻辑
- 只有"已派发待处置"状态的疑点可勾选
- 筛选区下方新增"批量处置"按钮（初始隐藏）
- 勾选后底部显示操作栏："已选 X 条 | 批量处置"

#### 10.3.4 弹窗设计
```html
<div class="modal-overlay" id="batchDisposeModal" style="display:none">
    <div class="modal-content" style="width: 500px;">
        <div class="modal-header">
            <h4 class="modal-title">批量处置</h4>
            <button class="modal-close" onclick="closeBatchDisposeModal()">&times;</button>
        </div>
        <div class="modal-body">
            <div class="alert alert-info">
                您已选择 <span id="batchDisposeCount">0</span> 条疑点，请填写处置说明后提交审核
            </div>
            <div class="mb-3">
                <label class="form-label">处置说明 <span class="text-danger">*</span></label>
                <textarea class="form-control" id="disposeOpinion" rows="4" placeholder="请描述疑点处理过程及结果"></textarea>
            </div>
        </div>
        <div class="modal-footer">
            <button class="btn btn-outline-secondary" onclick="closeBatchDisposeModal()">取消</button>
            <button class="btn btn-primary" onclick="confirmBatchDispose()">确定提交</button>
        </div>
    </div>
</div>
```

---

### 10.4 批量审核实现方案

**页面位置：** 疑点处置-疑点详情.html（需处置类型规则）

**需要修改：**

#### 10.4.1 表格头部新增复选框列
```html
<thead>
    <tr>
        <th width="40"><input type="checkbox" id="selectAll"></th>
        <th width="100">处置状态</th>
        <th width="130">疑点编号</th>
        <!-- 其他列 -->
    </tr>
</thead>
```

#### 10.4.2 每行新增复选框
```html
<tr data-id="YD20250101003" data-status="pending_review">
    <td><input type="checkbox" class="doubt-checkbox" data-id="YD20250101003"></td>
    <td><span class="status-badge status-review">已处置待审核</span></td>
    <!-- 其他列 -->
</tr>
```

#### 10.4.3 按钮显示逻辑
- 只有"已处置待审核"状态的疑点可勾选
- 筛选区下方新增"批量通过"和"批量驳回"按钮（初始隐藏）
- 勾选后底部显示操作栏："已选 X 条 | 批量通过 | 批量驳回"

#### 10.4.4 批量通过弹窗
```html
<div class="modal-overlay" id="batchApproveModal" style="display:none">
    <div class="modal-content" style="width: 500px;">
        <div class="modal-header">
            <h4 class="modal-title">批量审核通过</h4>
            <button class="modal-close" onclick="closeBatchApproveModal()">&times;</button>
        </div>
        <div class="modal-body">
            <div class="alert alert-info">
                您已选择 <span id="batchApproveCount">0</span> 条疑点，请填写审核意见后确认通过
            </div>
            <div class="mb-3">
                <label class="form-label">审核意见 <span class="text-danger">*</span></label>
                <textarea class="form-control" id="approveOpinion" rows="4" placeholder="请填写审核通过说明（如无特殊说明可写"同意通过"）"></textarea>
            </div>
        </div>
        <div class="modal-footer">
            <button class="btn btn-outline-secondary" onclick="closeBatchApproveModal()">取消</button>
            <button class="btn btn-success" onclick="confirmBatchApprove()">确定通过</button>
        </div>
    </div>
</div>
```

#### 10.4.5 批量驳回弹窗
```html
<div class="modal-overlay" id="batchRejectModal" style="display:none">
    <div class="modal-content" style="width: 500px;">
        <div class="modal-header">
            <h4 class="modal-title">批量审核驳回</h4>
            <button class="modal-close" onclick="closeBatchRejectModal()">&times;</button>
        </div>
        <div class="modal-body">
            <div class="alert alert-warning">
                您已选择 <span id="batchRejectCount">0</span> 条疑点，请填写驳回意见后确认驳回
            </div>
            <div class="mb-3">
                <label class="form-label">驳回意见 <span class="text-danger">*</span></label>
                <textarea class="form-control" id="rejectOpinion" rows="4" placeholder="请说明驳回原因及需补充完善的内容"></textarea>
            </div>
        </div>
        <div class="modal-footer">
            <button class="btn btn-outline-secondary" onclick="closeBatchRejectModal()">取消</button>
            <button class="btn btn-danger" onclick="confirmBatchReject()">确定驳回</button>
        </div>
    </div>
</div>
```

---

### 10.5 通用交互逻辑

#### 10.5.1 JavaScript交互代码框架
```javascript
// 全局变量
let selectedDoubtIds = [];

// 全选/取消全选
document.getElementById('selectAll').addEventListener('change', function() {
    const checkboxes = document.querySelectorAll('.doubt-checkbox:not(:disabled)');
    checkboxes.forEach(cb => cb.checked = this.checked);
    updateSelectedCount();
});

// 单选
document.querySelectorAll('.doubt-checkbox').forEach(cb => {
    cb.addEventListener('change', updateSelectedCount);
});

// 更新已选数量
function updateSelectedCount() {
    const checked = document.querySelectorAll('.doubt-checkbox:checked');
    selectedDoubtIds = Array.from(checked).map(cb => cb.dataset.id);
    const count = selectedDoubtIds.length;

    // 更新底部操作栏
    document.getElementById('batchActionBar').style.display = count > 0 ? 'flex' : 'none';
    document.getElementById('selectedCount').textContent = count;
}

// 批量已读
function openBatchReadModal() {
    document.getElementById('batchReadCount').textContent = selectedDoubtIds.length;
    document.getElementById('batchReadModal').style.display = 'flex';
}

function confirmBatchRead() {
    // 调用接口
    fetch('/core/riskRuleFiledConfig/batchRead', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ doubtIds: selectedDoubtIds })
    })
    .then(response => response.json())
    .then(data => {
        if (data.code === 200) {
            alert(`成功标记 ${data.data.successCount} 条疑点为已读`);
            location.reload();
        } else {
            alert('操作失败：' + data.message);
        }
    });
}

// 批量处置
function openBatchDisposeModal() {
    document.getElementById('batchDisposeCount').textContent = selectedDoubtIds.length;
    document.getElementById('disposeOpinion').value = '';
    document.getElementById('batchDisposeModal').style.display = 'flex';
}

function confirmBatchDispose() {
    const opinion = document.getElementById('disposeOpinion').value.trim();
    if (!opinion) {
        alert('请填写处置说明');
        return;
    }

    fetch('/core/riskRuleFiledConfig/batchDispose', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            doubtIds: selectedDoubtIds,
            disposeOpinion: opinion
        })
    })
    .then(response => response.json())
    .then(data => {
        if (data.code === 200) {
            alert(`成功处置 ${data.data.successCount} 条疑点`);
            location.reload();
        } else {
            alert('操作失败：' + data.message);
        }
    });
}

// 批量审核通过
function openBatchApproveModal() {
    document.getElementById('batchApproveCount').textContent = selectedDoubtIds.length;
    document.getElementById('approveOpinion').value = '';
    document.getElementById('batchApproveModal').style.display = 'flex';
}

function confirmBatchApprove() {
    const opinion = document.getElementById('approveOpinion').value.trim();
    if (!opinion) {
        alert('请填写审核意见');
        return;
    }

    fetch('/core/riskRuleFiledConfig/batchAudit', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            doubtIds: selectedDoubtIds,
            auditType: 'PASS',
            auditOpinion: opinion
        })
    })
    .then(response => response.json())
    .then(data => {
        if (data.code === 200) {
            alert(`成功审核通过 ${data.data.successCount} 条疑点`);
            location.reload();
        } else {
            alert('操作失败：' + data.message);
        }
    });
}

// 批量审核驳回
function openBatchRejectModal() {
    document.getElementById('batchRejectCount').textContent = selectedDoubtIds.length;
    document.getElementById('rejectOpinion').value = '';
    document.getElementById('batchRejectModal').style.display = 'flex';
}

function confirmBatchReject() {
    const opinion = document.getElementById('rejectOpinion').value.trim();
    if (!opinion) {
        alert('请填写驳回意见');
        return;
    }

    fetch('/core/riskRuleFiledConfig/batchAudit', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            doubtIds: selectedDoubtIds,
            auditType: 'REJECT',
            auditOpinion: opinion
        })
    })
    .then(response => response.json())
    .then(data => {
        if (data.code === 200) {
            alert(`成功驳回 ${data.data.successCount} 条疑点`);
            location.reload();
        } else {
            alert('操作失败：' + data.message);
        }
    });
}
```

#### 10.5.2 底部操作栏HTML
```html
<div class="batch-action-bar" id="batchActionBar" style="display:none">
    <div class="selected-info">
        已选 <span id="selectedCount">0</span> 条
    </div>
    <div class="action-buttons">
        <!-- 提示方式显示 -->
        <button class="btn btn-primary btn-sm" id="batchReadBtn" onclick="openBatchReadModal()" style="display:none">
            <i class="fa fa-check"></i> 批量已读
        </button>
        <!-- 需处置方式（处置人）显示 -->
        <button class="btn btn-primary btn-sm" id="batchDisposeBtn" onclick="openBatchDisposeModal()" style="display:none">
            <i class="fa fa-send"></i> 批量处置
        </button>
        <!-- 需处置方式（分派人）显示 -->
        <button class="btn btn-success btn-sm" id="batchApproveBtn" onclick="openBatchApproveModal()" style="display:none">
            <i class="fa fa-check-circle"></i> 批量通过
        </button>
        <button class="btn btn-danger btn-sm" id="batchRejectBtn" onclick="openBatchRejectModal()" style="display:none">
            <i class="fa fa-times-circle"></i> 批量驳回
        </button>
    </div>
</div>
```

#### 10.5.3 按钮显示控制
```javascript
// 根据规则类型和用户角色显示对应按钮
function initBatchButtons(ruleType, userRole) {
    if (ruleType === 'tip') {
        // 提示方式
        document.getElementById('batchReadBtn').style.display = 'inline-block';
    } else if (ruleType === 'need-handle') {
        if (userRole === 'handler') {
            // 处置人
            document.getElementById('batchDisposeBtn').style.display = 'inline-block';
        } else if (userRole === 'dispatcher') {
            // 分派人
            document.getElementById('batchApproveBtn').style.display = 'inline-block';
            document.getElementById('batchRejectBtn').style.display = 'inline-block';
        }
    }
}
```

---

## 11. 版本历史

| 版本 | 日期 | 更新内容 |
|------|------|----------|
| v1.0.0 | 2026-05-14 | 初始版本，支持批量标记已读、批量处置、批量审核 |
| v1.1.0 | 2026-05-14 | 补充实现细节，基于原型Demo的具体实现方案 |
| v1.2.0 | 2026-05-15 | 明确页面职责划分：处置人→疑点处置页面，派发人→疑点派发页面；新增单条审核入口、处置情况筛选器、操作菜单改名 |
| v1.3.0 | 2026-05-15 | 修正状态值：派发状态新增"派发驳回"；处置情况改为"待派发/已分派待处置/已处置待审核"；派发驳回时处置情况为"待派发" |
| v1.4.0 | 2026-05-15 | 处置人页面代码支持"提示"类型规则的批量已读功能（同一规则下疑点处置方式一致） |
| v1.5.0 | 2026-05-15 | 新增操作菜单显示规则："疑点甄别"和"放白名单"仅在派发状态为"未派发"时显示 |
| v1.6.0 | 2026-05-15 | 处置人页面新增处置类型切换功能（需处置/提示）；不同处置类型下处置状态和操作菜单不同；提示类型支持单条/批量确认已读 |
| v1.7.0 | 2026-05-15 | 批量按钮改名："批量已读"→"批量确认已读"，"批量处置"→"批量提交处理结果"；修复批量按钮点击弹窗功能 |
| v1.8.0 | 2026-05-15 | 弹窗文案优化："处置意见"→"处置说明"，placeholder改为"请描述疑点处理过程及结果" |
| v1.9.0 | 2026-05-15 | 派发人页面新增处置类型切换功能（需处置/提示）；不同处置类型下派发状态、处置情况筛选器和操作菜单不同；提示类型仅"未派发"可勾选 |
| v2.0.0 | 2026-05-15 | 派发人页面批量操作重构：新增批量甄别、批量加白名单；复选框改为分组控制（A组：未派发/派发驳回，B组：已处置待审核）；批量按钮改名"批量通过"→"批量审核通过"、"批量驳回"→"批量审核驳回" |
| v2.1.0 | 2026-05-15 | 处置人页面新增"批量退回重新分派"功能，针对"已派发待处置"状态，退回后派发人端派发状态变更为"派发驳回" |
