關於基於流程的待辦事項的實現
名詞定義
流程:工作流,一項工作的結束決定另一項工作的開始
步驟:流程中的每一步,每個工作
流動主體:步驟中,工作的對象
例如:員工創建一份申請提交給經理,經理批示後下達給員工。這個過程就是一個流程。它包括:創建申請、提交、批示、下達四個步驟,流動主體是申請。
問題描述
這裏說的待辦事項是記錄在一個流程中每個操作人員需要做的事項。
因此,它是基於流程的。要求在流程走到一個步驟時,操作該步驟的人員的待辦事項中自動添加一項待辦事項,當走到下一步時,該項待辦事項自動取消。
待辦事項的問題複雜度主要取決於流程的複雜度。
影響流程的複雜度的因素有:
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 |