Foxtable(狐表)用户栏目专家坐堂 → [求助]关于流程审批的排队或多线程处理


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

主题:[求助]关于流程审批的排队或多线程处理

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]关于流程审批的排队或多线程处理  发帖心情 Post By:2023/1/10 14:29:00 [显示全部帖子]

关于流程审批
1、客户端发来流程审批信息,服务器接收并解析这些信息,然后判断它们下一步是否执行、如果执行要执行哪一步、由哪些人来执行下一步
2、因为客户端发来的信息不确定时间的,而且是持续性的(可能这10秒钟内每秒钟都发来20个审核信息,而接下来的1小时都没有审批信息)。也就是说,如果把这些客户端信息加入到一个集合中的话,这个集合的长度随时都可能在变化
3、服务器如果排队处理这10秒钟内的200个审批信息,可能会有一定的延时,所以,用多线程来处理,可能响应速度会快很多
4、如何把客户端的信息加入到待处理集合(或字典)里,然后如何用多线程来处理它们呢?

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/10 15:33:00 [显示全部帖子]

1、客户端在提交审核时,直接保存客户端审核信息到数据库的表A中,这个没有问题,可以做,保存的信息包括:表名、行ID、适用流程ID、当前环节编号、审核人、审核结论、详细意见、提交时间(含日期)、已判断(=false,因为客户端提交以后,服务器肯定还没有判断)
2、服务器怎么处理表A中的数据呢,如果做定时任务去扫描表A也可以,但这个扫描的时间间隔长了不合适,短了耗CPU
3、现在定义了一个函数:nextflow,有以下几个参数:表名、行ID、适用流程ID、当前环节编号、审核结论,开启事务,用于输出下一步是否应当执行、如果可以应当执行哪一步、由谁执行等。在处理完成后把表A中的已判断列更新为true
4、问题:有些单据涉及到并联审批,所以,当同一个单据(同一个单据只能适配一个流程编号)多人同时在审核时,只能有一个进入服务器判断,其它的都需要排队等待
5、服务器要怎么样来调用异步函数呢
不能这么用吧
for each dr as dataraow in datatables("A").selct("已判断=false")
Functions.AsyncExecute("nextflow",参数1,参数2,参数…)  '异步调用
next

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/10 16:16:00 [显示全部帖子]

有些单据涉及到并联审批,所以,当同一个单据(同一个单据只能适配一个流程编号)多人同时在审核时,只能有一个进入服务器判断,其它的都需要排队等待

----这个怎么处理比较好?

---另外,看这个用法,貌似是全排队处理的啊
[此贴子已经被作者于2023/1/10 16:24:06编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/10 17:15:00 [显示全部帖子]

并联审批的意思是:现在总共有5个环节:ABCDE。

A审完,要BC审,BC都通过以后D审,D审完E审

那么BC就是并联审批。如果要执行D,就必须BC都审核通过

如果BC同时提交,服务器并行处理,就可能导致单独处理B时,不知道C是否同意,同理处理C时,不知道B是否同意。在一定概率下会导致BC单独处理,都不能判断是否会执行D

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/10 17:42:00 [显示全部帖子]

最近官网经常报这个错误啊:

HTTP/1.1 500 服务器错误


设计一个表,谁审批过就添加一行记录。B要审批,就先判断这个表,有A审批过的记录,有才能审批。
--可能是我没有表述清楚。

A环节审核完以后,BC环节都可以审核了。
B环节审核不同意,那就退回给A,C环节再审核同意也没意义
如果B环节审核同意在先,后面C环节也审核同意,这时候服务器要就判断可以执行D环节了。

总不能每次都把这个流程里的所有环节都来判断一遍,每个环节能不能执行吧。

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/10 17:44:00 [显示全部帖子]

我所想的是,B环节审核同意了,下一步是D,但这时候系统找不到C环节同意的信息,所以,就静等C环节的审核结果

当C环节的审核信息为同意时,因为下一步是D,这时候系统找到了B环节同意的信息,就会向D环节的涉众发送信息,通知他们可以做D环节的审核工作了

系统是要向涉众推待办事务,而不是用户登录进来,点某一个单据的审核,然后系统不让他点,或者允许他点。
这个就不合适了。
最好是系统根据规则判断某一个环节X可以执行了,给这个环节的涉众发消息,然后涉众用户收到消息,再去办理审核事务

否则,就要用户自己去点,啊,点不了,估计是还没轮到我。
过了一天,又去点,啊,还是点不了
又过了一天,又去点,啊,还是点不了

这显然不人性化啊
[此贴子已经被作者于2023/1/10 17:48:31编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/11 16:43:00 [显示全部帖子]

在客户端处理也是一个办法。
我想的是客户端处理可能受制于网络条件等等因素,如果在服务器上统一处理可能在这方面的影响会小一些。

如果在服务器上处理的话,同一业务单据排队,不同业务单据开启多线程,该当如何做呢?


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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/11 17:14:00 [显示全部帖子]

我在命令窗口执行过综合判断一个审核信息的处理过程,包括
1、下一个环节是否可以执行(就象上面的例子说BC两个环节都通过,D环节才可以执行,这是简单的,实际的执行还有业务条件,例如金额<10万,要流转到D环节,如果<50万,要流转到E环节,如果<100万,要流转到F环节;还可能再附加通过率条件,如同一环节的审核通过率达到60%以上才允许流转到下一环节)
2、下一环节如果可以执行,要通知哪些人去执行下一环节的审批(也就是形成哪些人的待办任务)
有可能是我的代码判断效率不够高吧,执行耗时约1秒钟
正是因为耗时较长,所以才想到在服务器上统一执行

不一定要开启多线程执行,我只是举例。不过我的理解是子线程也是多线程的一种吧
[此贴子已经被作者于2023/1/11 17:19:03编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2200 积分:18103 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/11 18:09:00 [显示全部帖子]

有没有可能出现一种情况。
B环节张三在审,C环节李四在审,同时提交。
张三(结论为同意)提交时,从后台获取数据显示李四还没有提交,所以,D环节不能执行
而李四(结论也是同意)提交时,从后台获取数据张三还没有提交(因为各种原因,如网络传输数据,而实际上张三已经提交了),所以,D环节也不能执行。

但实际上,张三李四都同意且都提交了,D环节应当执行,但阴差阳错,整个流程停在那里不动了。

 回到顶部