审批流程设计
1. 介绍
在银行相关业务场景中, 为了保护客户账户信息或资金的安全, 业务的开展往往需要经过严格的审批流程, 只有经过高级经理或行长审批完成后才允许业务交互核心生效. 而不同级别的部门又存在不同场景的业务, 审批流程又不尽相同, 这时候就需要一套完整的审批流程系统来进行统一调度和管理. 在我的工作经验中, 很多银行项目都会采用工作流workflow技术进行流程设计, 这是一个可行的流程设计框架. 但我今天要写的方案不是采用框架实现, 而是只用db设计来控制审批流程的走向, 为了适应不同场景的审批流程, 将设计成可配置化的审批节点.
2. 功能描述
在实际审批流程的业务场景的, 会附属很多扩展功能来给审批功能注入灵魂, 实现业务的电子痕迹管理. 主要功能涉及以下几个方面:
- 审批任务推送
- 审批任务领取
- 已审批任务查看
- 查询下一审批节点
- 查询下一审批任务的权限审批用户
- 审批任务未提交归还
- 审批任务提交
- 查看审批意见
- 查看退回理由
- 审批任务未领取, 进行撤回
- 审批流程取消
- 审批流程跟踪查询
3. 库表设计
3.1 流程编号历史表
表名: MY_PROCESS_NO_HISTORY_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| ID | 非业务主键 | VARCHAR(32) | 主键 | |
| PROCESS_NO | 流程编号 | VARCHAR(32) | ||
| TRACE_NO | 业务受理号 | VARCHAR(32) | ||
| CREATE_TIME | 创建时间 | TIMESTAMP |
当业务需要定制化流程编号规则时, 就不能使用UUID, DB序列号或主键自增的方式获取, 需要根据业务指定的规则创建, 为了保证多线程请求时, 生成的流程编号的唯一性, 使用流程编号历史表进行管理.
3.2 流程节点参数表
表名: MY_NODE_ROLE_PARAM
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| BUSI_TYPE | 业务类型 | VARCHAR(2) | 联合主键BUSI_TYPE+NODE_ID | |
| NODE_ID | 节点ID | VARCHAR(32) | 联合主键BUSI_TYPE+NODE_ID | |
| PRE_NODE_ID | 上一节点ID | VARCHAR(32) | ||
| NEXT_NODE_ID | 下一节点ID | VARCHAR(32) | ||
| ROLE_ID | 角色ID | VARCHAR(2) | ||
| ROLE_NAME | 角色名称 | VARCHAR(100) | ||
| FUN_CODE | PC端功能码 | VARCHAR(12) | ||
| EXTERNAL_FUN_CODE | 移动端功能码 | VARCHAR(12) | ||
| IS_LAST_NODE | 是否最后节点 | VARCHAR(2) | 默认N | |
| CREATE_TIME | 创建时间 | TIMESTAMP |
流程节点参数表, 用来维护审批流程的节点信息, 审批流程按照表里维护的节点顺序进行即可.
3.3 业务类型参数表
表名: MY_BUSI_PARAM
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| BUSI_TYPE | 业务类型ID | VARCHAR(2) | 主键 | |
| BUSI_NAME | 业务类型名称(简体中文) | VARCHAR(100) | ||
| BUSI_NAME_EN | 业务类型名称(英文) | VARCHAR(100) | ||
| BUSI_NAME_HK | 业务类型名称(繁体中文) | VARCHAR(100) |
业务类型参数表, 用来记录业务类型的枚举-枚举值, 相当于码表, 进行业务类型的统一管理.
3.4 流程申请信息主表
表名: MY_PROCESS_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| PROCESS_NO | 流程编号 | VARCHAR(32) | 主键 | |
| BUSI_TYPE | 业务类型 | VARCHAR(2) | ||
| TRACE_NO | 业务受理号 | VARCHAR(32) | ||
| TLR_ID | 经办柜员号 | VARCHAR(7) | ||
| TLR_NAME | 经办柜员名称 | VARCHAR(100) | ||
| ORG_CODE | 经办机构号 | VARCHAR(11) | ||
| ORG_NAME | 经办机构名称 | VARCHAR(100) | ||
| BRANCH_CODE | 省直分行号 | VARCHAR(11) | ||
| BRANCH_NAME | 省直分行名称 | VARCHAR(100) | ||
| SUB_BRANCH_CODE | 辖属分行号 | VARCHAR(11) | ||
| SUB_BRANCH_NAME | 辖属分行名称 | VARCHAR(100) | ||
| APPLY_DATE | 申请会计日期 | VARCHAR(8) | yyyyMMdd | |
| BUSI_STATUS | 业务流程状态 | VARCHAR(2) | 0-流程进行中 3-注销 4-审批完成 5-驳回 | |
| DOC_ID | 影像ID | VARCHAR(32) | ||
| ACC_DATE | 记账会计日期 | VARCHAR(8) | ||
| VCH_NO | 记账流水号 | VARCHAR(32) | ||
| CREATE_TIME | 创建时间 | TIMESTAMP | ||
| FINISH_TIME | 完成时间 | TIMESTAMP | ||
| OLD_PROCESS_NO | 旧流程编号 | VARCHAR(32) | 对已完成流程的业务做修改或删除申请时使用 | |
| EXIST_SIGN | 是否会签 | VARCHAR(2) | Y-是 N-否, 默认N | |
| CHANNEL_TYPE | 申请渠道 | VARCHAR(2) | 1-柜面端 2-移动端 | |
| REMAKR1 | 备用字段 | VARCHAR(100) |
流程申请信息主表, 用来记录发起业务申请流程的基本信息, 包含发起的用户, 部门, 时间, 导入影像等信息. 通过流程状态控制业务流程的完成度.
3.5 业务交易信息表
表名: MY_TRADE_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| ID | ID | VARCHAR(32) | 主键 | 非业务主键 |
| PROCESS_NO | 流程编号 | VARCHAR(32) | ||
| SEQ_NO | 序号 | VARCHAR(10) | ||
| ACCOUNT | 账号 | VARCHAR(32) | 查询用 | |
| TRADE_INFO | 交易信息 | VARCHAR(7000) | Json字符串 | |
| CREATE_TIME | 创建时间 | TIMESTAMP | ||
| REMARK1 | 备用字段 | VARCHAR(100) |
这是一张公共交易信息表, 不同界面的交易信息都可以封装成Json字符串存在TRADE_INFO字段中, 如果涉及到条件查询功能就需要单独设计分录表来存储定制化的交易信息.
3.6 任务信息表
表名: MY_TASK_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| TASK_ID | 任务ID | VARCHAR(32) | 主键 | |
| APP_CODE | 系统编号 | VARCHAR(8) | ||
| PROCESS_NO | 流程编号 | VARCHAR(32) | ||
| LAUNCH_DATE | 发起会计日期 | VARCHAR(8) | yyyyMMdd | |
| SIGN_NO | 会签子流程编号 | VARCHAR(32) | 会签任务才会有该字段信息 | |
| DEAL_CONTENT | 任务节点名称 | VARCHAR(300) | ||
| TASK_EFFECT_DATE | 任务时效日期 | VARCHAR(8) | yyyyMMdd | |
| FUNC_CODE | 功能码 | VARCHAR(12) | ||
| TASK_STATUS | 任务状态 | VARCHAR(2) | 0-已办 1-待办 2-取消 | |
| PARAMTERS | Paramters参数 | VARCHAR(1000) | Json字符串 | |
| CREATE_ORG_CODE | 发起机构号 | VARCHAR(11) | ||
| CREATE_ORG_NAME | 发起机构名称 | VARCHAR(300) | ||
| CREATE_BRANCH_CODE | 发起分行号 | VARCHAR(11) | ||
| CREATE_BRANCH_NAME | 发起分行名称 | VARCHAR(300) | ||
| CREATE_TIME | 创建时间 | TIMESTAMP |
任务信息表用户记录审批流程中推送的任务(包含会签任务), 并根据审批结果记录任务的状态, 客户端的体现就是任务池, 任务池可以设计成待办任务池和已办任务池; 未处理的任务展示在待办任务池中, 已经处理的任务展示在已办任务池中, 取消状态的任务不做展示. 其中PARAMTERS字段可以根据业务场景存放自己需要的扩展字段, 比如: processNo, taskId, nodeId, roleId, taskOwner, IsApply等.
3.7 任务用户信息表
表名: MY_TASK_USER_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| TASK_ID | 任务ID | VARCHAR(32) | 联合主键TASK_ID+USER_CODE | |
| USER_CODE | 权限用户 | VARCHAR(7) | 联合主键TASK_ID+USER_CODE | |
| TASK_FINAL_STATUS | 用户任务状态 | VARCHAR(2) | 0-已办 1-待办 2-取消 | |
| UPDATE_TIME | 时间戳 | TIMESTAMP |
这张表用来记录审批任务推送的具体权限用户, 将任务主体信息与用户进行关联. 并通过用户任务状态管理用户对任务的处理权限. 任务的领取要做抢占式领取,防止同一笔任务的重复提交; 任务的释放要做抢占式释放, 防止任务无法处理.
3.8 流程跟踪信息表
表名: MY_PROCESS_TRACK_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| ID | ID | VARCHAR(32) | 非业务主键 | |
| TASK_ID | 任务ID | VARCHAR(32) | ||
| PROCESS_NO | 流程编号 | VARCHAR(32) | ||
| NODE_ID | 节点ID | VARCHAR(32) | ||
| ROLE_ID | 角色ID | VARCHAR(2) | ||
| ROLE_NAME | 角色名称 | VARCHAR(300) | ||
| TASK_RECEIVE_TIME | 任务领取时间 | TIMESTAMP | ||
| TASK_COMMIT_TIME | 任务提交时间 | TIMESTAMP | ||
| TLR_ID | 任务提交柜员号 | VARCHAR(7) | ||
| TLR_NAME | 任务提交柜员名称 | VARCHAR(300) | ||
| ORG_CODE | 机构号 | VARCHAR(11) | ||
| ORG_NAME | 机构名称 | VARCHAR(300) | ||
| BRANCH_CODE | 分行号 | VARCHAR(11) | ||
| BRANCH_NAME | 分行名称 | VARCHAR(300) | ||
| CREATE_TIME | 创建时间 | TIMESTAMP | ||
| CHANNEL_TYPE | 渠道类型 | VARCHAR(2) | 1-PC端 2-移动端 |
这张表用来记录每一笔任务的操作痕迹信息, 用在流程跟踪信息电子化追踪查询的功能中.
3.9 审批意见信息表
表名: MY_JUDGE_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| ID | ID | VARCHAR(32) | 非业务主键 | |
| PROCESS_NO | 流程编号 | VARCHAR(32) | ||
| TLR_ID | 审批提交柜员号 | VARCHAR(7) | ||
| TLR_NAME | 审批提交柜员名称 | VARCHAR(300) | ||
| ORG_CODE | 机构号 | VARCHAR(11) | ||
| ORG_NAME | 机构名称 | VARCHAR(300) | ||
| BRANCH_CODE | 分行号 | VARCHAR(11) | ||
| BRANCH_NAME | 分行名称 | VARCHAR(300) | ||
| APPROVE_RSLT | 审批结果 | VARCHAR(2) | ||
| SUGGEST | 审批意见/退回理由 | VARCHAR(1000) | Y-审批通过;N-审批拒绝 | |
| NODE_ID | 审批节点ID | VARCHAR(32) | ||
| ROLE_ID | 审批角色ID | VARCHAR(2) | ||
| ROLE_NAME | 审批角色名称 | VARCHAR(300) | ||
| CREATE_TIME | 创建时间 | TIMESTAMP |
这张表用来记录权限用户在审批界面填写的审批意见或退回理由, 提供审批意见信息查询.
3.10 会签流程信息表
表名: MY_SIGN_PROCESS_INFO
| 字段英文名 | 字段中文名 | 数据类型/长度 | 约束 | 备注 |
|---|---|---|---|---|
| ID | ID | VARCHAR(32) | ||
| BUSI_TYPE | 业务类型 | VARCHAR(2) | ||
| SIGN_NO | 会签子流程编号 | VARCHAR(32) | ||
| PROCESS_NO | 主流程编号 | VARCHAR(32) | 可能关联多个会签子流程 | |
| ORG_CODE | 机构号 | VARCHAR(11) | ||
| ORG_NAME | 机构名称 | VARCHAR(300) | ||
| TLR_ID | 柜员号 | VARCHAR(7) | ||
| TLR_NAME | 柜员名称 | VARCHAR(300) | ||
| CS_ORG_CODE | 会签机构号 | VARCHAR(11) | 主流程可能关联多个会签机构 | |
| NODE_ID | 节点ID | VARCHAR(32) | ||
| ROLE_ID | 角色ID | VARCHAR(2) | ||
| ROLE_NAME | 角色名称 | VARCHAR(300) | ||
| SIGN_STATUS | 会签状态 | VARCHAR(2) | ||
| CS_FUN_CODE | 会签功能码 | VARCHAR(12) | ||
| CREATE_TIME | 创建时间 | TIMESTAMP | ||
| CHANNEL_TYPE | 渠道类型 | VARCHAR(2) | 1-PC端 2-移动端 |
这张表用来控制会签子流程的进行, 会签就是将审批任务的内容推送给部门中的用户传阅, 会签完成后继续回到主流程审批. 在中间的某个审批节点可以由用户主动选择发起会签或根据业务规定在指定的审批节点自动发起会签, 发起会签时需要选择会签的部门(可以选择多个会签部门), 每个会签部门都是一个会签子流程, 然后会签部门主管再将会签任务提交到部门内部传阅, 每个会签任务ID都不一样, 当每个部门内部会签任务完成, 当前会签子流程结束; 当所有会签子流程完成, 才允许回到主流程继续流转审批, 直至流程结束. 会签流程的控制需要结合会签流程信息表, 任务用户信息表, 任务用户信息表, 流程跟踪信息表等.
3.11 db关联关系图

