316 lines
11 KiB
Plaintext
316 lines
11 KiB
Plaintext
CREATE PROC DBO.GEXBPM_GENFLOW2
|
|
(
|
|
@BILLTAG VARCHAR(20),
|
|
@ASSIGBILL VARCHAR(20), --指定某來源單號(無表示全部)
|
|
@SQL_DEFINE NVARCHAR(2000),
|
|
@LOGINID NVARCHAR(30)
|
|
)
|
|
/*
|
|
Function : 讀 BPM_FLOWSETUP_M, 產生 FLOW DATA
|
|
Description:
|
|
Build Date : 2011/10/01
|
|
|
|
Modify History
|
|
Item Who Date Modify Docs
|
|
==== ========== ========== ================================================
|
|
1 Michael 2011/10/01 新增
|
|
2 Michael 2011/10/04 加入 Where 判斷及 Manager 處理
|
|
3 Michael 2011/10/06 新增 Agent 及指定欄位內容為簽核人
|
|
4 Michael 2012/10/30 新增有限度的支援條件式簽核(原單 PK 僅支援單一鍵值)
|
|
5 Michael 2012/11/22 新增 FLOW_DESC 欄位
|
|
6 Michael 2013/07/12 新增若群組內無人則不產生的判斷
|
|
7 Michael 2013/07/14 如果連續幾個簽核都是同一個人, 只產生第一筆
|
|
8 Michael 2013/07/15 修改 sp 中關於動態 sql 語法傳回值的寫法
|
|
9 Michael 2013/07/23 新增上呈時產生簽核明細, 一併產生其主代理人及 mail
|
|
10 Michael 2013/07/26 處理 MANAGER 等的簽核過濾條件
|
|
11 Michael 2013/08/08 新增部份多階主管的相關設定及展算, 原為 PICK 專案, 但併入標準版
|
|
SQL_DEFINE 新增 DEPARTMENTID 的內容, BPM_FLOWDATA_M 新增2個欄位
|
|
12 Michael 2013/08/31 新增萬一無人需簽核時, 刪除相關記錄
|
|
13 Michael 2013/09/23 新增刪除連續相同人員時, 僅通知不必判斷
|
|
|
|
*/
|
|
AS
|
|
|
|
--Flow 單號
|
|
DECLARE @G_BILLNO VARCHAR(20)
|
|
--跑迴圈
|
|
DECLARE @BILLDATE DATETIME
|
|
DECLARE @BILLNO VARCHAR(20)
|
|
DECLARE @PERSONID VARCHAR(20)
|
|
DECLARE @KEYDEF NVARCHAR(200)
|
|
DECLARE @FLOW_DESC NVARCHAR(600)
|
|
DECLARE @SIGNING NVARCHAR(50)
|
|
DECLARE @FLOWP CHAR(1)
|
|
DECLARE @SOURCETBL VARCHAR(100)
|
|
DECLARE @SOURCEPK VARCHAR(100)
|
|
--第二層 LOOP 使用的 VAR
|
|
DECLARE @SEQNO INT
|
|
DECLARE @SEQ INT
|
|
DECLARE @SEQ2 INT
|
|
DECLARE @CNT INT
|
|
DECLARE @SIGNPERSON VARCHAR(100)
|
|
DECLARE @PRE_PERSON VARCHAR(100)
|
|
DECLARE @ORG_PERSON VARCHAR(100)
|
|
DECLARE @BOSS_PERSON VARCHAR(100)
|
|
DECLARE @FILTER NVARCHAR(2000)
|
|
DECLARE @SQL NVARCHAR(2000)
|
|
DECLARE @SQL1 NVARCHAR(2000)
|
|
DECLARE @SQL2 NVARCHAR(2000)
|
|
DECLARE @SOURCEFLD VARCHAR(2000)
|
|
DECLARE @RETVAL INT --sp 傳參數
|
|
DECLARE @SIGN_TITLE NVARCHAR(200)
|
|
DECLARE @LAVEL VARCHAR(10)
|
|
DECLARE @DEPARTMENTID VARCHAR(20) --原單部門
|
|
|
|
--單一單據單一執行時(也算防錯)
|
|
IF @SQL_DEFINE = '' OR @SQL_DEFINE IS NULL
|
|
BEGIN
|
|
SELECT @SQL_DEFINE=SQL_DEFINE FROM BPM_FLOWSETUP_M WHERE BILLTAG = @BILLTAG
|
|
END
|
|
|
|
--將來源資料寫到暫存檔
|
|
SET @SQL_DEFINE = 'SELECT G.* INTO ##BPM_TMP1 FROM (' + @SQL_DEFINE + ') G'
|
|
EXECUTE SP_EXECUTESQL @SQL_DEFINE
|
|
|
|
--指定某來源單(例如重新產生)
|
|
IF @ASSIGBILL <> ''
|
|
BEGIN
|
|
DELETE FROM ##BPM_TMP1 WHERE BILLNO <> @ASSIGBILL
|
|
END
|
|
|
|
SELECT @SOURCETBL=SOURCETABLE,@SOURCEPK=SOURCEPK FROM BPM_FLOWSETUP_M WHERE BILLTAG = @BILLTAG
|
|
|
|
DECLARE contact_cursor2 CURSOR FOR
|
|
SELECT Z.BILLDATE,Z.BILLNO,Z.PERSONID,Z.DEPARTMENTID,Z.KEYDEF,Z.FLOW_DESC FROM ##BPM_TMP1 Z
|
|
WHERE CASE WHEN @LOGINID = '*' THEN '*' ELSE Z.PERSONID END = @LOGINID
|
|
|
|
OPEN contact_cursor2
|
|
|
|
-- Perform the first fetch.
|
|
FETCH NEXT FROM contact_cursor2
|
|
INTO @BILLDATE,@BILLNO,@PERSONID,@DEPARTMENTID,@KEYDEF,@FLOW_DESC
|
|
|
|
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
WAITFOR DELAY '00:00:00.005'
|
|
SELECT @G_BILLNO=REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR,GETDATE(),25),'-',''),' ',''),':','')
|
|
|
|
INSERT INTO BPM_FLOWDATA_M (BILLNO,BILLTAG,SOURCEBILLDATE,SOURCEBILLNO,SOURCEPERSONID,SOURCEDEPARTMENT,FLOWSTATUS,ISEMERGENCY,FLOW_DESC)
|
|
SELECT @G_BILLNO,@BILLTAG,@BILLDATE,@BILLNO,@PERSONID,@DEPARTMENTID,0,'N',@FLOW_DESC
|
|
|
|
/*
|
|
第一筆資料較特殊, 除了標準設定, 要新增 [上呈人員], 就是原單的 PERSONID, SEQNO = 1(固定)
|
|
因為通知和退簽都會用到
|
|
*/
|
|
SELECT @SEQNO=MIN(SEQNO) FROM BPM_FLOWSETUP_D WHERE BILLTAG = @BILLTAG
|
|
|
|
INSERT INTO BPM_FLOWDATA_D (BILLNO,SEQNO,FLOWSTATUS,SIGN_TITLE,SIGNPERSON,SENDMAIL,NOTIFY_ONLY,ORG_GROUP)
|
|
SELECT @G_BILLNO,0,1,'上呈',@PERSONID,'N','N',''
|
|
UNION ALL
|
|
SELECT
|
|
@G_BILLNO,B.SEQNO,
|
|
CASE WHEN B.SEQNO=@SEQNO THEN 0 ELSE 3 END,
|
|
B.SIGN_TITLE,
|
|
--直屬主管, 原單某欄位值或代理人
|
|
CASE WHEN B.SIGNPERSON = 'MANAGER' THEN '@MANAGER'
|
|
WHEN B.SIGNPERSON = 'AGENT' THEN '@AGENT'
|
|
WHEN B.SIGNPERSON = 'FIELDDEF' THEN '@FIELDDEF'
|
|
WHEN SUBSTRING(B.SIGNPERSON,1,7) = 'DEPBOSS' THEN '@'+B.SIGNPERSON
|
|
ELSE ISNULL(G.USERID,'') END,
|
|
B.SENDMAIL,B.NOTIFY_ONLY,B.SIGNPERSON
|
|
FROM BPM_FLOWSETUP_D B
|
|
LEFT JOIN USERGROUPS G ON B.SIGNPERSON = G.GROUPID
|
|
WHERE B.BILLTAG = @BILLTAG --AND ISNULL(G.USERID,'') <> '' --本條件會連 MANAGER/AGENT 都被檔掉
|
|
ORDER BY 2
|
|
|
|
--寫第一筆資料到 log
|
|
INSERT INTO BPM_FLOWDATA_LOG (BILLNO,SOURCESEQNO,SEQNO,FLOWINDATE,BILLDATE,FLOWSTATUS,SIGNPERSON)
|
|
SELECT
|
|
@G_BILLNO,@SEQNO,0,GETDATE(),GETDATE(),1,@PERSONID
|
|
|
|
--回寫原單(固定為 SIGN_PERSON 及 FLOWFLAG)
|
|
SET @FLOWP = 'P'
|
|
SET @SIGNING = 'FLOWSIGNING'
|
|
SET @SQL = 'UPDATE ' + @SOURCETBL + ' SET SIGN_USER = ' + CHAR(39)+@SIGNING+CHAR(39) + ',FLOWFLAG = ' + CHAR(39)+@FLOWP+CHAR(39) +
|
|
' WHERE ' + @SOURCEPK + ' = ' + CHAR(39) + @BILLNO + CHAR(39)
|
|
EXECUTE SP_EXECUTESQL @SQL
|
|
|
|
--取原單某欄位
|
|
SET @SQL2 = 'SELECT G.* INTO ##BPM_TMP3 FROM (SELECT * FROM ##BPM_TMP1 WHERE BILLNO = ' + CHAR(39) + @BILLNO + CHAR(39) + ') G'
|
|
EXECUTE SP_EXECUTESQL @SQL2
|
|
|
|
SELECT @SOURCEFLD=SOURCEFLD FROM ##BPM_TMP3
|
|
DROP TABLE ##BPM_TMP3
|
|
|
|
--再次處理 MANAGER 和條件簽核
|
|
DECLARE contact_cursor3 CURSOR FOR
|
|
SELECT SEQNO,SIGNPERSON,SIGN_TITLE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO ORDER BY SEQNO
|
|
|
|
OPEN contact_cursor3
|
|
|
|
-- Perform the first fetch.
|
|
FETCH NEXT FROM contact_cursor3
|
|
INTO @SEQ,@SIGNPERSON,@SIGN_TITLE
|
|
|
|
--ORG_PERSON 原上呈人員, 不變(代理人永遠是真對原上呈人)
|
|
--PRE_PERSON 前一關的簽核人, 是針對 MANAGER 用, 每一關都會變
|
|
SET @ORG_PERSON = @SIGNPERSON
|
|
SET @PRE_PERSON = @SIGNPERSON
|
|
|
|
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
SET @BOSS_PERSON = @SIGNPERSON
|
|
IF @SIGNPERSON = '@MANAGER'
|
|
BEGIN
|
|
SELECT @BOSS_PERSON=EMP_NO FROM BASPERSON WHERE PERSONID = @PRE_PERSON
|
|
|
|
UPDATE BPM_FLOWDATA_D SET SIGNPERSON = @BOSS_PERSON
|
|
WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SIGNPERSON = '@MANAGER'
|
|
END
|
|
ELSE IF @SIGNPERSON = '@AGENT'
|
|
BEGIN
|
|
SELECT @BOSS_PERSON=ISNULL(AGENTID,'') FROM BASPERSON_AGENT WHERE PERSONID = @ORG_PERSON AND PRIOITY = (SELECT MIN(PRIOITY) FROM BASPERSON_AGENT WHERE PERSONID = @ORG_PERSON)
|
|
|
|
UPDATE BPM_FLOWDATA_D SET SIGNPERSON = @BOSS_PERSON
|
|
WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SIGNPERSON = '@AGENT'
|
|
END
|
|
ELSE IF @SIGNPERSON = '@FIELDDEF'
|
|
BEGIN
|
|
--原單某欄位值
|
|
UPDATE BPM_FLOWDATA_D SET SIGNPERSON = @SOURCEFLD
|
|
WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SIGNPERSON = '@FIELDDEF'
|
|
|
|
SET @BOSS_PERSON = @SOURCEFLD
|
|
END
|
|
--以下為專案特殊寫法
|
|
ELSE IF SUBSTRING(@SIGNPERSON,1,8) = '@DEPBOSS'
|
|
BEGIN
|
|
--取得部門檔的簽核主管(PICK 專案, 但也可以變成標準版本, 目前最多6階)
|
|
SET @LAVEL = SUBSTRING(@SIGNPERSON,9,1)
|
|
SELECT
|
|
@BOSS_PERSON=
|
|
CASE WHEN @LAVEL = '1' THEN DE1_LEADER
|
|
WHEN @LAVEL = '2' THEN DE2_LEADER
|
|
WHEN @LAVEL = '3' THEN DE3_LEADER
|
|
WHEN @LAVEL = '4' THEN DE4_LEADER
|
|
WHEN @LAVEL = '5' THEN DE5_LEADER
|
|
WHEN @LAVEL = '6' THEN DE6_LEADER
|
|
ELSE ISNULL(DE1_LEADER,'') END
|
|
FROM BASDEPARTMENT WHERE DEPARTMENTID = @DEPARTMENTID
|
|
|
|
UPDATE BPM_FLOWDATA_D SET SIGNPERSON = ISNULL(@BOSS_PERSON,'')
|
|
WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SUBSTRING(@SIGNPERSON,1,8) = '@DEPBOSS'
|
|
END
|
|
|
|
/*
|
|
以下是條件式判斷的程式邏輯
|
|
目前的寫法, 只能處理 PK 是一個欄位(如單號), 暫不支援複合 PK 的表單
|
|
*/
|
|
SELECT @FILTER=B.FILTER FROM BPM_FLOWSETUP_D B
|
|
LEFT JOIN BPM_FLOWSETUP_M A ON A.BILLTAG = B.BILLTAG
|
|
WHERE B.BILLTAG = @BILLTAG AND B.SEQNO = @SEQ AND B.SIGN_TITLE = @SIGN_TITLE
|
|
|
|
IF @FILTER IS NULL SET @FILTER = ''
|
|
|
|
IF LEN(@FILTER) > 0
|
|
BEGIN
|
|
SET @SQL2 = 'SELECT @RETVALIN=COUNT(*) FROM ' + @SOURCETBL + ' WHERE ' + @SOURCEPK + ' = ' + CHAR(39)+@BILLNO+CHAR(39) + ' AND ' + @FILTER
|
|
EXECUTE SP_EXECUTESQL @SQL2,N'@RETVALIN INT OUT', @RETVAL OUT
|
|
|
|
IF @RETVAL <= 0 UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 99 WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SIGN_TITLE = @SIGN_TITLE
|
|
END
|
|
|
|
/*
|
|
如果連續幾個簽核都是同一個人, 只產生第一筆即可(待測試)
|
|
因為要留最末筆, 所有不在此刪, 另起一個 LOOP 處理
|
|
*/
|
|
--IF @PRE_PERSON = @BOSS_PERSON AND @SEQ > 10
|
|
-- UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 99 WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SIGN_TITLE = @SIGN_TITLE
|
|
|
|
SET @PRE_PERSON = @BOSS_PERSON
|
|
|
|
FETCH NEXT FROM contact_cursor3
|
|
INTO @SEQ,@SIGNPERSON,@SIGN_TITLE
|
|
END
|
|
|
|
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND FLOWSTATUS = 99
|
|
--刪除空白人員
|
|
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND ISNULL(SIGNPERSON,'') = ''
|
|
|
|
CLOSE contact_cursor3
|
|
DEALLOCATE contact_cursor3
|
|
|
|
FETCH NEXT FROM contact_cursor2
|
|
INTO @BILLDATE,@BILLNO,@PERSONID,@DEPARTMENTID,@KEYDEF,@FLOW_DESC
|
|
END
|
|
|
|
CLOSE contact_cursor2
|
|
DEALLOCATE contact_cursor2
|
|
|
|
--刪除連續的相同人員(僅通知不必判斷)
|
|
DECLARE contact_cursor9 CURSOR FOR
|
|
SELECT SEQNO,SIGNPERSON,SIGN_TITLE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND ISNULL(NOTIFY_ONLY,'') <> 'Y' ORDER BY SEQNO DESC
|
|
|
|
OPEN contact_cursor9
|
|
|
|
-- Perform the first fetch.
|
|
FETCH NEXT FROM contact_cursor9
|
|
INTO @SEQ,@SIGNPERSON,@SIGN_TITLE
|
|
|
|
SET @PRE_PERSON = ''
|
|
|
|
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
IF @PRE_PERSON = @SIGNPERSON AND @SEQ > 0
|
|
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 99 WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ AND SIGN_TITLE = @SIGN_TITLE
|
|
|
|
SET @PRE_PERSON = @SIGNPERSON
|
|
|
|
FETCH NEXT FROM contact_cursor9
|
|
INTO @SEQ,@SIGNPERSON,@SIGN_TITLE
|
|
END
|
|
|
|
CLOSE contact_cursor9
|
|
DEALLOCATE contact_cursor9
|
|
|
|
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND FLOWSTATUS = 99
|
|
--END OF 刪除連續的相同人員
|
|
|
|
--設大於0 的第一筆狀況為待簽
|
|
SELECT @SEQ2=MIN(SEQNO) FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND SEQNO > 0
|
|
UPDATE BPM_FLOWDATA_D SET FLOWSTATUS = 0 WHERE BILLNO = @G_BILLNO AND SEQNO = @SEQ2
|
|
|
|
--一併產生代理人
|
|
UPDATE BPM_FLOWDATA_D SET AGENTID = ISNULL((SELECT TOP 1 AGENTID FROM BASPERSON_AGENT WHERE BASPERSON_AGENT.PERSONID = BPM_FLOWDATA_D.SIGNPERSON AND PRIOITY <= 1),AGENTID)
|
|
WHERE BILLNO = @G_BILLNO
|
|
|
|
--判斷是否要發 mail 通知
|
|
DECLARE @ISMAIL CHAR(1)
|
|
DECLARE @USERID VARCHAR(30)
|
|
DECLARE @AGENTID VARCHAR(30)
|
|
SELECT TOP 1 @ISMAIL=SENDMAIL,@USERID=SIGNPERSON,@AGENTID=AGENTID FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND FLOWSTATUS = 0 --待簽
|
|
IF @ISMAIL = 'Y'
|
|
BEGIN
|
|
EXEC GEX_SEND_FLOWMAIL 'S',@USERID, @G_BILLNO, '上呈'
|
|
IF ISNULL(@AGENTID,'') <> '' EXEC GEX_SEND_FLOWMAIL 'S',@AGENTID, @G_BILLNO, '上呈(代理人)'
|
|
END
|
|
|
|
--如果本簽核無表身, 表示不需簽核, 刪除 log 及表頭(防錯)
|
|
SELECT @CNT=COUNT(*) FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO
|
|
IF @CNT <= 0
|
|
BEGIN
|
|
DELETE FROM BPM_FLOWDATA_M WHERE BILLNO = @G_BILLNO
|
|
DELETE FROM BPM_FLOWDATA_LOG WHERE BILLNO = @G_BILLNO
|
|
|
|
--回寫原單(固定為 SIGN_PERSON 及 FLOWFLAG)
|
|
SET @FLOWP = 'Z'
|
|
SET @SIGNING = 'NO-SIGN'
|
|
SET @SQL = 'UPDATE ' + @SOURCETBL + ' SET SIGN_USER = ' + CHAR(39)+@SIGNING+CHAR(39) + ',FLOWFLAG = ' + CHAR(39)+@FLOWP+CHAR(39) +
|
|
' WHERE ' + @SOURCEPK + ' = ' + CHAR(39) + @BILLNO + CHAR(39)
|
|
EXECUTE SP_EXECUTESQL @SQL
|
|
END
|
|
|
|
DROP TABLE ##BPM_TMP1 |