审批中心与表单发起
# 审批中心与表单发起
# 目的
在真实Vben后台填写标量表单、保存本人草稿、发起固定版本流程,再处理当前任务并查看本人参与历史。 成功保存会显示草稿修订;发起返回“已受理”时后台仍可能处理中,须查询进度或到“我的发起”看当前状态。 本页是首批用户页面,不包含可视化设计器或运行版本管理。后台部署与定义发布仍按工作流API操作。
# 前置条件
业务库须显式迁移至schema v48(四个本人入口自v47发布),API和worker启用同一精确兼容运行版本,平台已登记且流程定义已发布/启用。 按前端启动启动锁定的web-antd应用;生产继续走同域代理和统一JWE,不切换到mock或裸JSON客户端。
租户套餐须包含相应能力,账号已完成改密且会话有效。普通角色还须在“系统管理→角色”的菜单授权中显式选中对应页面;只有权限码不会自动出现菜单。 保留租户管理员也受当前套餐、租户权限上限与实际业务归属约束;平台身份没有这些租户入口。
| 页面或动作 | 当前权限 |
|---|---|
| 我的待办与投票已办 | workflow:task:read |
| 我的发起 | workflow:instance:start |
| 我的操作、参与人详情/时间线 | workflow:history:read |
| 表单目录、本人草稿/固定表单版 | bpm:form:read |
| 保存本人草稿 | 另需bpm:form:write |
| 发布标量表单合同 | 另需bpm:form:publish |
| 选择流程并发起 | 另需workflow:definition:read与workflow:instance:start |
| 同意/拒绝 | workflow:task:decide及当前任务资格 |
| 查询/继续本人审批命令 | 原提交者当前workflow:task:decide;不以发起或管理权限替代 |
| 领取/转办/委派/归还 | 对应workflow:task:claim/transfer/delegate/return及当前资格 |
| 原提交正文 | workflow:history:read与bpm:form:history-read,另需实际参与/原所有者与原字段范围 |
菜单的路径与组件在本地白名单固定,服务端不能下发远程脚本或把租户组件挂到平台路径:
// 仅说明实际路由;授权仍来自当前主库菜单,不能在浏览器自行添加权限。
const workflowPages = [
'/workflow/tasks', '/workflow/my-instances', '/workflow/activities', '/workflow/forms',
];
# 步骤与规则
# 1. 填写并保存本人草稿
进入“流程审批→表单与发起”,在表单目录点击“填写新草稿”,页面读取该表单的精确发布版。 表单只有text、integer、boolean标量;可选字段的“填写此字段”区分未提供与空字符串、false、0。 点击“保存本人草稿”后记录返回的id与修订;后续编辑使用该修订CAS,不能覆盖别人的修改。
对应请求如下。实际页面使用随机稳定命令号,同次失败重试保持原命令与原载荷;不需要用户手写命令:
POST /api/admin/v1/workflow/form-instances
Authorization: Bearer <当前租户访问凭据>
Origin: <当前已配置同域Origin>
X-App-Request: admin
Content-Type: application/json
{"id":"","form":{"key":"simple-request","version":1},"expectedVersion":0,"values":{"amount":{"integer":10}},"commandId":"wf-<页面生成>"}
开发/测试明文成功响应与生产解密后的结构相同:
{"code":0,"data":{"id":"<草稿ID>","form":{"key":"simple-request","version":1},"version":1,"values":{"amount":{"integer":10}}},"message":"ok","requestId":"<服务器生成>"}
在“本人草稿”分页中点击“继续填写/发起”可重新进入自己的当前修订。草稿固定formKey/formVersion,换表单版本须新建草稿。 原提交不会被保存草稿改写;页面和列表不提供指定其他owner或tenant的参数。
# 2. 选择精确流程并发起
保存后点击“读取流程目录”,选择精确发布版本。流程必须启用且资源合同与本草稿固定表单版匹配,否则“确认发起”不可用。 “更多流程”沿服务端游标取下一页,不把第一批50项当作完整目录。修改尚未保存时先保存,发起只投影已保存值中的流程声明字段。
若定义包含发起自选节点,逐节点输入操作者确认的账号ID,以逗号分隔;顺序决定串行候选顺序。 当前页面没有人员名称搜索器;不把账号ID转成浮点数,也不自动去重或从角色成员猜人。不存在、跨租户或已停用账号仍由服务端拒绝。
审批用途默认为approval,同资源修订的独立用途由服务端占位保护。发起时固定草稿修订和流程版本,不自动取新版:
POST /api/admin/v1/workflow/instances
Authorization: Bearer <当前租户访问凭据>
Origin: <当前已配置同域Origin>
X-App-Request: admin
Content-Type: application/json
{"key":"example-flow","version":1,"resource":{"type":"form-instance","id":"<已保存草稿ID>","version":"1","contractVersion":"scalar-form-v1","purpose":"approval"},"values":{"amount":{"integer":10}},"selections":{},"commandId":"wf-<页面生成>"}
HTTP 202只表示已受理。页面保留本次命令用于“查询发起进度”,不因未知网络结果自动生成第二次发起。
{"code":0,"data":{"commandId":"wf-<页面生成>","state":"accepted","result":{"id":"<流程ID>","definitionKey":"example-flow","definitionVersion":1,"engineVersion":"<固定运行版本>","state":"running","version":1,"waiting":[],"needsRun":true}},"message":"ok","requestId":"<服务器生成>"}
# 3. 处理当前任务
进入“我的待办与已办→我的待办”,点击“查看/处理”才读取该任务允许的正文。 未领取single任务先领取;当前持有人可按实际权限同意/拒绝、转办或委派,代理只能归还意见,不能代原人终审。 转办/委派输入单个目标账号ID,原因和意见仅在当前窗口内存中保存;转办不提交修改字段,代理归还只提交允许输出。
页面展示原提交与当前值,只有节点可写字段进入审批输出,不从表单全量字段推断写权限。 投票、变更都固定屏幕上任务的activation/task/version;409001不会被自动覆盖重试。任务离开当前列表后旧临时授权不能继续读取正文。
当前正文的 acceptedSignals 省略或false时,页面保持原同步审批请求:
POST /api/admin/v1/workflow/instances/<流程ID>/activations/5/tasks/<任务ID>/decision
Authorization: Bearer <当前租户访问凭据>
Origin: <当前已配置同域Origin>
X-App-Request: admin
Content-Type: application/json
{"taskVersion":3,"decision":"approved","values":{"amount":{"integer":12}},"opinion":"同意","commandId":"wf-<页面生成>"}
当前正文明确返回 acceptedSignals: true 时,页面向同一任务的 /decision-commands 提交相同字段,固定本次命令与入口。
这需要管理员按接口部署说明启用并登记正式v3,旧定义不会自动获得能力。
POST /api/admin/v1/workflow/instances/<流程ID>/activations/5/tasks/<任务ID>/decision-commands
Authorization: Bearer <当前租户访问凭据>
Origin: <当前已配置同域Origin>
X-App-Request: admin
Content-Type: application/json
{"taskVersion":3,"decision":"approved","values":{"amount":{"integer":12}},"opinion":"同意","commandId":"wf-<页面生成>"}
HTTP 202只表示投票与后台检查点已提交。页面清除旧正文、意见和已确认的冻结请求,保留收据并锁定其他任务动作:
{"code":0,"data":{"commandId":"wf-<页面生成>","state":"accepted","result":{"id":"<流程ID>","definitionKey":"example-flow","definitionVersion":1,"engineVersion":"fago-form-approval-v3","state":"running","version":4,"waiting":[],"needsRun":true}},"message":"ok","requestId":"<服务器生成>"}
点击“查询审批进度”只执行 GET /api/admin/v1/workflow/approval-commands/<原命令号>;需要显式继续时点击“继续处理”,向该路径的 /resume POST {}。
查询不投票、不推进执行,继续只恢复已提交的自动后继;均要求原提交者当前审批权限。收据done后刷新列表,即使实例仍running也不会提示整个流程已批准;部分会签可立即done并等待另一位审批人。
没有收到有效响应时页面提示“本次审批结果尚未确认”,保留原载荷、commandId和入口;可查询确认或原样重试,不能修改投票、自动降级到同步入口或创建新命令。 命令号与进度只在当前组件内存,不写URL或浏览器存储。关闭窗口、切换列表/对象或身份授权变化会清理本地进度,迟到响应被忽略;已经提交的投票与后台工作继续存在,重新打开前先刷新实际列表或实例状态。
# 4. 分别查看已办、发起与操作记录
“投票已办”只列本人实际同意/拒绝;“我的操作”保留真实领取/转办/委派/归还,每次实际动作各占一行。 候选、收到指派和管理补分配不冒充已办或过去参与。“我的发起”只看本人发起;管理员也不能借本页列出他人。 列表用上一页/下一页游标,当前任务每页最多100条,其他本人列表最多50条,没有总数或任意排序。
点击“读取流程历史”再读取参与人详情和追加时间线。只有发起人或条目操作者可按按钮读取对应私有条目;生命周期事件没有私有审批条目。 私有意见/原因/字段都作为文本展示,不解释HTML。三个历史来源的ID独立,页面用来源+ID区分,不把任务事件ID当投票ID。
“原提交”只读取固定原提交及原节点白名单;领取/转办/委派不授予原正文。代理归还或投票使用该历史条目完成版本,不能换成当前任务版本。 “读取本人原提交”还须原资源所有者资格。原提交不表示节点当时完整输入、当前变量或最终结果。
# 5. 发布标量表单合同
有发布权限时,在表单页点击“发布标量表单”。填写合法JSON合同和当前最新版本:新key为0,发布新版本须提供当前最新版本。 这只是标量合同发布入口,不是R3.2可视化设计器;未知类型/字段、冲突或绑定失败由后端明确拒绝,不覆盖旧版。
{"schemaVersion":"fago-scalar-form-v1","key":"simple-request","name":"简单申请","fields":[{"name":"amount","type":"integer","required":true}]}
# 参数
浏览器编辑/展示整数必须在[-9007199254740991,9007199254740991]内且为规范整数,拒绝01、-0、小数或近似转换。
后端int64合同不变;相关正文含浏览器不能精确处理的值时,页面拒绝该标量详情,须使用保留完整精度的客户端。
激活/任务/CAS/草稿资源修订同样必须能精确表示,超界在发网前拒绝,不能向上舍入后碰撞相邻新版本。
账号ID与事件ID使用字符串,可精确保留int64;自选账号不能重复,转办/委派仅单人。
菜单和按钮只反映当前授权快照;隐藏不能代替后端复核。关闭窗口、切换账号/realm或授权版本改变会清正文和冻结载荷,迟到响应不能重开旧窗口。 正常access刷新不抹去编辑。网络失败后的重试保留原commandId、对象版本和载荷;编辑被锁定,不把未知结果当作未执行。
# 失败与重试
保存/审批遇到409001应关闭窗口、刷新并核对最新对象后重新编辑,不能盲目覆盖获胜者。 400001/400002修正格式或字段后再提交;403001检查当前权限/角色/套餐与实际资格,404001不区分不存在与不可见。 401002须重新登录;503001先恢复依赖/兼容API与worker,已发送请求只能重试原操作或先查询状态。
HTTP/1.1 409 Conflict
Content-Type: application/json
{"code":409001,"data":null,"message":"记录已变更,请重试","requestId":"<服务器生成>"}
菜单出现而工作流API返回关闭/不可用时,管理员应先核对显式API/worker配置、迁移与精确版本登记,不改用mock。 关闭窗口不会撤销已发送的事务;重新打开前先刷新列表确认结果。失败只显示公开中文提示,不显示内部错误链或私有配置。
# 边界
本批为真实接口页面,组件测试使用真实Vue/Router/Ant,但当前Work设置禁用浏览器,尚无实际浏览器布局或完整端到端验收。 定义发布/准入、平台运行目录、任务补分配与外部动作恢复现有独立管理页面,按各自权限开放。 表单与流程原稿、受控 BPMN 画布已有独立设计页面,不由本页操作。文件/单据的完整资源认证、节点当时完整输入、完整滚动与容量认证仍未结束,M6/R3.1未结项。