首绑支付宝发放现金红包奖励

This commit is contained in:
谭凯凯
2024-12-20 14:02:50 +08:00
committed by Tankaikai
parent 8123d0223e
commit 0584ef6566
5 changed files with 270 additions and 189 deletions

View File

@@ -1,9 +1,9 @@
package com.sqx.modules.app.controller.app; package com.sqx.modules.app.controller.app;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sqx.common.annotation.Debounce;
import com.sqx.common.utils.ApiAccessLimitUtil; import com.sqx.common.utils.ApiAccessLimitUtil;
import com.sqx.common.utils.Result; import com.sqx.common.utils.Result;
import com.sqx.modules.app.annotation.Login; import com.sqx.modules.app.annotation.Login;
@@ -11,7 +11,6 @@ import com.sqx.modules.app.annotation.LoginUser;
import com.sqx.modules.app.entity.UserEntity; import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.AppService; import com.sqx.modules.app.service.AppService;
import com.sqx.modules.app.service.UserService; import com.sqx.modules.app.service.UserService;
import com.sqx.modules.message.entity.MessageInfo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
@@ -86,11 +85,23 @@ public class AppController {
if (!ApiAccessLimitUtil.isAccessAllowed(userId.toString(), "updateZFB", 3, "month")) { if (!ApiAccessLimitUtil.isAccessAllowed(userId.toString(), "updateZFB", 3, "month")) {
return Result.error("每月仅支持修改三次,请联系管理员"); return Result.error("每月仅支持修改三次,请联系管理员");
} }
UserEntity old = userService.getById(userId);
String accountNo = old.getZhiFuBao();
String accountName = old.getZhiFuBaoName();
boolean isFirstBind = false;
if (StrUtil.isEmpty(accountNo) && StrUtil.isEmpty(accountName)) {
isFirstBind = true;
}
UserEntity userEntity = new UserEntity(); UserEntity userEntity = new UserEntity();
userEntity.setZhiFuBao(zhiFuBao); userEntity.setZhiFuBao(zhiFuBao);
userEntity.setZhiFuBaoName(zhiFuBaoName); userEntity.setZhiFuBaoName(zhiFuBaoName);
userEntity.setUserId(userId); userEntity.setUserId(userId);
userService.updateById(userEntity); old.setZhiFuBao(userEntity.getZhiFuBao());
old.setZhiFuBaoName(userEntity.getZhiFuBaoName());
boolean bool = userService.updateById(userEntity);
if (bool && isFirstBind) {
userService.firstBindAwardsMoney(old);
}
return Result.success(); return Result.success();
} }

View File

@@ -227,4 +227,6 @@ public interface UserService extends IService<UserEntity> {
int updateUserClientIdIsNull(String clientid); int updateUserClientIdIsNull(String clientid);
void firstBindAwardsMoney(UserEntity entity);
} }

View File

