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