Foxtable(狐表)用户栏目专家坐堂 → [求助]流程审批并发处理


  共有6035人关注过本帖树形打印复制链接

主题:[求助]流程审批并发处理

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]流程审批并发处理  发帖心情 Post By:2022/3/24 22:24:00 [显示全部帖子]

涉及到流程审批。

有10个人同时提交流程审批,但其中6个人分别审核业务ABCDEF,一对一;还有4个人是并联审批G业务。

现在假设的场景是访问人数少,可以给10个做排队审批,不会有问题。
但如果同时提交流程审批的人数多,再排队就不合适了。

所以,可能需要异步处理了

比如定义一个“流程审核”的函数,分别接收客户端传来的业务ID、流程环节ID等信息,判断下一步处理环节。

希望是ABCDEF开启多线程异步处理,这样可以同时来调用“流程审核”函数
但G业务,就需要甲乙丙丁四个人依次排队了,因为如果同时处理,四人意见不统一时,同时写处理结论可能会死锁。

怎么来设计这个处理方式呢?

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 11:42:00 [显示全部帖子]

是这样的,某一项具体的业务,因为存在各种串并联的情况(有点象电路一样的),ABC三个人都在提交审批意见,因为有些人审批以后不同意会退回,有些同意可能他的下一步可以继续。
服务器接收到审核意见以后,要判断有些环节能不能继续进行(比如环节X的前置审核环节有两个,环节MN都通过了X才能进行),如果异步处理,M和N同时处理,可能就停在那里不动了。

所以,每一个项具体的业务,要单独开一个线程来执行下一步是否可以执行
而不是说,每一个终端用户提交审批意见以后,都单独开一个线程来处理,如果终端用户甲提交审批意见以后,服务器要看甲的业务有没有正在处理,正在处理,甲就得排队


比如现在有多人同时在审批。
但甲在审报销,乙在审请假,这没有问题。

但ABC三个人都在审供应商丁的本月对账数据,但处在不同的环节上(假定他们的下一步都是环节“报总经理批准”),因为任何一个人的意见都可能导致两种结果:继续往下走、退回到某个环节。

如果异步执行ABC三个的审核结果,即使三个人都表示同意,也可能导致“总经理批准”执行不了。

