fix(points): prevent stale integral balance updates
Use atomic integral updates during balance payment so older user snapshots cannot overwrite newer self-bonus rewards. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -691,7 +691,10 @@ public class OrderPayServiceImpl implements OrderPayService {
|
||||
userService.updateNowMoney(user, storeOrder.getPayPrice(), "sub");
|
||||
// 扣除积分
|
||||
if (storeOrder.getUseIntegral() > 0) {
|
||||
userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub");
|
||||
Boolean integralUpdated = userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub");
|
||||
if (!integralUpdated) {
|
||||
throw new CrmebException("用户积分不足");
|
||||
}
|
||||
}
|
||||
// 添加支付成功redis队列
|
||||
redisUtil.lPush(TaskConstants.ORDER_TASK_PAY_SUCCESS_AFTER, storeOrder.getOrderId());
|
||||
|
||||
@@ -392,6 +392,27 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
|
||||
return update(lambdaUpdateWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户积分
|
||||
*
|
||||
* 使用数据库原子加减,避免根据调用方传入的旧 User 对象计算后覆盖最新积分。
|
||||
*
|
||||
* @param user 用户
|
||||
* @param integral 积分
|
||||
* @param type 增加add、扣减sub
|
||||
* @return Boolean
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateIntegral(User user, Integer integral, String type) {
|
||||
if (ObjectUtil.isNull(user)) {
|
||||
throw new CrmebException("用户不存在");
|
||||
}
|
||||
if (ObjectUtil.isNull(integral) || integral <= 0) {
|
||||
throw new CrmebException("积分必须大于0");
|
||||
}
|
||||
return operationIntegral(user.getUid(), BigDecimal.valueOf(integral), user.getIntegral(), type);
|
||||
}
|
||||
|
||||
/**
|
||||
* 会员分组
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user