关于基于流程的待办事项的实现
名词定义
流程:工作流,一项工作的结束决定另一项工作的开始
步骤:流程中的每一步,每个工作
流动主体:步骤中,工作的对象
例如:员工创建一份申请提交给经理,经理批示后下达给员工。这个过程就是一个流程。它包括:创建申请、提交、批示、下达四个步骤,流动主体是申请。
问题描述
这里说的待办事项是记录在一个流程中每个操作人员需要做的事项。
因此,它是基于流程的。要求在流程走到一个步骤时,操作该步骤的人员的待办事项中自动添加一项待办事项,当走到下一步时,该项待办事项自动取消。
待办事项的问题复杂度主要取决于流程的复杂度。
影响流程的复杂度的因素有:
1、是否有并发流程。
2、流动的主体是否发生变化。
我们现在的流程中,有一个并发流程;流动主体有4个:工程、项目、设计单、预算补充申请单。
解决方案
给每个步骤设置一个标志(point)。创建标志列表tbl_pending_notice
给流动主体添加三个属性:当前用户(cur_uid),当前标志(cur_point),流动时间(pass_date)。
设置格式:
标志(point):([流程号]/[步骤号]),如起始步骤(0/1) -> (0/2) 有并发流程后编为(1/1)、(2/1)。
当前用户(cur_uid):([用户编号]),用户编号可以是单个用户的编号如:(34),也可以是多个用户编号的组合如:((12),(34),(56))三个并发流程,每个流程当前步骤的用户编号分别为12、34、56。
当前标志(cur_point):(([用户编号])@([标志位]))。如单流程((34)@(0/4)),三并发流程((12)@(1/1),(34)@(2/1),(56)@(3/1))。
流动时间(pass_date):时间型数据。
操作方法
读取代办事项
设:读取用户编号34的用户(以下简称用户34)在工程上的待办事项
1、在工程表中,查找cur_uid中有没有(34),有则表示用户34在该工程中有待办事项;
2、检查在cur_point中有没有(34)@,如果没有,则数据结构损坏
3、在cur_point中,截取从(34)@后一位开始到末尾的字串;
4、在截取的字串中,截取从头开始到第一个“)”的字串,即步骤标志位
从而得到用户34在工程表中,当前的待办事项。
SQL:
Declare @myid varchar(50) SET @myid = '(34)'
select my_point,pass_date ,replace(n.message,'<Project name/>',a.project_name_vchr)as cur_message from ( select substring(my_point,1,charindex(')',my_point)) as my_point ,pass_date,project_name_vchr from ( select pass_date,project_name_vchr,cur_point,substring(cur_point,charindex(''+ @myid +'@',cur_point)+len(''+ @myid +'@'),len(cur_point)) as my_point from tbl_project_info where cur_uid like '%'+ @myid +'%' and charindex(''+ @myid +'@',cur_point)>0 )as a ) as a left outer join tbl_pending_notice n on a.my_point =n.point |
步骤流转
1、在cur_uid中,将我的用户编码替换为下一任的用户编码;
2、在cur_point中,将我的标志位替换为下一任的标志位
例:当前用户34在步骤(0/4),完成后传给用户25,步骤(0/5)
SQL
Declare @ProjectId bigint Declare @MyId varchar(50) Declare @NextId varchar(50) Declare @MyPoint varchar(50) Declare @NextPoint varchar(50) Set @ProjectId=0 Set @MyId='(34) ' Set @NextId= '(25)' Set @MyPoint='(34)@(0/4)' Set @NextPoint ='(25)@(0/5)'
Update tbl_project_info set pass_date=getdate() ,cur_uid=replace(cur_uid,@MyId,@NextId) ,cur_point=replace(cur_point,@MyPoint,@NextPoint) Where id=@ProjectId |