@@ -1,6 +1,9 @@
package com.sqx.modules.app.service.impl; package com.sqx.modules.app.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@@ -42,6 +45,7 @@ import com.sqx.modules.app.utils.JwtUtils;
import com.sqx.modules.app.utils.UserConstantInterface; import com.sqx.modules.app.utils.UserConstantInterface;
import com.sqx.modules.common.entity.CommonInfo; import com.sqx.modules.common.entity.CommonInfo;
import com.sqx.modules.common.service.CommonInfoService; import com.sqx.modules.common.service.CommonInfoService;
import com.sqx.modules.discSpinning.service.DiscSpinningService;
import com.sqx.modules.file.utils.Md5Utils; import com.sqx.modules.file.utils.Md5Utils;
import com.sqx.modules.invite.service.InviteService; import com.sqx.modules.invite.service.InviteService;
import com.sqx.modules.message.entity.MessageInfo; import com.sqx.modules.message.entity.MessageInfo;
@@ -61,13 +65,17 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import weixin.popular.api.SnsAPI; import weixin.popular.api.SnsAPI;
import weixin.popular.util.JsonUtil; import weixin.popular.util.JsonUtil;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
/** /**
@@ -98,6 +106,10 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
private UserVipService userVipService; private UserVipService userVipService;
@Autowired @Autowired
private MessageService messageService; private MessageService messageService;
@Autowired
private CommonInfoService commonRepository;
@Autowired
private DiscSpinningService discSpinningService;
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
@Override @Override
@@ -213,7 +225,6 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
} }
@Override @Override
public Result getNewUserRed(Long userId) { public Result getNewUserRed(Long userId) {
reentrantReadWriteLock.writeLock().lock(); reentrantReadWriteLock.writeLock().lock();
@@ -622,8 +633,6 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
} }
@Override @Override
public Result wxAppLogin(String wxOpenId, String token) { public Result wxAppLogin(String wxOpenId, String token) {
UserEntity userEntity = queryByWxOpenId(wxOpenId); UserEntity userEntity = queryByWxOpenId(wxOpenId);
@@ -980,8 +989,6 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
} }
@Override @Override
public Result login(String phone, String pwd) { public Result login(String phone, String pwd) {
UserEntity userEntity = queryByPhone(phone); UserEntity userEntity = queryByPhone(phone);
@@ -1462,4 +1469,38 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
return baseMapper.updateUserClientIdIsNull(clientid); return baseMapper.updateUserClientIdIsNull(clientid);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void firstBindAwardsMoney(UserEntity entity) {
reentrantReadWriteLock.writeLock().lock();
try {
CommonInfo one = commonRepository.findOne(920);
BigDecimal money = new BigDecimal(one.getValue());
userMoneyService.updateMoney(1, entity.getUserId(), money.doubleValue());
UserMoneyDetails userMoneyDetails = new UserMoneyDetails();
userMoneyDetails.setUserId(entity.getUserId());
userMoneyDetails.setTitle("[首绑支付宝]");
userMoneyDetails.setContent("现金红包奖励:" + money + "");
// 充值
userMoneyDetails.setType(1);
// 任务领取
userMoneyDetails.setClassify(7);
userMoneyDetails.setMoney(money);
userMoneyDetails.setCreateTime(DateUtil.format(new Date(System.currentTimeMillis() - 1000), "yyyy-MM-dd HH:mm:ss"));
userMoneyDetails.setMoneyType(1);
boolean ret = userMoneyDetailsService.save(userMoneyDetails);
if (ret) {
ThreadUtil.execAsync(()->{
discSpinningService.withdrawAsync(entity, money.doubleValue(), "[首绑支付宝]");
},true);
}
} catch (Exception e) {
log.error("首绑支付宝发放奖励异常,用户信息:{}", JSONUtil.toJsonStr(entity));
log.error("首绑支付宝发放奖励异常:", e);
throw new RuntimeException("首绑奖励失败");
} finally {
reentrantReadWriteLock.writeLock().unlock();
}
}
} }

View File

@@ -16,6 +16,11 @@ public interface DiscSpinningService extends IService<DiscSpinning> {
//提现 //提现
void withdraw(UserEntity userInfo, Double money); void withdraw(UserEntity userInfo, Double money);
//提现
void withdraw(UserEntity userInfo, Double money, String title);
//提现
void withdrawAsync(UserEntity userInfo, Double money, String title);
} }

View File

@@ -17,10 +17,8 @@ import com.sqx.modules.discSpinning.dao.DiscSpinningDao;
import com.sqx.modules.discSpinning.entity.DiscSpinning; import com.sqx.modules.discSpinning.entity.DiscSpinning;
import com.sqx.modules.discSpinning.entity.DiscSpinningAmount; import com.sqx.modules.discSpinning.entity.DiscSpinningAmount;
import com.sqx.modules.discSpinning.entity.DiscSpinningRecord; import com.sqx.modules.discSpinning.entity.DiscSpinningRecord;
import com.sqx.modules.discSpinning.service.DiscSpinningAmountService;
import com.sqx.modules.discSpinning.service.DiscSpinningRecordService; import com.sqx.modules.discSpinning.service.DiscSpinningRecordService;
import com.sqx.modules.discSpinning.service.DiscSpinningService; import com.sqx.modules.discSpinning.service.DiscSpinningService;
import com.sqx.modules.orders.service.OrdersService;
import com.sqx.modules.pay.entity.CashOut; import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.service.CashOutService; import com.sqx.modules.pay.service.CashOutService;
import com.sqx.modules.pay.wuyou.BaseResp; import com.sqx.modules.pay.wuyou.BaseResp;
@@ -30,7 +28,10 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
@@ -48,6 +49,9 @@ public class DiscSpinningServiceImpl extends ServiceImpl<DiscSpinningDao, DiscSp
private final CashOutService cashOutService; private final CashOutService cashOutService;
private final RedisUtils redisUtils; private final RedisUtils redisUtils;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired @Autowired
public DiscSpinningServiceImpl(CommonInfoService commonRepository, public DiscSpinningServiceImpl(CommonInfoService commonRepository,
@@ -94,6 +98,12 @@ public class DiscSpinningServiceImpl extends ServiceImpl<DiscSpinningDao, DiscSp
@Override @Override
@Transactional @Transactional
public void withdraw(UserEntity userInfo, Double money) { public void withdraw(UserEntity userInfo, Double money) {
withdraw(userInfo, money, "[现金大转盘]");
}
@Override
@Transactional
public void withdraw(UserEntity userInfo, Double money, String title) {
CashOut cashOut = new CashOut(); CashOut cashOut = new CashOut();
cashOut.setIsOut(false); cashOut.setIsOut(false);
cashOut.setMoney(money.toString()); cashOut.setMoney(money.toString());
@@ -113,7 +123,7 @@ public class DiscSpinningServiceImpl extends ServiceImpl<DiscSpinningDao, DiscSp
BaseResp baseResp = WuyouPay.extractOrder(outOrderNo, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName()); BaseResp baseResp = WuyouPay.extractOrder(outOrderNo, cashOut.getMoney(), cashOut.getZhifubao(), cashOut.getZhifubaoName());
if (baseResp.getStatus() != null && (baseResp.getStatus().equals(2) || baseResp.getStatus().equals(10000))) { if (baseResp.getStatus() != null && (baseResp.getStatus().equals(2) || baseResp.getStatus().equals(10000))) {
UserMoneyDetails userMoneyDetails = new UserMoneyDetails( UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
userInfo.getUserId(), null, null, "[现金大转盘]", 4, 2, 1, userInfo.getUserId(), null, null, title, 4, 2, 1,
new BigDecimal(money), "现金红包自动提现" + money + "", 1); new BigDecimal(money), "现金红包自动提现" + money + "", 1);
userMoneyDetailsService.save(userMoneyDetails); userMoneyDetailsService.save(userMoneyDetails);
//减去余额 钱 //减去余额 钱
@@ -133,7 +143,7 @@ public class DiscSpinningServiceImpl extends ServiceImpl<DiscSpinningDao, DiscSp
} }
} else { } else {
UserMoneyDetails userMoneyDetails = new UserMoneyDetails( UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
userInfo.getUserId(), null, null, "[现金大转盘]", 4, 2, 1, userInfo.getUserId(), null, null, title, 4, 2, 1,
new BigDecimal(money), "现金红包自动提现" + money + "", 1); new BigDecimal(money), "现金红包自动提现" + money + "", 1);
userMoneyDetailsService.save(userMoneyDetails); userMoneyDetailsService.save(userMoneyDetails);
//减去余额 钱 //减去余额 钱
@@ -143,6 +153,18 @@ public class DiscSpinningServiceImpl extends ServiceImpl<DiscSpinningDao, DiscSp
log.info("领取奖励执行完毕"); log.info("领取奖励执行完毕");
} }
@Override
public void withdrawAsync(UserEntity userInfo, Double money, String title) {
TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
withdraw(userInfo, money, title);
transactionManager.commit(transactionStatus);
}catch (Exception e){
transactionManager.rollback(transactionStatus);
throw e;
}
}
@Override @Override
@Transactional @Transactional
public DiscSpinningRecord draws(int drawCount, double orderAmount, Long orderId, Long userId, String source) { public DiscSpinningRecord draws(int drawCount, double orderAmount, Long orderId, Long userId, String source) {