回退用户余额|学习笔记

简介: 快速学习回退用户余额

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

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


回退用户余额


1、将优惠卷进行回退操作代码有一处需要进行修改在进行优惠卷回退中可能消息中没有优惠卷的id在直接回退时就会出现问题

@Autowired

private TradeCouponMapper couponMapper;

@Override

public void onMessage(MessageExt message) {

try {

//1.解析消息内容

String body = new String(message. getBody(),

charsetName: "UTF-8");

MQEntity mqEntity = JSON. parse0bject(body,

MQEntity.class);

Log. info("接收到消息");

if(mqEntity . getCouponId()! =nu11){

//2.查询优惠券信息

TradeCoupon coupon=couponMapper.

selectByPrimaryKey(mqEntity . getCouponId());

//3.更改优惠券状态

coupon. setUsedTime( null);

coupon. setIsUsed(ShopCode.SHOP_COUPON_UNUSED. getCode());

coupon. setorderId(null);

couponMapper . updateByPrimaryKey( coupon);

}

Log. info("回退优惠券成功");

} catch (UnsupportedEncodingException e) {

e. printStackTrace();

Log . error("回退优惠券失败");

}

2、用户余额的回退相对简单因为业务层已经提供 updateMoneyPaid 的方法方法中已经有扣减余额和回退余额所以只需要封装 userMoneyLog 对象提交过来让 updateMoneyPaid 进行处理

@slf4j

@Autowired

private IUserService userService;

@Override

public void onMessage (MessageExt messageExt) {

try {

//1.解析消息,进行异常的处理

String body = new String(messageExt . getBody(),

charsetName: "UTF-8");

MQEntity mqEntity = JSON. parseObject( body, MQEntity. class);

Log. Info(“接收到消息”);

//2.调用业务层进行余额修改设置当前余额的类型进行余额的回退调用业务层进行余额的回退打印日志余额回退成功如果出现异常余额回退失败

TradeUserMoneyLog userMoneyLog = new

TradeUserMoneyLog();

userMoneyLog . setUseMoney (mqEntity.

getUserMoney());

userMoneyLog . setMoneyLogType ( ShopCode . SHOP_ USER_ MONEY_ REFUND. getCode());

userMoneyLog. setUserId(mqEntity . getUserId());

userMoneyLog, setOrderId(mqEntity . getorderId());

userService .pdateMoneyPaid(userMoneyLog) ;

Log . info("余额回退成功");

}catch (UnsupportedEncodingException e){

e. printStackTrace();

Log.error("余额回退失败");

}

}

}

3、为了代码的健壮性如果当前用户的余额是空的就不需要进行回退所以进行判断

@slf4j

@Autowired

private IUserService userService;

@Override

public void onMessage (MessageExt messageExt) {

try {

//1.解析消息

String body = new String(messageExt . getBody(),

charsetName: "UTF-8");

MQEntity mqEntity = JSON. parseObject( body, MQEntity. class);

Log. Info(“接收到消息”);

if(mqEntity. getUserMoney()!=null && mqEntity .

getUserMoney(). compareTo(BigDecimal .ZERO)>0){

//2.调用业务层进行余额修改

TradeUserMoneyLog userMoneyLog = new

TradeUserMoneyLog();

userMoneyLog . setUseMoney (mqEntity.

getUserMoney());

userMoneyLog . setMoneyLogType ( ShopCode . SHOP_ USER_ MONEY_ REFUND. getCode());

userMoneyLog. setUserId(mqEntity . getUserId());

userMoneyLog, setOrderId(mqEntity . getorderId());

userService .pdateMoneyPaid(userMoneyLog) ;

Log . info("余额回退成功");

}catch (UnsupportedEncodingException e){

e. printStackTrace();

Log.error("余额回退失败");

}

}

}

目录
打赏
0
0
0
0
55
分享
相关文章
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
JAVA实现用户登录错误N次后,账户暂时锁定
JAVA实现用户登录错误N次后,账户暂时锁定
883 0
单笔转账报错PAYEE_NOT_EXIST(收款账户不存在)-排查方案
报错原因 接口中用户账户参数设置存在问题,导致显示用户收款账户不存在。 排查方案 1、检查payee_account, payee_type是否匹配,如匹配,请检查payee_account是否存在; (1)payee_type设置要求 ALIPAY_USERID:支付宝账号对应的支付宝唯一用户号。
3824 12
|
10月前
|
如何让你的应用在后台可以继续处理未完事务
如何让你的应用在后台可以继续处理未完事务
76 1
微软一面:订单超时未支付,如何自动关闭?
本文探讨了微软面试中关于订单超时自动关闭的设计题,提供了四种解决方案:定时器轮询、被动关闭、MQ延时消息及分布式超时中心。每种方案均详细阐述了实现思路、优缺点及适用场景。强调架构应基于业务需求,而非盲目追求高大上。适合不同规模的企业参考选用。
112 4
谷粒商城笔记+踩坑(21)——提交订单。原子性验令牌+锁定库存
完成提交订单功能,并使用分布式事务方案,保证了订单提交的幂等性
谷粒商城笔记+踩坑(21)——提交订单。原子性验令牌+锁定库存
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统42----支付宝支付-定时查单-订单已支付,如果我们在定时查单的状态中,我们明明已经支付的订单,却在本地状态中显示没有支付,这是因我们的异步通知因为种种原因没有接受到,支付宝端成功,本地失败
支付系统42----支付宝支付-定时查单-订单已支付,如果我们在定时查单的状态中,我们明明已经支付的订单,却在本地状态中显示没有支付,这是因我们的异步通知因为种种原因没有接受到,支付宝端成功,本地失败
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等