更新余额2 |学习笔记

简介: 快速学习更新余额2

开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段)更新余额2 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/703/detail/12421


更新余额2


1.在进行代码实现之前要分析先流程在业务中包含两个子业务扣减余额和回退余额走流程时先判断当前请求参数是否合法微服务中每次远程调用时在微服务端都要做请求参数是否合法的判断

image.png

2.在余额的使用日志中查询是否有余额使用的记录查询该订单余额使用记录根据当前提交的参数判断是使用余额还是扣减余额如果已经查询到余额的使用记录就说明当前订单已经支付不需要再扣减余额所以查询订单余额使用日志是为了下面步骤做判断使用如果订单已经付款余额不用扣减如果没有付款就去完成扣减余额的操作如果余额在更新时是回退余额要判断订单是否完成付款如果完成付款则需要回退余额如果没有完成付款则不需要回退余额判断要依据日志查询的结果

image.png

3.已经完成付款在退款时要进行判断防止多次退款退款只能退一次就进行一次的退还金额操作所以不管是扣减金额还是回退金额都会记录余额使用日志

image.png

4.根据流程分析进行实现在微服务端进行更新余额的业务包含扣减余额和回退余额对方法进行修改把 reduce修改成 update

@Component

@Service( interfaceClass = IUserService. class)

public class UserServiceImpl implements IUserService{

@Autowired

private TradeUserMapper userMapper;

@Autowired

private TradeUserMoneyLogMapper userMoneyLogMapper;

@Override

public TradeUser findOne(Long userId) {

if(userId==null){

CastException. cast( ShopCode . SHOP_REQUEST_ PARAMETER_ VALID) ;

}

return userMapper. selectByPrimaryKey(userId);

}

@Override

在微服务中提供操作用户日志的方法操作用户的余额可能是减余额可能是加余额做这个操作之前先判断参数是否合法如果不合法不需要是不可以操作的

image.png

public Result updateMoneyPaid(TradeUserMoneyLog

userMoneyLog) {

//1.校验参数是否合法,是否满足需要

传递的用户是否为空用户的 id订单 id 不能为空余额数量大于等于0,小于等于0参数都属于非法如果有一个条件不满足直接抛异常

if( userMoneyLog==null ||

userMoneyLog. getUserId( )==null ||

userMoneyLog. getorderId( )==null ||

userMoneyLog. getUseMoney()==null ||

userMoneyLog. getUseMoney() . compareTo(BigDecimal.

ZERO)<=0){

CastException. cast( ShopCode . SHOP_REQUEST_ PARAMETER_ VALID);

}

//2.查询订单余额使用日志

根据条件做统计针对订单操作日志把结果先查询出来

TradeUserMoneyLogExample userMoneyLogExample =

new TradeUserMoneyLogExample();

TradeUserMoneyLogExample.Criteria criteria=

userMoneyLogExample . createCriteria();

criteria. andOrderIdEqualTo( userMoneyLog.

get0rderId());

criteria. andUserIdEqualTo(userMoneyLog. getUserId());

查询出来做备用

int r = userMoneyLogMapper.countByExample

( userMoneyLogExample);

用户对象已经查询出来

根据用户id查询用户的对象

TradeUser tradeUser=userMapper.

selectByPrimaryKey(userMoneyLog.getUserId());

//3.扣余额...

判断如果当前是扣减余额那么就要对用户的余额做减操作if(userMoneyLog.getMoneyLogType().

intValue( )==ShopCode . SHOP_ USER_ MONEY_ PAID.

getCode( ). intValue())

}

if(r>0){

//已经付款,不用再进行减余额的操作

CastException. cast(ShopCode .SHOP_ ORDER_ PAY_ STATUS_ IS_ PАY);

}

更新余额查询余额减去订单中的数据

image.png

//减余额

重新设置值这个值等于原先设置的值减去要使用的余额UserMoney 做更新操作tradeUser . setUserMoney(new BigDecimal(tradeUser.

getUserMoney()).subtract(userMoneyLog.getUseMoney()).

longValue());

userMapper . updateByPrimaryKey(tradeUser);

}

在lUserService,java中修改Result

updateMoneyPaid(TradeUserMoneyLog userMoneyLog ;

//4.回退余额...

退款要做的是余额加的操作

if(userMoneyLog.getMoneyLogType().

intValue( )==ShopCode . SHOP_ USER_ MONEY_ REFUND.

getCode( ). intValue())

}

判断如果r小于0,没有记录说明这个订单没有完成付款就没有使用过余额没有办法退款异常

//如果没有支付则不能回退余额

if(r<0){

CastException. cast(ShopCode . SHOP_ ORDER_ PAY_ STATUS_ NO_ PAY);

}

//防止多次退款

退款只能退一次防止多次退款的操作查询日志如果日志中已经记录了一次已经退款的记录那么就已经代表退过无需再退款

