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+'
' + '' + ' ' + '' + @FLOWDETAIL + '
'+@FLD8+''+@FLD9+''+@FLDA+''+@FLDB+''+@FLDC+''+@FLDD+'
' 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+'
' + '' + ' ' + '' + @FLOWDETAIL + '
'+@FLD8+''+@FLD9+''+@FLDA+''+@FLDB+''+@FLDC+''+@FLDD+'
' 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