234 lines
8.3 KiB
Plaintext
234 lines
8.3 KiB
Plaintext
CREATE PROC DBO.GEXBPM_SIGNOK
|
||
(
|
||
@BILLTAG VARCHAR(20), --單別
|
||
@BILLNO VARCHAR(20), --簽核單號
|
||
@SOURCESEQNO INT, --簽核單序號
|
||
@LOGINID VARCHAR(30),
|
||
@SIGNMEMO NVARCHAR(600)
|
||
)
|
||
AS
|
||
/*
|
||
Function : FLOW 核可時的更新資料程序
|
||
Description: 行動簽核 @SOURCESEQNO = -1
|
||
程式中有判斷跳簽的處理程序
|
||
只是將中間人員的 FLOWSTATUS 都改為已簽
|
||
|
||
FLOWSTATUS 0(待簽),1(已送件),2(退件),3(未到件),4(完成),5(通知),7(拒簽),9(作廢)
|
||
Build Date : 2011/10/05
|
||
|
||
Modify History
|
||
Item Who Date Modify Docs
|
||
==== ========== ========== ================================================
|
||
1 Michael 2011/10/05 新增
|
||
2 Michael 2013/07/01 加入連續相同人員, 直接簽核過的新功能
|
||
3 Michael 2013/07/13 新增通知的處理
|
||
4 Michael 2013/07/23 新增送下一關時, 同時通知代理人
|
||
5 Michael 2013/08/14 多考慮下一關為多人會簽的情況
|
||
|
||
*/
|
||
|
||
DECLARE @PRE_DATE DATETIME
|
||
DECLARE @NEXT_PERSON VARCHAR(20)
|
||
DECLARE @SEQ1 INT
|
||
DECLARE @SEQ3 INT
|
||
DECLARE @CNT INT
|
||
|
||
--傳入的是原單號還是簽核單號
|
||
SELECT @CNT=COUNT(*) FROM BPM_FLOWDATA_M WHERE BILLTAG = @BILLTAG AND BILLNO = @BILLNO
|
||
IF @CNT <= 0 SELECT @BILLNO=BILLNO FROM BPM_FLOWDATA_M WHERE BILLTAG = @BILLTAG AND SOURCEBILLNO = @BILLNO
|
||
|
||
--寫 LOG 專用
|
||
SELECT @SEQ1=MAX(SEQNO)+1,@PRE_DATE=MAX(BILLDATE) FROM BPM_FLOWDATA_LOG WHERE BILLNO = @BILLNO
|
||
|
||
--防錯(測試專用)
|
||
IF @SEQ1 IS NULL BEGIN SET @SEQ1 = 0 END
|
||
IF @PRE_DATE IS NULL BEGIN SET @PRE_DATE = GETDATE() END
|
||
|
||
--防錯, 如果 @SOURCESEQNO < 0, 則要取目前待簽的那一筆 SEQNO(配合行動簽核修改)
|
||
IF @SOURCESEQNO < 0 SELECT TOP 1 @SOURCESEQNO=SEQNO,@LOGINID=SIGNPERSON FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND FLOWSTATUS = 0
|
||
|
||
--寫 LOG
|
||
INSERT INTO BPM_FLOWDATA_LOG (BILLNO,SOURCESEQNO,SEQNO,FLOWINDATE,BILLDATE,FLOWSTATUS,SIGNPERSON,MEMOCHAR)
|
||
SELECT @BILLNO,@SOURCESEQNO,@SEQ1,@PRE_DATE,GETDATE(),1,@LOGINID,@SIGNMEMO
|
||
|
||
--判斷跳簽, 多 UPDATE 中間人員的狀態即可(由目前的待簽到本筆簽核間的資料都 Update)
|
||
DECLARE @FLOWSTATUS SMALLINT
|
||
SELECT @FLOWSTATUS=FLOWSTATUS FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO = @SOURCESEQNO
|
||
IF @FLOWSTATUS = 2 OR @FLOWSTATUS = 3
|
||
BEGIN
|
||
SELECT @SEQ1=ISNULL(MAX(SEQNO),0) FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO < @SOURCESEQNO AND FLOWSTATUS = 0 --(FLOWSTATUS = 1 OR FLOWSTATUS = 4)
|
||
IF @SEQ1 IS NULL SET @SEQ1 = 0
|
||
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 1 WHERE BILLNO = @BILLNO AND SEQNO > @SEQ1 AND SEQNO <= @SOURCESEQNO AND ISNULL(NOTIFY_ONLY,'N') <> 'Y'
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 5 WHERE BILLNO = @BILLNO AND SEQNO > @SEQ1 AND SEQNO <= @SOURCESEQNO AND ISNULL(NOTIFY_ONLY,'N') = 'Y'
|
||
END
|
||
|
||
--將 BPM_FLOWDATA_D 狀態改為 [1-已簽], 因為會簽多人時(相同欄號), 只要一人有簽就過, 其他人也要改為 [已簽]
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 1 WHERE BILLNO = @BILLNO AND SEQNO = @SOURCESEQNO --AND SIGNPERSON = @LOGINID
|
||
|
||
--如果是最後一筆, BPM_FLOWDATA_M 的狀態改為完成, 並回寫原單的 SIGN_PERSON
|
||
DECLARE @SEQ2 INT
|
||
DECLARE @SEQ9 INT
|
||
DECLARE @SOURCETBL VARCHAR(30)
|
||
DECLARE @SOURCEPK VARCHAR(30)
|
||
DECLARE @SQL NVARCHAR(400)
|
||
DECLARE @NOTIFY_ONLY CHAR(1)
|
||
DECLARE @SENDMAIL CHAR(1)
|
||
DECLARE @FLOWZ CHAR(1)
|
||
DECLARE @NOTIFY_WHO CHAR(1)
|
||
DECLARE @ORG_PERSON VARCHAR(20)
|
||
DECLARE @SOURCEBILLNO VARCHAR(20)
|
||
DECLARE @SIGN_TITLE NVARCHAR(30)
|
||
DECLARE @AGENTID VARCHAR(30)
|
||
|
||
/*
|
||
@SEQ2 是需簽核的最後一筆
|
||
@SEQ9 是所有簽核的最後一筆
|
||
差別是最後幾筆可能是通知
|
||
*/
|
||
SELECT @SEQ2=MAX(SEQNO) FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND ISNULL(NOTIFY_ONLY,'N') <> 'Y'
|
||
SELECT @SEQ9=MAX(SEQNO) FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO
|
||
SELECT @ORG_PERSON=SIGNPERSON FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO = 0
|
||
SELECT @SOURCETBL=SOURCETABLE,@SOURCEPK=SOURCEPK,@NOTIFY_WHO=NOTIFY_WHO FROM BPM_FLOWSETUP_M WHERE BILLTAG = @BILLTAG
|
||
SELECT @SOURCEBILLNO=SOURCEBILLNO FROM BPM_FLOWDATA_M WHERE BILLNO = @BILLNO
|
||
|
||
--需簽核的最後一筆
|
||
IF @SEQ2 = @SOURCESEQNO
|
||
BEGIN
|
||
--最後一筆不可以是通知(改為可以)
|
||
UPDATE BPM_FLOWDATA_M SET FLOWSTATUS = 4 WHERE BILLNO = @BILLNO
|
||
|
||
--回寫原單(固定為 SIGN_PERSON 及 FLOWFLAG)
|
||
SET @FLOWZ = 'Z'
|
||
SET @SQL = 'UPDATE ' + @SOURCETBL + ' SET SIGN_USER = ' + CHAR(39)+@LOGINID+CHAR(39) + ',FLOWFLAG = ' + CHAR(39)+@FLOWZ+CHAR(39) +
|
||
' WHERE ' + @SOURCEPK + ' = ' + CHAR(39) + @SOURCEBILLNO + CHAR(39)
|
||
EXECUTE SP_EXECUTESQL @SQL
|
||
|
||
--發送 MAIL(不另發通知)
|
||
IF @NOTIFY_WHO = 'S'
|
||
BEGIN
|
||
--INSERT INTO BPM_SENDMAIL (LOGINID,SENDDATE,SENDWHO,NOTIFY_ONLY,BILLNO,SEQNO)
|
||
--SELECT @LOGINID,GETDATE(),@ORG_PERSON,'E',@BILLNO,@SOURCESEQNO
|
||
|
||
--sql db sendmail
|
||
EXEC GEX_SEND_FLOWMAIL 'S',@ORG_PERSON, @BILLNO, '已簽核完畢'
|
||
END
|
||
ELSE IF @NOTIFY_WHO = 'A'
|
||
BEGIN
|
||
--INSERT INTO BPM_SENDMAIL (LOGINID,SENDDATE,SENDWHO,NOTIFY_ONLY,BILLNO,SEQNO)
|
||
--SELECT @LOGINID,GETDATE(),A.SIGNPERSON,'E',@BILLNO,@SOURCESEQNO FROM BPM_FLOWDATA_D A
|
||
--WHERE A.BILLNO = @BILLNO
|
||
|
||
--sql db sendmail
|
||
EXEC GEX_SEND_FLOWMAIL 'A',@ORG_PERSON, @BILLNO, '已簽核完畢'
|
||
END
|
||
|
||
--如果不是最末筆(還有其他的通知, 目前的寫法, 改為允許多個通知人)
|
||
IF @SEQ2 <> @SEQ9
|
||
BEGIN
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 5 WHERE BILLNO = @BILLNO AND SEQNO > @SEQ2 AND ISNULL(NOTIFY_ONLY,'N') = 'Y'
|
||
|
||
--有可能是通知多人, 要跑 loop
|
||
DECLARE contact_cursorN1 CURSOR FOR
|
||
SELECT SIGNPERSON,SENDMAIL FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO > @SEQ2 AND ISNULL(NOTIFY_ONLY,'N') = 'Y'
|
||
|
||
OPEN contact_cursorN1
|
||
|
||
-- Perform the first fetch.
|
||
FETCH NEXT FROM contact_cursorN1
|
||
INTO @ORG_PERSON,@SENDMAIL
|
||
|
||
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
|
||
WHILE @@FETCH_STATUS = 0
|
||
BEGIN
|
||
IF @SENDMAIL = 'Y'
|
||
EXEC GEX_SEND_FLOWMAIL 'S',@ORG_PERSON, @BILLNO, '(通知)已簽核完畢'
|
||
|
||
FETCH NEXT FROM contact_cursorN1
|
||
INTO @ORG_PERSON,@SENDMAIL
|
||
END
|
||
|
||
CLOSE contact_cursorN1
|
||
DEALLOCATE contact_cursorN1
|
||
END
|
||
END
|
||
ELSE BEGIN
|
||
--如果不是最後一筆, 則找到下一筆待簽, 將狀態改為 [0-待簽]
|
||
SELECT @SEQ3=MIN(SEQNO) FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO > @SOURCESEQNO
|
||
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 0 WHERE BILLNO = @BILLNO AND SEQNO = @SEQ3
|
||
|
||
--有可能是多人, 要跑 loop
|
||
DECLARE contact_cursor CURSOR FOR
|
||
SELECT SIGNPERSON,SENDMAIL,SIGN_TITLE,NOTIFY_ONLY,AGENTID FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO = @SEQ3
|
||
|
||
OPEN contact_cursor
|
||
|
||
-- Perform the first fetch.
|
||
FETCH NEXT FROM contact_cursor
|
||
INTO @ORG_PERSON,@SENDMAIL,@SIGN_TITLE,@NOTIFY_ONLY,@AGENTID
|
||
|
||
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
|
||
WHILE @@FETCH_STATUS = 0
|
||
BEGIN
|
||
IF @SENDMAIL = 'Y'
|
||
BEGIN
|
||
--sql db sendmail
|
||
EXEC GEX_SEND_FLOWMAIL 'S',@ORG_PERSON, @BILLNO, @SIGN_TITLE
|
||
|
||
IF ISNULL(@AGENTID,'') <> ''
|
||
BEGIN
|
||
SET @SIGN_TITLE = @SIGN_TITLE+' (代理人)'
|
||
EXEC GEX_SEND_FLOWMAIL 'S',@AGENTID, @BILLNO, @SIGN_TITLE
|
||
END
|
||
END
|
||
|
||
FETCH NEXT FROM contact_cursor
|
||
INTO @ORG_PERSON,@SENDMAIL,@SIGN_TITLE,@NOTIFY_ONLY,@AGENTID
|
||
END
|
||
|
||
CLOSE contact_cursor
|
||
DEALLOCATE contact_cursor
|
||
|
||
--如果是通知, 再找下一筆(目前的寫法不允許連續通知)
|
||
IF @NOTIFY_ONLY = 'Y'
|
||
BEGIN
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 5 WHERE BILLNO = @BILLNO AND SEQNO = @SEQ3
|
||
|
||
SELECT @SEQ3=MIN(SEQNO) FROM BPM_FLOWSETUP_D WHERE BILLTAG = @BILLTAG AND SEQNO > @SEQ3 AND ISNULL(NOTIFY_ONLY,'N') <> 'Y'
|
||
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 0 WHERE BILLNO = @BILLNO AND SEQNO = @SEQ3
|
||
|
||
--有可能要發多人 mail, 要跑 loop
|
||
DECLARE contact_cursorN2 CURSOR FOR
|
||
SELECT SIGNPERSON,SENDMAIL,SIGN_TITLE,NOTIFY_ONLY,AGENTID FROM BPM_FLOWDATA_D WHERE BILLNO = @BILLNO AND SEQNO = @SEQ3
|
||
|
||
OPEN contact_cursorN2
|
||
|
||
-- Perform the first fetch.
|
||
FETCH NEXT FROM contact_cursorN2
|
||
INTO @ORG_PERSON,@SENDMAIL,@SIGN_TITLE,@NOTIFY_ONLY,@AGENTID
|
||
|
||
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
|
||
WHILE @@FETCH_STATUS = 0
|
||
BEGIN
|
||
IF @SENDMAIL = 'Y'
|
||
BEGIN
|
||
--sql db sendmail
|
||
EXEC GEX_SEND_FLOWMAIL 'S',@ORG_PERSON, @BILLNO, @SIGN_TITLE
|
||
|
||
IF ISNULL(@AGENTID,'') <> ''
|
||
BEGIN
|
||
SET @SIGN_TITLE = @SIGN_TITLE+' (代理人)'
|
||
EXEC GEX_SEND_FLOWMAIL 'S',@AGENTID, @BILLNO, @SIGN_TITLE
|
||
END
|
||
END
|
||
|
||
FETCH NEXT FROM contact_cursorN2
|
||
INTO @ORG_PERSON,@SENDMAIL,@SIGN_TITLE,@NOTIFY_ONLY,@AGENTID
|
||
END
|
||
|
||
CLOSE contact_cursorN2
|
||
DEALLOCATE contact_cursorN2
|
||
END
|
||
END
|