综合

# 如何支持外部表单?

  1. 删除流程中的表单,仅仅使用外部表单是不可以的。举个例子:工作流中条件分支使用了表单中的一个数字表单当条件,外部表单如何实现?
  2. 所以我们要结合外部表单和工作流表单一起使用

# 使用方法

# 以请假为例

  1. 首先先创建完整的工作流表单和流程,比如表单有:开始时间结束时间两个表单

这里要记录下三个字段:流程id(第一张图)和各个表单id(第二张图点击每个表单右侧会显示)

上图对应的流程id:flyflow_flow_497599681047

开始时间id:flyflow_form_498203572070

结束时间id:flyflow_form_498220889239

  1. 假如外部表单也有两个字段对应的开始时间(startTime)和结束时间(endTime)
  2. 业务流程发起表单的时候可以将业务表的字段值转为流程的表单值发起 假设现在业务表中的开始时间和结束时间的值如下
{
    "startTime": "2024-05-06 09:00:00",
    "endTime": "2024-05-08 18:00:0"
}

那转成流程表单值如下:

{
    "flyflow_form_498203572070": "2024-05-06 09:00:00",
    "flyflow_form_498220889239": "2024-05-08 18:00:0"
}
  1. 调用发起流程,具体可以打开页面F12找到发起流程的接口和参数格式 请求地址:/process-instance/startProcessInstance

请求参数:

{
    "uniqueId": "flyflow_flow_497599681047",
    "paramMap": {
        "flyflow_form_498203572070": "2024-05-06 09:00:00",
        "flyflow_form_498220889239": "2024-05-08 18:00:0",
        "dynamicFormLastIndex": -1,
        "startUserMainDeptId": "1"
    }
}

uniqueId:即表单id

dynamicFormLastIndex:默认动态表单查询索引-1,必填的

startUserMainDeptId:发起人的主部门id,如果有一人多部门的情况,此处要选择一个主部门id,必填的

  1. 关于业务表单如何转为流程表单:可以建立一个表单映射关系表,即业务表id和流程表单id的映射
  2. 业务表单转成流程表单的格式,可以查看表单文档有介绍表单 (opens new window)

# 如何实现直接调用接口发起流程(包括其他需要认证登录的接口)

实现该操作最核心的在于如何跳过验证,并且可以获取到当前用户id

打开配置文件:

## 认证方式 如果是web 则是satoken拦截器拦截请求头实现  如果是custom的方式 则是header的传入jwt方式验证
auth:
#  cc.flyflow.common.constants.FlyFlowConstant.UserAuthType
  type: web
#  type=custom限制客户端访问的ip地址 必填
  ipList:
    - 127.0.0.1

  1. 认证方式有三个配置:web,customboth ,具体可以查看类cc.flyflow.common.constants.FlyFlowConstant.UserAuthType
  2. web:默认从前端传递token登录
  3. custom:支持接口直接调用,从header里直接获取用户id
  4. both:上述两种方式种任何一种方式可以获取到用户id即可实现接口鉴权

当我们使用custom方式实现其他业务直接调用接口发起流程时,参数和url地址与web形式访问一致(记得传递默认的租户id:-1)

额外需要传递的参数是在header里添加当前发起流程的用户id字段:AuthUserId,该字段对应的值即为用户id

具体如何获取用户id的可以查看拦截器实现:LoginInterceptor

# 如何实现不同节点不同表单?

  1. 一个流程只有一套表单,所谓的不同节点不同表单是通过权限控制的

  2. 打开审批人节点如下即可配置

# 如何查询历史流程变量?

## 流程实例id
String pid="";
List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(pid).list();

上述查询会查询到所有的变量,包括本地变量

比如,流程变量和本地任务变量里都有一个key是var的,值分别是1和2

那上述查询的所有变量里会有两个var的变量,区别是有一个变量里有taskId,标记为是任务本地变量

# 如何查询历史流程任务本地变量?

## 流程实例id
String pid="";
## 任务id
String tid="";
List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().taskId(tid).processInstanceId(pid).list();

# 为啥包容分支或者并行分支里的审批节点不能驳回到发起人节点?

这两个分支的特点是都会出现多个分支同时执行的情况,比如A、B两个分支

此时如果A分支的一个审批节点驳回到发起人,那B分支会出现两种情况:

  1. B分支保持原样,那就会出现,A分支驳回到发起人,继续向下执行,当执行到当前网关的时候,B分支又会被执行一次,这肯定是错误的
  2. B分支也驳回到发起人,那就会出现B分支某些节点已经完成的情况,被强制驳回了重新执行,且B分支的驳回是由于其他分支受影响的

基于以上两点,本工作流系统的原则是不同分支不能相互影响,保持了数据的独立性和完整性,所以这两种分支的审批节点不能驳回出分支