更新余额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());

}

}

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
10月前
|
机器人
如何查询OpenAI账户余额?ChatGPT怎么查看账户余额的方法
ChatGPT是美国OpenAI研发的聊天机器人程序,也是最近火爆全网的热门应用和话题之王。很多用户在使用openai的时候不知道如何查询OpenAI账户余额?
1965 0
单笔转账报错PAYEE_NOT_EXIST(收款账户不存在)-排查方案
报错原因 接口中用户账户参数设置存在问题,导致显示用户收款账户不存在。 排查方案 1、检查payee_account, payee_type是否匹配,如匹配,请检查payee_account是否存在; (1)payee_type设置要求 ALIPAY_USERID:支付宝账号对应的支付宝唯一用户号。
3463 0
假期余额的批量更新
请问各位大佬,通过接口创建的假期规则如需进行批量的添加应如何操作。 按照原方式,通过文件上传来更新假期余额,系统提示不允许操作。 另外是否有办法,在不走钉钉的年假申请,而只是上传请假记录后,自动扣除年假余额呢?
|
数据安全/隐私保护
APP - 支付宝怎么延时转账?能否撤回转账?
APP - 支付宝怎么延时转账?能否撤回转账?
1118 0
APP - 支付宝怎么延时转账?能否撤回转账?
|
弹性计算
阿里云存在未支付订单导致无法下单解决方法
解决阿里云存在未支付订单请支付或作废后再下单,阿里云服务器或其他云资源无法立即购买,提示“您选择的资源存在未支付订单,请支付或作废后再下单!”什么原因?这是由于你的阿里云账号之前已经创建了该订单,只是订单没有支付,所以无法再次创建订单。解决方法是,要么取消之前的订单,要么支付之前的订单。阿里云百科来详细说下阿里云账号下存在未支付订单的解决方法:
740 0
阿里云存在未支付订单导致无法下单解决方法
|
存储 编译器 uml
银行账户类(Accoount)可以为账户存储交易。取款和存款都会产生交易信息。需要记录账户每次交易的信息,包括取钱还是存钱,交易的金额,交易时间和交易之后的余额。系统可以通过账户查询所有的交易次数(最
银行账户类(Accoount)可以为账户存储交易。取款和存款都会产生交易信息。需要记录账户每次交易的信息,包括取钱还是存钱,交易的金额,交易时间和交易之后的余额。系统可以通过账户查询所有的交易次数(最
188 0
|
消息中间件 RocketMQ 开发者
更新余额1|学习笔记
快速学习更新余额1
61 0
更新余额1|学习笔记
|
消息中间件 RocketMQ 开发者
回退用户余额|学习笔记
快速学习回退用户余额
60 0
|
消息中间件 RocketMQ 开发者
更新优惠卷|学习笔记
快速学习更新优惠卷
80 0
更新优惠卷|学习笔记
|
数据库 开发者 微服务
查询订单支付状态接口(2) | 学习笔记
快速学习查询订单支付状态接口(2)
101 0
查询订单支付状态接口(2) | 学习笔记