4. 接口设计
审批流程功能需要合理的接口设计才能保证流程的正常流转和痕迹追踪. 下面是公共接口设计:
公共响应头:
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
| 响应头replyInformation | Object->Map | ||||
| 返回类型 | responseType | String | 1 | 是 | E-失败;N-成功 |
| 返回码 | responseCode | String | 12 | 是 | |
| 返回码 | responseMsg | String | 100 | 否 | |
4.1 获取流程编号 [getProcessNo]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 柜员号 | tlrId | String | 7 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 功能码 | funCode | String | 12 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
| 流程编号 | processNo | String | 32 | 是 |
4.2 获取下一审批节点/机构信息 [getNextNodeOrg]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 流程编号 | processNo | String | 32 | 否 | isApply为Y时非必输, 其他情况都必输 |
| 柜员号 | tlrId | String | 7 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 节点ID | nodeId | String | 32 | 是 | |
| 是否发起节点 | isApply | String | 1 | 是 | Y-是 ; N-否 |
| 业务类型 | busiType | String | 2 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
审批节点信息roleList循环开始 | 树结构 | ||||
| 角色名称 | roleName | String | 300 | 是 | |
| 下一角色ID | nextRoleId | String | 2 | 是 | |
| 下一节点ID | nextNodeId | String | 32 | 是 | |
| 下一节点类型 | nextNodeType | String | 1 | 是 | F-正向; B-退回 |
父机构parentNodeList循环开始 | 树结构 | ||||
| 父机构ID | parentOrgCode | String | 11 | 是 | |
| 父机构名称 | parentOrgName | String | 300 | 是 | |
| 子机构列表children循环开始 | |||||
| 子机构ID | orgCode | String | 11 | 是 | |
| 子机构名称 | orgName | String | 300 | 是 | |
| 子机构列表children循环结束 | |||||
父机构parentNodeList循环结束 | |||||
审批节点信息roleList循环结束 |
4.3 获取下一审批用户列表信息 [getReceiveUserList]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 机构号 | orgCode | String | 11 | 是 | |
| 柜员号 | tlrId | String | 7 | 是 | |
| 下一节点ID | nextNodeId | String | 32 | 是 | 如果funCode为空,就按照节点ID查询功能码 |
| 下一审批机构号 | nextOrgCode | String | 11 | 是 | |
| 业务类型 | busiType | String | 2 | 是 | |
| 查询功能码 | funCode | String | 12 | 否 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
用户信息列表userList循环开始 | |||||
| 用户编号 | userCode | String | 7 | 是 | |
| 用户名称 | userName | String | 100 | 是 | |
用户信息列表userList循环结束 |
4.4 流程发起提交 [processLaunch]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 流程编号 | processNo | String | 32 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 柜员号 | tlrId | String | 7 | 是 | |
| 柜员名称 | tlrName | String | 100 | 是 | |
| 业务类型 | busiType | String | 2 | 是 | |
| 下一角色ID | nextRoleId | String | 2 | 是 | |
| 下一节点ID | nextNodeId | String | 32 | 是 | |
| 下一机构ID | nextOrgCode | String | 11 | 是 | |
下一审批用户列表approveUserList循环开始 | |||||
| 审批用户编号 | aprUserCode | String | 7 | 是 | |
| 审批用户名称 | aprUserName | String | 100 | 是 | |
下一审批用户列表approveUserList循环结束 | |||||
| 影像ID | docId | String | 32 | 是 | |
| 交易信息 | tradeInfoList | String或List | 2000 | 是 | json字符串方式使得不同界面共用该字段; 但是如果是大数量的列表,还是使用List |
| 是否保存退出 | isSave | String | 1 | 是 | Y-是; N-否 |
| 是否需要会签 | existSign | String | 1 | 是 | Y-是; N-否 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 |
4.5 待办任务领取 [taskReceive]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 柜员号 | tlrId | String | 7 | 是 | |
| 柜员名称 | tlrName | String | 100 | 是 | |
| 是否已办任务 | doneStatus | boolean | 是 | true-已办; false-待办 | |
| 流程编号 | processNo | String | 32 | 是 | |
| 任务ID | taskId | String | 32 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
| 功能码 | funCode | String | 12 | 是 | |
| 申请人 | applyTlr | String | 7 | 是 | |
| 申请人名称 | applyTlrName | String | 100 | 是 | |
| 申请机构 | applyOrgCode | String | 11 | 是 | |
| 申请机构名称 | applyOrgName | String | 100 | 是 | |
| 节点ID | nodeId | String | 32 | 是 | |
| 影像ID | docId | String | 32 | 否 | |
| 交易信息 | tradeInfoList | String | 2000 | 否 |
4.6 已办任务查看 [tradeInfoDisplay]
合并到taskReceive接口中, 使用doneStatus字段区分待办任务和已办任务.
4.7 任务归还 [taskReturn]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 柜员号 | tlrId | String | 7 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 流程编号 | processNo | String | 32 | 是 | |
| 任务ID | taskId | String | 32 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 |
4.8 流程审批提交 [processApprove]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 柜员号 | tlrId | String | 7 | 是 | |
| 柜员名称 | tlrName | String | 100 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 机构名称 | orgName | String | 100 | 是 | |
| 流程编号 | processNo | String | 32 | 是 | |
| 任务ID | taskId | String | 32 | 是 | |
| 当前节点ID | nodeId | String | 32 | 是 | |
| 审批结果 | approveRslt | String | 1 | 是 | Y-审批通过; N-审批拒绝 |
| 下一角色ID | nextRoleId | String | 2 | 是 | |
| 下一节点ID | nextNodeId | String | 32 | 是 | |
下一审批机构/用户 nextTaskOwnerList 循环开始 | |||||
| 下一任务归属机构/用户 | taskOwner | String | 11 | 是 | 可以是柜员号或机构号 |
下一审批机构/用户 nextTaskOwnerList 循环结束 | |||||
| 退回理由 | rejectReason | String | 300 | 否 | 审批结果为"N"时必输. |
| 审批意见 | suggest | String | 300 | 否 | 审批结果为"Y"是必输 |
| 业务类型 | busiType | String | 2 | 是 | |
| 交易信息 | tradeInfoList | String或List | 1000 | 是 | json字符串方式使得不同界面共用该字段; 但是如果是大数量的列表,还是使用List |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 |
4.9 审批意见查看 [apSuggestQuery]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 流程编号 | processNo | String | 32 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
审批意见列表suggestList循环开始 | |||||
| 机构号 | orgCode | String | 11 | 是 | |
| 机构名称 | orgName | String | 100 | 是 | |
| 角色名称 | roleName | String | 100 | 是 | |
| 审批意见 | suggest | String | 300 | 是 | |
| 审批时间 | approveTime | String | 100 | 是 | |
| 审批人 | tlrId | String | 7 | 是 | |
| 审批人名称 | tlrName | String | 100 | 是 | |
| 审批结果 | approveRslt | String | 1 | 是 | Y-审批通过;N-审批拒绝 |
审批意见列表suggestList循环结束 |
4.10 退回理由查看 [backReasonQuery]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 流程编号 | processNo | String | 32 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
退回理由列表rejectReasonList循环开始 | |||||
| 机构号 | orgCode | String | 11 | 是 | |
| 机构名称 | orgName | String | 100 | 是 | |
| 角色名称 | roleName | String | 100 | 是 | |
| 退回理由 | rejectReason | String | 300 | 是 | |
| 退回时间 | rejectTime | String | 100 | 是 | |
| 审批结果 | approveRslt | String | 1 | 是 | Y-审批通过;N-审批拒绝 |
| 退回人 | tlrId | String | 7 | 是 | |
| 退回人名称 | tlrName | String | 100 | 是 | |
退回理由列表rejectReasonList循环结束 |
如果要将审批意见和退回理由合并展示, 也可以提供一个接口,将上面两个接口逻辑合并即可.
4.11 流程取消(注销) [processCancel]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 柜员号 | tlrId | String | 7 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 流程编号 | processNo | String | 32 | 是 | |
| 任务ID | taskId | String | 32 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 |
4.12 流程撤回 [cancelTaskToLastNode]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 柜员号 | tlrId | String | 7 | 是 | |
| 柜员名称 | tlrName | String | 100 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 机构名称 | orgName | String | 100 | 是 | |
| 流程编号 | processNo | String | 32 | 是 | |
| 已办任务ID | taskId | String | 32 | 是 | |
| 业务类型 | busiType | String | 2 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 |
该接口的使用场景, A用户提交任务到下一个审批任务节点给B用户, B用户没有领取任务之前, A用户可以在已办任务界面将流程撤回上个审批节点, B用户的审批任务被取消, 并给A用户自己重新推送一个上个审批节点的审批任务.
任务撤回的功能场景:
需求分析:
4.13 查询下一审批节点的权限用户信息 [queryNextNodeTaskUserInfo]
可以在已办任务界面添加按钮, 触发查询下一审批任务的权限审批用户.
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 流程编号 | processNo | String | 32 | 是 | |
| 柜员号 | tlrId | String | 7 | 是 | |
| 机构号 | orgCode | String | 11 | 是 | |
| 业务类型 | busiType | String | 2 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
| 流程最新任务归属机构 | taskOwnOrgCode | String | 11 | 是 | |
| 流程最新任务归属机构名称 | taskOwnOrgName | String | 100 | 是 | |
| 流程最新任务审批节点名称 | nodeName | String | 100 | 是 | |
最新任务权限用户信息列表userInfoList循环开始 | |||||
| 用户编号 | userCode | String | 7 | 是 | |
| 用户名称 | userName | String | 100 | 是 | |
最新任务权限用户信息列表userInfoList循环结束 |
4.14 流程跟踪信息查询 [processTrackQuery]
请求字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 流程编号 | processNo | String | 32 | 是 |
返回字段
| 字段中文名 | 字段英文名 | 数据类型 | 长度 | 必输 | 说明 |
|---|---|---|---|---|---|
| 响应头 | replyInformation | Object->Map | 是 | ||
流程跟踪信息列表processTrackList循环开始 | |||||
| 节点名称 | nodeName | String | 100 | 是 | |
| 分行号 | branchCode | String | 11 | 是 | |
| 分行名称 | branchName | String | 100 | 是 | |
| 处理部门 | orgCode | String | 11 | 是 | |
| 处理部门名称 | orgName | String | 100 | 是 | |
| 领取任务时间 | taskReceiveTime | String | 20 | 是 | |
| 提交任务时间 | taskCommitTime | String | 20 | 否 | |
| 处理动作 | dealAction | String | 100 | 是 | |
| 处理人 | tlrId | String | 7 | 是 | |
| 处理人名称 | tlrName | String | 100 | 是 | |
流程跟踪信息列表processTrackList循环结束 |
5. 落地实现
就写几个涉及公共流程的接口思路.
5.1 获取下一审批节点/机构信息 [getNextNodeOrg]

