风控系统之通用规则条件设计,算术单元/逻辑单元/函数式接口

本文主要是介绍风控系统之通用规则条件设计,算术单元/逻辑单元/函数式接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

前面有风控系统之普通规则条件,使用LiteFlow实现,介绍了普通规则条件,并给出简单的示例实现。

这篇就此进行扩展,介绍其他规则条件。

说白了,规则条件就是条件,而且并不局限于规则之中,简单讲就是if()括号里的内容,用于判断规则是否需要执行,是规则极其重要的部分。

规则条件有很多种,他们看似相同,却又不同。作为程序员,应该具备逻辑抽象的思维,通过设计将其统一整合起来。

普通条件

前文讲过,普通规则条件就是常规的比较,类同于代码中各种运算符。

这也是最简单最基础的,先看原来的设计。

create table de_condition
(id           bigint auto_increment comment '主键' primary key,field_name   varchar(32)                 default ''                not null comment '字段名',operate_type varchar(32)                 default 'null'            not null comment '操作类型',expect_type  varchar(32)                 default 'input'           not null comment '期望值类型',expect_value varchar(32)                 default ''                not null comment '期望值',description  varchar(64) charset utf8mb4 default ''                null comment '描述',creator      varchar(64) charset utf8mb4 default ''                null comment '创建者',create_time  datetime                    default CURRENT_TIMESTAMP not null comment '创建时间',updater      varchar(64) charset utf8mb4 default ''                null comment '更新者',update_time  datetime                    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',deleted      bit                         default b'0'              not null comment '是否删除'
) comment '规则条件表';

举例说明一下

field_nameoperate_typeexpect_typeexpect_value
N_S_appNameeqinputphone
N_F_moneygtecontextN_F_balance

第一个条件:判断系统字段N_S_appName是否等于phone这个字符串。

第二个条件:判断系统字段N_F_money是否大于等于系统字段N_F_balance

看似挺简单的,但这还涉及到系统字段的类型问题,之前文章有将字段进行如下划分。

/*** @author wnhyang* @date 2024/3/13**/
@AllArgsConstructor
@Getter
public enum FieldType {/*** 字符型,支持【等于、不等于、包含、不包含、前缀、非前缀、后缀、非后缀、为空、不为空、存在于、不存在于】*/STRING("S"),/*** 整数型,支持【等于、不等于、大于、小于、大于等于、小于等于、为空、不为空、存在于,不存在于】*/NUMBER("N"),/*** 小数型,支持【等于、不等于、大于、小于、大于等于、小于等于、为空、不为空】*/FLOAT("F"),/*** 日期型,支持【等于、不等于、大于、小于、大于等于、小于等于、为空、不为空】*/DATE("D"),/*** 枚举型,支持【等于、不等于、为空、不为空】*/ENUM("E"),/*** 布尔型,支持【等于、不等于、为空、不为空】*/BOOLEAN("B");private final String type;public static FieldType getByType(String type) {for (FieldType value : values()) {if (value.getType().equals(type)) {return value;}}return null;}public static FieldType getByFieldName(String fieldName) {if (fieldName.length() >= 3) {String sub = StrUtil.sub(fieldName, 2, 3);return getByType(sub);}return null;}
}

与其相对应的操作类型有下。

/*** @author wnhyang* @date 2024/4/3**/
@AllArgsConstructor
@Getter
public enum OperateType {NULL("null"),NOT_NULL("not_null"),EQ("eq"),NOT_EQ("not_eq"),GT("gt"),GTE("gte"),LT("lt"),LTE("lte"),CONTAINS("contains"),NOT_CONTAINS("not_contains"),PREFIX("prefix"),NOT_PREFIX("not_prefix"),SUFFIX("suffix"),NOT_SUFFIX("not_suffix");private final String type;public static OperateType getByType(String type) {for (OperateType operateType : OperateType.values()) {if (operateType.getType().equals(type)) {return operateType;}}return null;}
}

普通条件就可表示如下,因为左边,只有${字段}所以表设计的也简单,是field_name没有区分,而中间操作也只有这些,也是固定的operate_type,右边因为有变量${字段}和常量的区别,设计了expect_typeexpect_value

指标条件

作为风控系统,指标是非常重要的存在,它与字段有很多相似之处。

数据类型差不多,有字符、数字、时间,毕竟它就是通过字段计算出来的嘛。

操作和右边也是一样,所以指标条件需要在左边加上${指标}就够用了。

正则条件

我们都知道正则运算一般就是match(表达式,content),其实也是左运算右的模式。不过正则条件要加上一些属性。

1、是否匹配(是/否)

2、忽略大小写(是/否)

四则条件

四则运算,必要条件是数字类型,包括整数类型和小数类型,而且不局限于系统,还包含指标。

运算模式大概是下面这样。

不过这还不是条件,这只是运算,结果为数字类型,还需要加上判断才能成为条件。

如下,四则运算整体作为左边进行判断才构成了四则条件。

名单条件

名单条件有点类似普通条件的包含于,不多不是字符串那种包含于,而是数组类似的包含于。

时间条件

时间条件针对的是时间类型的字段。

时间差

顾名思义,时间A-时间B的差。

时间范围

对于流式数据时间不可能局限于准确的时间点,应当是类似于cron

位置条件

针对经纬度相关信息进行判断。

距离计算

顾名思义,位置A到位置B距离。

设备条件

关于设备可以算是新的安全领域,关系客户端。

主要风险包含有:越狱、代理、vpn、root、模拟器、双开、调试、注入攻击、DNS劫持等等。

通常需要配合客户端sdk来识别,本质上也是风控因子(系统字段)的收集与判断。

脚本条件

脚本条件是最灵活、最不可控的条件,灵活容易理解,毕竟都是直接写代码作为条件了;不可控制就是代码不可控,只有熟悉本系统了解怎么编写的才能正确的使用脚本条件,不然就是各种问题了。

总结

以上基本梳理了通用的规则条件,可以了解到,所有条件无非是boolean condition(left, operate, right);函数。

operate是常用的操作,是固定的运算流程。

leftright是两个不同于condition的逻辑单元,condition返回值是boolean,他们俩需要的是T arithmetic(T leftValue, arithmeticOperate, T rightValue);这样的运算单元。

是不是有点编译原理的意思了!虽然当时我上那门课的时候也是各种懵逼,但是有些思想和方法论确实很有价值。

读万卷书也要行万里路啊!

所以可以将其拆分开为conditionarithmetic

首先是T arithmetic(T leftValue, arithmeticOperate, T rightValue);

boolean condition(arithmetic(l1,m1,r1) right, logicOperation, arithmetic(l2,m2,r2) right);

根据如上的算术单元和逻辑单元可以结合Java的函数式接口使编码更加优雅,就先到这吧!

抛砖引玉啦!

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

扫码_搜索联合传播样式-标准色版.png

这篇关于风控系统之通用规则条件设计,算术单元/逻辑单元/函数式接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030114

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据