Spring Boot+SQL开发车辆登记与燃油费用计算API咨询
Spring Boot 车辆管理与燃油费用API实现指南
已完成基础上的剩余功能实现步骤
- 完善费用实体关联映射
费用实体类直接通过JPA注解绑定和车辆表的关联关系,不需要手动维护外键:在Expense类中添加Car类型属性,加上@ManyToOne注解标记多对一关系,用@JoinColumn(name = "car_id")指定关联的外键字段,同时补充费用表对应字段:汽油价格(雷亚尔)、城市行驶里程、高速行驶里程、计算得出的总燃油花费。 - 实现费用自动计算逻辑
计算逻辑统一写在Service层,新增费用记录时执行以下流程:- 根据传入的车辆ID调用Car的Repository查询对应车辆记录,不存在则直接抛出参数异常
- 取车辆记录中存储的城市平均油耗、高速平均油耗字段,套用公式计算总花费:
totalCost = ((城市行驶里程 / 城市平均油耗) + (高速行驶里程 / 高速平均油耗)) * 汽油价格 - 组装费用实体对象,绑定关联的车辆实例,赋值所有参数与计算得到的totalCost,调用费用Repository的save方法存入数据库
核心代码参考:
public Expense addVehicleExpense(Long carId, BigDecimal gasPrice, BigDecimal cityKm, BigDecimal highwayKm) { Car targetCar = carRepository.findById(carId) .orElseThrow(() -> new IllegalArgumentException("对应车辆ID不存在")); BigDecimal cost = cityKm.divide(targetCar.getCityAvgConsumption(), 2, RoundingMode.HALF_UP) .add(highwayKm.divide(targetCar.getHighwayAvgConsumption(), 2, RoundingMode.HALF_UP)) .multiply(gasPrice); Expense newExpense = new Expense(); newExpense.setCar(targetCar); newExpense.setGasPrice(gasPrice); newExpense.setCityKm(cityKm); newExpense.setHighwayKm(highwayKm); newExpense.setTotalCost(cost); return expenseRepository.save(newExpense); } - 开发对应接口
- 费用登记接口:POST请求路径可设为
/api/expenses,请求参数接收车辆ID、汽油价格、城市行驶里程、高速行驶里程,调用上述Service方法完成计算存库,返回生成的费用记录 - 费用排序查询接口:GET请求路径可设为
/api/expenses/ranking,接收汽油价格、城市总里程、高速总里程三个公共参数,在Repository层写关联查询,直接在SQL中套用公式计算每台车的对应花费,按花费升序/降序排序后返回车辆列表;如果需要查询单台车的历史费用记录,新增按车辆ID查询的GET接口,直接筛选该车辆关联的所有费用记录返回即可。
- 费用登记接口:POST请求路径可设为
开发注意事项
- 数值类字段(油耗、里程、价格、总花费)统一用
BigDecimal类型存储,避免浮点数计算精度丢失,除法计算要指定保留小数位数和舍入规则,提前做油耗非零校验防止除零报错 - 车辆实体的制造日期字段要加
@DateTimeFormat(pattern = "dd/MM/yyyy")和@JsonFormat(pattern = "dd/MM/yyyy")注解,匹配入参的12/12/2021这类日期格式,避免反序列化失败 - 实体字段命名如果和入参字段不一致,用
@JsonProperty注解做映射,比如葡语命名的ConsumoMedioCidade字段要对应绑定到城市油耗属性上,避免参数接收失败
内容的提问来源于stack exchange,提问作者Luiz Mafra
相关产品推荐
相关产品推荐

