標籤:
最近的一個項目中,在對故障工單進行自動語音督辦的時候,需要在某個時段對某種組合條件下的工單不督辦。如在即時督辦中,對所有地區警示ID為“FF--1057361341”工單,白天不督辦,但夜間需督辦;在受理督辦中,對某個指定地區警示ID為“207-121-00-800316”的,白天督辦,夜間無需督辦。
為了保障督辦的及時性,我們採用的是任務驅動的方式。即產生任務,根據任務去判定採用什麼督辦模式。如:
那麼為了實現某個時段對某種組合條件下的工單不督辦的功能,我們只需要在產生督辦任務後,逐個判斷是否滿足條件A,B,C,如。但每次增加一個條件的時候,我們都必須修改和發布系統。同時判斷條件很多時,效率極其低下。
於是,我們想到了“黑名單”,把某種特定的條件組合,設計成“黑名單”。我們只需要判斷此工單是否在黑名單中,如果在,則不督辦,如。但對於不同的組合條件,需要設計不同的黑名單表,且沒增加一種條件時,需要修改和發布系統。
那麼,怎麼才能實現一個黑名單,能夠滿足不同組合條件的變化情況。我們設計以下黑名單表BlackList。
欄位 |
類型 |
說明 |
F_Id |
int |
自動編號 |
F_Area |
Varchar(50) |
地區名稱 |
F_ClassID |
int |
督辦類別ID |
F_TimeSlot |
Int |
督辦時間段 |
F_Mark |
Varchar(100) |
網管警示ID |
F_Grede |
Varchar(100) |
處理層級 |
F_Class1 |
Varchar(100) |
一級分類 |
F_Class2 |
Varchar(100) |
二級分類 |
F_Class3 |
Varchar(100) |
三級分類 |
然後,我們提供一個Get_isDoBlackList函數,用於判定此任務工單是否存在於黑名單表中,如果存在0,否則返回1,代碼如下:
--建立判斷黑名單的函數create function [MM].[dbo].[Get_isDoBlackList](@Area varchar(50), --地區@ClassID int, --督辦類型編號@TimeSlot int, --執行時間段,白天(-23點)為1,夜間為2;@Grade varchar(50), --工單層級@Mark varchar(50), --警示ID@Class1 varchar(50), --一級分類@Class2 varchar(50), --二級分類@Class3 varchar(50) --三級分類)/*功能描述:查詢當前需要督辦的任務工單是否在黑名單表BlackList中有配置, 如果有就返回,否則返回建立者:ldh建立時間:2016/6/30*/returns intasbegin declare @rt int if not exists( select F_mark from dbo.BlackList where (F_Area=@Area or F_Area=‘all‘) and (F_ClassID=@ClassID or F_ClassID=0) and (F_Grade=@Grade or F_Grade=‘all‘) and (F_MARk=@Mark or F_MARk=‘all‘) and F_TimeSlot=@TimeSlot and (F_Class1=@Class1 or F_Class1=‘all‘) and (F_Class2=@Class2 or F_Class2=‘all‘) and (F_Class3=@Class3 or F_Class3=‘all‘) ) begin set @rt= 1 end else begin set @rt= 0 end return @rt end
View Code
這樣,我們只需要設定BlackList中的記錄,根據記錄中的值來判定是否啟用此欄位為條件。對於int型欄位,當設定為0時,表示適應所有條件,即忽略此判定條件,否則,設定到此欄位的值作為判斷條件。對於Varchar類型的欄位,all表示適應所有規則,即忽略此判定條件,否則,設定到此欄位的值作為判斷條件。當然,前提是我們知道不會出現0和all值。
我麼根據以下代碼來驗證我們的方法和思路:
1)設定黑名單記錄
--設定黑名單記錄INSERT INTO [IVR].[dbo].[t_r_EomsBlackList]([F_Area],[F_ClassID],[F_TimeSlot], [F_Grade],[F_Mark],[F_Class1],[F_Class2],[F_Class3])select ‘all‘,2,2,‘all‘,‘208-069-00-300008‘,‘all‘,‘all‘,‘all‘unionselect ‘all‘,2,2,‘all‘,‘208-121-00-800030‘,‘all‘,‘all‘,‘all‘unionselect ‘all‘,2,2,‘all‘,‘207-121-00-800316‘,‘all‘,‘all‘,‘all‘unionselect ‘all‘,1,1,‘all‘,‘FF--1057361341‘,‘all‘,‘all‘,‘all‘
View Code
2)調用方法判定是否為黑名單
if (IVR.dbo.Get_isDoBlackList(‘11‘,2,2,‘二級督辦‘,‘207-121-00-800316‘,‘a11a‘,‘a11a‘,‘123‘)=0)begin print ‘是黑名單,需要過濾,不督辦‘endelsebegin print ‘不是黑名單,無需過濾,督辦‘end*/
View Code
通過這種方法,我們可以實現通過設定一條記錄,來增加一種組合條件的判定條件,從而在某個時段對某種組合條件下的工單不督辦。
如有更好的方法,歡迎探討和指導。(不經允許,請勿轉載)
在SQL中實現多條件任意組合黑名單的方法