Files
e-Book/3.玩轉SQL/參考資料/erp/Day7/參考文檔/BPM-sp/GEXBPM_SIGNOK.txt
T

234 lines
8.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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