基于工作流平台禧鹊开发新审批流程

1,632 阅读9分钟

名词解释

流程模板: 审批按照什么流程进行流转的配置文件 详情模板: 审批详情页面要展示的页面配置文件配合配合 workflow-web 使用

背景

制定一个新的流程,是所涉及的业务平台参与方研发一起商讨确定的.不是单独一方完成.(这是目前的前提)

一、步骤

  • 创建流程模板
  • 导出流程模板
  • 将流程模板导入数据库
  • 新增调用平台应用信息
  • 新增应用和流程模板授权
  • 新增详情模板配置
  • 提交审批
  • 拉取待办
  • 输出审批列表
  • 审批通过/驳回/取消
  • notify通知审批结果(通过/驳回/取消)
  • 处理数据

二、创建流程模板

模板配置工具准备

工作流模板创建工具有很多,就不一一列举了.提供一个我在使用的工具.flowable公司提供的. dockerImage: flowable/all-in-one:6.4.2

docker的使用方法请查阅相关资料,不再赘述. 镜像的启动方式看一下文档即可;github.com/flowable/fl…

不要问我docker怎么用,问一下度娘比我更专业.

配置流程模板

-w1272

每个任务也必须配置分配用户,指定候选组,可以配置多个. 用户组字段规则为, 平台的app_id _ 职位标识或其他标识 如:禧鹊提交审批 100001_BD 审批节点 100001_22 (职位id) 开放平台提交审批 100002_ISV

每个任务必须配置执行监听器,这是规范,为以后流程增加统一处理规则使用.三个事件(start/end/take)委托表达式统一配置为${xyExecutionListener}

-w991
-w995

用到排他网关的流程,必须设置分支的流条件的条件表达式,参数统一为${examineStatus == 'Reject'}${examineStatus == 'Pass'} 注意大小写

-w981

-w1013

三、下载流程模板

配置完流程模板后,将其下载为xml文件. 流程文件扩展名必须是.bpmn20.xml

-w1268

四、将流程模板导入数据库

用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'

-w971

五、新增调用平台应用信息

已开放平台为例 当前版本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);

该模板即可通过接口使前端生成页面

-w981

前端提供可选组件参考: 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,对象id object_id 关联业务数据表获取审批实体数据

以应用授权审批为例:

  1. 从工作流平台获取待办数据(包含流程实例id,流程类型,任务id等字段)
  2. 根据流程实例id从开放平台获取审批实体数据(公司名称, 主键id 等字段)
  3. 组装相关数据
  4. 将待办数据写入qy_task_todo表(待办公共表)
  5. 将审批实体数据写入到qy_wf_bs_isv_app表 (每个审批业务独有的业务数据表)
  6. 写入操作日志

具体流程参考下面的交互流程图:

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处理实际业务场景需要处理的数据.

十三、处理数据

根据实际业务场景处理业务数据

十四、禧鹊开放平台应用授权审批交互流程

开放平台应用审批流程