Files
risk-management-process/docs/前期讨论/003-基于前端原型的业务与技术推断报告.md
2026-08-13 08:51:04 +08:00

2647 lines
133 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 风险防控管理系统业务与技术需求分析推断报告
> 文档版本:V0.5(接口字段契约完善稿)
> 分析日期:2026-08-13
> 主要依据:`deprecated/build/20260812 prototype` 静态原型
> 参考输入:`docs/前期讨论/001-后端API文档-用户管理相关.md`、`docs/前期讨论/002-服务风险防控-工作流程-V2.pos`
## 1. 文档目的与结论
本文档将静态原型还原为可评审的业务与技术需求,覆盖页面、角色、业务流程、字段、接口和后端约束。20260812 原型共 41 个画板,其中 1 个名称带“备份”的画板属于页面状态变体;按业务能力合并后,可归纳为 18 类页面、12 个主要流程步骤、7 类业务角色。
系统核心业务是将线下取得的 12398 工单导入系统,关联 95598 业务处理信息,由服务监督主管判定主责或协查并派工。派工后服务监督员可以先行填报部分调查信息并保存草稿,但主责工单必须等待首联及全部初查完成、协查工单必须等待全部初查完成后才能提交。两级审核完成后,业务部主任基于派工阶段持久化的责任类型分支:主责进入回访,协查直接进入 11 调查报告编写;报告页面以汇总调查及回访信息并确认下载为主要交互。
原型能够证明页面展示、操作入口和大部分表单字段,但不能证明数据库结构、全部枚举值、必填规则、接口路径、异常处理、状态码和数据权限。本报告对这些内容采用以下标记:
| 标记 | 含义 |
| --- | --- |
| 已确认 | 原型或已有接口文档直接展示,可作为当前需求基线 |
| 参考补充 | 来自前期流程图,仅作需求评审输入,需业务确认 |
| 技术建议 | 为保证系统可实现、可审计而提出的设计建议 |
| 待确认 | 现有材料存在缺口或冲突,不能直接作为开发定论 |
### 1.1 版本变化
V0.5 主要变化:
- 将第 8 章重排为 8.1~8.12 连续章节,修复接口目录合并后遗留的跳号问题。
- 所有目录接口统一补充请求字段定义和响应字段定义,明确字段位置、类型、必填条件及业务含义。
- 保留请求与响应示例作为字段表的补充,并修正登录返回结构及章节交叉引用。
V0.4 主要变化:
- 为接口补充可直接用于联调的请求头、请求字段、响应字段、分页、错误响应和状态变更约定。
- 明确主责/协查派工、前置任务校验及业务部主任审核分支在接口层的表达方式。
- 补充联调枚举、版本字段、幂等键、文件引用和异步任务查询规则。
V0.3 主要变化:
- 将 41 张画板编号和名称整体切换到 20260812 原型,删除旧原型中的重复/备份编号判断。
- 固化服务监督主管判定主责/协查并派工、服务监督员先行填报及分支前置条件。
- 补入业务部主任审核弹窗和完整审核页,并明确协查审核通过后直接进入 11 调查报告编写。
- 将报告需求由“在线编辑并提交”调整为“汇总业务信息、确认生成并受权下载”,同时统一回访结果枚举和条件附件规则。
## 2. 分析范围与证据
### 2.1 分析范围
- 登录与当前用户识别;
- 12398 工单文件导入、预览、确认和批次查询;
- 工单查询、待办和工单详情;
- 服务监督主管判定主责/协查并派工、智能派工、回访分派;
- 首联、事件初查、调查结果填报;
- 服务监督主管审核、业务部主任审核;
- 回访结果、答复书及送达凭证;
- 调查报告、成果物输出;
- 派工规则、流程时限和统计分析;
- 角色权限、状态流转、审计、幂等、并发、文件与安全约束。
### 2.2 不在本稿中定论的内容
- 技术栈、部署架构、中间件和数据库产品;
- 组织机构与岗位编码的最终数据模型;
- 与 12398、95598 外部系统的在线对接方式;
- 智能派工、智能写作和“五级溯源”的算法实现;
- 统计指标口径、绩效考核与整改闭环的详细规则;
- 法定保存期限、附件大小和文件格式白名单的具体数值。
### 2.3 证据边界
1. 原型的日期、姓名、电话、工单号和数量均为示例数据,不应固化为业务规则。
2. 画板间没有足够完整的可执行跳转链,流程顺序主要由页面名称、按钮、表单内容及前期流程图交叉还原。
3. “备份”画板只用于识别方案差异,不应直接形成重复页面或重复接口。
4. `001-后端API文档-用户管理相关.md` 只确认登录及用户查询相关接口,不代表工单业务接口已经存在。
5. 20260812 原型替代 20260811 原型作为当前页面和字段基线;旧原型仅用于识别变化,不再作为编号或页面状态依据。
6. 已确认的主责/协查流程规则优先于画板中的静态展示。若画板仍同时展示不适用于协查的首联或回访字段,应视为设计待同步,而不能据此改变业务分支。
## 3. 业务范围与领域对象
### 3.1 核心领域对象
| 对象 | 说明 | 关键关系 |
| --- | --- | --- |
| 导入批次 ImportBatch | 一次 Excel/CSV 预览和确认导入记录 | 包含多条导入行,成功后产生或更新工单 |
| 12398 工单 WorkOrder | 系统的核心业务聚合 | 关联客户、分类、任务、95598 记录、附件、报告和审计轨迹 |
| 95598 处理记录 ServiceRecord | 与 12398 工单关联的历史业务处理信息 | 一张 12398 工单可关联多条记录、录音和转译文本 |
| 流程实例 ProcessInstance | 记录工单当前环节、状态、时限和流程版本 | 一张工单原则上对应一个有效流程实例 |
| 待办任务 Task | 分派到角色、部门、岗位或人员的可执行工作项 | 支持并行初查、单人首联、审核和回访任务 |
| 派工记录 Dispatch | 服务监督主管的主责/协查判定,以及首联、初查、监督员和提级督办选择 | 按责任类型产生对应待办任务,并向服务监督员开放调查填报 |
| 首联记录 FirstContact | 客服班组首次联系客户的结果 | 属于一张工单及一个首联任务 |
| 初查记录 PreliminaryInvestigation | 被选部门对事件的初步调查结果 | 多部门可并行,一任务一记录 |
| 全面调查 Investigation | 服务监督员可在派工后先行填报并保存草稿,待前置任务完成后提交完整调查结果 | 主责依赖首联及全部初查完成;协查依赖全部初查完成 |
| 审核记录 Review | 服务监督主管、业务部主任的审核结论 | 保留审核层级、结论、意见及驳回去向 |
| 回访记录 Callback | 主责工单的客服回访及服务监督员结果填报 | “不同意或客户主动要求”触发附件要求;协查工单不进入回访 |
| 调查报告 InvestigationReport | 基于调查及回访信息形成的报告版本和输出记录 | 最新原型以“确认下载”为主要动作;是否允许在线编辑或智能生成待确认 |
| 成果物 Deliverable | 办结输出物及其版本 | 与报告、附件和办结动作关联 |
| 规则配置 RuleConfig | 智能派工规则和流程时限配置 | 必须版本化并记录生效范围 |
### 3.2 业务关系要点
- 一个导入批次包含多条导入行;导入行应独立记录成功、失败和失败原因。
- 一张 12398 工单可关联多条 95598 处理记录。
- 一张工单可并行产生多个事件初查任务,但首联任务原则上为单选部门下的单个有效任务。
- 服务监督员首次指定后,后续调查、回访结果、报告和成果物环节原则上保持同一责任人(参考补充,待确认);协查工单不产生回访任务,但仍由服务监督员完成报告。
- 审核、驳回和重新提交必须新增记录,不覆盖历史版本。
## 4. 页面梳理
### 4.1 页面结构总览
| 页面域 | 逻辑页面 | 主要能力 | 主要角色 |
| --- | --- | --- | --- |
| 公共 | 登录 | 账号、密码、验证码登录 | 全部用户 |
| 导入 | 工单导入、导入预览、导入明细 | 文件选择、批次号、预览、确认、批次历史 | 服务监督主管 |
| 查询 | 工单查询、工单详情 | 多条件查询、分页、详情查看 | 6 类业务角色 |
| 待办 | 待办列表、分类统计 | 按环节查看个人/岗位待办 | 除纯查询人员外的业务角色 |
| 派工 | 主管派单、智能派工 | 初查多选、首联单选、监督员、提级督办 | 服务监督主管 |
| 首联 | 首联分派、首联填报 | 分派班组/人员,填写首次联系信息 | 客服部主管、客服部班长/成员 |
| 调查 | 初查填报、全面调查填报 | 初查内容、调查问卷和处置结果 | 调查部门、服务监督员 |
| 审核 | 调查审核、业务审核 | 同意/不同意、驳回理由、按责任类型确定下步分支 | 服务监督主管、业务部主任 |
| 回访 | 回访分派、回访填报、结果确认 | 班组分派、回复信息、同意/不同意结果、条件附件 | 客服部主管、客服班组、服务监督员 |
| 输出 | 调查报告、成果物 | 汇总调查/回访信息、条件附件、确认下载、成果物输出 | 服务监督员 |
| 配置 | 智能派工规则、流程时限 | 规则维护、环节时限维护 | 服务监督主管或配置管理员 |
| 分析 | 统计分析 | 办结统计与展示 | 有菜单权限人员 |
### 4.2 41 个原型画板清单
| 原型编号 | 画板名称 | 页面状态/用途 | 处理结论 |
| --- | --- | --- | --- |
| 1-1 | 登录页2 | 登录 | 有效页面 |
| 1-2 | 服务监督主管-首页(工单导入)导入预览 | 导入文件后的行级预览 | 有效页面状态 |
| 1-3 | 服务监督主管-首页(工单导入)导入明细 | 历史批次列表 | 有效页面状态 |
| 1-4 | 服务监督主管-工单处理(审核弹窗) | 主管审核弹窗:审核结果、驳回理由、回访分派 | 有效页面状态;回访分派的实际生效时点待统一 |
| 1-5 | 服务监督主管-工单处理(待审核) | 主管待审核列表 | 有效页面状态 |
| 1-6 | 服务监督主管-规则配置-智能派工规则配置 | 智能派工规则入口 | 页面内容待补齐 |
| 1-7 | 服务监督主管-规则配置-流程时限管理 | 整体及环节时限配置 | 有效页面 |
| 1-8 | 服务监督主管-统计分析 | 统计分析入口 | 指标和图表待补齐 |
| 1-9 | 服务监督主管-工单处理(待审核) | 全量调查结果审核长页面 | 有效长页面 |
| 1-10 | 服务监督主管-工单处理(待分配派工) | 待派工列表和派工入口 | 有效页面状态 |
| 1-11 | 服务监督主管-待分派(确定标题版) | 主管派工详情 | 有效长页面;业务上由服务监督主管完成主责/协查判定和派工 |
| 1-12 | 服务监督主管-工单处理 | 主管任务总览 | 有效页面 |
| 1-13 | 服务监督人员-待办工单(调查结果填报)业务类型 | 调查表单简化/业务类型方案 | 与 1-21 的适用条件待确认 |
| 1-14 | 服务监督人员-待办工单(调查报告编写-不同意) | 报告确认下载及条件附件状态 | 有效条件分支 |
| 1-15 | 服务监督人员-待办工单(调查报告编写-同意) | 报告确认下载状态 | 有效页面状态 |
| 1-16 | 服务监督人员-待办工单(成果物输出) | 成果物输出 | 有效长页面;成果物清单仍待定义 |
| 1-17 | 服务监督人员-待办工单(处理工单)事件类型(回访结果填写)不同意上传 | “不同意或客户主动要求”附件状态 | 有效条件分支 |
| 1-18 | 业务部主任-待办工单(审核)(弹窗) | 二级审核弹窗:审核结果、驳回理由、回访分派 | 有效页面状态;协查通过后业务上不应要求回访分派 |
| 1-19 | 业务部主任-待办工单(审核) | 二级审核完整详情 | 有效长页面 |
| 1-20 | 服务监督人员-待办工单(处理工单)事件类型(回访结果填写) | 回访结果完整表单 | 有效长页面 |
| 1-21 | 服务监督人员-待办工单(调查结果填报) | 全面调查表单 | 有效长页面 |
| 1-22 | 服务监督人员-待办工单 | 调查、报告、回访、成果物待办总览 | 有效页面 |
| 1-23 | 总值班经理待办工单-待调查(处理) | 初查内容填报 | 有效页面 |
| 1-24 | 智能运营团队-待办工单-待调查(处理) | 初查内容填报 | 有效页面 |
| 1-25 | 客服部主管-待办工单-待调研 | 客服部门初查 | 有效页面 |
| 1-26 | 客服部班长-待办工单备份 | 首联填写状态 | 页面状态有效,名称应去掉“备份” |
| 1-27 | 业务部主任-待办工单 | 业务审核列表 | 有效页面 |
| 1-28 | 总值班经理-待办工单 | 初查待办列表 | 有效页面 |
| 1-29 | 智能运营团队-待办工单 | 初查待办列表 | 有效页面 |
| 1-30 | 客服部班长-待办工单 | 首联待办列表 | 有效页面 |
| 1-31 | 客服部主管-待办工单-回访分派 | 回访任务选择班组/人员 | 有效页面 |
| 1-32 | 客服部主管-待办工单-首联分派 | 首联任务选择班组/人员 | 有效页面 |
| 1-33 | 客服部主管-待办工单 | 任务总数、首联分派、回访分派入口 | 有效页面 |
| 1-34 | 业务部主任 | 工单查询 | 有效页面,名称需规范化 |
| 1-35 | 总值班经理-工单查询 | 工单查询 | 有效页面 |
| 1-36 | 智能运营团队-工单查询 | 工单查询 | 有效页面 |
| 1-37 | 客服部班长-工单查询 | 工单查询 | 有效页面 |
| 1-38 | 客服部主管-工单查询 | 工单查询 | 有效页面 |
| 1-39 | 服务监督人员-工单查询 | 工单查询 | 有效页面 |
| 1-40 | 服务监督主管-工单查询 | 工单查询 | 有效页面 |
| 1-41 | 服务监督主管-首页(工单导入) | 导入入口 | 有效页面 |
### 4.3 通用列表需求
工单查询页在各角色间基本一致,应实现为同一页面组件加数据权限,而不是复制六套接口。查询条件包括:12398 工单编号、工单环节、信息来源、客户致电 12398 日期、转办日期、客户名称、联系方式、用户地址、客户所在地区(省)、省份、事件类型、转办事项分类、问题分类。
列表至少展示:序号、12398 工单编号、工单状态/环节、信息来源、客户致电日期、转办日期、客户名称、联系方式、用户地址、客户所在地区及操作。列表必须服务端分页,排序字段使用白名单,手机号按权限脱敏。
待办列表应与查询列表区分:查询页返回用户可见工单,待办页只返回当前用户可办理的有效任务。任务统计卡片必须与相同筛选口径下的列表一致。
## 5. 角色与权限梳理
### 5.1 业务角色
| 角色 | 主要职责 | 原型可见菜单 | 关键操作 |
| --- | --- | --- | --- |
| 服务监督主管 | 导入、主责/协查判定与派工、调查一级审核、规则与时限管理 | 工单导入、工单查询、工单处理、规则配置、统计分析 | 预览/确认导入、判定责任类型并派工、审核、维护配置;原型显示的回访分派生效时点待统一 |
| 服务监督人员 | 全面调查、回访结果、调查报告、成果物 | 工单查询、待办工单 | 派工后先行填报调查草稿,满足前置条件后提交;填回访结果、上传材料、确认下载报告、输出成果物 |
| 客服部主管 | 将首联或回访任务分派到本部门班组/人员,也可承担部门初查 | 工单查询、待办工单 | 首联分派、回访分派、初查提交 |
| 客服部班长/成员 | 执行首联或客户回访 | 工单查询、待办工单 | 填写首联时间、首联工单号、首联内容;回访表单待进一步确认 |
| 智能运营团队 | 执行被派发的事件初查 | 工单查询、待办工单 | 填写初查内容并提交 |
| 总值班经理/团队 | 执行被派发的事件初查 | 工单查询、待办工单 | 填写初查内容并提交 |
| 业务部主任 | 对调查结果进行第二级业务审核,并依据前序责任类型触发后续分支 | 工单查询、待办工单 | 审核同意/不同意并填写意见;主责进入回访,协查直接进入调查报告 |
| 系统任务(建议) | 导入解析、时限计时、提醒、统计、智能派工/写作 | 无人工菜单 | 异步处理、规则计算、通知和审计 |
> 原型出现 7 个业务称谓,但“客服部班长/成员”可建模为同一执行角色下的岗位或人员范围;“智能运营团队”和“总值班经理”更适合作为可被派工的组织/岗位,而非写死在流程代码中。
### 5.2 权限矩阵
| 能力 | 监督主管 | 监督人员 | 客服主管 | 客服班组 | 智能运营 | 总值班 | 业务主任 |
| --- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 导入工单 | 写 | - | - | - | - | - | - |
| 查询可见工单 | 读 | 读 | 读 | 读 | 读 | 读 | 读 |
| 查看完整客户联系方式 | 按权限 | 按任务 | 按任务 | 按任务 | 按任务 | 按任务 | 按审核任务 |
| 主管派工 | 写 | - | - | - | - | - | - |
| 首联/回访班组分派 | - | - | 写 | - | - | - | - |
| 首联填报 | - | - | 可选 | 写 | - | - | - |
| 初查填报 | - | - | 写 | - | 写 | 写 | - |
| 全面调查填报 | - | 写 | - | - | - | - | - |
| 调查一级审核 | 写 | - | - | - | - | - | - |
| 调查二级审核 | - | - | - | - | - | - | 写 |
| 回访结果填报/材料 | - | 写 | 分派 | 执行待确认 | - | - | - |
| 报告和成果物 | - | 写 | - | - | - | - | - |
| 规则与时限 | 写或配置管理员 | - | - | - | - | - | - |
| 统计分析 | 按菜单权限 | 按菜单权限 | 按菜单权限 | 按菜单权限 | 按菜单权限 | 按菜单权限 | 按菜单权限 |
### 5.3 数据权限原则
- 服务监督主管:可查看其管理范围内全部工单和任务。
- 执行角色:默认只查看本人、本岗位或本部门被分派的工单;跨部门信息按任务需要开放。
- 查询权限与办理权限分离;能查看工单不代表可以提交当前任务。
- 联系方式、地址、录音、转译文本和附件属于敏感业务数据,应分别控制查看、播放、下载和导出权限。
- 所有写操作必须以服务端当前任务所有者、角色、状态和版本为准,不能只依赖前端隐藏按钮。
## 6. 业务流程
### 6.1 主流程
```mermaid
flowchart TD
A["01 线下导入12398工单"] --> B["服务监督主管判定主责或协查并派工"]
B -. "同时开放" .-> H["05 服务监督员可先行填报并保存调查草稿"]
B --> R{"服务监督主管判定结果"}
R -->|"主责"| C["02 客服主管分派首联"]
C --> D["03 客服班组完成首联"]
R -->|"主责"| E["04 多部门并行事件初查"]
R -->|"协查"| E
D --> F{"主责:首联及全部初查均完成"}
E -->|"主责"| F
E -->|"协查"| G{"协查:全部初查均完成"}
H -. "只能在对应前置条件满足后提交" .-> S["05 提交全面调查"]
F --> S
G --> S
S --> I["06 服务监督主管审核"]
I -->|"不通过"| H
I -->|"通过"| J["07 业务部主任审核"]
J -->|"不通过"| H
J -->|"通过"| Q{"按服务监督主管前序判定分支"}
Q -->|"主责"| K["08 客服主管分派回访"]
Q -->|"协查"| O["11 调查报告编写"]
K --> L["09 客服班组回访"]
L --> M["10 服务监督员填报回访结果"]
M -->|"不同意或客户主动要求"| N["上传答复书和送达凭证"]
M -->|"同意"| O["11 调查报告编写"]
N --> O
O --> P["12 成果物输出并办结"]
```
### 6.2 流程步骤明细
| 步骤 | 操作人 | 输入 | 操作/输出 | 进入下一步条件 |
| --- | --- | --- | --- | --- |
| 01 导入 | 服务监督主管 | Excel/CSV、导入批次 | 预览校验,确认生成工单 | 批次确认成功且行级校验通过 |
| 01A 判定派工 | 服务监督主管 | 工单、95598 记录 | 判定主责/协查,选择初查部门、首联部门、监督员、提级督办;同时向服务监督员开放调查填报 | 派工事务成功;服务监督员可开始填报和保存草稿 |
| 02 首联分派 | 客服部主管 | 首联任务 | 选择本部门班组/人员 | 目标人员有效且属于授权范围 |
| 03 班组首联 | 客服班组 | 客户及工单信息 | 填首联时间、首联工单号、首联内容 | 首联任务提交完成 |
| 04 事件初查 | 被派部门主管/岗位 | 工单及 95598 记录 | 填写初查内容 | 每个并行初查任务均提交完成 |
| 05 全面调查 | 服务监督人员 | 工单信息,以及办理过程中逐步形成的首联和初查信息 | 派工后可先行填报并保存部分信息;前置任务完成后提交完整调查表 | 主责:首联及全部初查完成;协查:全部初查完成;表单校验通过 |
| 06 主管审核 | 服务监督主管 | 调查版本 | 同意或驳回并填写意见 | 同意进入二级审核;驳回重开调查 |
| 07 业务审核 | 业务部主任 | 已通过一级审核的调查版本、服务监督主管前序判定结果 | 同意或驳回并填写意见 | 不同意则重开调查;同意且为主责进入回访,同意且为协查直接进入调查报告 |
| 08 回访分派 | 客服部主管 | 主责工单的回访任务 | 选择本部门班组/人员 | 仅主责工单进入;目标人员有效 |
| 09 班组回访 | 客服班组 | 主责工单的联系信息、处理结果 | 记录客户联系及原始回访情况 | 回访执行任务完成 |
| 10 回访结果 | 服务监督人员 | 主责工单的回访执行记录 | 填回复人、时间、电话、回复情况、结果 | “不同意或客户主动要求”分支附件齐全 |
| 11 调查报告 | 服务监督人员 | 调查数据;主责还包括回访及条件附件 | 核对报告上下文并确认生成/下载 | 主责在回访结果完成后进入;协查在业务部主任审核通过后直接进入;报告输出版本生成成功 |
| 12 成果物/办结 | 服务监督人员 | 报告和附件 | 汇总、输出、确认办结 | 必备成果物齐全且不存在未完成任务 |
### 6.3 主责与协查分支
流程分支规则如下:
- 服务监督主管负责判定工单属于主责还是协查,并完成派工;该判定结果必须随流程实例持久化,供后续分支使用。
- 主责工单同时产生首联任务、一个或多个并行事件初查任务,并向指定服务监督员开放全面调查填报。
- 协查工单从服务监督主管派工直接进入 04 多部门并行事件初查,不产生首联任务;同时向指定服务监督员开放全面调查填报。
- 服务监督员在派工完成后即可先行填写部分调查信息并保存草稿,无需等待首联或初查结束。
- 全面调查的“提交”动作受前置条件约束:主责必须等待首联及全部初查完成;协查必须等待全部初查完成。前置条件未满足时只能继续编辑或保存草稿。
- 服务监督主管审核通过后进入业务部主任审核。业务部主任审核通过时,系统读取服务监督主管在派工阶段作出的判定:主责进入 08~10 回访流程,协查直接进入 11 调查报告编写。
- 事件初查部门可多选;主责工单的首联部门单选。
### 6.4 建议状态模型
不建议只使用原型中的“待分派/处理中/已结束”三个展示状态驱动流程。建议拆分“工单生命周期状态”和“任务环节状态”:
| 类型 | 建议状态 |
| --- | --- |
| 工单生命周期 | `IMPORTED` 已导入、`DISPATCHING` 待派工、`PROCESSING` 办理中、`REVIEWING` 审核中、`CALLBACK` 回访中、`REPORTING` 报告中、`CLOSED` 已办结、`CANCELLED` 已取消 |
| 任务状态 | `PENDING` 待领取/待办理、`ASSIGNED` 已分派、`IN_PROGRESS` 办理中、`SUBMITTED` 已提交、`APPROVED` 已通过、`REJECTED` 已驳回、`COMPLETED` 已完成、`CANCELLED` 已取消 |
| 流程环节 | `DISPATCH``FIRST_CONTACT_ASSIGN``FIRST_CONTACT``PRELIMINARY_INVESTIGATION``INVESTIGATION``SUPERVISOR_REVIEW``BUSINESS_REVIEW``CALLBACK_ASSIGN``CALLBACK``CALLBACK_RESULT``REPORT``DELIVERABLE` |
工单状态由有效任务和流程实例聚合计算,不允许客户端直接提交任意目标状态。
## 7. 字段梳理
### 7.1 字段约定
- `ID` 建议使用系统内部不可猜测标识;业务编号另设唯一字段。
- 日期使用 `YYYY-MM-DD`,日期时间使用带时区的 ISO 8601;存储使用统一时区,展示按用户时区转换。
- `是否`类字段使用布尔或明确枚举,不使用自由文本。
- 所有枚举保存稳定编码,界面显示名称通过字典返回。
- “必填”在原型中未用星号完整表达,以下仅将流程成立所需字段标为“建议必填”,最终以业务评审为准。
### 7.2 登录与用户上下文
| 字段 | 建议类型 | 必填 | 来源/说明 |
| --- | --- | :---: | --- |
| username | string(64) | 是 | 登录账号 |
| password | string | 是 | 只用于认证请求,不落业务日志 |
| code | string(16) | 是 | 验证码 |
| uuid | string(64) | 是 | 验证码唯一标识 |
| userId | int64/string | 系统 | 当前用户标识 |
| nickName | string(64) | 系统 | 页头显示名称 |
| deptId | int64/string | 系统 | 数据权限和派工候选范围 |
| roleIds/postIds | array | 系统 | 菜单与操作授权 |
### 7.3 导入批次与导入行
| 字段 | 建议类型 | 必填 | 说明 |
| --- | --- | :---: | --- |
| batchId | string | 系统 | 导入批次内部标识 |
| batchNo | string(64) | 是 | 原型示例 `20260806-B01`,需唯一性规则 |
| fileId/fileName | string | 是 | 原始导入文件 |
| importMode | enum | 是 | `EXCEL`/`CSV` |
| status | enum | 系统 | 上传中、预览成功、部分失败、已确认、已取消 |
| totalCount/successCount/failureCount | integer | 系统 | 批次数量统计 |
| importedBy/importedAt | string/datetime | 系统 | 操作人和时间 |
| previewToken | string | 系统 | 预览到确认之间的短期凭证,防止文件被替换 |
| rowNo | integer | 系统 | 原文件行号 |
| rowStatus | enum | 系统 | 有效、重复、错误、待确认 |
| errorCode/errorMessage | string | 否 | 行级错误原因 |
### 7.4 12398 工单基础信息
| 字段 | 建议类型 | 必填 | 说明 |
| --- | --- | :---: | --- |
| workOrderId | string | 系统 | 内部主键 |
| workOrderNo12398 | string(64) | 是 | 12398 工单编号,建议唯一 |
| orderStatus | enum | 系统 | 工单生命周期状态 |
| currentStage | enum | 系统 | 当前流程环节 |
| sourceCode | enum | 是 | 信息来源,如 12398 电话 |
| customerCalledAt | date/datetime | 是 | 客户致电 12398 日期/时间 |
| transferredAt | date/datetime | 是 | 转办日期/时间 |
| customerName | string(128) | 建议 | 客户名称 |
| contactPhone | string(32) | 建议 | 联系方式,密文或受控存储 |
| customerAddress | string(512) | 否 | 用户地址,敏感字段 |
| customerRegion | string(128) | 否 | 客户所在地区(省) |
| provinceCode | string(32) | 建议 | 省份稳定编码 |
| eventTypeCode | string(32) | 建议 | 事件类型 |
| transferCategoryCode | string(32) | 建议 | 转办事项分类 |
| problemCategoryCode | string(32) | 建议 | 问题分类 |
| responsibilityType | enum | 是 | 由服务监督主管在派工时判定:`PRIMARY` 主责 / `ASSIST` 协查;后续业务审核分支以该值为准 |
| escalationFlag | boolean | 否 | 是否提级督办 |
| processVersion | integer | 系统 | 流程/乐观锁版本 |
| createdAt/updatedAt | datetime | 系统 | 审计时间 |
### 7.5 95598 业务处理信息
| 字段 | 建议类型 | 必填 | 说明 |
| --- | --- | :---: | --- |
| serviceRecordId | string | 系统 | 记录标识 |
| serviceOrderNo95598 | string(64) | 建议 | 95598 工单编号 |
| acceptanceContent | text | 建议 | 受理内容 |
| businessTypeCode | string(32) | 否 | 业务类型 |
| acceptedAt | datetime | 否 | 受理时间 |
| powerSupplyOrgId/name | string | 否 | 供电单位编码及名称 |
| recordingFileId | string | 否 | 录音文件引用 |
| recordingDuration | integer | 否 | 录音时长(秒) |
| transcriptText | text | 否 | 转译文本 |
| sequenceNo | integer | 系统 | 同一工单内排序 |
### 7.6 派工信息
| 字段 | 建议类型 | 必填 | 说明 |
| --- | --- | :---: | --- |
| dispatchId | string | 系统 | 派工记录标识 |
| workOrderId | string | 是 | 所属工单 |
| responsibilityType | enum | 是 | 服务监督主管在派工时判定主责/协查,并持久化到流程实例 |
| preliminaryDeptIds | array<string> | 是 | 初查部门,多选且去重 |
| firstContactDeptId | string | 主责必填 | 首联部门,单选;协查应为空 |
| supervisorUserId | string | 是 | 服务监督员,单选 |
| escalationDeptIds | array<string> | 否 | 提级督办部门多选 |
| dispatchMode | enum | 是 | `MANUAL`/`SMART` |
| ruleVersion | integer | 智能派工时 | 命中的规则版本 |
| dispatchedBy/dispatchedAt | string/datetime | 系统 | 派工人和时间 |
### 7.7 首联与初查
| 对象 | 字段 | 建议类型 | 必填 | 说明 |
| --- | --- | --- | :---: | --- |
| 首联分派 | assigneeDeptId | string | 是 | 客服主管所在部门 |
| 首联分派 | assigneeUserId/postId | string | 是 | 本部门班组人员或岗位 |
| 首联 | firstContactAt | datetime | 是 | 首联时间 |
| 首联 | firstContactOrderNo | string(64) | 是 | 首联工单号 |
| 首联 | firstContactContent | text | 是 | 首联内容 |
| 初查 | taskId | string | 是 | 一任务一初查,保证并行结果可追踪 |
| 初查 | preliminaryContent | text | 是 | 原型中的“初查内容” |
| 通用 | submittedBy/submittedAt | string/datetime | 系统 | 提交审计字段 |
### 7.8 全面调查
| 字段 | 建议类型 | 建议必填 | 说明 |
| --- | --- | :---: | --- |
| investigationId/version | string/integer | 系统 | 每次提交生成不可变版本 |
| acceptedContent12398 | text | 否 | 原型业务类型方案中展示“导入的12398投诉内容” |
| externalExposureRisk | boolean | 是 | 是否存在国家级媒体、党政机关、监管机构等外部渠道风险 |
| internalAppealIssued | boolean | 是 | 是否派发内部诉求工单 |
| customerAppealSummary | text | 是 | 客户诉求概况 |
| escalationReason | text | 是 | 客户升级主要原因 |
| investigationProcess | text | 是 | 本期诉求调查过程 |
| localResponsibility | boolean | 条件 | 是否本单位事项 |
| handlingSituation | text | 条件 | 办理情况 |
| accountable | boolean | 条件 | 是否有责 |
| hasHandlingBasis | boolean | 条件 | 是否有处理依据 |
| handlingMethod | text | 条件 | 处理方式 |
| handlingResult | text | 条件 | 处理结果 |
| investigationSummary | text | 待确认 | 原型出现独立“调查结果”,与上述字段可能重复 |
| draftFlag | boolean | 系统 | 是否草稿;原型未显示“暂存”按钮,建议补充 |
“是否本单位事项”之后的字段在 1-21 完整调查页出现、在 1-13 业务类型方案中未出现,可能是按事件类型或责任判定动态展示,需确认显示条件及条件必填规则。
### 7.9 审核、回访、报告与成果物
| 对象 | 字段 | 建议类型 | 必填/条件 |
| --- | --- | --- | --- |
| 审核 | reviewLevel | enum | 是:主管审核/业务审核 |
| 审核 | reviewResult | enum | 是:同意/不同意 |
| 审核 | rejectReason | text | 不同意时必填 |
| 审核 | reviewedBy/reviewedAt | string/datetime | 系统生成 |
| 回访分派 | callbackDeptId | string | 是 |
| 回访分派 | assigneeUserId/postId | string | 客服主管二次分派时必填 |
| 回访 | respondentName | string(64) | 原型显示“回复人” |
| 回访 | repliedAt | datetime | 是 |
| 回访 | replyPhone | string(32) | 是,敏感字段 |
| 回访 | replySituation | text | 是 |
| 回访 | callbackResult | enum | 是;最新原型统一为 `AGREE` 同意 / `DISAGREE_OR_CUSTOMER_REQUEST` 不同意或客户主动要求 |
| 附件 | responseLetterFileIds | array<string> | 不同意或客户主动要求时至少 1 个答复书 |
| 附件 | deliveryProofFileIds | array<string> | 不同意或客户主动要求时至少 1 个送达凭证 |
| 报告 | reportId/version | string/integer | 系统 |
| 报告 | sourceInvestigationVersion | string/integer | 是;锁定生成报告所依据的调查版本 |
| 报告 | sourceCallbackVersion | string/integer | 主责必填;协查为空 |
| 报告 | outputFileId | string | 确认生成后返回的可控下载文件 |
| 报告 | outputStatus | enum | 待生成、生成中、可下载、生成失败、已确认 |
| 报告 | generationMode | enum | 模板生成/智能辅助;是否开放在线编辑待确认 |
| 成果物 | deliverableType/fileId | enum/string | 待确认具体成果物类型 |
| 办结 | closedBy/closedAt/closeReason | string/datetime/text | 系统/条件 |
20260812 原型未提供独立富文本报告编辑器,而是展示调查信息、主责工单的回访信息及条件附件,并通过“确认下载”输出报告。因此 `reportContent` 不应在当前阶段被直接定为前端必填字段;后端可内部保存结构化快照或模板渲染内容,但其格式属于技术方案而非原型已确认需求。
### 7.10 规则与时限
| 字段 | 建议类型 | 说明 |
| --- | --- | --- |
| configId/configVersion | string/integer | 配置标识和版本 |
| totalLimitMinutes | integer | 整体时限,原型示例 188 分钟不能视为正式值 |
| stageCode | enum | 办理派工、首联、事件调查、调查审核、回访、调查报告、编写提交等 |
| stageLimitMinutes | integer | 环节时限,必须为正整数 |
| smartDispatchRule | json/rule DSL | 智能派工条件和结果,原型未提供字段 |
| effectiveFrom/effectiveTo | datetime | 生效区间 |
| status | enum | 草稿、启用、停用 |
| changedBy/changedAt/changeReason | string/datetime/text | 配置审计 |
## 8. 接口梳理
### 8.1 接口约定
现有后端文档采用 Bearer Token、`AjaxResult``TableDataInfo`。为保持兼容,本报告沿用这些返回结构;新业务接口路径是建议契约,最终应与后端统一前缀和命名规范后进入 OpenAPI。
通用约定:
- 除验证码和登录外,接口请求头携带 `Authorization: Bearer <token>`
- 分页统一使用 `pageNum``pageSize`;响应使用 `total``rows``code``msg`
- 写接口携带 `requestId``Idempotency-Key`,涉及状态变更时携带 `version`
- 业务校验失败返回稳定业务错误码,不依赖提示语解析。
- 列表只返回摘要;详情接口按权限返回敏感字段和附件权限。
### 8.2 接口目录
接口目录只用于定位,不替代字段契约。每个接口的请求字段定义、响应字段定义和 JSON 示例见 8.5~8.11 节。
#### 8.2.1 已有认证与用户接口
| 方法 | 路径 | 用途 | 状态 |
| --- | --- | --- | --- |
| GET | `/captchaImage` | 获取验证码和 uuid | 已有文档确认 |
| POST | `/login` | 账号、密码、验证码登录 | 已有文档确认 |
| GET | `/system/user/profile` | 当前用户信息 | 已有文档确认 |
| GET | `/system/user/list` | 用户候选查询 | 已有文档确认,业务派工应增加数据范围过滤 |
| GET | `/system/user/deptTree` | 部门树 | 已有文档确认 |
| GET | `/system/user/{userId}` | 用户详情 | 已有文档确认 |
| PUT | `/system/user/profile/updatePwd` | 修改密码 | 已有文档确认 |
#### 8.2.2 导入接口
| 编号 | 方法 | 建议路径 | 用途 | 备注 |
| --- | --- | --- | --- | --- |
| IMP-01 | GET | `/risk/import-batches/template` | 下载导入模板 | 返回文件流及模板版本 |
| IMP-02 | POST | `/risk/import-batches/preview` | 上传并解析 Excel/CSV | multipartfile、batchNo;返回 previewToken、统计、行级预览 |
| IMP-03 | GET | `/risk/import-batches/{previewToken}/rows` | 分页查看预览行 | pageNum/pageSize/rowStatus |
| IMP-04 | POST | `/risk/import-batches/confirm` | 确认导入 | previewToken、batchNo、requestId;返回 batchId 和成功/失败数量 |
| IMP-05 | GET | `/risk/import-batches` | 导入批次列表 | 时间、批次号、人员、状态、分页 |
| IMP-06 | GET | `/risk/import-batches/{batchId}` | 批次详情 | 批次统计和文件信息 |
| IMP-07 | GET | `/risk/import-batches/{batchId}/rows` | 导入结果行明细 | 行状态、错误码、关联工单 |
#### 8.2.3 工单查询与详情接口
| 编号 | 方法 | 建议路径 | 用途 | 备注 |
| --- | --- | --- | --- | --- |
| WO-01 | GET | `/risk/work-orders` | 权限范围内工单查询 | 原型全部查询条件、分页、排序 |
| WO-02 | GET | `/risk/work-orders/{workOrderId}` | 工单基础详情 | 基础信息、当前环节、权限动作 |
| WO-03 | GET | `/risk/work-orders/{workOrderId}/service-records` | 95598 处理信息 | 列表、录音授权、转译文本 |
| WO-04 | GET | `/risk/work-orders/{workOrderId}/process` | 流程视图 | 当前节点、并行任务、历史节点、时限 |
| WO-05 | GET | `/risk/work-orders/{workOrderId}/timeline` | 操作轨迹 | 派工、提交、审核、驳回、附件、办结事件 |
| WO-06 | GET | `/risk/work-orders/{workOrderId}/allowed-actions` | 当前用户可执行动作 | 动作编码及所需版本;也可并入详情响应 |
#### 8.2.4 待办与派工接口
| 编号 | 方法 | 建议路径 | 用途 | 备注 |
| --- | --- | --- | --- | --- |
| TASK-01 | GET | `/risk/tasks` | 当前用户待办列表 | stage/status/工单条件/分页 |
| TASK-02 | GET | `/risk/tasks/summary` | 待办统计卡片 | 各环节数量,与列表同口径 |
| TASK-03 | GET | `/risk/tasks/{taskId}` | 待办上下文 | 工单摘要、表单数据、任务版本、允许动作 |
| DSP-01 | GET | `/risk/work-orders/{id}/dispatch-candidates` | 派工候选 | 初查部门、首联部门、监督员、督办部门 |
| DSP-02 | POST | `/risk/work-orders/{id}/smart-dispatch-suggestion` | 获取智能派工建议 | 工单版本;返回建议和规则解释,不直接落单 |
| DSP-03 | POST | `/risk/work-orders/{id}/dispatch` | 确认人工/智能派工 | 主责/协查、部门、监督员、督办、version、requestId |
| DSP-04 | POST | `/risk/tasks/{taskId}/assign` | 客服主管分派班组/人员 | assigneeUserId/postId、version |
| DSP-05 | POST | `/risk/work-orders/{id}/callback-department` | 审核环节确定主责工单的回访承接部门 | callbackDeptId、reviewTaskId、version;具体由一级还是二级审核生效待确认 |
#### 8.2.5 办理与审核接口
| 编号 | 方法 | 建议路径 | 用途 | 备注 |
| --- | --- | --- | --- | --- |
| ACT-01 | PUT | `/risk/tasks/{taskId}/draft` | 保存草稿 | formType、formData、version;技术建议 |
| ACT-02 | POST | `/risk/tasks/{taskId}/first-contact/submit` | 提交首联 | 时间、工单号、内容、version |
| ACT-03 | POST | `/risk/tasks/{taskId}/preliminary-investigation/submit` | 提交初查 | preliminaryContent、version |
| ACT-04 | GET | `/risk/tasks/{taskId}/investigation-context` | 获取全面调查上下文 | 派工后即可调用;返回已形成的首联/初查、历史调查版本和 `submitReady`/未完成前置任务 |
| ACT-05 | POST | `/risk/tasks/{taskId}/investigation/submit` | 提交全面调查 | 第 7.8 节字段、version;主责校验首联及全部初查,协查校验全部初查 |
| ACT-06 | POST | `/risk/tasks/{taskId}/supervisor-review` | 主管审核 | result、rejectReason、investigationVersion、version |
| ACT-07 | POST | `/risk/tasks/{taskId}/business-review` | 业务审核 | result、rejectReason、investigationVersion、version |
| ACT-08 | POST | `/risk/tasks/{taskId}/callback/submit` | 提交班组回访 | 原始回访字段,具体字段待确认 |
| ACT-09 | POST | `/risk/tasks/{taskId}/callback-result/submit` | 提交回访结果 | 回复信息、结果、附件 fileIds、version |
| ACT-10 | GET | `/risk/tasks/{taskId}/report-context` | 获取报告确认上下文 | 返回责任类型、锁定的调查版本、主责回访版本、附件及当前输出状态 |
| ACT-11 | POST | `/risk/tasks/{taskId}/report/confirm` | 确认生成报告 | 模板版本、调查/回访数据版本、version、requestId;可同步返回 reportId,或异步返回 jobId |
| ACT-12 | GET | `/risk/reports/{reportId}/download` | 受权下载已生成报告 | 返回受控文件流或短期下载地址,不改变流程状态 |
| ACT-13 | POST | `/risk/tasks/{taskId}/deliverables/submit` | 提交成果物并申请办结 | deliverables、version |
| ACT-14 | POST | `/risk/work-orders/{id}/close` | 确认办结 | version、requestId;仅在所有前置条件满足时允许 |
#### 8.2.6 文件、字典、配置和统计接口
| 编号 | 方法 | 建议路径 | 用途 |
| --- | --- | --- | --- |
| FILE-01 | POST | `/risk/files` | 上传录音、答复书、送达凭证或成果物,返回 fileId |
| FILE-02 | GET | `/risk/files/{fileId}` | 受权下载/播放,建议返回短期签名地址或受控流 |
| FILE-03 | DELETE | `/risk/files/{fileId}` | 删除尚未绑定且由当前用户上传的临时文件 |
| DICT-01 | GET | `/risk/dictionaries/{type}` | 信息来源、省份、事件类型、事项分类、问题分类等 |
| CFG-01 | GET | `/risk/config/sla` | 获取当前时限配置和版本 |
| CFG-02 | PUT | `/risk/config/sla` | 保存并发布整体/环节时限 |
| CFG-03 | GET | `/risk/config/dispatch-rules` | 获取智能派工规则 |
| CFG-04 | PUT | `/risk/config/dispatch-rules` | 保存并发布规则版本 |
| ANA-01 | GET | `/risk/analytics/overview` | 统计概览;指标口径待定义 |
| ANA-02 | GET | `/risk/analytics/closed-orders` | 办结工单统计与明细 |
| JOB-01 | GET | `/risk/jobs/{jobId}` | 查询导入、报告生成等异步任务进度 |
### 8.3 页面—接口映射
| 页面 | 读接口 | 写接口 |
| --- | --- | --- |
| 登录 | `/captchaImage` | `/login` |
| 工单导入 | IMP-01、IMP-05 | IMP-02、IMP-04 |
| 导入预览/明细 | IMP-03、IMP-06、IMP-07 | IMP-04 |
| 工单查询 | WO-01、DICT-01 | 无 |
| 工单详情 | WO-02~WO-06 | 按允许动作进入对应接口 |
| 主管处理列表 | TASK-01、TASK-02 | 无 |
| 派工 | WO-02、WO-03、DSP-01 | DSP-02、DSP-03 |
| 首联/回访分派 | TASK-03、候选用户/岗位 | DSP-04、DSP-05 |
| 首联/初查 | TASK-03、WO-03 | ACT-01ACT-03 |
| 全面调查 | ACT-04、WO-02、WO-03 | ACT-01、ACT-05 |
| 两级审核 | TASK-03、历史调查版本 | ACT-06、ACT-07 |
| 回访结果 | TASK-03、附件读取 | FILE-01、ACT-09 |
| 报告/成果物 | ACT-10、报告输出状态、流程上下文 | ACT-11ACT-14、FILE-01 |
| 时限/规则配置 | CFG-01、CFG-03 | CFG-02、CFG-04 |
| 统计分析 | ANA-01、ANA-02 | 无 |
### 8.4 联调公共契约
本节给出前后端联调基线。除 8.2 节已有接口外,以下均为建议契约;进入开发前应固化为 OpenAPI 3.1。示例中的 ID、日期、人员和数量均为演示值。
8.5~8.11 节统一按以下顺序描述接口:
1. **请求字段定义**:逐项说明字段位置、名称、类型、是否必填和业务含义;无请求体也必须明确写出。
2. **响应字段定义**:逐项说明业务数据字段路径、类型和业务含义;公共包装字段引用 8.4.2~8.4.4。
3. **请求示例**GET/DELETE 接口没有请求体时给出完整 URLJSON 或 multipart 接口给出请求体。
4. **响应示例**:JSON 接口给出完整响应;文件流接口说明状态码、响应头和响应体类型。
字段路径中的 `[]` 表示数组元素,例如 `data.rows[].workOrderId`。标记为“条件必填”的字段必须在定义中写明触发条件。未在字段表中定义的业务字段,前后端不得仅凭示例自行增加。
#### 8.4.1 请求头
| 请求头 | 必填 | 适用范围 | 说明 |
| --- | :---: | --- | --- |
| `Authorization: Bearer <token>` | 是 | 除验证码、登录外 | 当前用户身份 |
| `Content-Type: application/json` | 是 | JSON 写接口 | 文件上传除外 |
| `Idempotency-Key` | 条件 | 导入确认、派工、提交、审核、报告确认、办结 | 客户端生成 UUID;同一业务动作重试必须复用 |
| `X-Request-Id` | 建议 | 全部接口 | 链路追踪;未传时由服务端生成 |
| `Accept-Language: zh-CN` | 否 | 全部接口 | 提示语语言,不影响业务错误码 |
#### 8.4.2 单对象成功响应
| 响应字段 | 类型 | 必有 | 定义 |
| --- | --- | :---: | --- |
| `code` | integer/string | 是 | 成功时为 `200`;失败时为稳定业务错误码 |
| `msg` | string | 是 | 面向用户的结果说明,不作为前端业务判断依据 |
| `data` | object/array/null | 是 | 业务响应数据;无业务数据时为 `null` 或空对象,项目内须统一 |
| `requestId` | string | 是 | 服务端链路追踪标识,应同时写入服务端日志 |
```json
{
"code": 200,
"msg": "操作成功",
"data": {},
"requestId": "req-20260813-000001"
}
```
#### 8.4.3 分页成功响应
| 响应字段 | 类型 | 必有 | 定义 |
| --- | --- | :---: | --- |
| `total` | integer | 是 | 符合查询条件的数据总数,不是当前页条数 |
| `rows` | object[] | 是 | 当前页数据;无数据时返回空数组 |
| `code` | integer | 是 | 成功结果码,固定为 `200` |
| `msg` | string | 是 | 查询结果说明 |
| `requestId` | string | 是 | 服务端链路追踪标识 |
```json
{
"total": 1,
"rows": [],
"code": 200,
"msg": "查询成功",
"requestId": "req-20260813-000002"
}
```
分页请求统一使用 `pageNum``pageSize``pageNum` 从 1 开始,`pageSize` 建议限制为 10100。排序使用 `orderByColumn``isAsc`,服务端必须使用字段白名单。
#### 8.4.4 业务错误响应
新增 `/risk/**` 接口建议由 HTTP 状态表达协议结果,响应体 `code` 使用第 9.7 节稳定业务错误码,不用 HTTP 200 包装业务失败;8.2 节列出的既有接口继续保持现有返回约定,避免破坏兼容性。
```json
{
"code": "RISK-4220",
"msg": "首联及全部初查完成后才能提交全面调查",
"data": {
"currentStage": "INVESTIGATION",
"responsibilityType": "PRIMARY",
"incompletePrerequisites": [
{ "type": "FIRST_CONTACT", "taskId": "TASK-FC-001", "status": "IN_PROGRESS" },
{ "type": "PRELIMINARY_INVESTIGATION", "taskId": "TASK-PI-003", "status": "PENDING" }
],
"fieldErrors": []
},
"requestId": "req-20260813-000003"
}
```
建议 HTTP 映射:认证失效 `401`,越权 `403`,不存在 `404`,版本/状态冲突 `409`,业务前置条件或字段校验失败 `422`,限流 `429`,服务端异常 `500`
#### 8.4.5 状态变更通用响应
所有任务写接口至少返回最新任务版本、工单版本、当前环节和新建后续任务,前端必须用响应覆盖本地版本,不能自行推算状态。
```json
{
"code": 200,
"msg": "提交成功",
"data": {
"workOrderId": "WO-20260806-001",
"taskId": "TASK-INV-001",
"taskStatus": "COMPLETED",
"currentStage": "SUPERVISOR_REVIEW",
"workOrderVersion": 8,
"taskVersion": 3,
"nextTasks": [
{
"taskId": "TASK-SR-001",
"stage": "SUPERVISOR_REVIEW",
"status": "PENDING",
"assigneeRole": "SERVICE_SUPERVISOR"
}
]
},
"requestId": "req-20260813-000004"
}
```
### 8.5 认证与用户接口请求与响应字段定义
#### 8.5.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| `GET /captchaImage` | — | — | — | — | 无查询参数、无请求体 |
| `POST /login` | body | `username` | string | 是 | 登录账号 |
| `POST /login` | body | `password` | string | 是 | 登录密码;仅通过 HTTPS 传输 |
| `POST /login` | body | `code` | string | 条件 | 验证码开启时必填 |
| `POST /login` | body | `uuid` | string | 条件 | 验证码开启时必填,与验证码图片绑定 |
| `GET /system/user/profile` | — | — | — | — | 无查询参数、无请求体;用户由 Token 确定 |
| `GET /system/user/list` | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| `GET /system/user/list` | query | `pageSize` | integer | 是 | 每页数量,建议 10100 |
| `GET /system/user/list` | query | `userName` | string | 否 | 用户名模糊查询 |
| `GET /system/user/list` | query | `phonenumber` | string | 否 | 手机号查询 |
| `GET /system/user/list` | query | `status` | string | 否 | 用户状态 |
| `GET /system/user/list` | query | `deptId` | string | 否 | 部门标识;服务端仍需执行数据范围过滤 |
| `GET /system/user/deptTree` | — | — | — | — | 无查询参数、无请求体 |
| `GET /system/user/{userId}` | path | `userId` | string | 是 | 用户标识 |
| `PUT /system/user/profile/updatePwd` | query | `oldPassword` | string | 是 | 原密码 |
| `PUT /system/user/profile/updatePwd` | query | `newPassword` | string | 是 | 新密码,须满足密码策略 |
#### 8.5.2 响应字段定义
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| `GET /captchaImage` | `code` | integer | 结果码 |
| `GET /captchaImage` | `data.uuid` | string | 验证码会话标识 |
| `GET /captchaImage` | `data.img` | string | Base64 编码的验证码图片 |
| `POST /login` | `code` | integer | 结果码 |
| `POST /login` | `msg` | string | 结果说明 |
| `POST /login` | `data` | string | Bearer Token;前端不得写入日志 |
| `GET /system/user/profile` | `data.user` | object | 当前用户基本信息 |
| `GET /system/user/profile` | `data.roles[]` | string[] | 当前用户角色编码 |
| `GET /system/user/profile` | `data.permissions[]` | string[] | 当前用户权限编码 |
| `GET /system/user/list` | `total` | integer | 符合条件的用户总数 |
| `GET /system/user/list` | `rows[]` | object[] | 用户摘要列表 |
| `GET /system/user/list` | `rows[].userId` | string | 用户标识 |
| `GET /system/user/list` | `rows[].userName` | string | 用户名 |
| `GET /system/user/list` | `rows[].nickName` | string | 用户显示名称 |
| `GET /system/user/list` | `rows[].dept` | object | 所属部门摘要 |
| `GET /system/user/list` | `rows[].status` | string | 用户状态 |
| `GET /system/user/deptTree` | `data[]` | object[] | 部门树根节点 |
| `GET /system/user/deptTree` | `data[].id` | string | 部门标识 |
| `GET /system/user/deptTree` | `data[].label` | string | 部门名称 |
| `GET /system/user/deptTree` | `data[].children[]` | object[] | 子部门,递归结构 |
| `GET /system/user/{userId}` | `data.user` | object | 用户详情 |
| `GET /system/user/{userId}` | `data.roleIds[]` | string[] | 已关联角色标识 |
| `GET /system/user/{userId}` | `data.postIds[]` | string[] | 已关联岗位标识 |
| `PUT /system/user/profile/updatePwd` | `code` | integer | 结果码,成功为 200 |
| `PUT /system/user/profile/updatePwd` | `msg` | string | 修改结果说明 |
#### 8.5.3 请求与响应示例
##### `GET /captchaImage`
无查询参数、无请求体。
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"uuid": "4c25fa10-6f61-4ea3-aea5-977c26759468",
"img": "data:image/png;base64,iVBORw0KGgoAAA..."
}
}
```
##### `POST /login`
```json
{
"username": "admin",
"password": "******",
"code": "TB5K",
"uuid": "4c25fa10-6f61-4ea3-aea5-977c26759468"
}
```
```json
{
"code": 200,
"msg": "登录成功",
"data": "eyJhbGciOiJIUzI1NiJ9...",
"requestId": "req-20260813-000010"
}
```
##### 用户和部门查询
- `GET /system/user/list?pageNum=1&pageSize=20&deptId=101&status=0`:无 body;响应 `rows` 为用户数组。
- `GET /system/user/deptTree?status=0`:无 body;响应 `data` 为部门树。
- `GET /system/user/{userId}``GET /system/user/profile`:无 body;响应 `data` 为用户对象。
```json
{
"total": 1,
"rows": [
{
"userId": 1001,
"deptId": 101,
"userName": "zhangsan",
"nickName": "张某",
"phonenumber": "131****7777",
"status": "0",
"roleIds": [201],
"postIds": [301]
}
],
"code": 200,
"msg": "查询成功"
}
```
派工候选不得直接使用无业务范围限制的全量用户列表;后端应基于部门、岗位、角色和启用状态过滤。
### 8.6 导入接口请求与响应字段定义
#### 8.6.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| IMP-01 | query | `templateVersion` | string | 否 | 指定模板版本;不传则下载当前有效版本 |
| IMP-02 | multipart | `file` | binary | 是 | 待解析的 Excel/CSV 文件,须通过扩展名、MIME、大小和安全扫描校验 |
| IMP-02 | multipart | `batchNo` | string | 是 | 用户填写的业务批次号,同一有效批次内唯一 |
| IMP-02 | multipart | `templateVersion` | string | 是 | 文件使用的模板版本 |
| IMP-03 | path | `previewToken` | string | 是 | 预览会话标识,过期后不可使用 |
| IMP-03 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| IMP-03 | query | `pageSize` | integer | 是 | 每页数量 |
| IMP-03 | query | `rowStatus` | enum | 否 | 行状态:`VALID``DUPLICATE``INVALID` |
| IMP-04 | body | `previewToken` | string | 是 | IMP-02 返回的预览会话标识 |
| IMP-04 | body | `batchNo` | string | 是 | 必须与预览阶段批次号一致 |
| IMP-04 | body | `fileSha256` | string | 是 | 文件摘要,防止预览后文件被替换 |
| IMP-04 | body | `duplicatePolicy` | enum | 是 | 重复处理策略;当前建议仅支持 `REJECT` |
| IMP-04 | body | `requestId` | string | 是 | 幂等请求标识,与 `Idempotency-Key` 一致 |
| IMP-05 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| IMP-05 | query | `pageSize` | integer | 是 | 每页数量 |
| IMP-05 | query | `batchNo` | string | 否 | 批次号模糊或精确查询,开发前统一口径 |
| IMP-05 | query | `status` | enum | 否 | 批次状态 |
| IMP-05 | query | `importedFrom` | date | 否 | 导入开始日期,含边界 |
| IMP-05 | query | `importedTo` | date | 否 | 导入结束日期,含边界 |
| IMP-06 | path | `batchId` | string | 是 | 导入批次标识 |
| IMP-07 | path | `batchId` | string | 是 | 导入批次标识 |
| IMP-07 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| IMP-07 | query | `pageSize` | integer | 是 | 每页数量 |
| IMP-07 | query | `rowStatus` | enum | 否 | 行处理状态 |
#### 8.6.2 响应字段定义
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| IMP-01 | HTTP body | binary | 模板文件流 |
| IMP-01 | `Content-Type` | string | Excel 模板 MIME 类型 |
| IMP-01 | `Content-Disposition` | string | 下载文件名 |
| IMP-01 | `X-Template-Version` | string | 实际下载的模板版本 |
| IMP-02 | `data.previewToken` | string | 预览会话标识 |
| IMP-02 | `data.expiresAt` | datetime | 预览会话过期时间 |
| IMP-02 | `data.fileName` | string | 原始文件名 |
| IMP-02 | `data.fileSha256` | string | 文件 SHA-256 摘要 |
| IMP-02 | `data.templateVersion` | string | 解析所用模板版本 |
| IMP-02 | `data.batchNo` | string | 业务批次号 |
| IMP-02 | `data.totalCount` | integer | 数据总行数,不含标题行 |
| IMP-02 | `data.validCount` | integer | 校验通过且可导入行数 |
| IMP-02 | `data.duplicateCount` | integer | 重复行数 |
| IMP-02 | `data.invalidCount` | integer | 校验失败行数 |
| IMP-02 | `data.canConfirm` | boolean | 当前预览是否允许确认导入 |
| IMP-02 | `data.sampleRows[]` | object[] | 少量预览行;完整数据通过 IMP-03 查询 |
| IMP-02 | `data.sampleRows[].rowNo` | integer | 文件中的原始行号 |
| IMP-02 | `data.sampleRows[].rowStatus` | enum | 行校验状态 |
| IMP-02 | `data.sampleRows[].workOrderNo12398` | string | 12398 工单号 |
| IMP-02 | `data.sampleRows[].customerName` | string | 客户名称 |
| IMP-02 | `data.sampleRows[].errors[]` | object[] | 行级错误集合 |
| IMP-03/IMP-07 | `total` | integer | 符合行状态条件的总数 |
| IMP-03/IMP-07 | `rows[]` | object[] | 当前页行明细 |
| IMP-03/IMP-07 | `rows[].rowNo` | integer | 原始行号 |
| IMP-03/IMP-07 | `rows[].rowStatus` | enum | 行状态 |
| IMP-03/IMP-07 | `rows[].rawData` | object | 原始单元格键值,不作为正式业务数据 |
| IMP-03/IMP-07 | `rows[].normalizedData` | object/null | 类型和格式归一化后的业务数据 |
| IMP-03/IMP-07 | `rows[].errorCode` | string/null | 行级稳定错误码 |
| IMP-03/IMP-07 | `rows[].errorMessage` | string/null | 行级错误说明 |
| IMP-03/IMP-07 | `rows[].workOrderId` | string/null | 导入成功后关联的工单标识;预览阶段为空 |
| IMP-04 | `data.batchId` | string | 服务端生成的导入批次标识 |
| IMP-04 | `data.batchNo` | string | 业务批次号 |
| IMP-04 | `data.status` | enum | 批次处理结果:成功、部分成功或失败 |
| IMP-04 | `data.totalCount` | integer | 确认处理总数 |
| IMP-04 | `data.successCount` | integer | 成功创建/关联工单数 |
| IMP-04 | `data.failureCount` | integer | 失败数 |
| IMP-04 | `data.createdWorkOrderIds[]` | string[] | 本次新建工单标识 |
| IMP-05 | `total` | integer | 批次总数 |
| IMP-05 | `rows[]` | object[] | 批次摘要列表,字段结构见下方批次对象 |
| IMP-06 | `data` | object | 批次详情,字段结构见下方批次对象 |
| IMP-05/IMP-06 | `batchId` | string | 导入批次标识 |
| IMP-05/IMP-06 | `batchNo` | string | 业务批次号 |
| IMP-05/IMP-06 | `fileId` | string | 原始导入文件标识 |
| IMP-05/IMP-06 | `fileName` | string | 原始文件名 |
| IMP-05/IMP-06 | `templateVersion` | string | 模板版本 |
| IMP-05/IMP-06 | `status` | enum | 批次状态 |
| IMP-05/IMP-06 | `totalCount` | integer | 总行数 |
| IMP-05/IMP-06 | `successCount` | integer | 成功行数 |
| IMP-05/IMP-06 | `failureCount` | integer | 失败行数 |
| IMP-05/IMP-06 | `importedBy` | object | 导入人摘要,包含 `userId``name` |
| IMP-05/IMP-06 | `importedAt` | datetime | 导入时间 |
#### 8.6.3 请求与响应示例
##### IMP-01 下载模板
`GET /risk/import-batches/template?templateVersion=2026.08` 无 body。成功响应为文件流,并返回:
```http
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="12398-work-order-template-2026.08.xlsx"
X-Template-Version: 2026.08
```
##### IMP-02 导入预览
`POST /risk/import-batches/preview` 使用 `multipart/form-data`
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | :---: | --- |
| file | binary | 是 | Excel/CSV 文件 |
| batchNo | string | 是 | 客户端填写的业务批次号 |
| templateVersion | string | 是 | 使用的模板版本 |
```json
{
"code": 200,
"msg": "文件解析完成",
"data": {
"previewToken": "pvw_6d0726d6",
"expiresAt": "2026-08-13T18:00:00+08:00",
"fileName": "12398工单.xlsx",
"fileSha256": "84a3...e02c",
"templateVersion": "2026.08",
"batchNo": "20260813-B01",
"totalCount": 10,
"validCount": 8,
"duplicateCount": 1,
"invalidCount": 1,
"canConfirm": true,
"sampleRows": [
{
"rowNo": 2,
"rowStatus": "VALID",
"workOrderNo12398": "2026-08-06-001",
"customerName": "某某有限公司",
"errors": []
}
]
}
}
```
##### IMP-03/IMP-07 行明细
`GET /risk/import-batches/{previewToken}/rows?pageNum=1&pageSize=20&rowStatus=INVALID``GET /risk/import-batches/{batchId}/rows` 无 body。
```json
{
"total": 1,
"rows": [
{
"rowNo": 5,
"rowStatus": "INVALID",
"rawData": {
"workOrderNo12398": "",
"customerCalledAt": "2026/13/40"
},
"normalizedData": null,
"errorCode": "INVALID_DATE",
"errorMessage": "客户致电12398日期格式不正确",
"workOrderId": null
}
],
"code": 200,
"msg": "查询成功"
}
```
##### IMP-04 确认导入
```json
{
"previewToken": "pvw_6d0726d6",
"batchNo": "20260813-B01",
"fileSha256": "84a3...e02c",
"duplicatePolicy": "REJECT",
"requestId": "f332e303-d335-4a58-b09e-e5879122fb7b"
}
```
```json
{
"code": 200,
"msg": "导入完成",
"data": {
"batchId": "IB-20260813-001",
"batchNo": "20260813-B01",
"status": "PARTIAL_SUCCESS",
"totalCount": 10,
"successCount": 8,
"failureCount": 2,
"createdWorkOrderIds": ["WO-20260806-001", "WO-20260806-002"]
}
}
```
##### IMP-05/IMP-06 批次列表与详情
`GET /risk/import-batches?pageNum=1&pageSize=20&batchNo=20260813-B01&status=CONFIRMED&importedFrom=2026-08-01&importedTo=2026-08-31` 无 body。
列表 `rows` 和详情 `data` 统一使用:
```json
{
"batchId": "IB-20260813-001",
"batchNo": "20260813-B01",
"fileId": "FILE-001",
"fileName": "12398工单.xlsx",
"templateVersion": "2026.08",
"status": "PARTIAL_SUCCESS",
"totalCount": 10,
"successCount": 8,
"failureCount": 2,
"importedBy": { "userId": "1001", "name": "服务监督主管" },
"importedAt": "2026-08-13T10:20:00+08:00"
}
```
### 8.7 工单与流程查询接口请求与响应字段定义
#### 8.7.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| WO-01 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| WO-01 | query | `pageSize` | integer | 是 | 每页数量 |
| WO-01 | query | `workOrderNo12398` | string | 否 | 12398 工单号 |
| WO-01 | query | `currentStage` | enum | 否 | 当前流程环节 |
| WO-01 | query | `orderStatus` | enum | 否 | 工单状态 |
| WO-01 | query | `sourceCode` | string | 否 | 信息来源编码 |
| WO-01 | query | `calledFrom`/`calledTo` | datetime | 否 | 客户致电 12398 时间范围 |
| WO-01 | query | `transferredFrom`/`transferredTo` | datetime | 否 | 工单转入时间范围 |
| WO-01 | query | `customerName` | string | 否 | 客户名称模糊查询 |
| WO-01 | query | `contactPhone` | string | 否 | 联系电话精确或后四位查询,须受敏感数据权限控制 |
| WO-01 | query | `customerAddress` | string | 否 | 客户地址模糊查询 |
| WO-01 | query | `regionCode` | string | 否 | 区域编码 |
| WO-01 | query | `provinceCode` | string | 否 | 省份编码 |
| WO-01 | query | `eventTypeCode` | string | 否 | 事件类型编码 |
| WO-01 | query | `transferCategoryCode` | string | 否 | 转办事项分类编码 |
| WO-01 | query | `problemCategoryCode` | string | 否 | 问题分类编码 |
| WO-01 | query | `responsibilityType` | enum | 否 | `PRIMARY` 主责或 `ASSIST` 协查 |
| WO-01 | query | `orderByColumn` | string | 否 | 排序字段,仅允许服务端白名单字段 |
| WO-01 | query | `isAsc` | enum | 否 | `asc``desc` |
| WO-02 | path | `workOrderId` | string | 是 | 工单标识 |
| WO-03 | path | `workOrderId` | string | 是 | 工单标识 |
| WO-03 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| WO-03 | query | `pageSize` | integer | 是 | 每页数量 |
| WO-04 | path | `workOrderId` | string | 是 | 工单标识 |
| WO-05 | path | `workOrderId` | string | 是 | 工单标识 |
| WO-05 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| WO-05 | query | `pageSize` | integer | 是 | 每页数量 |
| WO-06 | path | `workOrderId` | string | 是 | 工单标识 |
WO-01~WO-06 均无请求体,数据范围由当前用户身份和权限决定。
#### 8.7.2 响应字段定义
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| WO-01 | `total` | integer | 符合查询条件且当前用户有权查看的工单总数 |
| WO-01 | `rows[]` | object[] | 当前页工单摘要 |
| WO-01 | `rows[].workOrderId` | string | 工单标识 |
| WO-01 | `rows[].workOrderNo12398` | string | 12398 工单号 |
| WO-01 | `rows[].orderStatus` | enum | 工单状态 |
| WO-01 | `rows[].currentStage` | enum | 当前流程环节编码 |
| WO-01 | `rows[].currentStageName` | string | 当前环节显示名称 |
| WO-01 | `rows[].sourceCode`/`sourceName` | string | 信息来源编码及名称 |
| WO-01 | `rows[].customerCalledAt` | datetime | 客户致电时间 |
| WO-01 | `rows[].transferredAt` | datetime | 工单转入时间 |
| WO-01 | `rows[].customerName` | string | 客户名称,按权限脱敏 |
| WO-01 | `rows[].contactPhoneMasked` | string | 脱敏联系电话 |
| WO-01 | `rows[].customerAddressMasked` | string | 脱敏地址 |
| WO-01 | `rows[].responsibilityType` | enum/null | 派工前为空,派工后为主责或协查 |
| WO-01 | `rows[].version` | integer | 工单乐观锁版本 |
| WO-01 | `rows[].allowedActions[]` | string[] | 当前用户在该工单上的允许动作 |
| WO-02 | `data.workOrderId`/`workOrderNo12398` | string | 工单标识及 12398 工单号 |
| WO-02 | `data.orderStatus`/`currentStage` | enum | 工单状态及当前环节 |
| WO-02 | `data.responsibilityType` | enum/null | 主责/协查,派工前为空 |
| WO-02 | `data.sourceCode` | string | 信息来源编码 |
| WO-02 | `data.customerCalledAt`/`transferredAt` | datetime | 客户致电及转入时间 |
| WO-02 | `data.customer` | object | 客户信息对象 |
| WO-02 | `data.customer.name` | string | 客户名称 |
| WO-02 | `data.customer.contactPhone` | string | 联系电话,按权限脱敏 |
| WO-02 | `data.customer.address` | string | 地址,按权限脱敏 |
| WO-02 | `data.customer.regionCode`/`provinceCode` | string | 区域及省份编码 |
| WO-02 | `data.classification` | object | 事件、事项和问题分类编码集合 |
| WO-02 | `data.version` | integer | 工单版本 |
| WO-02 | `data.allowedActions[]` | string[] | 当前用户允许动作 |
| WO-03 | `total` | integer | 关联 95598 记录总数 |
| WO-03 | `rows[]` | object[] | 95598 业务记录 |
| WO-03 | `rows[].serviceRecordId` | string | 记录标识 |
| WO-03 | `rows[].serviceOrderNo95598` | string | 95598 工单号 |
| WO-03 | `rows[].acceptanceContent` | string | 受理内容 |
| WO-03 | `rows[].businessTypeCode` | string | 业务类型编码 |
| WO-03 | `rows[].acceptedAt` | datetime | 受理时间 |
| WO-03 | `rows[].powerSupplyOrg` | object | 供电单位,包含 `id``name` |
| WO-03 | `rows[].recording` | object/null | 录音信息,包含 `fileId``durationSeconds``playable` |
| WO-03 | `rows[].transcriptText` | string/null | 录音转译文本 |
| WO-04 | `data.processInstanceId` | string | 流程实例标识 |
| WO-04 | `data.processVersion` | integer | 流程定义/实例版本 |
| WO-04 | `data.responsibilityType` | enum | 主责或协查 |
| WO-04 | `data.currentStage` | enum | 当前环节 |
| WO-04 | `data.workOrderVersion` | integer | 工单版本 |
| WO-04 | `data.nodes[]` | object[] | 流程节点集合 |
| WO-04 | `data.nodes[].stage`/`status` | enum | 节点编码及状态 |
| WO-04 | `data.nodes[].completedAt` | datetime/null | 节点完成时间 |
| WO-04 | `data.nodes[].completedCount`/`totalCount` | integer/null | 并行节点完成数及总数 |
| WO-04 | `data.nodes[].submitReady` | boolean/null | 当前节点是否满足提交条件 |
| WO-04 | `data.deadlineAt` | datetime | 当前时限截止时间 |
| WO-04 | `data.overdue` | boolean | 是否逾期 |
| WO-05 | `total` | integer | 轨迹事件总数 |
| WO-05 | `rows[]` | object[] | 当前页轨迹事件 |
| WO-05 | `rows[].eventId`/`eventType` | string | 事件标识及类型 |
| WO-05 | `rows[].stage` | enum | 发生事件的环节 |
| WO-05 | `rows[].actor` | object | 操作人,包含 `userId``name``role` |
| WO-05 | `rows[].occurredAt` | datetime | 发生时间 |
| WO-05 | `rows[].fromStatus`/`toStatus` | enum/null | 变更前后状态 |
| WO-05 | `rows[].summary` | string | 事件摘要 |
| WO-06 | `data.workOrderId` | string | 工单标识 |
| WO-06 | `data.workOrderVersion` | integer | 当前工单版本 |
| WO-06 | `data.actions[]` | object[] | 动作集合 |
| WO-06 | `data.actions[].code` | string | 动作编码 |
| WO-06 | `data.actions[].enabled` | boolean | 是否允许执行 |
| WO-06 | `data.actions[].reasonCode` | string/null | 禁止执行时的稳定原因码 |
#### 8.7.3 请求与响应示例
##### WO-01 工单列表
```http
GET /risk/work-orders?pageNum=1&pageSize=20&workOrderNo12398=2026-08-06-001&currentStage=DISPATCH&customerName=某某&orderByColumn=transferredAt&isAsc=desc
```
无 body。响应:
```json
{
"total": 1,
"rows": [
{
"workOrderId": "WO-20260806-001",
"workOrderNo12398": "2026-08-06-001",
"orderStatus": "PROCESSING",
"currentStage": "DISPATCH",
"currentStageName": "待分配派工",
"sourceCode": "12398_PHONE",
"sourceName": "12398 电话",
"customerCalledAt": "2026-08-06T09:15:00+08:00",
"transferredAt": "2026-08-06T11:00:00+08:00",
"customerName": "某某有限公司",
"contactPhoneMasked": "138****8888",
"customerAddressMasked": "XX市XX区XX路88号",
"responsibilityType": null,
"version": 3,
"allowedActions": ["VIEW", "DISPATCH"]
}
],
"code": 200,
"msg": "查询成功"
}
```
##### WO-02 工单详情
`GET /risk/work-orders/{workOrderId}` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"workOrderId": "WO-20260806-001",
"workOrderNo12398": "2026-08-06-001",
"orderStatus": "PROCESSING",
"currentStage": "INVESTIGATION",
"responsibilityType": "PRIMARY",
"sourceCode": "12398_PHONE",
"customerCalledAt": "2026-08-06T09:15:00+08:00",
"transferredAt": "2026-08-06T11:00:00+08:00",
"customer": {
"name": "某某有限公司",
"contactPhone": "138****8888",
"address": "XX市XX区XX路88号",
"regionCode": "120101",
"provinceCode": "120000"
},
"classification": {
"eventTypeCode": "COMPLAINT",
"transferCategoryCode": "COMPLAINT_ITEM",
"problemCategoryCode": "SAFETY_RISK"
},
"version": 7,
"allowedActions": ["VIEW", "SAVE_INVESTIGATION_DRAFT"]
}
}
```
##### WO-03 95598 记录
`GET /risk/work-orders/{workOrderId}/service-records?pageNum=1&pageSize=20` 无 body,返回 `TableDataInfo`
```json
{
"serviceRecordId": "SR-001",
"serviceOrderNo95598": "95598-20260806-001",
"acceptanceContent": "客户反映近期电压不稳,设备频繁重启。",
"businessTypeCode": "COMPLAINT",
"acceptedAt": "2026-08-06T08:45:00+08:00",
"powerSupplyOrg": { "id": "ORG-1200", "name": "国网天津市电力公司" },
"recording": {
"fileId": "FILE-AUDIO-001",
"durationSeconds": 384,
"playable": true
},
"transcriptText": "客户反映近期电压不稳……"
}
```
##### WO-04 流程视图
`GET /risk/work-orders/{workOrderId}/process` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"processInstanceId": "PI-001",
"processVersion": 1,
"responsibilityType": "PRIMARY",
"currentStage": "INVESTIGATION",
"workOrderVersion": 7,
"nodes": [
{ "stage": "DISPATCH", "status": "COMPLETED", "completedAt": "2026-08-06T12:00:00+08:00" },
{ "stage": "FIRST_CONTACT", "status": "COMPLETED", "completedAt": "2026-08-06T14:32:00+08:00" },
{ "stage": "PRELIMINARY_INVESTIGATION", "status": "IN_PROGRESS", "completedCount": 1, "totalCount": 3 },
{ "stage": "INVESTIGATION", "status": "IN_PROGRESS", "submitReady": false }
],
"deadlineAt": "2026-08-08T18:00:00+08:00",
"overdue": false
}
}
```
##### WO-05/WO-06 时间线与允许动作
`GET /risk/work-orders/{workOrderId}/timeline?pageNum=1&pageSize=50` 返回分页事件;`GET /risk/work-orders/{workOrderId}/allowed-actions` 返回动作集合。
```json
{
"eventId": "EVT-001",
"eventType": "DISPATCHED",
"stage": "DISPATCH",
"actor": { "userId": "1001", "name": "服务监督主管", "role": "SERVICE_SUPERVISOR" },
"occurredAt": "2026-08-06T12:00:00+08:00",
"fromStatus": "PENDING",
"toStatus": "COMPLETED",
"summary": "判定主责并完成派工"
}
```
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"workOrderId": "WO-20260806-001",
"workOrderVersion": 7,
"actions": [
{ "code": "SAVE_INVESTIGATION_DRAFT", "enabled": true },
{ "code": "SUBMIT_INVESTIGATION", "enabled": false, "reasonCode": "PREREQUISITES_INCOMPLETE" }
]
}
}
```
### 8.8 待办与派工接口请求与响应字段定义
#### 8.8.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| TASK-01 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| TASK-01 | query | `pageSize` | integer | 是 | 每页数量 |
| TASK-01 | query | `stage` | enum | 否 | 任务环节 |
| TASK-01 | query | `status` | enum | 否 | 任务状态 |
| TASK-01 | query | `workOrderNo12398` | string | 否 | 12398 工单号 |
| TASK-01 | query | `customerName` | string | 否 | 客户名称 |
| TASK-02 | query | `workOrderNo12398` | string | 否 | 与任务列表相同口径的工单号条件 |
| TASK-02 | query | `customerName` | string | 否 | 与任务列表相同口径的客户条件 |
| TASK-02 | query | `status` | enum | 否 | 需要统计的任务状态 |
| TASK-03 | path | `taskId` | string | 是 | 任务标识 |
| DSP-01 | path | `id` | string | 是 | 工单标识 |
| DSP-01 | query | `responsibilityType` | enum | 是 | 用于筛选候选项;`PRIMARY``ASSIST` |
| DSP-02 | path | `id` | string | 是 | 工单标识 |
| DSP-02 | body | `workOrderVersion` | integer | 是 | 工单当前版本 |
| DSP-02 | body | `responsibilityType` | enum | 是 | 拟判定责任类型 |
| DSP-03 | path | `id` | string | 是 | 工单标识 |
| DSP-03 | body | `responsibilityType` | enum | 是 | 服务监督主管判定的 `PRIMARY``ASSIST` |
| DSP-03 | body | `preliminaryDeptIds[]` | string[] | 是 | 初查部门,至少 1 个且不可重复 |
| DSP-03 | body | `firstContactDeptId` | string/null | 条件 | 主责必填;协查必须为空 |
| DSP-03 | body | `serviceOfficerUserId` | string | 是 | 承办服务监督员用户标识 |
| DSP-03 | body | `escalationDeptIds[]` | string[] | 否 | 督办/协同部门标识集合 |
| DSP-03 | body | `dispatchMode` | enum | 是 | `MANUAL``SMART_CONFIRMED` |
| DSP-03 | body | `suggestionId` | string/null | 条件 | 采用智能建议时必填,人工派工为空 |
| DSP-03 | body | `workOrderVersion` | integer | 是 | 工单版本,用于并发校验 |
| DSP-03 | body | `requestId` | string | 是 | 幂等请求标识 |
| DSP-04 | path | `taskId` | string | 是 | 待分派任务标识 |
| DSP-04 | body | `assigneeType` | enum | 是 | `USER``POST` |
| DSP-04 | body | `assigneeUserId` | string/null | 条件 | `assigneeType=USER` 时必填 |
| DSP-04 | body | `assigneePostId` | string/null | 条件 | `assigneeType=POST` 时必填 |
| DSP-04 | body | `taskVersion` | integer | 是 | 任务版本 |
| DSP-04 | body | `requestId` | string | 是 | 幂等请求标识 |
| DSP-05 | path | `id` | string | 是 | 工单标识 |
| DSP-05 | body | `reviewTaskId` | string | 是 | 当前审核任务标识 |
| DSP-05 | body | `callbackDeptId` | string | 是 | 主责工单回访承接部门 |
| DSP-05 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| DSP-05 | body | `requestId` | string | 是 | 幂等请求标识 |
TASK-01、TASK-02、TASK-03 和 DSP-01 均无请求体。
#### 8.8.2 响应字段定义
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| TASK-01 | `total` | integer | 当前用户符合条件的任务总数 |
| TASK-01 | `rows[]` | object[] | 当前页任务摘要 |
| TASK-01 | `rows[].taskId` | string | 任务标识 |
| TASK-01 | `rows[].workOrderId`/`workOrderNo12398` | string | 工单标识及 12398 工单号 |
| TASK-01 | `rows[].stage`/`stageName` | string | 环节编码及名称 |
| TASK-01 | `rows[].status` | enum | 任务状态 |
| TASK-01 | `rows[].assignee` | object/null | 承办人或岗位摘要 |
| TASK-01 | `rows[].deadlineAt` | datetime/null | 截止时间 |
| TASK-01 | `rows[].version` | integer | 任务版本 |
| TASK-01 | `rows[].allowedActions[]` | string[] | 当前用户允许动作 |
| TASK-02 | `data.total` | integer | 与当前过滤条件一致的任务总数 |
| TASK-02 | `data.counts[]` | object[] | 按环节统计集合 |
| TASK-02 | `data.counts[].stage`/`name` | string | 环节编码及名称 |
| TASK-02 | `data.counts[].count` | integer | 环节任务数量 |
| TASK-02 | `data.filterFingerprint` | string | 统计条件指纹,用于核对列表与卡片口径 |
| TASK-03 | `data.task` | object | 当前任务,至少包含 `taskId``stage``status``version` |
| TASK-03 | `data.workOrder` | object | 工单摘要及 `responsibilityType``version` |
| TASK-03 | `data.form` | object/null | 当前表单类型、草稿版本和保存时间 |
| TASK-03 | `data.allowedActions[]` | string[] | 当前任务允许动作 |
| DSP-01 | `data.preliminaryDepartments[]` | object[] | 可选初查部门,包含 `deptId``deptName``enabled` |
| DSP-01 | `data.firstContactDepartments[]` | object[] | 主责可选首联部门;协查返回空数组 |
| DSP-01 | `data.serviceOfficers[]` | object[] | 可选服务监督员,包含用户和部门标识 |
| DSP-01 | `data.escalationDepartments[]` | object[] | 可选督办/协同部门 |
| DSP-01 | `data.workOrderVersion` | integer | 当前工单版本 |
| DSP-02 | `data.suggestionId` | string | 智能建议标识 |
| DSP-02 | `data.ruleVersion` | integer | 命中的规则版本 |
| DSP-02 | `data.responsibilityType` | enum | 建议对应的责任类型 |
| DSP-02 | `data.preliminaryDeptIds[]` | string[] | 建议初查部门 |
| DSP-02 | `data.firstContactDeptId` | string/null | 建议首联部门,协查为空 |
| DSP-02 | `data.serviceOfficerUserId` | string | 建议服务监督员 |
| DSP-02 | `data.escalationDeptIds[]` | string[] | 建议督办部门 |
| DSP-02 | `data.explanations[]` | string[] | 规则命中说明,不作为最终派工事实 |
| DSP-03 | `data.dispatchId` | string | 派工记录标识 |
| DSP-03 | `data.workOrderId` | string | 工单标识 |
| DSP-03 | `data.responsibilityType` | enum | 已持久化的责任类型 |
| DSP-03 | `data.currentStage` | enum | 派工后的当前环节;主责与协查取值不同 |
| DSP-03 | `data.workOrderVersion` | integer | 更新后的工单版本 |
| DSP-03 | `data.createdTasks[]` | object[] | 本次派工生成的任务集合 |
| DSP-03 | `data.createdTasks[].taskId` | string | 新任务标识 |
| DSP-03 | `data.createdTasks[].stage`/`status` | enum | 新任务环节及状态 |
| DSP-03 | `data.createdTasks[].deptId` | string/null | 部门任务的承接部门 |
| DSP-03 | `data.createdTasks[].submitReady` | boolean/null | 调查任务当前是否可提交 |
| DSP-04 | `data.taskId` | string | 被分派任务标识 |
| DSP-04 | `data.assignee` | object | 新承办对象 |
| DSP-04 | `data.assignedBy` | object | 分派操作人 |
| DSP-04 | `data.assignedAt` | datetime | 分派时间 |
| DSP-04 | `data.taskVersion` | integer | 更新后的任务版本 |
| DSP-05 | `data.workOrderId` | string | 工单标识 |
| DSP-05 | `data.callbackDeptId` | string | 已确定的回访承接部门 |
| DSP-05 | `data.workOrderVersion` | integer | 更新后的工单版本 |
#### 8.8.3 请求与响应示例
##### TASK-01/TASK-02/TASK-03
`GET /risk/tasks?pageNum=1&pageSize=20&stage=INVESTIGATION&status=IN_PROGRESS&workOrderNo12398=2026-08-06-001` 无 body。
```json
{
"total": 1,
"rows": [
{
"taskId": "TASK-INV-001",
"workOrderId": "WO-20260806-001",
"workOrderNo12398": "2026-08-06-001",
"stage": "INVESTIGATION",
"stageName": "调查结果填报",
"status": "IN_PROGRESS",
"assignee": { "type": "USER", "id": "1002", "name": "张某" },
"deadlineAt": "2026-08-08T18:00:00+08:00",
"version": 2,
"allowedActions": ["VIEW", "SAVE_DRAFT"]
}
],
"code": 200,
"msg": "查询成功"
}
```
`GET /risk/tasks/summary?workOrderNo12398=&customerName=` 无 body
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"total": 103,
"counts": [
{ "stage": "INVESTIGATION", "name": "调查结果填报", "count": 34 },
{ "stage": "REPORT", "name": "调查报告编写", "count": 12 }
],
"filterFingerprint": "sha256:62e8..."
}
}
```
`GET /risk/tasks/{taskId}` 返回工单摘要、任务、允许动作及当前表单版本:
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"task": { "taskId": "TASK-INV-001", "stage": "INVESTIGATION", "status": "IN_PROGRESS", "version": 2 },
"workOrder": { "workOrderId": "WO-20260806-001", "workOrderNo12398": "2026-08-06-001", "responsibilityType": "PRIMARY", "version": 7 },
"form": { "formType": "INVESTIGATION", "draftVersion": 3, "lastSavedAt": "2026-08-13T10:10:00+08:00" },
"allowedActions": ["SAVE_DRAFT"]
}
}
```
##### DSP-01 派工候选
`GET /risk/work-orders/{id}/dispatch-candidates?responsibilityType=PRIMARY` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"preliminaryDepartments": [{ "deptId": "D-OPS", "deptName": "运营部", "enabled": true }],
"firstContactDepartments": [{ "deptId": "D-CS1", "deptName": "客服一部", "enabled": true }],
"serviceOfficers": [{ "userId": "1002", "name": "张某", "deptId": "D-SERVICE", "enabled": true }],
"escalationDepartments": [{ "deptId": "D-BIZ", "deptName": "业务部", "enabled": true }],
"workOrderVersion": 3
}
}
```
##### DSP-02 智能派工建议
```json
{
"workOrderVersion": 3,
"responsibilityType": "PRIMARY"
}
```
```json
{
"code": 200,
"msg": "建议生成成功",
"data": {
"suggestionId": "DS-001",
"ruleVersion": 5,
"responsibilityType": "PRIMARY",
"preliminaryDeptIds": ["D-OPS"],
"firstContactDeptId": "D-CS1",
"serviceOfficerUserId": "1002",
"escalationDeptIds": [],
"explanations": ["问题分类为安全隐患,命中运营部初查规则"]
}
}
```
##### DSP-03 服务监督主管确认派工
主责请求体示例:
```json
{
"responsibilityType": "PRIMARY",
"preliminaryDeptIds": ["D-OPS", "D-BIZ"],
"firstContactDeptId": "D-CS1",
"serviceOfficerUserId": "1002",
"escalationDeptIds": [],
"dispatchMode": "MANUAL",
"suggestionId": null,
"workOrderVersion": 3,
"requestId": "04d7de39-3e48-4b1e-b327-e0048678ac6b"
}
```
协查请求体必须将 `firstContactDeptId` 设为 `null`
```json
{
"responsibilityType": "ASSIST",
"preliminaryDeptIds": ["D-OPS", "D-BIZ"],
"firstContactDeptId": null,
"serviceOfficerUserId": "1002",
"escalationDeptIds": [],
"dispatchMode": "MANUAL",
"suggestionId": null,
"workOrderVersion": 3,
"requestId": "bc14ae85-cebd-4784-a30a-b42a56419ee5"
}
```
```json
{
"code": 200,
"msg": "派工成功",
"data": {
"dispatchId": "DISP-001",
"workOrderId": "WO-20260806-001",
"responsibilityType": "PRIMARY",
"currentStage": "FIRST_CONTACT_AND_PRELIMINARY_INVESTIGATION",
"workOrderVersion": 4,
"createdTasks": [
{ "taskId": "TASK-FC-001", "stage": "FIRST_CONTACT_ASSIGN", "status": "PENDING" },
{ "taskId": "TASK-PI-001", "stage": "PRELIMINARY_INVESTIGATION", "status": "PENDING", "deptId": "D-OPS" },
{ "taskId": "TASK-PI-002", "stage": "PRELIMINARY_INVESTIGATION", "status": "PENDING", "deptId": "D-BIZ" },
{ "taskId": "TASK-INV-001", "stage": "INVESTIGATION", "status": "IN_PROGRESS", "submitReady": false }
]
}
}
```
##### DSP-04 班组/人员分派
```json
{
"assigneeType": "USER",
"assigneeUserId": "2001",
"assigneePostId": null,
"taskVersion": 1,
"requestId": "20cdb204-dc60-4182-bb9c-b6a1b5415c35"
}
```
响应采用 8.4.5 通用状态变更响应,并返回新的 `assignee``assignedBy``assignedAt`
##### DSP-05 回访承接部门
```json
{
"reviewTaskId": "TASK-BR-001",
"callbackDeptId": "D-CS1",
"workOrderVersion": 10,
"requestId": "3197100b-1508-49c0-9d10-74459badbda2"
}
```
```json
{
"code": 200,
"msg": "回访承接部门已确定",
"data": {
"workOrderId": "WO-20260806-001",
"callbackDeptId": "D-CS1",
"workOrderVersion": 11
}
}
```
`PRIMARY` 工单允许调用;具体由一级还是二级审核调用仍属于 D-03 待确认项。
### 8.9 办理、审核与回访接口请求与响应字段定义
#### 8.9.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| ACT-01 | path | `taskId` | string | 是 | 当前办理任务标识 |
| ACT-01 | body | `formType` | enum | 是 | 表单类型,如 `INVESTIGATION` |
| ACT-01 | body | `formData` | object | 是 | 草稿业务字段;结构必须与对应正式提交接口一致,可部分填写 |
| ACT-01 | body | `draftVersion` | integer | 是 | 草稿版本;首次保存传 0 |
| ACT-01 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-02 | path | `taskId` | string | 是 | 首联任务标识 |
| ACT-02 | body | `firstContactAt` | datetime | 是 | 实际首联时间,不得晚于提交时间 |
| ACT-02 | body | `firstContactOrderNo` | string | 是 | 首联关联工单号 |
| ACT-02 | body | `firstContactContent` | string | 是 | 首联内容 |
| ACT-02 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-02 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-03 | path | `taskId` | string | 是 | 初查任务标识 |
| ACT-03 | body | `preliminaryContent` | string | 是 | 本部门初查结论和事实说明 |
| ACT-03 | body | `attachmentFileIds[]` | string[] | 否 | 已上传且有权绑定的初查附件 |
| ACT-03 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-03 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-04 | path | `taskId` | string | 是 | 全面调查任务标识;无请求体 |
| ACT-05 | path | `taskId` | string | 是 | 全面调查任务标识 |
| ACT-05 | body | `acceptedContent12398` | string | 是 | 12398 受理内容 |
| ACT-05 | body | `externalExposureRisk` | boolean | 是 | 是否存在外部曝光风险 |
| ACT-05 | body | `internalAppealIssued` | boolean | 是 | 是否已下发内部诉求 |
| ACT-05 | body | `customerAppealSummary` | string | 是 | 客户诉求摘要 |
| ACT-05 | body | `escalationReason` | string | 否 | 升级/督办原因 |
| ACT-05 | body | `investigationProcess` | string | 是 | 调查过程 |
| ACT-05 | body | `localResponsibility` | boolean | 是 | 是否属于本单位责任 |
| ACT-05 | body | `handlingSituation` | string | 是 | 当前处理情况 |
| ACT-05 | body | `accountable` | boolean | 是 | 是否需要问责 |
| ACT-05 | body | `hasHandlingBasis` | boolean | 是 | 是否存在处理依据 |
| ACT-05 | body | `handlingMethod` | string | 是 | 处理方式 |
| ACT-05 | body | `handlingResult` | string | 是 | 处理结果 |
| ACT-05 | body | `investigationSummary` | string | 是 | 调查结论摘要 |
| ACT-05 | body | `draftVersion` | integer | 是 | 本次提交依据的草稿版本 |
| ACT-05 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-05 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-05 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-06 | path | `taskId` | string | 是 | 服务监督主管审核任务标识 |
| ACT-06 | body | `result` | enum | 是 | `APPROVED``REJECTED` |
| ACT-06 | body | `rejectReason` | string/null | 条件 | 驳回时必填,通过时为空 |
| ACT-06 | body | `investigationVersion` | integer | 是 | 审核所依据的调查版本 |
| ACT-06 | body | `taskVersion` | integer | 是 | 审核任务版本 |
| ACT-06 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-06 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-07 | path | `taskId` | string | 是 | 业务部主任审核任务标识 |
| ACT-07 | body | `result` | enum | 是 | `APPROVED``REJECTED` |
| ACT-07 | body | `rejectReason` | string/null | 条件 | 驳回时必填 |
| ACT-07 | body | `callbackDeptId` | string/null | 条件 | 若 D-03 确认为二级审核选部门,则主责通过时必填;协查必须为空 |
| ACT-07 | body | `investigationVersion` | integer | 是 | 审核依据的调查版本 |
| ACT-07 | body | `taskVersion` | integer | 是 | 审核任务版本 |
| ACT-07 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-07 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-08 | path | `taskId` | string | 是 | 主责工单的班组回访任务标识 |
| ACT-08 | body | `contactedAt` | datetime | 是 | 联系客户时间 |
| ACT-08 | body | `contactPhone` | string | 是 | 实际联系号码,敏感字段 |
| ACT-08 | body | `contactResult` | enum | 是 | 联系结果,如 `CONNECTED``NOT_CONNECTED` |
| ACT-08 | body | `contactSummary` | string | 是 | 回访执行摘要 |
| ACT-08 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-08 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-09 | path | `taskId` | string | 是 | 服务监督员回访结果任务标识 |
| ACT-09 | body | `respondentName` | string | 是 | 回复人姓名 |
| ACT-09 | body | `repliedAt` | datetime | 是 | 回复时间 |
| ACT-09 | body | `replyPhone` | string | 是 | 回复联系电话,敏感字段 |
| ACT-09 | body | `replySituation` | string | 是 | 回复情况 |
| ACT-09 | body | `callbackResult` | enum | 是 | `AGREE``DISAGREE_OR_CUSTOMER_REQUEST` |
| ACT-09 | body | `responseLetterFileIds[]` | string[] | 条件 | 不同意或客户主动要求时至少 1 个 |
| ACT-09 | body | `deliveryProofFileIds[]` | string[] | 条件 | 不同意或客户主动要求时至少 1 个 |
| ACT-09 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-09 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-09 | body | `requestId` | string | 是 | 幂等请求标识 |
#### 8.9.2 响应字段定义
除下列业务字段外,状态变更接口同时返回 8.4.5 定义的任务状态、当前环节、工单版本、任务版本和后续任务。
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| ACT-01 | `data.taskId` | string | 草稿所属任务 |
| ACT-01 | `data.draftVersion` | integer | 保存后的草稿版本 |
| ACT-01 | `data.taskVersion` | integer | 更新后的任务版本 |
| ACT-01 | `data.savedAt` | datetime | 服务端保存时间 |
| ACT-01 | `data.submitReady` | boolean | 当前是否满足正式提交条件 |
| ACT-02 | `data.firstContactId` | string | 不可变首联记录标识 |
| ACT-02 | `data.taskStatus` | enum | 首联任务完成后的状态 |
| ACT-02 | `data.workOrderVersion`/`taskVersion` | integer | 更新后的版本 |
| ACT-02 | `data.nextTasks[]` | object[] | 因首联完成而更新或生成的任务 |
| ACT-03 | `data.preliminaryInvestigationId` | string | 不可变初查记录标识 |
| ACT-03 | `data.taskId`/`taskStatus` | string/enum | 初查任务及完成状态 |
| ACT-03 | `data.completedCount`/`totalCount` | integer | 并行初查完成数及总数 |
| ACT-03 | `data.investigationSubmitReady` | boolean | 全面调查是否满足提交前置条件 |
| ACT-03 | `data.workOrderVersion`/`taskVersion` | integer | 更新后的版本 |
| ACT-04 | `data.taskId` | string | 全面调查任务标识 |
| ACT-04 | `data.taskVersion`/`workOrderVersion` | integer | 当前任务及工单版本 |
| ACT-04 | `data.responsibilityType` | enum | 主责或协查 |
| ACT-04 | `data.firstContact` | object/null | 主责首联结果;协查固定为空 |
| ACT-04 | `data.preliminaryProgress` | object | 并行初查完成数、总数及任务明细 |
| ACT-04 | `data.preliminaryProgress.items[]` | object[] | 各部门初查任务的 `taskId`、部门和状态 |
| ACT-04 | `data.draft` | object/null | 草稿版本及表单数据 |
| ACT-04 | `data.submitReady` | boolean | 是否允许提交全面调查 |
| ACT-04 | `data.incompletePrerequisites[]` | string[] | 未完成的前置任务标识 |
| ACT-05 | `data.investigationId` | string | 不可变调查记录标识 |
| ACT-05 | `data.investigationVersion` | integer | 本次形成的调查版本 |
| ACT-05 | `data.currentStage` | enum | 提交后进入 `SUPERVISOR_REVIEW` |
| ACT-05 | `data.nextTasks[]` | object[] | 新建的服务监督主管审核任务 |
| ACT-06 | `data.reviewId` | string | 审核记录标识 |
| ACT-06 | `data.reviewLevel` | enum | 固定为 `SUPERVISOR` |
| ACT-06 | `data.reviewResult` | enum | 审核结果 |
| ACT-06 | `data.currentStage` | enum | 通过进入业务审核,驳回回到调查 |
| ACT-06 | `data.nextTasks[]` | object[] | 业务审核或返工任务 |
| ACT-07 | `data.reviewId` | string | 业务审核记录标识 |
| ACT-07 | `data.responsibilityType` | enum | 服务端从派工记录读取的责任类型 |
| ACT-07 | `data.currentStage` | enum | 主责通过为 `CALLBACK_ASSIGN`;协查通过为 `REPORT`;驳回为 `INVESTIGATION` |
| ACT-07 | `data.nextTasks[]` | object[] | 按唯一业务分支生成的任务 |
| ACT-08 | `data.callbackExecutionId` | string | 班组回访执行记录标识 |
| ACT-08 | `data.taskStatus` | enum | 回访执行任务状态 |
| ACT-08 | `data.nextTasks[]` | object[] | 后续服务监督员回访结果任务 |
| ACT-09 | `data.callbackResultId` | string | 回访结果记录标识 |
| ACT-09 | `data.callbackResult` | enum | 已保存的回访结果 |
| ACT-09 | `data.currentStage` | enum | 成功后进入 `REPORT` |
| ACT-09 | `data.nextTasks[]` | object[] | 新建调查报告任务 |
#### 8.9.3 请求与响应示例
##### ACT-01 保存草稿
```json
{
"formType": "INVESTIGATION",
"formData": {
"investigationSummary": "经初查,台区监测记录存在短时电压波动。",
"customerAppealSummary": "客户要求核查原因并恢复稳定供电。",
"investigationProcess": "已调取历史记录并组织现场检查。"
},
"draftVersion": 3,
"taskVersion": 2
}
```
```json
{
"code": 200,
"msg": "草稿已保存",
"data": {
"taskId": "TASK-INV-001",
"draftVersion": 4,
"taskVersion": 3,
"savedAt": "2026-08-13T10:30:00+08:00",
"submitReady": false
}
}
```
##### ACT-02 提交首联
```json
{
"firstContactAt": "2026-08-12T14:32:00+08:00",
"firstContactOrderNo": "2026-08-06-001",
"firstContactContent": "已联系客户核实情况并告知后续调查安排。",
"taskVersion": 1,
"requestId": "b4e95b87-3ec4-4207-aa85-d2df28641cc0"
}
```
响应采用 8.4.5,并返回 `firstContactId`;协查工单调用时返回 `RISK-4091`
##### ACT-03 提交事件初查
```json
{
"preliminaryContent": "现场检查设备运行正常,监测到短时电压波动。",
"attachmentFileIds": ["FILE-PI-001"],
"taskVersion": 1,
"requestId": "85dd9477-c5df-444e-8b31-6fd660bc36ee"
}
```
```json
{
"code": 200,
"msg": "初查结果已提交",
"data": {
"preliminaryInvestigationId": "PINV-001",
"taskId": "TASK-PI-001",
"taskStatus": "COMPLETED",
"completedCount": 2,
"totalCount": 3,
"investigationSubmitReady": false,
"workOrderVersion": 6,
"taskVersion": 2
}
}
```
##### ACT-04 全面调查上下文
`GET /risk/tasks/{taskId}/investigation-context` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"taskId": "TASK-INV-001",
"taskVersion": 3,
"workOrderVersion": 7,
"responsibilityType": "PRIMARY",
"firstContact": { "status": "COMPLETED", "firstContactAt": "2026-08-12T14:32:00+08:00", "content": "已完成首联" },
"preliminaryProgress": {
"completedCount": 1,
"totalCount": 3,
"items": [
{ "taskId": "TASK-PI-001", "deptId": "D-OPS", "deptName": "运营部", "status": "COMPLETED" },
{ "taskId": "TASK-PI-002", "deptId": "D-BIZ", "deptName": "业务部", "status": "PENDING" }
]
},
"draft": { "draftVersion": 4, "formData": {} },
"submitReady": false,
"incompletePrerequisites": ["TASK-PI-002", "TASK-PI-003"]
}
}
```
协查响应中的 `firstContact` 必须为 `null`,其 `submitReady` 只依据全部事件初查是否完成。
##### ACT-05 提交全面调查
```json
{
"acceptedContent12398": "客户反映近期电压不稳,设备频繁重启。",
"externalExposureRisk": false,
"internalAppealIssued": false,
"customerAppealSummary": "客户要求核查电压不稳原因并恢复稳定供电。",
"escalationReason": "问题偶发且多次反映。",
"investigationProcess": "调取95598历史记录及台区监测数据并现场检查。",
"localResponsibility": true,
"handlingSituation": "已完成线路及设备检查。",
"accountable": false,
"hasHandlingBasis": true,
"handlingMethod": "调整运行参数并增加监测频次。",
"handlingResult": "当前数据恢复正常,后续持续跟踪。",
"investigationSummary": "存在短时波动,已完成处置。",
"draftVersion": 4,
"taskVersion": 3,
"workOrderVersion": 7,
"requestId": "b6848224-1277-421e-907e-4a1f4c1039bb"
}
```
响应采用 8.4.5,并额外返回不可变的 `investigationId``investigationVersion`。前置任务未完成返回 `RISK-4220`
##### ACT-06 服务监督主管审核
```json
{
"result": "APPROVED",
"rejectReason": null,
"investigationVersion": 1,
"taskVersion": 1,
"workOrderVersion": 8,
"requestId": "2ec9fd4b-c493-44dc-b1fd-8e70f72754ab"
}
```
```json
{
"code": 200,
"msg": "审核通过",
"data": {
"reviewId": "REV-S-001",
"reviewLevel": "SUPERVISOR",
"reviewResult": "APPROVED",
"currentStage": "BUSINESS_REVIEW",
"workOrderVersion": 9,
"taskVersion": 2,
"nextTasks": [{ "taskId": "TASK-BR-001", "stage": "BUSINESS_REVIEW", "status": "PENDING" }]
}
}
```
驳回时 `result``REJECTED``rejectReason` 必填;响应的 `currentStage` 回到 `INVESTIGATION`,并返回新建返工任务。
##### ACT-07 业务部主任审核
主责审核通过且 D-03 决定由二级审核选回访部门时:
```json
{
"result": "APPROVED",
"rejectReason": null,
"callbackDeptId": "D-CS1",
"investigationVersion": 1,
"taskVersion": 1,
"workOrderVersion": 9,
"requestId": "6c704449-6022-40fa-a7bb-509b879e93ee"
}
```
协查审核请求体必须省略或将 `callbackDeptId` 设为 `null`。主责响应:
```json
{
"code": 200,
"msg": "审核通过,进入回访分配",
"data": {
"reviewId": "REV-B-001",
"responsibilityType": "PRIMARY",
"currentStage": "CALLBACK_ASSIGN",
"workOrderVersion": 10,
"taskVersion": 2,
"nextTasks": [{ "taskId": "TASK-CA-001", "stage": "CALLBACK_ASSIGN", "status": "PENDING", "deptId": "D-CS1" }]
}
}
```
协查响应:
```json
{
"code": 200,
"msg": "审核通过,直接进入调查报告编写",
"data": {
"reviewId": "REV-B-002",
"responsibilityType": "ASSIST",
"currentStage": "REPORT",
"workOrderVersion": 10,
"taskVersion": 2,
"nextTasks": [{ "taskId": "TASK-RPT-001", "stage": "REPORT", "status": "PENDING" }]
}
}
```
服务端必须根据派工记录中的 `responsibilityType` 生成唯一分支,不接受客户端通过目标状态控制分支。
##### ACT-08 提交班组回访
班组回访字段仍待业务确认,当前最小请求体建议为:
```json
{
"contactedAt": "2026-08-13T15:20:00+08:00",
"contactPhone": "13800008888",
"contactResult": "CONNECTED",
"contactSummary": "已向客户说明处理情况。",
"taskVersion": 1,
"requestId": "8f596b61-fcd9-4d52-93cc-0908c4654b8c"
}
```
响应采用 8.4.5,并返回 `callbackExecutionId`;仅主责回访任务允许调用。
##### ACT-09 服务监督员提交回访结果
“同意”分支:
```json
{
"respondentName": "监督员A(张某)",
"repliedAt": "2026-08-13T16:00:00+08:00",
"replyPhone": "13100007777",
"replySituation": "客户认可处理结果。",
"callbackResult": "AGREE",
"responseLetterFileIds": [],
"deliveryProofFileIds": [],
"taskVersion": 1,
"workOrderVersion": 12,
"requestId": "84808ee5-c306-4543-89e1-53f733e2a3c8"
}
```
“不同意或客户主动要求”分支:
```json
{
"respondentName": "监督员A(张某)",
"repliedAt": "2026-08-13T16:00:00+08:00",
"replyPhone": "13100007777",
"replySituation": "客户要求提供书面答复。",
"callbackResult": "DISAGREE_OR_CUSTOMER_REQUEST",
"responseLetterFileIds": ["FILE-RL-001"],
"deliveryProofFileIds": ["FILE-DP-001"],
"taskVersion": 1,
"workOrderVersion": 12,
"requestId": "560215f4-cab9-4ff2-806f-d47950116eea"
}
```
响应采用 8.4.5,并创建 `REPORT` 任务。缺少任一类附件返回 `RISK-4221`
### 8.10 调查报告、成果物与办结接口请求与响应字段定义
#### 8.10.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| ACT-10 | path | `taskId` | string | 是 | 调查报告任务标识;无请求体 |
| ACT-11 | path | `taskId` | string | 是 | 调查报告任务标识 |
| ACT-11 | body | `templateId` | string | 是 | 报告模板标识 |
| ACT-11 | body | `templateVersion` | integer | 是 | 报告模板版本 |
| ACT-11 | body | `investigationVersion` | integer | 是 | 锁定的调查版本 |
| ACT-11 | body | `callbackVersion` | integer/null | 条件 | 主责必填;协查必须为空 |
| ACT-11 | body | `taskVersion` | integer | 是 | 报告任务版本 |
| ACT-11 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-11 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-12 | path | `reportId` | string | 是 | 已生成报告标识;无请求体 |
| ACT-13 | path | `taskId` | string | 是 | 成果物提交任务标识 |
| ACT-13 | body | `reportId` | string | 是 | 已生成报告标识 |
| ACT-13 | body | `reportVersion` | integer | 是 | 报告版本 |
| ACT-13 | body | `deliverables[]` | object[] | 是 | 成果物集合,至少 1 项 |
| ACT-13 | body | `deliverables[].type` | enum | 是 | 成果物类型 |
| ACT-13 | body | `deliverables[].fileId` | string | 是 | 已上传并有权绑定的文件标识 |
| ACT-13 | body | `taskVersion` | integer | 是 | 任务版本 |
| ACT-13 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-13 | body | `requestId` | string | 是 | 幂等请求标识 |
| ACT-14 | path | `id` | string | 是 | 工单标识 |
| ACT-14 | body | `closeReason` | string | 是 | 办结原因/说明 |
| ACT-14 | body | `deliverableSetId` | string | 是 | 已提交成果物集合标识 |
| ACT-14 | body | `workOrderVersion` | integer | 是 | 工单版本 |
| ACT-14 | body | `requestId` | string | 是 | 幂等请求标识 |
#### 8.10.2 响应字段定义
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| ACT-10 | `data.taskId`/`taskVersion` | string/integer | 报告任务及版本 |
| ACT-10 | `data.workOrder` | object | 工单标识、12398 工单号、责任类型和版本 |
| ACT-10 | `data.investigation` | object | 锁定的调查记录、版本、提交时间和结构化数据 |
| ACT-10 | `data.callback` | object/null | 主责的回访结果;协查固定为空 |
| ACT-10 | `data.attachments[]` | object[] | 报告可引用附件 |
| ACT-10 | `data.template` | object | 模板标识、版本和名称 |
| ACT-10 | `data.output` | object | 输出状态、报告标识和文件标识 |
| ACT-10 | `data.allowedActions[]` | string[] | 当前允许的报告动作 |
| ACT-11 | `data.reportId` | string | 报告标识 |
| ACT-11 | `data.jobId` | string/null | 异步生成任务标识;同步生成时为空 |
| ACT-11 | `data.outputStatus` | enum | `GENERATING``READY``FAILED` |
| ACT-11 | `data.fileId`/`fileName` | string/null | 同步完成或异步完成后的文件信息 |
| ACT-11 | `data.contentType` | string/null | 报告文件 MIME 类型 |
| ACT-11 | `data.downloadable` | boolean | 当前是否可下载 |
| ACT-11 | `data.taskVersion`/`workOrderVersion` | integer | 更新后的版本 |
| ACT-12 | HTTP body | binary | 报告文件流 |
| ACT-12 | `Content-Type` | string | 报告文件 MIME 类型 |
| ACT-12 | `Content-Disposition` | string | 下载文件名 |
| ACT-12 | `X-File-Id` | string | 输出文件标识 |
| ACT-12 | `X-Report-Version` | integer | 报告版本 |
| ACT-13 | `data.deliverableSetId` | string | 成果物集合标识 |
| ACT-13 | `data.taskStatus` | enum | 成果物任务状态 |
| ACT-13 | `data.currentStage` | enum | 当前流程环节 |
| ACT-13 | `data.readyToClose` | boolean | 是否满足办结条件 |
| ACT-13 | `data.taskVersion`/`workOrderVersion` | integer | 更新后的版本 |
| ACT-14 | `data.workOrderId` | string | 已办结工单标识 |
| ACT-14 | `data.orderStatus` | enum | 固定为 `CLOSED` |
| ACT-14 | `data.currentStage` | enum | 办结时所在环节 |
| ACT-14 | `data.closedAt` | datetime | 服务端办结时间 |
| ACT-14 | `data.closedBy` | object | 办结人,包含 `userId``name` |
| ACT-14 | `data.workOrderVersion` | integer | 更新后的工单版本 |
#### 8.10.3 请求与响应示例
##### ACT-10 报告上下文
`GET /risk/tasks/{taskId}/report-context` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"taskId": "TASK-RPT-001",
"taskVersion": 1,
"workOrder": { "workOrderId": "WO-20260806-009", "workOrderNo12398": "2026-08-06-009", "responsibilityType": "ASSIST", "version": 10 },
"investigation": { "investigationId": "INV-009", "version": 1, "submittedAt": "2026-08-13T10:00:00+08:00", "data": {} },
"callback": null,
"attachments": [],
"template": { "templateId": "TPL-RPT-001", "templateVersion": 2, "name": "12398调查报告" },
"output": { "status": "PENDING", "reportId": null, "fileId": null },
"allowedActions": ["CONFIRM_REPORT"]
}
}
```
主责工单的 `callback` 必须包含已完成的回访版本;协查必须为 `null`
##### ACT-11 确认生成报告
```json
{
"templateId": "TPL-RPT-001",
"templateVersion": 2,
"investigationVersion": 1,
"callbackVersion": null,
"taskVersion": 1,
"workOrderVersion": 10,
"requestId": "aec607a6-a962-4f97-9650-d49624988bcb"
}
```
异步生成响应建议使用 HTTP `202 Accepted`
```json
{
"code": 200,
"msg": "报告生成任务已创建",
"data": {
"reportId": "RPT-001",
"jobId": "JOB-RPT-001",
"outputStatus": "GENERATING",
"taskVersion": 2,
"workOrderVersion": 11
}
}
```
若实现为同步生成,可返回 HTTP 200,并直接提供 `fileId``fileName``contentType``downloadable: true`
##### ACT-12 下载报告
`GET /risk/reports/{reportId}/download` 无 body。成功返回受控文件流:
```http
Content-Type: application/pdf
Content-Disposition: attachment; filename="2026-08-06-009-调查报告.pdf"
X-File-Id: FILE-RPT-001
X-Report-Version: 1
```
报告仍在生成时返回 HTTP 409、`RISK-4091`;生成失败时响应应包含可展示的失败原因和是否允许重新生成。
##### ACT-13 提交成果物
```json
{
"reportId": "RPT-001",
"reportVersion": 1,
"deliverables": [
{ "type": "INVESTIGATION_REPORT", "fileId": "FILE-RPT-001" },
{ "type": "SUPPORTING_MATERIAL", "fileId": "FILE-SUP-001" }
],
"taskVersion": 1,
"workOrderVersion": 11,
"requestId": "e2f3d22c-2be0-461c-b9e5-c089ea4c0e9c"
}
```
```json
{
"code": 200,
"msg": "成果物已提交",
"data": {
"deliverableSetId": "DEL-001",
"taskStatus": "COMPLETED",
"currentStage": "DELIVERABLE",
"readyToClose": true,
"taskVersion": 2,
"workOrderVersion": 12
}
}
```
##### ACT-14 确认办结
```json
{
"closeReason": "调查、审核、报告及成果物均已完成",
"deliverableSetId": "DEL-001",
"workOrderVersion": 12,
"requestId": "995a8d84-a776-4dd8-98ca-779004ab8cbb"
}
```
```json
{
"code": 200,
"msg": "工单已办结",
"data": {
"workOrderId": "WO-20260806-001",
"orderStatus": "CLOSED",
"currentStage": "DELIVERABLE",
"closedAt": "2026-08-13T17:30:00+08:00",
"closedBy": { "userId": "1002", "name": "张某" },
"workOrderVersion": 13
}
}
```
### 8.11 文件、字典、配置、统计与异步任务接口请求与响应字段定义
#### 8.11.1 请求字段定义
| 接口 | 字段位置 | 字段 | 类型 | 必填 | 定义 |
| --- | --- | --- | --- | :---: | --- |
| FILE-01 | multipart | `file` | binary | 是 | 待上传文件,须校验大小、扩展名、MIME 和安全风险 |
| FILE-01 | multipart | `purpose` | enum | 是 | 文件用途,取值见 8.12 |
| FILE-01 | multipart | `workOrderId` | string | 是 | 所属工单标识 |
| FILE-01 | multipart | `taskId` | string | 条件 | 任务办理过程中上传时必填 |
| FILE-02 | path | `fileId` | string | 是 | 文件标识;无请求体 |
| FILE-03 | path | `fileId` | string | 是 | 临时文件标识 |
| FILE-03 | query | `version` | integer | 是 | 文件记录版本;无请求体 |
| DICT-01 | path | `type` | string | 是 | 字典类型编码 |
| DICT-01 | query | `enabled` | boolean | 否 | 是否只返回启用项,默认 `true` |
| CFG-01 | — | — | — | — | 无查询参数、无请求体 |
| CFG-02 | body | `configVersion` | integer | 是 | 当前时限配置版本 |
| CFG-02 | body | `totalLimitMinutes` | integer | 是 | 全流程总时限,必须为正整数 |
| CFG-02 | body | `stages[]` | object[] | 是 | 环节时限集合 |
| CFG-02 | body | `stages[].stageCode` | enum | 是 | 环节编码,不得重复 |
| CFG-02 | body | `stages[].limitMinutes` | integer | 是 | 环节时限,必须为正整数 |
| CFG-02 | body | `effectiveFrom` | datetime | 是 | 新版本生效时间 |
| CFG-02 | body | `changeReason` | string | 是 | 变更原因 |
| CFG-02 | body | `publish` | boolean | 是 | 是否立即发布 |
| CFG-03 | — | — | — | — | 无查询参数、无请求体 |
| CFG-04 | body | `ruleVersion` | integer | 是 | 当前规则版本 |
| CFG-04 | body | `rules[]` | object[] | 是 | 派工规则集合 |
| CFG-04 | body | `rules[].ruleId` | string | 条件 | 修改已有规则时必填;新增时可为空 |
| CFG-04 | body | `rules[].priority` | integer | 是 | 规则优先级,数值冲突处理方式待确认 |
| CFG-04 | body | `rules[].conditions[]` | object[] | 是 | 匹配条件集合 |
| CFG-04 | body | `rules[].conditions[].field` | string | 是 | 条件字段,必须来自白名单 |
| CFG-04 | body | `rules[].conditions[].operator` | enum | 是 | 比较操作符 |
| CFG-04 | body | `rules[].conditions[].value` | any | 是 | 比较值,类型须与字段一致 |
| CFG-04 | body | `rules[].result` | object | 是 | 派工建议结果 |
| CFG-04 | body | `rules[].enabled` | boolean | 是 | 规则是否启用 |
| CFG-04 | body | `effectiveFrom` | datetime | 是 | 生效时间 |
| CFG-04 | body | `changeReason` | string | 是 | 变更原因 |
| CFG-04 | body | `publish` | boolean | 是 | 是否发布 |
| ANA-01 | query | `from` | date | 是 | 统计开始日期,含边界 |
| ANA-01 | query | `to` | date | 是 | 统计结束日期,含边界 |
| ANA-01 | query | `deptId` | string | 否 | 部门范围;仍受当前用户数据权限约束 |
| ANA-02 | query | `pageNum` | integer | 是 | 页码,从 1 开始 |
| ANA-02 | query | `pageSize` | integer | 是 | 每页数量 |
| ANA-02 | query | `from` | date | 是 | 办结开始日期 |
| ANA-02 | query | `to` | date | 是 | 办结结束日期 |
| ANA-02 | query | `deptId` | string | 否 | 部门范围 |
| JOB-01 | path | `jobId` | string | 是 | 异步任务标识;无请求体 |
#### 8.11.2 响应字段定义
| 接口 | 响应字段 | 类型 | 定义 |
| --- | --- | --- | --- |
| FILE-01 | `data.fileId` | string | 文件标识,后续业务接口仅传此标识 |
| FILE-01 | `data.fileName` | string | 安全处理后的文件名 |
| FILE-01 | `data.contentType` | string | 服务端识别的 MIME 类型 |
| FILE-01 | `data.size` | integer | 文件字节数 |
| FILE-01 | `data.sha256` | string | 文件摘要 |
| FILE-01 | `data.purpose` | enum | 文件用途 |
| FILE-01 | `data.bindingStatus` | enum | `TEMPORARY``BOUND` |
| FILE-01 | `data.uploadedAt` | datetime | 上传完成时间 |
| FILE-02 | HTTP body | binary | 受控文件流 |
| FILE-02 | `Content-Type` | string | 文件 MIME 类型 |
| FILE-02 | `Content-Disposition` | string | 内联播放或附件下载及安全文件名 |
| FILE-02 | `Content-Length` | integer | 文件字节数 |
| FILE-03 | `data.fileId` | string | 已删除临时文件标识 |
| FILE-03 | `data.deleted` | boolean | 是否删除成功 |
| DICT-01 | `data.type` | string | 字典类型 |
| DICT-01 | `data.version` | integer | 字典版本 |
| DICT-01 | `data.items[]` | object[] | 字典项集合 |
| DICT-01 | `data.items[].value`/`label` | string | 字典编码及显示名称 |
| DICT-01 | `data.items[].sort` | integer | 排序值 |
| DICT-01 | `data.items[].enabled` | boolean | 是否启用 |
| CFG-01/CFG-02 | `data.configId` | string | 时限配置标识 |
| CFG-01/CFG-02 | `data.configVersion` | integer | 配置版本 |
| CFG-01/CFG-02 | `data.status` | enum | 草稿、启用或停用 |
| CFG-01/CFG-02 | `data.totalLimitMinutes` | integer | 全流程总时限 |
| CFG-01/CFG-02 | `data.stages[]` | object[] | 环节编码及分钟数 |
| CFG-01/CFG-02 | `data.effectiveFrom` | datetime | 生效时间 |
| CFG-03/CFG-04 | `data.ruleSetId` | string | 规则集标识 |
| CFG-03/CFG-04 | `data.ruleVersion` | integer | 规则版本 |
| CFG-03/CFG-04 | `data.status` | enum | 规则集状态 |
| CFG-03/CFG-04 | `data.rules[]` | object[] | 规则、条件和建议结果集合 |
| CFG-03/CFG-04 | `data.effectiveFrom` | datetime | 生效时间 |
| ANA-01 | `data.period` | object | 实际统计日期范围 |
| ANA-01 | `data.metrics.importedCount` | integer | 导入工单数 |
| ANA-01 | `data.metrics.processingCount` | integer | 处理中工单数 |
| ANA-01 | `data.metrics.closedCount` | integer | 已办结工单数 |
| ANA-01 | `data.metrics.overdueCount` | integer | 逾期工单数 |
| ANA-01 | `data.metrics.primaryCount` | integer | 主责工单数 |
| ANA-01 | `data.metrics.assistCount` | integer | 协查工单数 |
| ANA-01 | `data.generatedAt` | datetime | 统计数据生成时间 |
| ANA-02 | `total` | integer | 已办结工单总数 |
| ANA-02 | `rows[]` | object[] | 工单摘要,继承 WO-01 并增加办结字段 |
| ANA-02 | `rows[].closedAt` | datetime | 办结时间 |
| ANA-02 | `rows[].durationMinutes` | integer | 从规定起点到办结的耗时分钟数,口径待 D-07 确认 |
| ANA-02 | `rows[].overdue` | boolean | 是否逾期 |
| JOB-01 | `data.jobId` | string | 异步任务标识 |
| JOB-01 | `data.jobType` | enum | 任务类型,如导入或报告生成 |
| JOB-01 | `data.status` | enum | `PENDING``RUNNING``SUCCEEDED``FAILED``CANCELLED` |
| JOB-01 | `data.progress` | integer | 0100 的整数进度 |
| JOB-01 | `data.createdAt`/`finishedAt` | datetime/null | 创建和结束时间 |
| JOB-01 | `data.result` | object/null | 成功结果;结构由 `jobType` 决定 |
| JOB-01 | `data.error` | object/null | 失败信息,至少包含稳定错误码和说明 |
#### 8.11.3 请求与响应示例
##### FILE-01/FILE-02/FILE-03 文件接口
`POST /risk/files` 使用 `multipart/form-data``file``purpose``workOrderId``taskId``purpose` 取值见 8.12。
```json
{
"code": 200,
"msg": "上传成功",
"data": {
"fileId": "FILE-RL-001",
"fileName": "答复书.pdf",
"contentType": "application/pdf",
"size": 248102,
"sha256": "53dd...a8cb",
"purpose": "RESPONSE_LETTER",
"bindingStatus": "TEMPORARY",
"uploadedAt": "2026-08-13T15:45:00+08:00"
}
}
```
FILE-02 `GET /risk/files/{fileId}` 无 body,成功返回受控文件流;无权访问返回 `RISK-4031`。FILE-03
```http
DELETE /risk/files/{fileId}?version=1
```
```json
{ "code": 200, "msg": "临时文件已删除", "data": { "fileId": "FILE-RL-001", "deleted": true } }
```
已绑定业务记录的文件不得通过 FILE-03 删除。
##### DICT-01 字典
`GET /risk/dictionaries/{type}?enabled=true` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"type": "RESPONSIBILITY_TYPE",
"version": 1,
"items": [
{ "value": "PRIMARY", "label": "主责", "sort": 1, "enabled": true },
{ "value": "ASSIST", "label": "协查", "sort": 2, "enabled": true }
]
}
}
```
##### CFG-01/CFG-02 时限配置
`GET /risk/config/sla` 无 body;响应:
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"configId": "SLA-001",
"configVersion": 3,
"status": "ENABLED",
"totalLimitMinutes": 188,
"stages": [
{ "stageCode": "DISPATCH", "limitMinutes": 20 },
{ "stageCode": "FIRST_CONTACT", "limitMinutes": 30 },
{ "stageCode": "PRELIMINARY_INVESTIGATION", "limitMinutes": 60 }
],
"effectiveFrom": "2026-08-01T00:00:00+08:00"
}
}
```
`PUT /risk/config/sla` 请求体:
```json
{
"configVersion": 3,
"totalLimitMinutes": 188,
"stages": [
{ "stageCode": "DISPATCH", "limitMinutes": 20 },
{ "stageCode": "FIRST_CONTACT", "limitMinutes": 30 },
{ "stageCode": "PRELIMINARY_INVESTIGATION", "limitMinutes": 60 }
],
"effectiveFrom": "2026-09-01T00:00:00+08:00",
"changeReason": "调整事件初查时限",
"publish": true
}
```
响应返回新的 `configId``configVersion``status``effectiveFrom`,不得覆盖旧版本。
##### CFG-03/CFG-04 派工规则
`GET /risk/config/dispatch-rules` 无 body;响应 `data` 至少包含 `ruleSetId``ruleVersion``status``rules`
```json
{
"ruleVersion": 5,
"rules": [
{
"ruleId": "RULE-001",
"priority": 10,
"conditions": [{ "field": "problemCategoryCode", "operator": "EQ", "value": "SAFETY_RISK" }],
"result": { "preliminaryDeptIds": ["D-OPS"] },
"enabled": true
}
],
"effectiveFrom": "2026-09-01T00:00:00+08:00",
"changeReason": "安全隐患默认由运营部初查",
"publish": true
}
```
响应返回新规则版本和发布状态。规则 DSL、冲突策略和试算接口仍属于 D-06 待确认项。
##### ANA-01/ANA-02 统计
`GET /risk/analytics/overview?from=2026-08-01&to=2026-08-31&deptId=D-OPS` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"period": { "from": "2026-08-01", "to": "2026-08-31" },
"metrics": {
"importedCount": 103,
"processingCount": 34,
"closedCount": 69,
"overdueCount": 2,
"primaryCount": 61,
"assistCount": 42
},
"generatedAt": "2026-08-13T18:00:00+08:00"
}
}
```
`GET /risk/analytics/closed-orders?pageNum=1&pageSize=20&from=2026-08-01&to=2026-08-31` 返回 `TableDataInfo``rows` 使用 WO-01 工单摘要并增加 `closedAt``durationMinutes``overdue`。指标正式口径仍需关闭 D-07 后确定。
##### JOB-01 异步任务状态
`GET /risk/jobs/{jobId}` 无 body。
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"jobId": "JOB-RPT-001",
"jobType": "REPORT_GENERATION",
"status": "SUCCEEDED",
"progress": 100,
"createdAt": "2026-08-13T17:00:00+08:00",
"finishedAt": "2026-08-13T17:00:08+08:00",
"result": { "reportId": "RPT-001", "fileId": "FILE-RPT-001", "downloadable": true },
"error": null
}
}
```
任务状态建议为 `PENDING``RUNNING``SUCCEEDED``FAILED``CANCELLED`。前端轮询间隔建议不小于 1 秒,并在完成或失败后停止轮询。
### 8.12 联调枚举与字段规则
| 业务字段 | 编码 | 中文显示 |
| --- | --- | --- |
| responsibilityType | `PRIMARY` / `ASSIST` | 主责 / 协查 |
| reviewResult | `APPROVED` / `REJECTED` | 同意 / 不同意 |
| callbackResult | `AGREE` / `DISAGREE_OR_CUSTOMER_REQUEST` | 同意 / 不同意或客户主动要求 |
| dispatchMode | `MANUAL` / `SMART` | 人工派工 / 智能建议后确认 |
| rowStatus | `VALID` / `DUPLICATE` / `INVALID` | 有效 / 重复 / 错误 |
| filePurpose | `IMPORT_SOURCE` / `RECORDING` / `PRELIMINARY_ATTACHMENT` / `RESPONSE_LETTER` / `DELIVERY_PROOF` / `REPORT_OUTPUT` / `DELIVERABLE` | 导入原件 / 录音 / 初查附件 / 答复书 / 送达凭证 / 报告输出 / 成果物 |
联调必须遵守以下规则:
1. 前端提交稳定编码,展示使用后端返回的中文名称或字典,不提交中文作为枚举值。
2. 所有时间使用带时区的 ISO 8601,例如 `2026-08-13T16:00:00+08:00`;纯日期使用 `YYYY-MM-DD`
3. 金额以最小货币单位整数传输;当前原型没有金额字段,未来新增时不得使用浮点数。
4. 空数组使用 `[]`,无值对象使用 `null`;不得混用空字符串表达 `null`
5. ID 一律按字符串处理,前端不得转换为 JavaScript `number` 后再传回。
6. 手机号、地址、录音和附件是否返回完整数据由服务端权限决定;前端不得依据掩码值发起写操作。
7. 前端只能提交当前详情响应中的 `version`;收到 `RISK-4090` 后重新获取详情,不自动覆盖。
8. 写接口成功后以响应中的 `currentStage``nextTasks` 和最新版本为准,不按按钮名称本地推断流程。
9. `PRIMARY` 的全面调查提交依赖首联和全部初查;`ASSIST` 只依赖全部初查。该判断必须以后端 `submitReady` 为权威。
10. 业务部主任审核请求不携带目标环节;后端依据持久化责任类型决定进入回访或调查报告。
11. 报告“确认生成”和“下载”是两个动作;生成接口使用幂等键,下载接口不得推进任务状态。
12. 文件先上传取得 `fileId`,业务提交再绑定;业务提交失败时文件保持临时状态并由后台清理。
## 9. 后端业务与技术约束
### 9.1 状态与权限约束
1. 每个写接口同时校验:用户权限、数据范围、任务所有权、任务状态、工单当前环节和数据版本。
2. 状态只允许按定义的状态机迁移;跳步、重复提交、对已完成任务再次提交均拒绝。
3. 驳回必须指定目标环节并新建返工任务,旧任务和旧调查版本保持不可变。
4. 并行初查使用任务集合判断完成,不能以工单上的单一“调查状态”覆盖多个部门结果。
5. 派工完成后即创建或开放服务监督员全面调查任务,允许编辑和保存草稿;是否允许提交由服务端根据 `responsibilityType` 及前置任务完成情况实时计算。
6. 业务部主任审核通过后必须读取派工阶段持久化的主责/协查判定:主责创建回访任务,协查创建调查报告任务,两个分支不得同时创建。
7. 主责/协查切换如已生成任务,必须撤销旧任务并记录原因;禁止静默修改。
8. 已办结工单默认只读;重新开启需独立权限、原因和审计事件。
### 9.2 幂等、并发与事务
- 确认导入、派工、提交、审核、办结必须支持幂等键,重复请求返回同一业务结果。
- 工单、任务、调查版本和配置均使用乐观锁版本号;版本冲突返回明确错误,提示用户刷新。
- “派工记录 + 多个任务创建 + 流程状态更新 + 审计事件”必须处于同一事务。
- “审核结果 + 当前任务完成 + 下游任务创建/返工任务创建 + 工单状态更新”必须处于同一事务。
- 文件上传与业务提交分两阶段处理:先上传临时文件,业务提交成功后绑定;定期清理超时未绑定文件。
- 异步导入和智能报告生成不能在 HTTP 请求中长时间阻塞,应使用任务状态查询,并保证重复消费幂等。
### 9.3 导入约束
1. 文件扩展名和实际 MIME/内容类型必须同时校验,禁止只看后缀。
2. 导入模板应带版本;字段缺失、类型错误、枚举无效、日期非法、编号重复必须形成行级错误。
3. 预览不写入正式工单;确认导入必须绑定原预览文件摘要和 previewToken。
4. 批次号唯一性、12398 工单编号重复处理策略需确认:拒绝、覆盖、忽略或形成新版本。
5. 部分成功策略需确认。建议默认“整批校验、有效行可确认”,确认结果保留失败行,不允许悄然丢弃。
6. 原始文件、解析版本、操作人和导入结果必须可追溯。
### 9.4 表单校验约束
- 所有文本字段设置长度上限并进行服务端校验;富文本需消毒,防止脚本注入。
- 电话号码保留业务允许的字符,但标准化后再用于查询;模糊查询需防止全表扫描。
- 日期不得明显晚于当前业务允许时间;首联、调查、审核、回访时间应满足流程先后顺序。
- 主责必须选择首联部门;协查不得生成首联任务;初查部门至少 1 个且不得重复。
- 调查草稿可在前置任务完成前保存;调查提交时,主责必须校验首联及全部初查完成,协查必须校验全部初查完成。
- 业务部主任审核通过时,主责必须进入回访分支,协查必须直接进入调查报告分支。
- 审核不同意时驳回理由必填;同意时不得携带会误导流程的驳回理由。
- 回访结果为“不同意或客户主动要求”时,答复书和送达凭证均为强制附件;“同意”分支不得被错误阻塞。
- 报告确认必须锁定所依据的调查版本;主责还必须锁定回访版本,协查不得伪造或要求回访版本。
- 报告生成与下载应分离:确认生成属于幂等写操作,重复下载属于受权读操作,不得因重复下载重复推进流程。
- 办结前必须校验不存在未完成的有效任务,报告和成果物满足配置要求。
### 9.5 文件与敏感数据
- 附件存储使用 fileId,不在业务表保存本地路径或公开 URL。
- 下载/播放每次鉴权;链接短期有效,禁止通过猜测 fileId 越权访问。
- 文件执行病毒/恶意内容扫描,限制类型、大小、数量和总容量;具体阈值待安全评审。
- 客户姓名、电话、地址、录音、转译文本、答复书和送达凭证按敏感等级控制,日志中脱敏。
- 导出和批量下载属于独立权限并记录审计;原型未展示导出入口,未经确认不实现。
### 9.6 时限、规则和审计
- 时限以流程配置版本计算,已开始实例是否随新配置变化必须明确;建议锁定启动时版本。
- 暂停、节假日、退回返工、并行任务的计时方式需业务确认。
- 智能派工只产生可解释建议,主管确认后才创建任务;必须记录输入摘要、规则版本、建议和人工调整。
- 配置发布需要高权限、二次确认、变更原因、生效时间和回滚能力。
- 审计事件至少记录 actor、角色、部门、动作、对象、前后状态、业务版本、requestId、IP、时间和结果。
### 9.7 错误码建议
| 错误码 | 含义 |
| --- | --- |
| `RISK-4001` | 请求字段校验失败 |
| `RISK-4002` | 枚举或字典值无效 |
| `RISK-4010` | 登录失效或令牌无效 |
| `RISK-4030` | 无菜单/操作权限 |
| `RISK-4031` | 超出数据范围或任务不属于当前用户 |
| `RISK-4040` | 工单、任务或文件不存在 |
| `RISK-4090` | 数据版本冲突 |
| `RISK-4091` | 当前状态不允许该操作 |
| `RISK-4092` | 幂等请求参数与首次请求不一致 |
| `RISK-4220` | 前置任务尚未全部完成 |
| `RISK-4221` | 条件必填附件缺失 |
| `RISK-4222` | 导入批次或工单编号重复 |
| `RISK-4290` | 请求过于频繁 |
| `RISK-5001` | 异步任务处理失败 |
## 10. 非功能需求
| 维度 | 需求建议 |
| --- | --- |
| 可用性 | 所有提交操作给出明确成功/失败反馈;长表单提供草稿和离开提醒 |
| 性能 | 普通分页查询在约定数据量下稳定响应;录音、附件和统计使用独立加载,不阻塞基础详情 |
| 可扩展性 | 流程环节、部门类型、事件分类和规则使用配置/字典,不写死角色名称 |
| 可观测性 | 请求链路、异步任务、状态迁移和外部存储均可追踪;requestId 贯穿日志与审计 |
| 安全 | 认证、最小权限、敏感字段脱敏、文件扫描、下载鉴权、防重放和输入消毒 |
| 可恢复性 | 导入和异步任务可重试;配置可回滚;关键写操作可根据审计恢复业务事实 |
| 兼容性 | 保持已有 Bearer Token、用户/部门接口及通用返回结构,变更需版本化 |
| 无障碍/易用性 | 表单标签、错误提示和键盘焦点明确;状态不只依赖颜色表达 |
## 11. 原型问题、冲突与待确认事项
### 11.1 高优先级业务决策
| 编号 | 问题 | 影响 | 建议决策方向 |
| --- | --- | --- | --- |
| D-01 | 派工完成后是否允许服务监督主管变更主责/协查判定 | 可能导致已生成的首联、初查、调查或回访任务失效 | 建议默认禁止;如业务必须支持,应限定时点并采用撤销旧任务、重新派工和全量审计 |
| D-02 | 全面调查的 1-13 与 1-21 字段范围不同 | 影响动态表单和必填规则 | 明确按业务类型/事件类型的适用条件 |
| D-03 | 1-4 与 1-18 审核弹窗均出现“回访分派”,但主流程只允许业务部主任通过后按责任类型分支 | 可能重复选择回访部门,或让协查错误进入回访 | 明确回访承接部门在哪一级审核生效;协查审核界面必须隐藏或禁用回访分派 |
| D-04 | 班组回访表单缺失,只有分派和结果页 | 无法区分执行回访与监督员结果填报 | 明确两个环节是否合并及各自字段 |
| D-05 | 调查报告已改为“确认下载”,但报告模板、文件格式、签章、重生成和历史版本规则未展示 | 无法确定报告生成与下载接口契约 | 明确模板、输出格式、生成失败处理、版本保留和重新下载规则 |
| D-06 | 智能派工规则配置页为空 | 无法定义规则数据结构 | 补充条件、优先级、冲突、试算、发布和回滚需求 |
| D-07 | 统计分析页为空 | 无法定义指标和接口 | 明确指标、口径、维度、权限和刷新频率 |
| D-08 | 重复工单和部分导入失败策略未说明 | 影响数据一致性 | 确认唯一键、覆盖/忽略/拒绝策略 |
| D-09 | 状态仅出现待分派/处理中/已结束,与实际 12 步不匹配 | 容易形成非法状态跃迁 | 采用生命周期 + 任务环节双层状态 |
| D-10 | 流程时限只展示分钟,未说明工作日、暂停和驳回重算 | 影响 SLA | 明确日历、起止点、暂停和重算规则 |
### 11.2 原型一致性问题
- “智能运营团队”与页头“运营智能团队”名称不一致。
- 总值班经理工单查询页页头错误显示“运营智能团队”。
- 监督员待办统计出现“成果无输出”,疑似应为“成果物输出”。
- 服务监督主管和业务部主任审核弹窗均出现回访分派字段,与“业务部主任审核通过后再按主责/协查分支”的流程规则存在职责重叠。
- 1-14/1-15 调查报告页面已经区分不同意与同意状态,但报告模板、生成进度、失败重试和历史版本未展示。
- 1-16 成果物输出继续复用大量调查/回访信息,专属成果物类型和办结清单仍不明确。
- 最新原型将回访结果展示为“同意/不同意或客户主动要求”,旧文档或流程中如仍使用“满意/不满意”应统一替换。
- “客户所在地区(省)”和“省份”同时存在,需明确一个是原始文本、一个是标准编码,还是重复字段。
- “工单状态”和“工单环节”在部分列表列中混用,必须拆分定义。
## 12. 验收建议与追踪矩阵
### 12.1 关键业务验收场景
1. 有效文件预览后确认导入,生成批次、工单和完整审计记录;重复确认不重复建单。
2. 含错误行的文件展示准确行号和原因,未确认前不写正式工单。
3. 服务监督主管判定主责并派工后,系统生成 1 个首联任务、N 个初查任务,并立即向指定服务监督员开放全面调查填报;服务监督员可先行填写和保存草稿。
4. 服务监督主管判定协查并派工后,系统只生成 N 个初查任务,不生成首联任务,同时立即向指定服务监督员开放全面调查填报。
5. 主责任一首联或初查任务未完成时、协查任一初查任务未完成时,全面调查均只能编辑/保存草稿,不能提交。
6. 服务监督主管审核或业务部主任审核驳回后生成返工任务,历史调查和审核记录仍可查看。
7. 业务部主任审核通过主责工单后生成回访分支任务;审核通过协查工单后不生成回访任务,直接生成调查报告任务。
8. 无任务所有权的用户即使直接调用接口也不能办理。
9. 两人同时操作同一任务时,后提交者收到版本冲突,不覆盖先提交结果。
10. 回访选择“不同意或客户主动要求”但缺少任一必需附件时不能提交;“同意”分支无需附件。
11. 协查报告上下文不要求首联或回访数据;主责报告必须引用已完成的回访版本。
12. 报告确认生成重复请求只产生一个业务版本;报告生成完成后可重复受权下载,不重复推进流程。
13. 已办结前存在未完成任务时拒绝办结;成功办结后普通用户不能再修改。
14. 修改时限或派工规则产生新版本,不篡改既有流程实例的历史计算结果。
15. 手机号、地址、录音和附件在无权限用户的列表、详情、日志和下载接口中均不可泄露。
16. 各待办统计卡片数量与同条件列表总数一致。
### 12.2 需求追踪
| 需求域 | 原型证据 | 主要接口 | 主要约束 |
| --- | --- | --- | --- |
| 登录 | 1-1 | 认证接口 | 验证码、Bearer Token |
| 导入 | 1-2、1-3、1-41 | IMP-0107 | 预览隔离、幂等、行级错误 |
| 查询 | 1-341-40 | WO-0106 | 数据权限、分页、脱敏 |
| 派工 | 1-101-12 | DSP-0103 | 服务监督主管判定主责/协查、单选/多选、事务 |
| 首联 | 1-26、1-30、1-32、1-33 | DSP-04、ACT-02 | 仅主责、本部门候选、任务所有权 |
| 初查 | 1-231-25、1-28、1-29 | ACT-03 | 多部门并行任务全部完成 |
| 全面调查 | 1-13、1-21、1-22 | ACT-04、ACT-05 | 先行填报、动态字段、版本化、分支前置条件 |
| 主管审核 | 1-4、1-5、1-9 | ACT-06 | 驳回理由、不可覆盖历史 |
| 业务审核 | 1-18、1-19、1-27 | ACT-07 | 按持久化责任类型创建唯一后续分支 |
| 回访 | 1-17、1-20、1-31、1-33 | DSP-04/05、ACT-08/09、FILE | 仅主责、条件附件、敏感信息 |
| 报告/成果物 | 1-141-16 | ACT-1014 | 数据版本快照、确认生成、受权下载、办结校验 |
| 配置/统计 | 1-61-8 | CFG、ANA | 版本发布、指标口径待补齐 |
## 13. 后续交付建议
在进入后端开发前,建议按以下顺序完成需求基线:
1. 业务评审本报告第 6、7、11 节,先关闭 D-01D-10。
2. 设计人员统一两级审核中的回访分派职责,并补齐班组回访、报告生成状态、成果物清单、智能规则和统计分析页面。
3. 将字段字典固化为数据模型与枚举表,将状态模型固化为状态迁移矩阵。
4. 基于第 8 节生成 OpenAPI 3.1,补充请求/响应 Schema、权限编码和错误码。
5. 用第 12.1 节场景形成接口验收测试和流程集成测试。
本稿可作为需求评审和接口设计的输入,但在高优先级待确认项关闭前,不应直接据此创建数据库表或固化流程代码。