5.2 获取下一审批用户列表信息 [getReceiveUserList]

根据功能码+机构号查询, 即查询机构下面具有功能码权限的用户. 涉及到功能码, 角色, 用户等表的关联查询. 功能码相当于界面访问权限, 绑定的是界面的url路径, 然后通过角色分配给用户. 下面是关系图:

5.3 流程发起提交 [processLaunch]


5.4 待办任务领取 [taskReceive]

5.5 任务归还 [taskReturn]

5.6 流程审批提交 [processApprove]

5.7 流程取消(注销) [processCancel]

6. 业务演示
涉及的数据库表及流程维护, 以下是测试数据, 不涉及客户数据.
1). 在MY_BUSI_PARAM表中新增维护一个业务类型, 比如46-批处理挂账后销账.

2). 在MY_NODE_ROLE_PARAM表中新增维护流程节点信息.

3). 提交一笔流程申请, 在MY_PROCESS_INFO主表生成一笔流程信息. apply_no就是process_no

4). 同时在MY_TRADE_INFO交易信息表保存界面的交易信息, 以Json字符串格式保存在TRADE_INFO字段中.

5). 同时推送审批任务给有权限的用户, 在MY_TASK_INFO任务信息表和MY_TASK_USER_INFO任务用户信息表保存任务信息.


6). 同时会生成一笔流程跟踪信息.

7). 后面的审批任务领取, 归还, 提交, 撤回等操作都是围绕这几张表进行.
7. 部分业务流程图
7.1 印鉴卡催缴

7.2 人行账户比对

7.3 客户信息下载

7.4 对公钱包限额调整

7.5 客户优惠利率维护











