以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]流程审批并发处理  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=175949)

--  作者:chnfo
--  发布时间:2022/3/24 22:24:00
--  [求助]流程审批并发处理
涉及到流程审批。

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

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

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

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

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

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

--  作者:有点蓝
--  发布时间:2022/3/24 22:40:00
--  
流程和多线程没有什么直接的关系。流程无非就是更新状态,再多也就是写入一些意见之类的数据。

如果一个流程需要A审批才能B审批,那么B在审批的时候判断A是否已经审批即可,至于B是在主线程做审批还是在多线程里作审批对流程完全没有影响。

如果是a和b不分先后,随时谁都可以审批,这要看表结构设计了,如果多人审批数据都在同一行,大家同时写数据会有锁,但是如果是一行一行处理的也很快。

如果是有专门的审批表,每人审批就添加一行数据,这种就根本不会互相影响了

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

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


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

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

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

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

--  作者:chnfo
--  发布时间:2022/3/25 11:52:00
--  
我的意思是如何来做异步执行?

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

--  作者:有点蓝
--  发布时间:2022/3/25 13:35:00
--  
ABC三个人的做自己的审核好了,“总经理批准”只需要判断ABC是否都审批通过了就行,和同步还是异步有什么关系?
--  作者:chnfo
--  发布时间:2022/3/25 15:40:00
--  
做了一个自定义函数“判断下一步环节是否执行”
1、客户端做完审核以后,把业务ID、流程ID、当前环节ID、审核意见(通过/不通过)、审核人ID传递给服务端。
2、服务端接收到信息,开始做流程判断。
希望实现的效果:
(1)服务端接收到N个客户端传来的信息(有可能是同时),每个业务ID做异步处理
(2)同一个业务ID,在特定的情况下,如果同时接收到多人的审核意见,就排队依次调用函数“判断下一步环节是否执行”,给出是/否的结果,如果为是,则当前环节ID的下一步可以执行,否则不执行


--  作者:chnfo
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2022/3/25 16:12:00
--  
不理解。审核不就保存数据到数据库么?只需要查数据库是否有对应的审核数据即可
--  作者:chnfo
--  发布时间:2022/3/25 16:29:00
--  
蓝版的意思是服务器接收到客户端的流程审核信息,每接收到一条消息,就往表A里插入一行数据,包括业务ID、流程环节ID、审核意见?
这个没问题,可以理解,这个不需要排队处理,每接收到一条信息,就插入数据。

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

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

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

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

--  作者:有点蓝
--  发布时间:2022/3/25 16:37:00
--  
说了半天,客户端审核不是直接写数据库?而是就发了个消息给服务端?

消息处理确实是需要排队的,这种情况只能把接收的客户端审核数据保存到数据库里,然后在调用异步函数里通过查询数据库的时候数据是否完整来决定下一步