# 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自动扫描添加了注解的方法,然后根据实体类中的注解进行计算: ![计算结果](./doc/compute-result.png)