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

242 lines
8.5 KiB
Plaintext

CREATE PROC DBO.GEXBPM_GENFLOW3
(
@G_BILLNO VARCHAR(20) --簽核單號
)
/*
Function : 重新產生 BPM_FLOWDATA_D
Description: 本作業是當原單已產生 FLOWDATA
但又修改原單, 此時僅需(能)重新產生表身
目前應該是在 BPMMG1 的 [重新載入] 有呼叫
Build Date : 2011/10/06
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2013/07/26 依新版修正的規格改寫
2 Michael 2013/08/02 已加入判斷, 已開始簽核就不能重新產生
新增 ORG_GROUP, 方便重新產生變動的簽核人用
3 Michael 2013/08/08 新增部份多階主管的相關設定及展算, 原為 PICK 專案, 但併入標準版
4 Michael 2013/09/23 新增刪除連續相同人員時, 僅通知不必判斷
*/
AS
--Flow 單號
DECLARE @BILLTAG VARCHAR(20)
DECLARE @SQL_DEFINE NVARCHAR(800)
DECLARE @SOURCEBILLNO VARCHAR(20)
--原單
DECLARE @BILLDATE DATETIME
DECLARE @BILLNO VARCHAR(20)
DECLARE @PERSONID VARCHAR(20)
DECLARE @KEYDEF NVARCHAR(200)
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(200)
DECLARE @RETVAL INT --sp 傳參數
DECLARE @SIGN_TITLE NVARCHAR(200)
DECLARE @LAVEL VARCHAR(10)
DECLARE @DEPARTMENTID VARCHAR(20) --原單部門
--如果 log 檔筆數大於 1(已經開始簽核), 就不能重新產生
SELECT @CNT=COUNT(*) FROM BPM_FLOWDATA_LOG WHERE BILLNO = @G_BILLNO
IF @CNT > 1 RETURN
--取得 Tag 及 SQLDef
SELECT @BILLTAG=BILLTAG,@SOURCEBILLNO=SOURCEBILLNO FROM BPM_FLOWDATA_M WHERE BILLNO = @G_BILLNO
SELECT @SQL_DEFINE=SQL_DEFINE FROM BPM_FLOWSETUP_M WHERE BILLTAG = @BILLTAG
SELECT @CNT=CHARINDEX('WHERE ',@SQL_DEFINE)
SET @SQL_DEFINE = SUBSTRING(@SQL_DEFINE,1,@CNT-1) + ' WHERE BILLNO = ' + CHAR(39) + @SOURCEBILLNO + CHAR(39)
SELECT @SOURCETBL=SOURCETABLE,@SOURCEPK=SOURCEPK FROM BPM_FLOWSETUP_M WHERE BILLTAG = @BILLTAG
--將來源資料寫到暫存檔
SET @SQL_DEFINE = 'SELECT G.* INTO ##BPM_TMP1 FROM (' + @SQL_DEFINE + ' AND BILLNO = ' + CHAR(39) + @SOURCEBILLNO + CHAR(39) + ') G'
EXECUTE SP_EXECUTESQL @SQL_DEFINE
SELECT @BILLDATE=BILLDATE,@BILLNO=BILLNO,@PERSONID=PERSONID,@DEPARTMENTID=DEPARTMENTID,@KEYDEF=KEYDEF FROM ##BPM_TMP1
--刪除並重新產生FLOW DETAIL
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO
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
ORDER BY 2
--取原單某欄位
SET @SQL2 = 'SELECT G.* INTO ##BPM_TMP3 FROM (SELECT * FROM ##BPM_TMP1 ) 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
CLOSE contact_cursor3
DEALLOCATE contact_cursor3
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND FLOWSTATUS = 99
--刪除空白人員
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND ISNULL(SIGNPERSON,'') = ''
--刪除連續的相同人員(僅通知不必判斷)
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
--刪除空白人員
DELETE FROM BPM_FLOWDATA_D WHERE BILLNO = @G_BILLNO AND ISNULL(SIGNPERSON,'') = ''
--設大於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
DROP TABLE ##BPM_TMP1