image.png

TradeUserMoneyLogExample userMoneyLogExample2 =

new TradeUserMoneyLogExample();

TradeUserMoneyLogExample . Criteria criteria1 =

userMoneyLogExample2. createCriteria();

criterial . andOrderIdEqualTo( userMoneyLog.

getOrderId());

criteria1. andUserIdEqualTo( userMoneyLog. getUserId());

criteria1. andMoneyLogTypeEqua1To(ShopCode.SHOP_ USER_ MONEY_ REFUND. getCode());

带条件查询日志表如果现在有日志就代表当前订单已经完成过退款

int r2 = userMoneyLogMapper . countByExample

(userMoneyLogExample2);

如果r2大于0,抛异常提示已经退过款

if(r2>0){

CastException.cast(ShopCode.SHOP_USER_MONEY_REFUND_ ALREADY);

}

//退款tradeUser.setUserMoney(new BigDecimal(tradeUser.

getUserMoney()).add(userMoneyLog.getUseMoney()).longValue());

更新

userMapper . updateByPrimaryKey(tradeUser) ;

如果有日志检查跟分析的流程是否一样

//5.记录订单余额使用日志

缺少时间

userMoneyLog . setCreateTime(new Date());

插入数据库

userMoneyLogMapper . insert(userMoneyLog);

返回return new Result(ShopCode.SHOP_SUCCESS.getSuccess(),

ShopCode.SHOP_ SUCCESS. getMessage());

}

}

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
消息中间件 监控 NoSQL
Celery 高效异步任务队列:打破常规,颠覆认知,应用实践全攻略在此!
【8月更文挑战第5天】Celery 是一款强大的异步任务队列框架,适用于后台执行耗时任务如邮件发送、报表生成等。可通过`pip install celery`安装,并配置消息代理(如Redis)以启动服务。定义异步任务使用装饰器`@app.task`,并通过`.delay()`方法执行。任务状态和结果可通过`.ready()`和`.get()`查询。异常处理支持任务重试,性能优化包括调整并发数和选用高效消息代理。Celery 能显著提升应用效率与用户体验。
719 0
|
1月前
|
前端开发 UED
突破异步困境:巧用Promise.all()优化前端性能
突破异步困境:巧用Promise.all()优化前端性能
274 116
23【办公软件】WPS2019打开时报错:安装Office自定义项,安装期间出错
左下角【开始】按钮,点击【运行】,在对话框输入【regedit】打开注册表
2445 0
|
4月前
|
JSON 监控 API
抖音视频列表API秘籍!轻松获取视频列表数据
抖音视频列表API是抖音开放平台提供的核心接口,支持按关键词、分类、排序方式筛选视频,适用于内容推荐、趋势分析等场景。接口返回含视频ID、标题、播放量等50+字段,支持分页获取,通过HTTP GET请求调用,返回JSON格式数据,便于开发者快速集成与处理。需注册平台账号获取访问权限。
979 56
|
1月前
|
人工智能 数据可视化 数据挖掘
2025主流BI产品深度评测,一文看懂企业BI选型
在数字经济时代,数据成为企业核心战略资源。商业智能(BI)已从传统报表工具演变为支撑决策、优化运营的关键基础设施。面对全民化分析、AI增强、嵌入式分析与云原生等趋势,企业需构建涵盖业务适配性、性能、成本、智能化与国产化等维度的选型体系。 本文对比Tableau、Power BI、Quick BI、FineBI、观远BI五大主流产品,揭示其在数据源支持、可视化、智能化、部署模式等方面差异,为企业提供科学选型参考,助力实现数据驱动转型。
2025主流BI产品深度评测,一文看懂企业BI选型
|
Linux 网络安全 Python
如何在服务器上运行python文件
如何在服务器上运行python文件
|
存储 应用服务中间件 数据库
服务器,你真的了解吗?
服务器是在网络中为其他计算机提供服务的高性能计算机,具备高速CPU运算能力、长时间稳定运行及强大的I/O能力。其主要组件包括CPU、内存、硬盘等,并通过自带管理系统进行数据控制。按外形分为塔式、机架、刀片和高密服务器;按指令集分为CISC(如x86)和RISC(如Unix、ARM);按处理器数量分为单路、双路和多路服务器;按负载类型则有数据库、应用、接入、Web和文件服务器等多种分类。每种服务器针对不同应用场景设计,满足多样化的计算需求。
2227 2
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
1095 0
|
算法
STM32CubeMX PID差速循迹小车
STM32CubeMX PID差速循迹小车
650 1
STM32CubeMX PID差速循迹小车
|
数据可视化 数据挖掘 BI
我最常用的两个数据可视化软件,强烈推荐
我最常用的两个数据可视化软件,强烈推荐
372 1