# auto-compute
**Repository Path**: iAuzre/auto-compute
## Basic Information
- **Project Name**: auto-compute
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-02-29
- **Last Updated**: 2024-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringBoot 中间件: 基于AOP的数据自动计算
## 1. 概述
在开发中,我们经常会遇到一些需要根据一些数据计算出来的数据,比如:订单金额、订单数量、订单总价等等。这些数据的计算逻辑通常是固定的,但是在代码中我们还是需要手动计算,这样会导致代码重复,而且容易出错。为了解决这个问题,我们可以使用AOP来实现数据自动计算。
项目目前支持行内计算,提供简便的求和、求平均以及公式计算功能。
后续将拓展更多的计算方式,比如:求最大最小值、行间计算等。
## 2. 使用
在SpringBoot中,我们可以使用AOP来实现数据自动计算。首先我们需要引入依赖:
```xml
com.iauzre
auto-compute
1.0-SNAPSHOT
```
在需要触发的方法上添加注解:
```java
@com.iauzre.annotation.AutoCompute
public List test() {
// ...
}
```
之后只需要在实体类中配置相应的计算规则即可:
```java
package com.iauzre.test;
import com.iauzre.annotation.Avg;
import com.iauzre.annotation.Compute;
import com.iauzre.annotation.Formula;
import com.iauzre.annotation.Sum;
import com.iauzre.constant.Type;
import com.iauzre.excute.IComputeAfter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* @author iauzre@vip.qq.com 2024/2/26 10:20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Compute(type = {Type.SUM, Type.AVG, Type.FORMULA})
public class ComputeTestEntityAfter implements IComputeAfter {
private BigDecimal amount1;
private BigDecimal amount2;
private BigDecimal amount3;
@Sum(fieldName = {"amount1", "amount2", "amount3"})
private BigDecimal sum;
@Avg(fieldName = {"amount1", "amount2", "amount3"})
private BigDecimal avg;
/**
* 计算公式注解
* 用于标记需要计算的字段
*/
@Formula(formula = "amount1-amount2+amount1-100")
private BigDecimal sum12;
private BigDecimal avg12;
/**
* 在计算之后会自动执行该方法
* 提供可拓展计算的接口
*/
@Override
public void computeAfter() {
this.avg12 = this.amount1.add(this.amount2).divide(new BigDecimal(2), 2, RoundingMode.HALF_UP);
}
}
```
中间件会基于AOP自动扫描添加了注解的方法,然后根据实体类中的注解进行计算:
