名词解释
流程模板: 审批按照什么流程进行流转的配置文件 详情模板: 审批详情页面要展示的页面配置文件配合配合 workflow-web 使用
背景
制定一个新的流程,是所涉及的业务平台参与方研发一起商讨确定的.不是单独一方完成.(这是目前的前提)
一、步骤
- 创建流程模板
- 导出流程模板
- 将流程模板导入数据库
- 新增调用平台应用信息
- 新增应用和流程模板授权
- 新增详情模板配置
- 提交审批
- 拉取待办
- 输出审批列表
- 审批通过/驳回/取消
- notify通知审批结果(通过/驳回/取消)
- 处理数据
二、创建流程模板
模板配置工具准备
工作流模板创建工具有很多,就不一一列举了.提供一个我在使用的工具.flowable公司提供的.
dockerImage: flowable/all-in-one:6.4.2
docker的使用方法请查阅相关资料,不再赘述. 镜像的启动方式看一下文档即可;github.com/flowable/fl…
不要问我docker怎么用,问一下度娘比我更专业.
配置流程模板
每个任务也必须配置分配用户,指定候选组,可以配置多个.
用户组字段规则为, 平台的app_id _ 职位标识或其他标识
如:禧鹊提交审批 100001_BD 审批节点 100001_22 (职位id)
开放平台提交审批 100002_ISV
每个任务必须配置执行监听器,这是规范,为以后流程增加统一处理规则使用.三个事件(start/end/take)委托表达式统一配置为${xyExecutionListener}
用到排他网关的流程,必须设置分支的流条件的条件表达式,参数统一为${examineStatus == 'Reject'}
和 ${examineStatus == 'Pass'}
注意大小写
三、下载流程模板
配置完流程模板后,将其下载为xml文件. 流程文件扩展名必须是.bpmn20.xml
四、将流程模板导入数据库
用curl请求或postman
curl --request POST \
--url http://t1514.bigmiddle-workflow-api.yunzong:12630/api/v1/bpmn/import \
--header 'Postman-Token: 42204fc8-e487-41c0-9d30-e6931b0475e4' \
--header 'cache-control: no-cache' \
--header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
--form key=examine_process_isv_app \
--form 'name=应用授权审批' \
--form 'bpmn=@/Users/hanshunchuang/Downloads/isv应用授权审批.bpmn20.xml'
五、新增调用平台应用信息
已开放平台为例 当前版本notify_url和callback_url未使用,后期版本扩展使用
新增前请确认双方秘钥.
INSERT INTO flow_app (app_id, app_name, status, notify_url, callback_url, app_pub_key, remark, create_time, update_time)
VALUES (100002, '开放平台', 1, 'http://open.com', 'http://open.com',
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0B2G4JDWg33p4AJ4W4RLSBDMF2Oq0AMqJeoNxzGCzUhfS0Tk4ylOwROv7e16VR/MKiOSdONW3e/+KMt8aFB0Gkm70eVmGi63Jwep05ful19dsh5hHwd8vX5FLMUpKvkMd4pJKSm2kXlvvpdeQ4GYbqf/zpg4FP1is/lX7kz/N9+6m6kO1nnQHfokO+y/pUfIu4aFXEiSyIKH6l+TGsrfoMNOImeTQwmS57PnbSr8UkjofF87OAwmZ2V+Cq2zwGXCkIh5hziCaO6vqgsMR9LoUwNTfYeE82mXGlRUVJuEh2lb/xd+NNKrIcG3tgpDYFaK+cSi3qYtGNmR7su8HQ0wsQIDAQAB',
'开放平台', '1970-01-01 01:00:00', '1970-01-01 01:00:00');
六、新增应用和流程模板授权
已开放平台应用授权审批为例 将该流程参与的平台统一增加授权 应用授权审批参与平台为开放平台和禧鹊
INSERT INTO flow_app_process (process_key, status, app_id, create_time, update_time)
VALUES ('examine_process_isv_app', 1, 100002, '2019-12-04 09:44:11', '2019-12-04 09:44:15');
INSERT INTO flow_app_process (process_key, status, app_id, create_time, update_time)
VALUES ('examine_process_isv_app', 1, 100001, '2019-12-04 09:44:49', '2019-12-04 09:44:51');
##七、新增详情模板配置 已开放平台应用授权审批为例
INSERT INTO flow_template (template, template_name, create_time, update_time, process_key, is_delete)
VALUES ('[{"patchs":[{"title":"ISV公司信息","type":"table","fields":{"body":[[{"type":"text","value":"公司名称:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{companyName}}","options":{"colspan":1}}],[{"type":"text","value":"管理员账号(禧云开放平台):","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"components","components":"sensitive","value":"{{account}}","options":{"colspan":1}}]]}},{"title":"申请权限","type":"table","fields":{"body":[[{"type":"text","value":"应用名称:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{appName}}","options":{"colspan":1}}],[{"type":"text","value":"应用描述:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{appRemark}}","options":{"colspan":1}}],[{"type":"text","value":"应用APPID:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{appId}}","options":{"colspan":1}}],[{"type":"text","value":"服务名称:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{serviceName}}","options":{"colspan":1}}],[{"type":"text","value":"服务描述:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{serviceRemark}}","options":{"colspan":1}}]]}},{"title":"商户信息","type":"table","fields":{"body":[[{"type":"text","value":"商户名称:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{merchantName}}","options":{"colspan":1}}],[{"type":"text","value":"商户主账号(禧云商家中心):","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{merchantMainAccount}}","options":{"colspan":1}}],[{"type":"text","value":"商户编号:","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"text","value":"{{merchantCode}}","options":{"colspan":1}}],[{"type":"text","value":"商户授权协议(照片):","options":{"colspan":1,"style":{"fontWeight":"bold"}}},{"type":"components","components":"v-viewer","value":[{"src":"{{protocolPicUrl}}","desc":"{{createTime}}","name":"{{picName}}"}],"options":{"colspan":1}}]]}}]}]',
'ISV应用授权审批', '2019-12-04 16:57:08', '2019-12-04 16:57:11', 'examine_process_isv_app', 0);
该模板即可通过接口使前端生成页面
前端提供可选组件参考: xiyun-international.github.io/xy/ant-desi…
前端校验地址: ds.bigmiddle-workflow-web.yunzong:12635/#/test
模板配置json结构
[
{
"patchs": [
{
"title": "ISV公司信息",
"type": "table",
"fields": {
"body": [
[
{
"type": "text",
"value": "公司名称:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{companyName}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "管理员账号(禧云开放平台):",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "components",
"components": "sensitive",
"value": "{{account}}",
"options": {
"colspan": 1
}
}
]
]
}
},
{
"title": "申请权限",
"type": "table",
"fields": {
"body": [
[
{
"type": "text",
"value": "应用名称:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{appName}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "应用描述:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{appRemark}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "应用APPID:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{appId}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "服务名称:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{serviceName}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "服务描述:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{serviceRemark}}",
"options": {
"colspan": 1
}
}
]
]
}
},
{
"title": "商户信息",
"type": "table",
"fields": {
"body": [
[
{
"type": "text",
"value": "商户名称:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{merchantName}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "商户主账号(禧云商家中心):",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{merchantMainAccount}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "商户编号:",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "text",
"value": "{{merchantCode}}",
"options": {
"colspan": 1
}
}
],
[
{
"type": "text",
"value": "商户授权协议(照片):",
"options": {
"colspan": 1,
"style": {
"fontWeight": "bold"
}
}
},
{
"type": "components",
"components": "v-viewer",
"value": [
{
"src": "{{protocolPicUrl}}",
"desc": "{{createTime}}",
"name": "{{picName}}"
}
],
"options": {
"colspan": 1
}
}
]
]
}
}
]
}
]
实体数据结构 提交审批接口initData字段数据
{
"appId": 10181930,
"appName": "aaa200",
"appRemark": "aaa200",
"companyName": "测试010",
"createTime": "2019-12-06",
"id": 10197914,
"merchantCode": "100103",
"merchantMainAccount": "13581651932",
"merchantName": "陕西服装工程学院",
"picName": "111.png",
"protocolPicUrl": "http://yunzongtest.oss-cn-beijing.aliyuncs.com/2019/12/06/16/809481575621984.png",
"serviceId": 10005201,
"serviceName": "支付服务",
"serviceRemark": "网关支付服务列表",
"status": 0
}
调用工作流平台接口获取完整前端需要的数据渲染成页面.(前端工程需支持workflow-web组件)
curl --request POST \
--url http://localhost:12630/api/v1/bpmn/examineInfoPage \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Postman-Token: 7155db8b-cb81-424c-b3fb-b16447fc5bc7' \
--header 'cache-control: no-cache' \
--data 'processInstanceId=54f0f125-0a96-11ea-912e-4a650e2916ee&gCode=12&appId=100001&sign=fFflfxLeqfyfWcfZz37Zu6lxWNfAnzWA9m%2BgJKUOORvyfZi5Hmhqy3wKkbxR3kSwvJOUDIvre6Uz6XbasYj%2FMJTiV3IYcyxTHXSht2Cf5ZCO6rEEnKa96JHJsLw6Fg%2BtE4bhIFsLHiLrFnT8CeW7U4IIZtFGza1CgJVL%2Ff%2FejwBazXVsZ8RuTVnIrelT8gI1fDt0s8BakX%2BXgs4IjQgOmOTZ1mERX%2Fu49YLldUY56NL0jAxZAAGfsUWlTlDFz0njZt1zRHZrDuy3%2BuQ%2F8Q4KMHTnD4Cdol3TSpsvKqy%2FUqKB48lXmVE9IvPMl2XUtDG1k6TfYB3lJthhNycM3HbGmw%3D%3D'
提供详情页面有两种方式:
1.iframe嵌入workflow-web页面.嵌入地址
http://ts.xy-workflow-engine-frontend.yunzong:12545/#/detail?processInstanceId=57e91fe4-0c3f-11ea-90e9-0242ac11000d&appId=100001&gCode=11&sign=eIqFcS21Vt8%2FdA1I6elkPtjdTjRyPvxmzQ%2FJSCWQDusnYFrOZqJgK%2BN9Z4WkouCVZxs3ueJJkrgXFOXdkK2Y3Ata0O8GDMS5kMDsMyiOfQszwRX%2BswHjVCAcg5u%2Fg8theLvL8ZzGBWE1EVzJX5cUuVyr531gC24bWTA9MtJz%2BuohfSme8%2FdSt8nEXWwzDexMtgXOrQG96hQ2qsB62qF3j9fCzpLeCfzXsUIVuPAP1GHm75bkT5nlgJL5GPd3wXFg6RLntof%2FovIfey%2FK%2FStjcq9HC1f3xEioMmeyRYnTpYE4eCZN5ExVq86FYw2QsvNwK432Aiy0CPe2%2FRBczqr%2BuA%3D%3D
链接中的参数由服务端生成
2.前端工程引入workflow-web组件.服务端将工作流接口输出数据转发给前端即可.
模板和实体数据进行替换配置规则语法参考: jknack.github.io/handlebars.…
八、提交审批
提交审批 uCode: 平台各自的操作人员标识 gCode: 流程模板配置时指定的候选组
curl --request POST \
--url http://localhost:13001/api/v1/bpmn/startTask \
--header 'Postman-Token: 8dbf29ce-d84c-4ccc-bffe-cd0e31f90a58' \
--header 'cache-control: no-cache' \
--header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
--form uCode=2 \
--form gCode=ISV \
--form 'initData={"account":"18612902902","appId":910032,"appName":"应用名称","appRemark":"应用备注","companyName":"公司名称","createTime":"2019-12-04","picName":"图片名称","id":1000,"protocolPicUrl":"图片url","serviceId":100111,"serviceName":"数据推送服务","serviceRemark":"推送数据用的","status":1,"merchantCode":"10010","merchantName":"商户名称"}' \
--form processKey=examine_process_isv_app \
--form appId=100002
提交工作流平台成功后需建processId流程实例id与审批实体对象数据建立关系表.(后续跟据流程实例id获取审批实体对象数据时会用到)
禧鹊的关系表是qy_examine_commit_job
.存储禧鹊所有作为 提交审批角色 的关系数据.(强弱电方案审批)
开放平台的关系表(应用授权审批)
九、拉取待办
拉取待办脚本 ./yii work-flow-get-todo/index
php端:
\diningData\services\examine\base\WorkFlowProcessEnum
新增枚举
新增业务service类必须继承,业务数据保存自行处理\diningData\services\workFlow\examineClient\ExamineObjectInfo
修改\diningData\services\workFlow\TaskTodoService::getObjectIdByProcessKey
获取待办记录需要根据工作流平台获取的processId从审批提交平台获取审批实体数据,字段根据审批业务需要指定.
如果是禧鹊提交的审批,禧鹊处理,只需要根据processId从表
qy_examine_commit_job
获取审批类型process_key,对象idobject_id
关联业务数据表获取审批实体数据
以应用授权审批为例:
- 从工作流平台获取待办数据(包含流程实例id,流程类型,任务id等字段)
- 根据流程实例id从开放平台获取审批实体数据(公司名称, 主键id 等字段)
- 组装相关数据
- 将待办数据写入
qy_task_todo
表(待办公共表) - 将审批实体数据写入到
qy_wf_bs_isv_app
表 (每个审批业务独有的业务数据表) - 写入操作日志
具体流程参考下面的交互流程图:
curl --request POST \
--url http://localhost:13001/api/v1/bpmn/getTaskTodo \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Postman-Token: e9f24303-5a9a-4254-b6a2-91dd5710a525' \
--header 'cache-control: no-cache' \
--header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
--form groupId=gProjectExamine \
--form appId=100001
十、获取审批列表
审批列表Java端根据业务需求连表生成,参考net.xiyun.middle.home.service.impl.workflow.ExamineIsvAppServiceImpl#getList
十一、审批通过/驳回/取消
Java端
增加枚举
net.xiyun.middle.home.dao.enums.ProcessKeyEnum
业务实现类实现接口net.xiyun.middle.home.service.workflow.ExamineAfterService
修改方法net.xiyun.middle.home.service.impl.workflow.ExamineRouterServiceImpl#getAfterService
增加接口net.xiyun.middle.home.service.workflow.ExamineAfterService
实现类
暂时未涉及审批取消
这期抽象的还不够彻底,后续需求开发过程中再做优化
十二、通知审批结果(通过/驳回/取消)
监听队列wf.event.notify
{
"eventType": "examine_result",
"processId": "0",
"processKey": "",
"desc": "",
"status": "" // pass || reject
"eventTime": ""
}
如果禧鹊操作审批结果,禧鹊可以监听队列异步处理结果,也可以操作时同步处理后续业务
根据processId处理实际业务场景需要处理的数据.
十三、处理数据
根据实际业务场景处理业务数据