執行審核上則是每處理一個環節,就插入一個環節的信息.
我個人認為實現審核的代碼使用存儲過程去實現要比用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

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

這個就是執行審核的存儲過程,
現在主任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

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

上面的存儲過程還可以增加未提交的列表
只需要一個存儲過程就實現了,未提交,已經審核,未審核,和歷史審核記錄,
并將這些不同的狀態定義為一個枚舉類型.
我們實現了,審核操作,和查看審核信息,還缺少什么呢?還缺少一個文件跟蹤功能,就是審核流程走到哪個角色的功能
?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
?)

?2

?3

?4

?5

?6

?7

?8

?9

10

11

從安全性來說,我覺得應該進行下用戶權限檢驗的.
其實我個人寫存儲過程有個習慣的,如果這個存儲過程是返回一個列表的,我喜歡用GetList為開頭,如果執行性存儲過程則喜歡Exec,如果只是返回一個值的用則是GetOnly開頭,