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


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

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

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


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望: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、如何把客户端的信息加入到待处理集合(或字典)里,然后如何用多线程来处理它们呢?

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 14:49:00 [只看该作者]

建议客户端把审核消息直接保存到数据库的一个流程表。然后服务端使用数据库事务+异步的方式,按时间顺序取流程表数据处理。类似:


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


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望: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

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 15:42:00 [只看该作者]

使用事务:http://www.foxtable.com/webhelp/topics/3312.htm

do while true
Dim cmd As new SQLCommand()
cmd
.ConnectionName = "Orders"  '指定数据源
Try

    Dim id As Integer 10258
    cmd.BeginTransaction() 
'
开启事务
    cmd.CommandText = 
"select top 1 * from 表A
 Where 已判断=false"
    
dim dt as datatable = cmd.ExecuteReader()
if dt.datarows.count = 0 then
exit do
end if
    
'
继续使用同一个SQLCommand执行其它SQL语句.
    cmd.CommandText = "Update 
表A Set 已判断= true Where OrderID = " & dt.datarows("
OrderID ")
    cmd.ExecuteNonQuery()
    cmd.Commit() 
'
提交事务
Functions.AsyncExecute("nextflow",参数1,参数2,参数…)  '异步调用
Catch
 ex As Exception '如果出错
    cmd.Rollback() 
'
则回滚事务
    
MessageBox.Show(ex.Message, "错误",MessageBoxButtons.OK,MessageBoxIcon.Error)
End
 Try
loop

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


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2023/1/10 16:16:00 [只看该作者]

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

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

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

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 16:29:00 [只看该作者]

并联审批的逻辑是怎么样的?

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


加好友 发短信
等级:狐精 帖子:3223 积分:21401 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2023/1/10 16:31:00 [只看该作者]

我的是审批流程一个表,待审批一个表,审批意见一个表,待审批根据职务判断来推送相关需要审批的数据。
但我审批流不是很大,所以没用事务。

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 16:35:00 [只看该作者]

没看懂。没有理解您具体的审批处理过程和逻辑,没有办法给出进一步的建议

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


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望: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

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 17:25:00 [只看该作者]

这个和异步不异步什么的没有关系。完全就是流程逻辑设计问题。

设计一个表,谁审批过就添加一行记录。B要审批,就先判断这个表,有A审批过的记录,有才能审批。同样D要审批,就先判断这个表,有没有B和C审批过的记录,有才能审批....

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