執行審核上則是每處理一個環節,就插入一個環節的信息.
我個人認為實現審核的代碼使用存儲過程去實現要比用C#代碼去實現要好,至于用事務處理感覺還是差點,因為如果一個系統的事務處理過多,會造成處理緩慢,而用C#代碼去實現,則需要進行多次的查詢數據庫,操作過程也比較復雜..所以我覺得還是用存儲過程去實現是最理想的.
?1
Create
??
procedure
?ExecFlowAuditPass
?2
(
?3
@AuditMainID
?
int
,
?4
@UserID
?
varchar
(
100
),
?5
@AuditOpinion
?
ntext
,
?6
@Auditstatus
?
int
?7
)
?8
As
?9
--
獲取最后審核的節點
10
declare
?
@posid
?
int
11
select
?
@posid
?
=
?
max
(Sequence)?
from
?審核子表?
where
?MainID
=
?
@AuditMainID
12
--
獲取最大審核的節點
13
declare
?
@maxposid
?
int
14
select
?
@maxposid
=
max
(Sequence)?
from
?流程子表?
where
?MainID
=
?
@AuditMainID
15
--
獲取將審核節點角色資料
16
declare
?
@UserGroupID
?
int
17
select
?
@UserGroupID
?
=
?UserGroupID?
from
?審核子表?
where
?MainID
=
?
@AuditMainID
?
and
?Sequence
=
@posid
+
1
18
--
角色不符
19
if
?(
select
?
count
(
*
)?
from
?員工表?
where
?員工ID
=
@UserID
?
and
?角色ID?
=
?
@UserGroupID
)
=
0
20
begin
21
??
select
?
*
?
from
?審核子表?
where
??MainID
=
?
@AuditMainID
22
??
print
?
-
1
;
23
??
return
?
-
1
;
24
end
25
--
角色符合執行
26
if
?
@Auditstatus
?
=
1
27
begin
28
insert?
into
?流程子表(MainID,AuditOpinion,Auditstatus,Sequence,AuditID,CreateDate,角色ID)?
values
(
@AuditMainID
,
@AuditOpinion
,
1
,
@posid
+
1
,
@UserID
,
getdate
(),
@UserGroupID
)
29
???????????
if
?
@posid
?
+
1
?
=
?
@maxposid
30
????????????
begin
31
?????????????????
update
?審核主表?
set
?Auditstatus?
=
?
3
?
where
?
[
ID
]
=
@AuditMainID
?
32
?????????????
end
33
end
34
else
35
begin
36
?????????????????? insert?
into
?流程子表(MainID,AuditOpinion,Auditstatus,Sequence,AuditID,CreateDate,角色ID)?
values
(
@AuditMainID
,
@AuditOpinion
,
0
,
@posid
+
1
,
@UserID
,
getdate
(),
@UserGroupID
)
37
????????????????
update
?審核主表?
set
?Auditstatus?
=
?
2
?
where
?
[
ID
]
=
@AuditMainID
?
38
end
這個就是執行審核的存儲過程,
現在主任C1打開審核系統,根據需要,他只能看到它能看的審核.
?1
Create
?
procedure
?GetListAudit
?2
(
?3
?
@userid
?
varchar
(
100
),
?4
?
@statusid
?
int
?
--
0待審核,1已審核,2歷史記錄
?5
)
?6
?7
AS
?8
if
?
@statusid
?
=
1
?9
begin
?
10
??
select
?
*
?
11
??
from
?審核主表?
12
??
where
?
[
ID
]
?
in
?
13
??(
14
????
Select
?MainID?
from
?審核子表?
15
????
where
?AuditID?
=
?
@userid
16
???)
17
end
18
if
?
@statusid
?
=
0
19
begin
20
??
select
?
*
21
??
from
?審核主表?
22
??
where
?
[
ID
]
?
not
?
in
23
??(
24
?????
select
?MainID?
from
?審核子表?
25
??????
where
?AuditID?
=
?
@userid
26
??)
27
??
and
?ProcessID?
in
?
28
??(
29
????
Select
?MainID?
from
?流程子表
30
?????
where
?UserGroupID?
in
?
31
?????(
32
??????
select
?角色ID?
from
?員工表
33
???????
where
?員工ID
=
@userid
34
??????)
35
??)
36
end
37
if
?
@statusid
?
=
2
38
begin
?
39
??
select
?
*
40
??
from
?審核主表?
41
??
where
?Auditstatus?
in
(
2
,
3
)
42
??
and
?ProcessID?
in
43
??(
44
????
Select
?MainID?
from
?流程子表
45
?????
where
?UserGroupID?
in
?
46
?????(
47
??????
select
?角色ID?
from
?員工表
48
???????
where
?員工ID
=
@userid
49
??????)
50
??)
51
end
上面的存儲過程還可以增加未提交的列表
只需要一個存儲過程就實現了,未提交,已經審核,未審核,和歷史審核記錄,
并將這些不同的狀態定義為一個枚舉類型.
我們實現了,審核操作,和查看審核信息,還缺少什么呢?還缺少一個文件跟蹤功能,就是審核流程走到哪個角色的功能
?1
Create
?
procedure
?GetListAuditTrail
?2
(
?3
??
@AuditMainID
?
int
?
--
審核單號
?4
)
?5
AS
?6
?7
Select
?a.
*
?b.AuditID,b.CreateDate?Dates
?8
from
?流程子表?a?
left
?
join
?審核子表?b
?9
on
?a.Sequence?
=
?b.Sequence
10
where
?b.MainID
=
@AuditMainID
?
and
?
11
???a.MainID?
in
?(
select
?ProcessID?
from
?審核主表?
where
?
[
ID
]
=
@AuditMainID
?)
從安全性來說,我覺得應該進行下用戶權限檢驗的.
其實我個人寫存儲過程有個習慣的,如果這個存儲過程是返回一個列表的,我喜歡用GetList為開頭,如果執行性存儲過程則喜歡Exec,如果只是返回一個值的用則是GetOnly開頭,
明鏡臺
posted on 2009-05-09 15:37
^喬喬^ 閱讀(2439)
評論(2) 編輯 收藏 引用 所屬分類:
c#