技术文章

当前位置:首页>帮助手册>技术文章

o2server人工处理节点底层流转机制详解

时间:2022-06-09   

数据存储

待办处理人在每一个work(工作实例)中以二维数组(矩阵)的方式存储:

[
   ["A","B","C","D"],
   ["E","F","G"],
   ["H","I"]]

每一行表示一组可以相互替代的一组处理人.实际编码中是通过嵌套的LinkedList实现.

到达人工活动活动环节事件(arrive)

在工作(work)到达人工环节时主要处理的是要计算此人工环节的处理人,这里的处理人是以身份进行记录的.根据人工环节的配置项,进行计算:

WX20220609-140111@2x.png

处理过程中首先获取所有指定的身份,组织和群组,再计算职位,流程数据和脚本都是通过运行后端脚本最终得到数据的.

在得到所有的身份,组织和群组数据后在进行递归解析,最终得到所有的办理人的身份数据.这里得到的是一个多人的数组.后续我们用identities指代计算得到的身份数据.

人工节点处理模式

人工节点处理模式有单人活动(single), 并行(parallel), 顺序执行(queue), 抢办(grab)四中可选方式

WX20220609-140453@2x.png


人工活动处理方式根据四种不同处理方式执行不同的业务逻辑. 例如计算得到环节的处理人为用户"A","B","C","D"

单人活动实现

单人活动将前面得到的identities以单行的方式(asColumn)存储到处理人矩阵中:

[
   ["A","B","C","D"]]

然后读取该环节所有的已办,将已办中的人从处理人矩阵中删除,删除的方式为以行方式删除,如果该行有一个的数据那么删除整行: 如

[
   ["A","B","C","D"],
   ["E","F","G"],
   ["H","I"]]

删除"F",由于在第二行包含"F",执行删除后得到:

[
   ["A","B","C","D"],
   ["H","I"]]

经过这样处理后就从处理人矩阵中删除了已经办理的人员,剩余的是待办理人员,如果剩余人员为空,那么说明所有的处理人已经全部处理完成了,工作(work)需要离开当前环节,否则读取矩阵的第一行

    ["A","B","C","D"]

并为"A","B","C","D"分别创建待办.

并行实现

并行将前面得到的identities以多行的方式存储到处理人矩阵中:

[
   ["A"],
   ["B"],
   ["C"],
   ["D"]]

然后读取该环节所有的已办,将已办中的人从处理人矩阵中删除,删除的方式为以行方式删除,这个和前面在单人活动中的模式是完全一致的.

比如找到了"B"的已办进行删除后就得到了

[
   ["A"],
   ["C"],
   ["D"]]

由于是并行环节,这里会读取到处理人矩阵中所有的人员全部创建待办,也就是为"A","C","D"创建待办.

顺序执行实现

顺序执行将前面得到的identities以多行的方式(mutliRow)存储到处理人矩阵中:

[
   ["A"],
   ["B"],
   ["C"],
   ["D"]]

然后读取该环节所有的已办,将已办中的人从处理人矩阵中删除,删除的方式为以行方式删除,这个和前面在并行环节中的模式是完全一致的.

然后对处理人矩阵中读取第一行创建待办,这里的处理逻辑是和单人活动一直的.

抢办实现

抢办的业务逻辑多人都接收到待办,如

[
   ["A","B","C","D"]]

一旦抢办如"B"执行了抢办,那么"A","C","D"待办消失,有"B"负责办理.用于实现类似"客服抢办"这样的业务场景.

针对当前处理身份的操作

基于上述的数据结构,额外增加了对待办身份数据进行直接修改的功能.可以针对数据进行

增加操作:

add(String identity, String position, List<String> list);

删除操作:

remove(String identity);

替换操作:

ManualTaskIdentityMatrix replace(String source, String target);

其中add操作已经包装了jaxrs接口可以直接调用.

WX20220609-140617@2x.png

此接口可以实现在指定身份位置进行增,删,改

基于此接口我们可以实现复杂的办理身份处理:

前加签

当前办理人为:

[
   ["A"]
   ["B"]
   ["C"]]

执行add操作:

{"identity":"B","position":"before","identityList":["加签人甲","加签人乙"],"remove":false}

操作后的办理身份

[
   ["A"],
   ["加签人甲"],
   ["加签人乙"],
   ["B"],
   ["C"]]

后加签

当前办理人为:

[
   ["A"]
   ["B"]
   ["C"]]

执行add操作:

{"identity":"B","position":"after","identityList":["加签人甲","加签人乙"],"remove":false}

操作后的办理身份

[
   ["A"],
   ["B"],
   ["加签人甲"],
   ["加签人乙"],
   ["C"]]

转交

当前办理人为:

[
   ["A"]
   ["B"]
   ["C"]]

执行add操作:

{"identity":"B","position":"extend","identityList":["加签人甲","加签人乙"],"remove":true}

操作后的办理身份

[
   ["A"],
   ["加签人甲","加签人乙"],
   ["C"]]

默认加签

系统默提供加签功能,可以限定可加签的范围和数量.

WX20220609-140713@2x.png

默认加签界面

WX20220609-140752@2x.png

自定义业务逻辑

通过定制一组option来实现特定业务的实现,比如重置处理人,委派等业务场景.









上一篇:O2OA把流程表单保存到附件中-档案系统归档

下一篇:o2server启用定时thread dump(stack trace)功能