这时候,ABC的审核请求要排队处理。
但甲乙的审核业务可以跟这个异步执行
[此贴子已经被作者于2022/3/25 11:50:03编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 11:52:00 [显示全部帖子]

我的意思是如何来做异步执行?

只要审批不是在做同一个业务,都可以单独线程处理。
但如果是多人在做同一个业务的审批,就得排队

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 15:40:00 [显示全部帖子]

做了一个自定义函数“判断下一步环节是否执行”
1、客户端做完审核以后,把业务ID、流程ID、当前环节ID、审核意见(通过/不通过)、审核人ID传递给服务端。
2、服务端接收到信息,开始做流程判断。
希望实现的效果:
(1)服务端接收到N个客户端传来的信息(有可能是同时),每个业务ID做异步处理
(2)同一个业务ID,在特定的情况下,如果同时接收到多人的审核意见,就排队依次调用函数“判断下一步环节是否执行”,给出是/否的结果,如果为是,则当前环节ID的下一步可以执行,否则不执行


 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 15:49:00 [显示全部帖子]

比如服务器同时接收到ABC三个人的审核信息,他们都是审核同一个业务ID的。
借用QQServer与异步编程的介绍:

e.AsyncExecute = True  '通知系统不要关闭信道
Functions.AsyncExecute("环节判断", e) '异步调用函数处理下一步是否执行

如果下一步的条件是ABC都同意才可以执行。
如果异步判断三条审核信息(因为函数处理也需要时间),有没有可能出现一种情况

ABC三个人本来都同意
异步处理的时候,处理A时还没有调取到BC的审核意见(为空会认为不同意)
处理B的时候,还没有传递AC的意见

然后互相不知道另外两个人是否同意,然后返回一个结论:下一步不能执行。

这就象出去吃饭,都以为对方带酒了,结果没酒喝

这就是我所想说的,如果是同一个业务ID,服务器要处理多人审核意见时,就要排队;如果不是同一个业务ID时,就不需要排队

[此贴子已经被作者于2022/3/25 15:51:36编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 16:29:00 [显示全部帖子]

蓝版的意思是服务器接收到客户端的流程审核信息,每接收到一条消息,就往表A里插入一行数据,包括业务ID、流程环节ID、审核意见?
这个没问题,可以理解,这个不需要排队处理,每接收到一条信息,就插入数据。

我现在要做的事情是:服务器接收到客户端的用户张三传来的某一个环节A的审核信息,包括业务ID、流程环节ID、审核意见,然后就要调用函数去判断张三审核以后,下一步应当执行什么,是回退到以前的某一个环节,还是继续执行下一步X
同理,接收到李四的环节B的审核信息、王五的环节C的审核信息,都要这么处理。

假如X要执行,是取决于张三、李四、王五分别处理的ABC三个环节都同意才可以,否则就不可以。(如果张三同意,李四还没审或不同意,都不可执行)

如果张三、李四、王五间隔很长时间审核,就没什么问题。

假如张三、李四、王五同时审核完成(假如都同意),服务器是要排队处理的吧,依次把张三、李四、王五的审核意见传进函数,才能最终确定X能不能执行啊。
如果异步处理,会不会出问题?--得到一个结论:X不能执行?

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 16:44:00 [显示全部帖子]

这个流程是例如这个样子的。
客户端审核完成以后,由客户端往数据库里写审核流水也没有问题,把审核的详细信息通过消息发给服务器,由服务器往数据库里写审核流水也可以。

如图的X必须三个黄色的环节都审核同意才可以执行

但是判断下一步能不能执行,肯定是交给服务器来执行的。
图片点击可在新窗口打开查看此主题相关图片如下:流程.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2022/3/25 16:45:23编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 16:50:00 [显示全部帖子]

说了半天,客户端审核不是直接写数据库?而是就发了个消息给服务端?---是的,我的想法是让服务器统一处理写数据库(客户端写了以后实时往数据库里存也可以)

消息处理确实是需要排队的,这种情况只能把接收的客户端审核数据保存到数据库里,然后在调用异步函数里通过查询数据库的时候数据是否完整来决定下一步
---因为流程审核可能会被退回再审,也就是同一个环节可能会走多次。比如某个环节审核不同意,退回去重新处理,再走到这个环节的时候,还不同意,又退回,又又又……

所以,我的想法是,如果是同一个业务ID(比如3月份给供应商甲的供货对账),如果有多人同时审,就排队处理这个业务ID的审核流水;如果不是同一个业务ID(比如3月份审供应商甲的对账、供应商乙的对账、……)就开启多线程处理。一个业务ID开启一个线程
[此贴子已经被作者于2022/3/25 16:53:48编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 16:57:00 [显示全部帖子]

就象上面的图示,如果B、M(或N)都已经审完且同意了,但环节K如果不同意,会打回到环节U,U处理以后,所有后续环节全部都要再审的(也就是B、M或N已经审过也废了,得重审)

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2022/3/25 17:09:00 [显示全部帖子]

因为如果K环节不同意,系统需要将U、B、M(或N)、P、Q的审核状态标记为未完成,这样,X就不能执行了。

如果没有上面这个处理过程。K打回U,U环节改了数据,再走到下一步(要K、B再审),K同意了,如果这时候BM(或N)不再审,数据库直接判断说K、P、Q都通过了,就直接往下走,这肯定是不行的。

所以,审核流水信息虽然重要(但它只是记录性质的),更重要的是下面这一点

我想要知道的是:服务器如何把客户端传来的审核流水信息,每个业务ID分别异步处理,同一个业务ID中如果有多条流水做排队处理



[此贴子已经被作者于2022/3/25 17:11:21编辑过]

 回到顶部
总数 12 1 2 下一页