mysql 设置的黑名单_在SQL中实现多条件任意组合黑名单的方法

最近的一个项目中,在对故障工单进行自动语音督办的时候,需要在某个时段对某种组合条件下的工单不督办。如在实时督办中,对所有区域告警ID为“FF--1057361341”工单,白天不督办,但夜间需督办;在受理督办中,对某个指定区域告警ID为“207-121-00-800316”的,白天督办,夜间无需督办。

为了保障督办的及时性,我们采用的是任务驱动的方式。即生成任务,根据任务去判定采用什么督办模式。如下图:

715df44e8534959060eb557ebf8fd651.png

那么为了实现某个时段对某种组合条件下的工单不督办的功能,我们只需要在生成督办任务后,逐个判断是否满足条件A,B,C,如下图。但每次增加一个条件的时候,我们都必须修改和发布系统。同时判断条件很多时,效率极其低下。

c92fe67d61ab32ca9bda214a67ee95dd.png

于是,我们想到了“黑名单”,把某种特定的条件组合,设计成“黑名单”。我们只需要判断此工单是否在黑名单中,如果在,则不督办,如下图。但对于不同的组合条件,需要设计不同的黑名单表,且没增加一种条件时,需要修改和发布系统。

cbb1f2c99a0325fa03c4ed0f6c3e1fbb.png

那么,怎么才能实现一个黑名单,能够满足不同组合条件的变化情况。我们设计以下黑名单表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,代码如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

--创建判断黑名单的函数

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 int

as

begin

declare @rt int

if not exists( select F_mark fromdbo.BlackListwhere (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)设置黑名单记录

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

--设置黑名单记录

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'

union

select 'all',2,2,'all','208-121-00-800030','all','all','all'

union

select 'all',2,2,'all','207-121-00-800316','all','all','all'

union

select 'all',1,1,'all','FF--1057361341','all','all','all'

View Code

2)调用方法判定是否为黑名单

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

if (IVR.dbo.Get_isDoBlackList('11',2,2,'二级督办','207-121-00-800316','a11a','a11a','123')=0)begin

print '是黑名单,需要过滤,不督办'

end

else

begin

print '不是黑名单,无需过滤,督办'

end

*/

View Code

通过这种方法,我们可以实现通过设置一条记录,来增加一种组合条件的判定条件,从而在某个时段对某种组合条件下的工单不督办。

如有更好的方法,欢迎探讨和指导。(不经允许,请勿转载)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值