CREATE PROCEDURE dbo.GEX_SEND_FLOWMAIL
(
@BPM_TYPE CHAR(1), --S:送簽 B:退簽 A:已簽結 F:作廢 R:拒簽
@SENDUSER VARCHAR(30), --被通知要簽核的人
@BPMBILLNO VARCHAR(30), --簽核單號
@SIGN_TITLE NVARCHAR(30) = ''
)
AS
/*
Function : 利用 sql 發送 FLOW MAIL 的共用程式
Description: 測試時, 連續密集的發送 mail, 會被 gMail 當成垃圾信
Build Date : 2012/10/21
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2013/07/01 新增 PICK 的專案發送 mail 寫法(依收件人 mail, 決定 mail Server)
2 Michael 2013/07/08 新增 R:拒簽
3 Michael 2013/08/07 PICK 不連回原單
4 Michael 2013/08/14 PICK 的 Mail 格式有修正
5 Michael 2013/09/26 因為發送 mail 一直都亂碼, 修改為變數測試看看
*/
DECLARE @MAIL_PROFILE NVARCHAR(100)
DECLARE @MSG NVARCHAR(1000)
DECLARE @BILLDESC NVARCHAR(200)
DECLARE @FLOWDETAIL NVARCHAR(1000)
DECLARE @DEST_MAIL VARCHAR(100)
DECLARE @TITLE NVARCHAR(200)
DECLARE @WEBSITE VARCHAR(200)
DECLARE @SMTPSRV VARCHAR(200)
DECLARE @CNT INT
DECLARE @POS INT
DECLARE @IS_PICK CHAR(1)
--判斷是否 PICK 專案
SELECT @CNT=Count(*) FROM sysobjects WHERE XTYPE='U' AND NAME='COMPANYTYPE'
IF @CNT > 0 SET @IS_PICK = 'Y' ELSE SET @IS_PICK = 'N'
SELECT @MAIL_PROFILE=PARAVALUE FROM PARAMETER WHERE PARATYPE = 'SYS' AND PARAFIELD = 'MAIL_PROFILE'
IF ISNULL(@MAIL_PROFILE,'') = '' SET @MAIL_PROFILE = 'gexMail' --Default
/*
PICK 有特殊的發送 mail 機制
跟據收件人決定發送 mail 的 SMTP Server
程式寫在 exec msdb.dbo.sp_send_dbmail 前
*/
SELECT @WEBSITE=PARAVALUE FROM PARAMETER WHERE PARATYPE = 'SYS' AND PARAFIELD = 'WEBSITE'
IF ISNULL(@WEBSITE,'') = '' SET @WEBSITE = 'http://erp.gex.com.tw' --Default(http://erp.gex.com.tw/gEIP/bPMSM13A.aspx?keyvalueparam=4318)
SET @WEBSITE = @WEBSITE + '/gBPM/bBPMMG3.aspx'
SELECT @BILLDESC=ISNULL(B.BILLDESC,''),@TITLE='簽核通知-'+B.BILLDESC+ ' 原單單號: '+A.SOURCEBILLNO FROM BPM_FLOWDATA_M A
LEFT JOIN BPM_FLOWSETUP_M B ON A.BILLTAG = B.BILLTAG
WHERE A.BILLNO = @BPMBILLNO
--
DECLARE @BILLDATE DATETIME
DECLARE @SIGNPERSON NVARCHAR(30)
DECLARE @PERSONCNAME NVARCHAR(30)
DECLARE @ORG_PERSON NVARCHAR(30)
DECLARE @FLOWTYPE NVARCHAR(30)
DECLARE @MEMOCHAR NVARCHAR(200)
SET @FLOWDETAIL = ''
DECLARE @FLDN NVARCHAR(100)
SELECT @FLDN=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'N'
IF @FLDN IS NULL SET @FLDN = '上呈'
SELECT
BILLDATE,
CASE WHEN SEQNO = 0 THEN @FLDN ELSE B.KEYVALUE END FLOWTYPE,
CASE WHEN FLOWSTATUS <> 2 THEN SIGNPERSON ELSE BACKTOPERSON END SIGNPERSON,
CASE WHEN FLOWSTATUS <> 2 THEN MEMOCHAR ELSE BACKMEMOCHAR END MEMOCHAR
INTO #BPM_TMP1 FROM BPM_FLOWDATA_LOG A
LEFT JOIN KEYVALUE B ON B.KEYTAG = 'FLOWSTATUS' AND B.KEYID = A.FLOWSTATUS
WHERE BILLNO = @BPMBILLNO
DECLARE contact_cursor CURSOR FOR
SELECT
A.BILLDATE,A.FLOWTYPE,A.SIGNPERSON,B.PERSONCNAME,A.MEMOCHAR
FROM #BPM_TMP1 A
LEFT JOIN BASPERSON B ON A.SIGNPERSON = B.PERSONID
OPEN contact_cursor
-- Perform the first fetch.
FETCH NEXT FROM contact_cursor
INTO @BILLDATE,@FLOWTYPE,@SIGNPERSON,@PERSONCNAME,@MEMOCHAR
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
SET @FLOWDETAIL = @FLOWDETAIL +
'
' +
' | '+ISNULL(@SIGNPERSON,'')+' | '+ISNULL(@PERSONCNAME,'')+' | ' +
' '+ISNULL(@FLOWTYPE,'')+' | ' +
' '+ISNULL(CONVERT(varchar(12),@BILLDATE,111),'')+' | '+ISNULL(CONVERT(varchar(12),@BILLDATE,108),'')+' | ' +
' '+ISNULL(@MEMOCHAR,'')+' | ' +
'
'
FETCH NEXT FROM contact_cursor
INTO @BILLDATE,@FLOWTYPE,@SIGNPERSON,@PERSONCNAME,@MEMOCHAR
END
CLOSE contact_cursor
DEALLOCATE contact_cursor
--
DROP TABLE #BPM_TMP1
--待簽核人員
SET @ORG_PERSON = @SENDUSER
SELECT @ORG_PERSON=USERID+' ('+USERNAME+')' FROM USERS WHERE USERID = @ORG_PERSON
IF ISNULL(@ORG_PERSON,'') = '' SET @ORG_PERSON = 'NO-DATA'
--**************************************************************************
DECLARE @ORG_BILLNO VARCHAR(100) --原單單號(以下四個欄位是 PICK 專用)
DECLARE @ORD_COMPANY NVARCHAR(100) --公司
DECLARE @ORD_DEPARTMENT NVARCHAR(100) --費用分攤部門
DECLARE @ORG_DETAIL NVARCHAR(600) --表身的品名及數量
DECLARE @BILLTAG VARCHAR(100)
SET @ORD_COMPANY = ''
SET @ORD_DEPARTMENT = ''
SET @ORG_DETAIL = ''
SELECT @ORG_BILLNO=A.SOURCEBILLNO,@BILLTAG=BILLTAG FROM BPM_FLOWDATA_M A WHERE A.BILLNO = @BPMBILLNO
IF @IS_PICK = 'Y'
BEGIN
IF @BILLTAG = 'OPOM11' BEGIN
SELECT
@ORD_COMPANY=A.ACC_COMPANYID+'('+B.COMPCNAME+')',@ORD_DEPARTMENT=A.ACC_DEPARTMENTID+'-'+D.DEPARTMENTCNAME,
@ORG_DETAIL=dbo.GEXFUNC_GETDETAIL('OPOORDER4_M',@ORG_BILLNO)
FROM OPOORDER4_M A
LEFT JOIN COMPANYTYPE B ON A.ACC_COMPANYID = B.COMPANYID
LEFT JOIN BASDEPARTMENT D ON A.ACC_DEPARTMENTID = D.DEPARTMENTID
WHERE BILLNO = @ORG_BILLNO
END
ELSE IF @BILLTAG = 'OPOM12' BEGIN
SELECT
@ORD_COMPANY=A.ACC_COMPANYID+'('+B.COMPCNAME+')',@ORD_DEPARTMENT=A.ACC_DEPARTMENTID+'-'+D.DEPARTMENTCNAME,
@ORG_DETAIL=dbo.GEXFUNC_GETDETAIL('OPOORDER3_M',@ORG_BILLNO)
FROM OPOORDER3_M A
LEFT JOIN COMPANYTYPE B ON A.ACC_COMPANYID = B.COMPANYID
LEFT JOIN BASDEPARTMENT D ON A.ACC_DEPARTMENTID = D.DEPARTMENTID
WHERE BILLNO = @ORG_BILLNO
END
ELSE IF @BILLTAG = 'OPOM13' BEGIN
SELECT
@ORD_COMPANY=A.ACC_COMPANYID+'('+B.COMPCNAME+')',@ORD_DEPARTMENT=A.ACC_DEPARTMENTID+'-'+D.DEPARTMENTCNAME,
@ORG_DETAIL=dbo.GEXFUNC_GETDETAIL('QMSIQC_M',@ORG_BILLNO)
FROM QMSIQC_M A
LEFT JOIN COMPANYTYPE B ON A.ACC_COMPANYID = B.COMPANYID
LEFT JOIN BASDEPARTMENT D ON A.ACC_DEPARTMENTID = D.DEPARTMENTID
WHERE BILLNO = @ORG_BILLNO
END
--ELSE IF @BILLTAG = 'OPOM16' BEGIN
-- SELECT * FROM OPO_BUYSWOT BILLNO = @ORG_BILLNO
--END
END
--**************************************************************************
/*
因為 mail 發送一直會出現亂碼, 所以把所有的中文抬頭都改為變數測試看看
*/
DECLARE @FLD1 NVARCHAR(100)
DECLARE @FLD2 NVARCHAR(100)
DECLARE @FLD3 NVARCHAR(100)
DECLARE @FLD4 NVARCHAR(100)
DECLARE @FLD5 NVARCHAR(100)
DECLARE @FLD6 NVARCHAR(100)
DECLARE @FLD7 NVARCHAR(100)
DECLARE @FLD8 NVARCHAR(100)
DECLARE @FLD9 NVARCHAR(100)
DECLARE @FLDA NVARCHAR(100)
DECLARE @FLDB NVARCHAR(100)
DECLARE @FLDC NVARCHAR(100)
DECLARE @FLDD NVARCHAR(100)
DECLARE @FLDE NVARCHAR(100)
DECLARE @FLDF NVARCHAR(100)
DECLARE @FLDG NVARCHAR(100)
DECLARE @FLDH NVARCHAR(100)
DECLARE @FLDI NVARCHAR(100)
DECLARE @FLDJ NVARCHAR(100)
DECLARE @FLDK NVARCHAR(100)
DECLARE @FLDL NVARCHAR(100)
DECLARE @FLDM NVARCHAR(100)
SELECT @FLD1=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '1'
SELECT @FLD2=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '2'
SELECT @FLD3=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '3'
SELECT @FLD4=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '4'
SELECT @FLD5=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '5'
SELECT @FLD6=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '6'
SELECT @FLD7=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '7'
SELECT @FLD8=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '8'
SELECT @FLD9=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = '9'
SELECT @FLDA=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'A'
SELECT @FLDB=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'B'
SELECT @FLDC=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'C'
SELECT @FLDD=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'D'
SELECT @FLDE=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'E'
SELECT @FLDF=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'F'
SELECT @FLDG=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'G'
SELECT @FLDH=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'H'
SELECT @FLDI=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'I'
SELECT @FLDJ=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'J'
SELECT @FLDK=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'K'
SELECT @FLDL=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'L'
SELECT @FLDM=KEYVALUE FROM KEYVALUE WHERE KEYTAG = 'FLOWTITLE' AND KEYID = 'M'
IF @FLD1 IS NULL SET @FLD1 = '發送者'
IF @FLD2 IS NULL SET @FLD2 = '原單單號'
IF @FLD3 IS NULL SET @FLD3 = '流程說明'
IF @FLD4 IS NULL SET @FLD4 = '簽核程序'
IF @FLD5 IS NULL SET @FLD5 = '簽核作業'
IF @FLD6 IS NULL SET @FLD6 = '送簽日期'
IF @FLD7 IS NULL SET @FLD7 = '網頁連結'
IF @FLD8 IS NULL SET @FLD8 = '簽核人員'
IF @FLD9 IS NULL SET @FLD9 = '姓名'
IF @FLDA IS NULL SET @FLDA = '簽核別'
IF @FLDB IS NULL SET @FLDB = '簽核日期'
IF @FLDC IS NULL SET @FLDC = '時間'
IF @FLDD IS NULL SET @FLDD = '簽核內容'
IF @FLDE IS NULL SET @FLDE = '出帳公司'
IF @FLDF IS NULL SET @FLDF = '費用分攤單位'
IF @FLDG IS NULL SET @FLDG = '採買品名數量'
IF @FLDH IS NULL SET @FLDH = '按此連結到表單'
IF @FLDI IS NULL SET @FLDI = '送簽'
IF @FLDJ IS NULL SET @FLDJ = '退簽'
IF @FLDK IS NULL SET @FLDK = '作廢通知'
IF @FLDL IS NULL SET @FLDL = '拒簽通知'
IF @FLDM IS NULL SET @FLDM = '已簽結通知'
DECLARE @HYPER NVARCHAR(200)
DECLARE @ACTIVITY NVARCHAR(200)
SET @HYPER = ''+@FLDH+''
IF @BPM_TYPE='S' SET @ACTIVITY = @FLDI
ELSE IF @BPM_TYPE='B' SET @ACTIVITY = @FLDJ
ELSE IF @BPM_TYPE='F' SET @ACTIVITY = @FLDK
ELSE IF @BPM_TYPE='R' SET @ACTIVITY = @FLDL
ELSE SET @ACTIVITY = @FLDM
--PICK 要求不要連回原單(格式也有修改)
IF @IS_PICK <> 'Y'
--標準版本
SET @MSG = '' +
' | '+@FLD1+' | '+@ORG_PERSON+' | ' +
'
' +
'' +
' | '+@FLD2+' | '+@ORG_BILLNO+' | ' +
'
' +
'' +
' | '+@FLD3+' | '+@BILLDESC+' | ' +
'
' +
'' +
' | '+@FLD4+' | '+@SIGN_TITLE+' | ' +
'
' +
'' +
' | '+@FLD5+' | '+@ACTIVITY+' | ' +
'
' +
'' +
' | '+@FLD6+' | '+CONVERT(varchar(30),GETDATE(),120)+' | ' +
'
' +
'' +
' | '+@FLD7+' | '+@HYPER+' | ' +
'
' +
'
' +
'' +
' | '+@FLD8+' | '+@FLD9+' | '+@FLDA+' | '+@FLDB+' | '+@FLDC+' | '+@FLDD+' | ' +
'
' +
@FLOWDETAIL +
'
'
ELSE
--元誠格式
SET @MSG = '' +
' | '+@FLD1+' | '+@ORG_PERSON+' | ' +
'
' +
'' +
' | '+@FLD3+' | '+@BILLDESC+' | ' +
'
' +
'' +
' | '+@FLD4+' | '+@SIGN_TITLE+' | ' +
'
' +
'' +
' | '+@FLD5+' | '+@ACTIVITY+' | ' +
'
' +
'' +
' | '+@FLD8+' | '+CONVERT(varchar(30),GETDATE(),120)+' | ' +
'
' +
'' +
' | '+@FLD2+' | '+@ORG_BILLNO+' | ' +
'
' +
'' +
' | '+@FLDE+' | '+@ORD_COMPANY+' | ' +
'
' +
'' +
' | '+@FLDF+' | '+@ORD_DEPARTMENT+' | ' +
'
' +
'' +
' | '+@FLDG+' | '+@ORG_DETAIL+' | ' +
'
' +
'
' +
'' +
' | '+@FLD8+' | '+@FLD9+' | '+@FLDA+' | '+@FLDB+' | '+@FLDC+' | '+@FLDD+' | ' +
'
' +
@FLOWDETAIL +
'
'
IF @BPM_TYPE = 'A' OR @BPM_TYPE = 'F'
BEGIN
--本簽核已完成, 要通知所有相關的人
DECLARE @EMAIL VARCHAR(200)
DECLARE @BPM_TMP2 TABLE (EMAIL VARCHAR(200))
IF @BPM_TYPE = 'A'
BEGIN
INSERT INTO @BPM_TMP2
SELECT DISTINCT U.EMAIL FROM BPM_FLOWDATA_D Z
LEFT JOIN USERS U ON U.USERID = Z.SIGNPERSON
WHERE Z.BILLNO = @BPMBILLNO AND ISNULL(U.EMAIL,'') <> '' AND (Z.SEQNO = 0 OR Z.SENDMAIL = 'Y') --原上呈人員也要發通知
END
ELSE BEGIN --曾經簽核過的人
INSERT INTO @BPM_TMP2
SELECT DISTINCT U.EMAIL FROM BPM_FLOWDATA_LOG Z
LEFT JOIN USERS U ON U.USERID = Z.SIGNPERSON
WHERE Z.BILLNO = @BPMBILLNO AND ISNULL(U.EMAIL,'') <> ''
END
DECLARE contact_cursor2 CURSOR FOR
SELECT EMAIL FROM @BPM_TMP2
OPEN contact_cursor2
-- Perform the first fetch.
FETCH NEXT FROM contact_cursor2
INTO @EMAIL
-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
--PICK 專案
IF @IS_PICK = 'Y' BEGIN
SET @POS = CHARINDEX('@', @EMAIL)
SET @SMTPSRV = SUBSTRING(@EMAIL,@POS+1,LEN(@EMAIL)-@POS)
SELECT TOP 1 @MAIL_PROFILE=COMPANYID FROM COMPANYTYPE WHERE MAILSERVER = @SMTPSRV
END
exec msdb.dbo.sp_send_dbmail
@recipients = @EMAIL,
@body = @MSG,
@subject = @TITLE,
@profile_name = @MAIL_PROFILE,
@body_format = HTML --也可以使用HTML格式
FETCH NEXT FROM contact_cursor2
INTO @EMAIL
END
CLOSE contact_cursor2
DEALLOCATE contact_cursor2
END
ELSE BEGIN
--也有可能是多人(群組內有多人, 已在 GEXBPM_SIGNOK 跑 loop)
SELECT @DEST_MAIL=EMAIL FROM USERS WHERE USERID = @SENDUSER
--SET @DEST_MAIL = 'genie.michael@gmail.com' --For TEST
IF ISNULL(@DEST_MAIL,'') <> ''
BEGIN
--PICK 專案
IF @IS_PICK = 'Y' BEGIN
SET @POS = CHARINDEX('@', @DEST_MAIL)
SET @SMTPSRV = SUBSTRING(@DEST_MAIL,@POS+1,LEN(@DEST_MAIL)-@POS)
SELECT TOP 1 @MAIL_PROFILE=COMPANYID FROM COMPANYTYPE WHERE MAILSERVER = @SMTPSRV
END
exec msdb.dbo.sp_send_dbmail
@recipients = @DEST_MAIL,
@body = @MSG,
@subject = @TITLE,
@profile_name = @MAIL_PROFILE,
@body_format = HTML --也可以使用HTML格式
END
END