技术文章
待办处理人在每一个work(工作实例)中以二维数组(矩阵)的方式存储:
[
["A","B","C","D"],
["E","F","G"],
["H","I"]]
每一行表示一组可以相互替代的一组处理人.实际编码中是通过嵌套的LinkedList实现.
在工作(work)到达人工环节时主要处理的是要计算此人工环节的处理人,这里的处理人是以身份进行记录的.根据人工环节的配置项,进行计算:
用户标识:指定的人员.如:张三,李四
组织:指定的组织架构,支持嵌套.如:开发部,市场部
群组:定义的群组,支持嵌套.如各部门领导
职位:指在组织中和组织相关的组织角色,比如部门负责人,这里支持动态的计算,张三所在的部门领导是A,李四所在的部门领导是B,那么张三在处理的时得到的是A,李四在处理则会对应的得到B.
流程数据:指表单中填写的数据
脚本:可以通过脚本计算最终通return 返回指定用户.
处理过程中首先获取所有指定的身份,组织和群组,再计算职位,流程数据和脚本都是通过运行后端脚本最终得到数据的.
在得到所有的身份,组织和群组数据后在进行递归解析,最终得到所有的办理人的身份数据.这里得到的是一个多人的数组.后续我们用identities指代计算得到的身份数据.
人工节点处理模式有单人活动(single), 并行(parallel), 顺序执行(queue), 抢办(grab)四中可选方式
人工活动处理方式根据四种不同处理方式执行不同的业务逻辑. 例如计算得到环节的处理人为用户"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接口可以直接调用.
此接口可以实现在指定身份位置进行增,删,改
id:工作标识
identity:指定的身份
optionList:操作列表,结构为{"position":"top",identityList:["张三@001@I"]},position:before(在指定位置前添加),after(在指定位置后添加),top(添加在最前),bottom(添加到最后),extend(与指定位置同一行进行扩展).
remove:操作完成后是否删除指定身份.
基于此接口我们可以实现复杂的办理身份处理:
当前办理人为:
[
["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"]]
系统默提供加签功能,可以限定可加签的范围和数量.
默认加签界面
通过定制一组option来实现特定业务的实现,比如重置处理人,委派等业务场景.