用drools实现账户近一个月累计交易笔数≥30笔
时间: 2024-03-23 20:41:06 浏览: 77
好的,您的问题是如何用drools实现账户近一个月累计交易笔数≥30笔。
首先,您需要定义一个规则,用于判断账户近一个月的交易笔数是否大于等于30笔。以下是一个简单的规则示例:
```
rule "Account Transaction Count"
when
$account : Account($transactions : transactions)
accumulate(
Transaction($account == $account, $timestamp : timestamp) over window:time(30d);
$count : count($timestamp);
$count >= 30
)
then
System.out.println("Account " + $account.getNumber() + " has had " + $count + " transactions in the last 30 days.");
end
```
这个规则会匹配所有具有交易记录的账户,并在交易记录中累加在最近30天内发生的交易。如果交易数量大于等于30,就会触发规则,并输出账户号码和交易数。
您可以根据自己的业务逻辑进行修改和扩展,以实现更加复杂的规则。
相关问题
用drools实现同账户过去24小时交易金额的变异系数≤0.05
要实现同账户过去24小时交易金额的变异系数≤0.05,可以按照以下步骤使用 Drools 规则引擎:
1. 定义交易实体类
首先,我们需要定义一个交易实体类,该类包含交易所属的账户、交易金额和交易时间等属性,例如:
```java
public class Transaction {
private String account;
private double amount;
private LocalDateTime time;
// 省略构造方法和 getter/setter 方法
}
```
在上述代码中,我们定义了一个交易实体类 `Transaction`,该类包含了三个属性,分别为 `account`、`amount` 和 `time`,分别表示交易所属的账户、交易金额和交易时间。
2. 编写规则文件
接下来,我们需要编写一个规则文件,该文件用于计算同账户过去 24 小时交易金额的变异系数,并判断是否满足条件。以下是一个简单的规则文件示例:
```drools
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.time.LocalDateTime;
import com.example.Transaction;
rule "Check transaction coefficient of variation"
when
$transactions: List(size > 1) from collect(Transaction() over window:time(24h) from entry-point transactions)
then
// 根据账户分组,计算每个账户的交易金额平均值和标准差
Map<String, List<Double>> groups = $transactions.stream()
.collect(Collectors.groupingBy(Transaction::getAccount, Collectors.mapping(Transaction::getAmount, Collectors.toList())));
Map<String, Double> means = groups.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().stream().mapToDouble(Double::doubleValue).average().orElse(0.0)));
Map<String, Double> sds = groups.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> {
double mean = means.get(e.getKey());
return Math.sqrt(e.getValue().stream().mapToDouble(x -> Math.pow(x - mean, 2)).average().orElse(0.0));
}));
// 计算变异系数
boolean isSatisfied = true;
for (String account : groups.keySet()) {
double mean = means.get(account);
double sd = sds.get(account);
double cv = sd / mean;
if (cv > 0.05) {
isSatisfied = false;
break;
}
}
// 如果满足条件,则输出日志信息
if (isSatisfied) {
System.out.println("Transaction coefficient of variation is satisfied.");
}
end
```
在上述规则中,我们首先通过模式匹配定义了一个名为 `$transactions` 的交易列表,该列表包含了所有在过去 24 小时内进入 entry-point `transactions` 的交易。然后,我们根据账户分组,计算每个账户的交易金额平均值和标准差,并计算变异系数。最后,我们判断变异系数是否小于等于 0.05,如果满足条件,则输出日志信息。
需要注意的是,规则中的时间窗口 `window:time(24h)` 表示在过去 24 小时内进入 entry-point `transactions` 的交易,因此需要在代码中将交易实体类 `Transaction` 定义为 entry-point,例如:
```java
KieSession kieSession = kieBase.newKieSession();
kieSession.getEntryPoint("transactions").insert(new Transaction("account1", 100.0, LocalDateTime.now()));
kieSession.getEntryPoint("transactions").insert(new Transaction("account1", 200.0, LocalDateTime.now().minusHours(12)));
kieSession.getEntryPoint("transactions").insert(new Transaction("account2", 300.0, LocalDateTime.now().minusHours(6)));
kieSession.fireAllRules();
```
在上述代码中,我们首先创建了一个名为 `transactions` 的 entry-point,并将三个不同的交易实例插入到该 entry-point 中。然后,我们使用 `fireAllRules` 方法触发规则引擎执行规则,如果满足条件,则会输出日志信息。
总的来说,以上是一个简单的 Drools 规则示例,用于计算同账户过去 24 小时交易金额的变异系数,并判断是否满足条件。实际应用中,您可能需要更复杂的规则和类定义,以满足您的具体需求。
当日,账户转账交易关联不同交易对手(账号)>=20个,其中转入笔数小于5笔总金额大于15万,且日终余额<=100元。使用drools实现
好的,根据您的要求,我可以给您提供一个基于Drools的规则实现,来检测当日账户转账交易的情况。以下是一个可能的规则实现:
```java
rule "Suspicious Account Transactions"
when
// 当日交易次数大于等于20次
$count : Long() from accumulate(
$tx : Transaction($account : account, date == today),
count($tx)
)
$count >= 20
// 转入次数小于5次
$inCount : Long() from accumulate(
$tx : Transaction($account : account, date == today, amount > 0),
count($tx)
)
$inCount < 5
// 转入总金额大于15万
$inTotal : Double() from accumulate(
$tx : Transaction($account : account, date == today, amount > 0),
sum($tx.getAmount())
)
$inTotal > 150000
// 日终余额小于等于100元
$balance : Double() from accumulate(
$tx : Transaction(account == $account, date == today),
sum($tx.getAmount())
)
$balance <= 100.0
then
// 触发警报
System.out.println("警告:账户 " + $account + " 存在可疑交易!");
end
```
以上规则会检查当日所有交易,如果账户的转入次数小于5次,并且转入总金额大于15万,并且当日余额小于等于100元,并且交易次数大于等于20次,就会触发警报。
当然,这个规则只是一个例子,您可以根据实际需要进行修改或扩展。同时,您需要将这个规则与您的应用程序进行集成,以便在需要时触发规则检查。
阅读全文