|
|
@ -3,6 +3,7 @@ package cc.hiver.mall.controller; |
|
|
import cc.hiver.core.common.constant.DealingsRecordConstant; |
|
|
import cc.hiver.core.common.constant.DealingsRecordConstant; |
|
|
import cc.hiver.core.common.utils.ResultUtil; |
|
|
import cc.hiver.core.common.utils.ResultUtil; |
|
|
import cc.hiver.core.common.utils.SecurityUtil; |
|
|
import cc.hiver.core.common.utils.SecurityUtil; |
|
|
|
|
|
import cc.hiver.core.common.utils.SnowFlakeUtil; |
|
|
import cc.hiver.core.common.utils.StringUtils; |
|
|
import cc.hiver.core.common.utils.StringUtils; |
|
|
import cc.hiver.core.common.vo.Result; |
|
|
import cc.hiver.core.common.vo.Result; |
|
|
import cc.hiver.core.entity.User; |
|
|
import cc.hiver.core.entity.User; |
|
|
@ -24,19 +25,24 @@ import io.swagger.annotations.ApiOperation; |
|
|
import io.swagger.annotations.ApiParam; |
|
|
import io.swagger.annotations.ApiParam; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate; |
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
import org.springframework.web.bind.annotation.*; |
|
|
import org.springframework.web.bind.annotation.*; |
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
import java.math.BigDecimal; |
|
|
import java.util.Date; |
|
|
import java.util.Date; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
|
|
|
@Slf4j |
|
|
@Slf4j |
|
|
@RestController |
|
|
@RestController |
|
|
@Api(tags = "店铺提现接口") |
|
|
@Api(tags = "提现接口") |
|
|
@RequestMapping("/hiver/app/returnCommission/") |
|
|
@RequestMapping("/hiver/app/returnCommission/") |
|
|
@Transactional |
|
|
@Transactional |
|
|
public class ReturnCommissionController { |
|
|
public class ReturnCommissionController { |
|
|
|
|
|
private static final long WITHDRAW_REQUEST_LOCK_MINUTES = 30L; |
|
|
|
|
|
private static final long WITHDRAW_ACCOUNT_LOCK_SECONDS = 120L; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private ReturnCommissionService returnCommissionService; |
|
|
private ReturnCommissionService returnCommissionService; |
|
|
|
|
|
|
|
|
@ -55,6 +61,9 @@ public class ReturnCommissionController { |
|
|
@Autowired |
|
|
@Autowired |
|
|
private DealingsRecordService dealingsRecordService; |
|
|
private DealingsRecordService dealingsRecordService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private StringRedisTemplate stringRedisTemplate; |
|
|
|
|
|
|
|
|
@RequestMapping(value = "/save", method = RequestMethod.POST) |
|
|
@RequestMapping(value = "/save", method = RequestMethod.POST) |
|
|
@ApiOperation("新增店铺提现") |
|
|
@ApiOperation("新增店铺提现") |
|
|
public Result save(ReturnCommission returnCommission) { |
|
|
public Result save(ReturnCommission returnCommission) { |
|
|
@ -113,87 +122,109 @@ public class ReturnCommissionController { |
|
|
|
|
|
|
|
|
@Transactional |
|
|
@Transactional |
|
|
@RequestMapping(value = "/handleReturn", method = RequestMethod.POST) |
|
|
@RequestMapping(value = "/handleReturn", method = RequestMethod.POST) |
|
|
@ApiOperation("提现处理") |
|
|
@ApiOperation("店铺提现处理") |
|
|
public Result handleReturn(@RequestBody ReturnCommission returnCommission) { |
|
|
public Result handleReturn(@RequestBody ReturnCommission returnCommission) { |
|
|
//final String shopId = securityUtil.getShopId();
|
|
|
//final String shopId = securityUtil.getShopId();
|
|
|
|
|
|
|
|
|
if(returnCommission.getCommission() == null ){ |
|
|
final Result validateResult = validateReturnCommission(returnCommission); |
|
|
return ResultUtil.error("提现金额不能为空!"); |
|
|
if (validateResult != null) { |
|
|
} |
|
|
return validateResult; |
|
|
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){ |
|
|
|
|
|
return ResultUtil.error("提现金额不能为0!"); |
|
|
|
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliName())){ |
|
|
if (StringUtils.isEmpty(returnCommission.getShopId())) { |
|
|
return ResultUtil.error("支付宝实名名称不能为空!"); |
|
|
return ResultUtil.error("商铺id不能为空!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliAccount())){ |
|
|
final String withdrawId = ensureWithdrawId(returnCommission); |
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
final String requestLockKey = buildRequestLockKey(withdrawId); |
|
|
|
|
|
if (!tryLock(requestLockKey, WITHDRAW_REQUEST_LOCK_MINUTES, TimeUnit.MINUTES)) { |
|
|
|
|
|
return ResultUtil.error("提现处理中,请勿重复提交!"); |
|
|
} |
|
|
} |
|
|
|
|
|
String accountLockKey = null; |
|
|
boolean result = false; |
|
|
boolean keepRequestLock = false; |
|
|
String aliResult = ""; |
|
|
|
|
|
final Shop shop = shopService.findById(returnCommission.getShopId()); |
|
|
|
|
|
returnCommission.setRemark("商家" + shop.getShopName() + "提现"); |
|
|
|
|
|
if (shop.getBalance().compareTo(returnCommission.getCommission()) < 0) { |
|
|
|
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
} |
|
|
|
|
|
//支付宝户名(姓名)
|
|
|
|
|
|
final String name = returnCommission.getAliName(); //shop.getAliName();
|
|
|
|
|
|
//支付宝账号(手机号)
|
|
|
|
|
|
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
|
|
|
|
|
|
// 提现金额
|
|
|
|
|
|
final BigDecimal commission = returnCommission.getCommission(); |
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
|
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission); |
|
|
|
|
|
if (shopBefRebateAmount.compareTo(commission) < 0) { |
|
|
|
|
|
// 如果提现金额大于返佣余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
}*/ |
|
|
|
|
|
try { |
|
|
try { |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
if (returnCommissionService.getById(withdrawId) != null) { |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
keepRequestLock = true; |
|
|
returnCommission.setStatus("1"); |
|
|
return ResultUtil.error("请勿重复提交提现申请!"); |
|
|
aliResult = "支付宝转账成功"; |
|
|
} |
|
|
|
|
|
accountLockKey = buildAccountLockKey("shop", returnCommission.getShopId()); |
|
|
//.setShopBefRebateAmount(shopBefRebateAmount);
|
|
|
if (!tryLock(accountLockKey, WITHDRAW_ACCOUNT_LOCK_SECONDS, TimeUnit.SECONDS)) { |
|
|
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
|
|
|
return ResultUtil.error("当前账户已有提现处理中,请稍后再试!"); |
|
|
// 3. 更新店铺返佣金额
|
|
|
} |
|
|
//shop.setRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
shop.setBalance(shop.getBalance().subtract(commission)); |
|
|
boolean result = false; |
|
|
shopService.update(shop); |
|
|
String aliResult = ""; |
|
|
|
|
|
final Shop shop = shopService.findById(returnCommission.getShopId()); |
|
|
//增加余额变动记录
|
|
|
if (shop == null) { |
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
return ResultUtil.error("商铺不存在!"); |
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[3]); |
|
|
} |
|
|
dealingsRecord.setAmount(commission); |
|
|
returnCommission.setRemark("商家" + shop.getShopName() + "提现"); |
|
|
dealingsRecord.setLinkUserId(shop.getId()); |
|
|
if (shop.getBalance().compareTo(returnCommission.getCommission()) < 0) { |
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
dealingsRecord.setLinkId(returnCommission.getId()); |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[2]); |
|
|
} |
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]); |
|
|
//支付宝户名(姓名)
|
|
|
dealingsRecord.setCreateBy(shop.getId()); |
|
|
final String name = returnCommission.getAliName(); //shop.getAliName();
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
//支付宝账号(手机号)
|
|
|
} else { |
|
|
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
|
|
|
|
|
|
// 提现金额
|
|
|
|
|
|
final BigDecimal commission = returnCommission.getCommission(); |
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
|
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission); |
|
|
|
|
|
if (shopBefRebateAmount.compareTo(commission) < 0) { |
|
|
|
|
|
// 如果提现金额大于返佣余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
}*/ |
|
|
|
|
|
try { |
|
|
|
|
|
keepRequestLock = true; |
|
|
|
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
|
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
|
|
|
returnCommission.setStatus("1"); |
|
|
|
|
|
aliResult = "支付宝转账成功"; |
|
|
|
|
|
|
|
|
|
|
|
//.setShopBefRebateAmount(shopBefRebateAmount);
|
|
|
|
|
|
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
// 3. 更新店铺返佣金额
|
|
|
|
|
|
//shop.setRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
shop.setBalance(shop.getBalance().subtract(commission)); |
|
|
|
|
|
shopService.update(shop); |
|
|
|
|
|
|
|
|
|
|
|
//增加余额变动记录
|
|
|
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[3]); |
|
|
|
|
|
dealingsRecord.setAmount(commission); |
|
|
|
|
|
dealingsRecord.setLinkUserId(shop.getId()); |
|
|
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
|
|
dealingsRecord.setLinkId(returnCommission.getId()); |
|
|
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[2]); |
|
|
|
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]); |
|
|
|
|
|
dealingsRecord.setCreateBy(shop.getId()); |
|
|
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
|
|
} else { |
|
|
|
|
|
returnCommission.setStatus("2"); |
|
|
|
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
|
|
|
returnCommission.setRemark(payResult.getSubMsg()); |
|
|
|
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
|
|
|
} |
|
|
|
|
|
} catch (AlipayApiException e) { |
|
|
returnCommission.setStatus("2"); |
|
|
returnCommission.setStatus("2"); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
returnCommission.setRemark(payResult.getSubMsg()); |
|
|
returnCommission.setRemark(e.getErrMsg()); |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
} |
|
|
} |
|
|
} catch (AlipayApiException e) { |
|
|
//2.修改提现记录
|
|
|
returnCommission.setStatus("2"); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
if (result) { |
|
|
returnCommission.setRemark(e.getErrMsg()); |
|
|
keepRequestLock = true; |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
} |
|
|
} else { |
|
|
//2.修改提现记录
|
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
} |
|
|
if (result) { |
|
|
} finally { |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
releaseLock(accountLockKey); |
|
|
} else { |
|
|
if (!keepRequestLock) { |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
releaseLock(requestLockKey); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
@ -204,83 +235,105 @@ public class ReturnCommissionController { |
|
|
public Result handleReturnUser(@RequestBody ReturnCommission returnCommission) { |
|
|
public Result handleReturnUser(@RequestBody ReturnCommission returnCommission) { |
|
|
//final String shopId = securityUtil.getShopId();
|
|
|
//final String shopId = securityUtil.getShopId();
|
|
|
|
|
|
|
|
|
if(returnCommission.getCommission() == null ){ |
|
|
final Result validateResult = validateReturnCommission(returnCommission); |
|
|
return ResultUtil.error("提现金额不能为空!"); |
|
|
if (validateResult != null) { |
|
|
} |
|
|
return validateResult; |
|
|
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){ |
|
|
|
|
|
return ResultUtil.error("提现金额不能为0!"); |
|
|
|
|
|
} |
|
|
|
|
|
if(StringUtils.isEmpty(returnCommission.getAliName())){ |
|
|
|
|
|
return ResultUtil.error("支付宝实名名称不能为空!"); |
|
|
|
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliAccount())){ |
|
|
if (StringUtils.isEmpty(returnCommission.getUserId())) { |
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
return ResultUtil.error("用户id不能为空!"); |
|
|
} |
|
|
} |
|
|
|
|
|
final String withdrawId = ensureWithdrawId(returnCommission); |
|
|
boolean result = false; |
|
|
final String requestLockKey = buildRequestLockKey(withdrawId); |
|
|
String aliResult = ""; |
|
|
if (!tryLock(requestLockKey, WITHDRAW_REQUEST_LOCK_MINUTES, TimeUnit.MINUTES)) { |
|
|
final User user = userService.findById(returnCommission.getUserId()); |
|
|
return ResultUtil.error("提现处理中,请勿重复提交!"); |
|
|
returnCommission.setRemark("用户" + user.getUsername() + "提现"); |
|
|
|
|
|
if (user.getDepoBal().compareTo(returnCommission.getCommission()) < 0) { |
|
|
|
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
} |
|
|
} |
|
|
//支付宝户名(姓名)
|
|
|
String accountLockKey = null; |
|
|
final String name = returnCommission.getAliName(); //shop.getAliName();
|
|
|
boolean keepRequestLock = false; |
|
|
//支付宝账号(手机号)
|
|
|
|
|
|
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
|
|
|
|
|
|
// 提现金额
|
|
|
|
|
|
final BigDecimal commission = returnCommission.getCommission(); |
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
|
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission); |
|
|
|
|
|
if (shopBefRebateAmount.compareTo(commission) < 0) { |
|
|
|
|
|
// 如果提现金额大于返佣余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
}*/ |
|
|
|
|
|
try { |
|
|
try { |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
if (returnCommissionService.getById(withdrawId) != null) { |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
keepRequestLock = true; |
|
|
returnCommission.setStatus("1"); |
|
|
return ResultUtil.error("请勿重复提交提现申请!"); |
|
|
aliResult = "支付宝转账成功"; |
|
|
} |
|
|
|
|
|
accountLockKey = buildAccountLockKey("user", returnCommission.getUserId()); |
|
|
//.setShopBefRebateAmount(shopBefRebateAmount);
|
|
|
if (!tryLock(accountLockKey, WITHDRAW_ACCOUNT_LOCK_SECONDS, TimeUnit.SECONDS)) { |
|
|
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
|
|
|
return ResultUtil.error("当前账户已有提现处理中,请稍后再试!"); |
|
|
// 3. 更新店铺返佣金额
|
|
|
} |
|
|
//shop.setRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
user.setDepoBal(user.getDepoBal().subtract(commission)); |
|
|
boolean result = false; |
|
|
userService.update(user); |
|
|
String aliResult = ""; |
|
|
|
|
|
final User user = userService.findById(returnCommission.getUserId()); |
|
|
//增加余额变动记录
|
|
|
if (user == null) { |
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
return ResultUtil.error("用户不存在!"); |
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[7]); |
|
|
} |
|
|
dealingsRecord.setAmount(commission); |
|
|
returnCommission.setRemark("用户" + user.getUsername() + "提现"); |
|
|
dealingsRecord.setLinkUserId(user.getId()); |
|
|
if (user.getDepoBal().compareTo(returnCommission.getCommission()) < 0) { |
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
dealingsRecord.setLinkId(returnCommission.getId()); |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]); |
|
|
} |
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]); |
|
|
//支付宝户名(姓名)
|
|
|
dealingsRecord.setCreateBy(user.getId()); |
|
|
final String name = returnCommission.getAliName(); //shop.getAliName();
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
//支付宝账号(手机号)
|
|
|
} else { |
|
|
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
|
|
|
|
|
|
// 提现金额
|
|
|
|
|
|
final BigDecimal commission = returnCommission.getCommission(); |
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
|
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission); |
|
|
|
|
|
if (shopBefRebateAmount.compareTo(commission) < 0) { |
|
|
|
|
|
// 如果提现金额大于返佣余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
}*/ |
|
|
|
|
|
try { |
|
|
|
|
|
keepRequestLock = true; |
|
|
|
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
|
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
|
|
|
returnCommission.setStatus("1"); |
|
|
|
|
|
aliResult = "支付宝转账成功"; |
|
|
|
|
|
|
|
|
|
|
|
//.setShopBefRebateAmount(shopBefRebateAmount);
|
|
|
|
|
|
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
// 3. 更新店铺返佣金额
|
|
|
|
|
|
//shop.setRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
user.setDepoBal(user.getDepoBal().subtract(commission)); |
|
|
|
|
|
userService.update(user); |
|
|
|
|
|
|
|
|
|
|
|
//增加余额变动记录
|
|
|
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[7]); |
|
|
|
|
|
dealingsRecord.setAmount(commission); |
|
|
|
|
|
dealingsRecord.setLinkUserId(user.getId()); |
|
|
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
|
|
dealingsRecord.setLinkId(returnCommission.getId()); |
|
|
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[0]); |
|
|
|
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]); |
|
|
|
|
|
dealingsRecord.setCreateBy(user.getId()); |
|
|
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
|
|
} else { |
|
|
|
|
|
returnCommission.setStatus("2"); |
|
|
|
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
|
|
|
returnCommission.setRemark(payResult.getSubMsg()); |
|
|
|
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
|
|
|
} |
|
|
|
|
|
} catch (AlipayApiException e) { |
|
|
returnCommission.setStatus("2"); |
|
|
returnCommission.setStatus("2"); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
returnCommission.setRemark(payResult.getSubMsg()); |
|
|
returnCommission.setRemark(e.getErrMsg()); |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
} |
|
|
} |
|
|
} catch (AlipayApiException e) { |
|
|
//2.修改提现记录
|
|
|
returnCommission.setStatus("2"); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
if (result) { |
|
|
returnCommission.setRemark(e.getErrMsg()); |
|
|
keepRequestLock = true; |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
} |
|
|
} else { |
|
|
//2.修改提现记录
|
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
} |
|
|
if (result) { |
|
|
} finally { |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
releaseLock(accountLockKey); |
|
|
} else { |
|
|
if (!keepRequestLock) { |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
releaseLock(requestLockKey); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
@ -291,85 +344,151 @@ public class ReturnCommissionController { |
|
|
public Result handleReturnWorker(@RequestBody ReturnCommission returnCommission) { |
|
|
public Result handleReturnWorker(@RequestBody ReturnCommission returnCommission) { |
|
|
//final String shopId = securityUtil.getShopId();
|
|
|
//final String shopId = securityUtil.getShopId();
|
|
|
|
|
|
|
|
|
if(returnCommission.getCommission() == null ){ |
|
|
final Result validateResult = validateReturnCommission(returnCommission); |
|
|
return ResultUtil.error("提现金额不能为空!"); |
|
|
if (validateResult != null) { |
|
|
} |
|
|
return validateResult; |
|
|
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){ |
|
|
|
|
|
return ResultUtil.error("提现金额不能为0!"); |
|
|
|
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliName())){ |
|
|
if (StringUtils.isEmpty(returnCommission.getWorkerId())) { |
|
|
return ResultUtil.error("支付宝实名名称不能为空!"); |
|
|
return ResultUtil.error("配送员id不能为空!"); |
|
|
} |
|
|
|
|
|
if(StringUtils.isEmpty(returnCommission.getAliAccount())){ |
|
|
|
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
final String withdrawId = ensureWithdrawId(returnCommission); |
|
|
boolean result = false; |
|
|
final String requestLockKey = buildRequestLockKey(withdrawId); |
|
|
String aliResult = ""; |
|
|
if (!tryLock(requestLockKey, WITHDRAW_REQUEST_LOCK_MINUTES, TimeUnit.MINUTES)) { |
|
|
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId()); |
|
|
return ResultUtil.error("提现处理中,请勿重复提交!"); |
|
|
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现"); |
|
|
|
|
|
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) { |
|
|
|
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
} |
|
|
} |
|
|
//支付宝户名(姓名)
|
|
|
String accountLockKey = null; |
|
|
final String name = returnCommission.getAliName(); //shop.getAliName();
|
|
|
boolean keepRequestLock = false; |
|
|
//支付宝账号(手机号)
|
|
|
|
|
|
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
|
|
|
|
|
|
// 提现金额
|
|
|
|
|
|
final BigDecimal commission = returnCommission.getCommission(); |
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
|
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission); |
|
|
|
|
|
if (shopBefRebateAmount.compareTo(commission) < 0) { |
|
|
|
|
|
// 如果提现金额大于返佣余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
}*/ |
|
|
|
|
|
try { |
|
|
try { |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
if (returnCommissionService.getById(withdrawId) != null) { |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
keepRequestLock = true; |
|
|
returnCommission.setStatus("1"); |
|
|
return ResultUtil.error("请勿重复提交提现申请!"); |
|
|
aliResult = "支付宝转账成功"; |
|
|
} |
|
|
|
|
|
accountLockKey = buildAccountLockKey("worker", returnCommission.getWorkerId()); |
|
|
//.setShopBefRebateAmount(shopBefRebateAmount);
|
|
|
if (!tryLock(accountLockKey, WITHDRAW_ACCOUNT_LOCK_SECONDS, TimeUnit.SECONDS)) { |
|
|
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
|
|
|
return ResultUtil.error("当前账户已有提现处理中,请稍后再试!"); |
|
|
// 3. 更新店铺返佣金额
|
|
|
} |
|
|
//shop.setRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
worker.setDepoBalRel(worker.getDepoBalRel().subtract(commission)); |
|
|
boolean result = false; |
|
|
workerServiceImpl.update(worker); |
|
|
String aliResult = ""; |
|
|
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId()); |
|
|
//增加余额变动记录
|
|
|
if (worker == null) { |
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
return ResultUtil.error("配送员不存在!"); |
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[4]); |
|
|
} |
|
|
dealingsRecord.setAmount(commission); |
|
|
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现"); |
|
|
dealingsRecord.setLinkUserId(worker.getWorkerId()); |
|
|
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) { |
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
dealingsRecord.setLinkId(returnCommission.getId()); |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]); |
|
|
} |
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]); |
|
|
//支付宝户名(姓名)
|
|
|
dealingsRecord.setCreateBy(worker.getWorkerId()); |
|
|
final String name = returnCommission.getAliName(); //shop.getAliName();
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
//支付宝账号(手机号)
|
|
|
} else { |
|
|
final String phoneNumber = returnCommission.getAliAccount();// shop.getAliAccount();
|
|
|
|
|
|
// 提现金额
|
|
|
|
|
|
final BigDecimal commission = returnCommission.getCommission(); |
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
//final BigDecimal shopBefRebateAmount = shop.getRebateAmount();
|
|
|
|
|
|
// 店铺当前返佣余额
|
|
|
|
|
|
/* final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.subtract(commission); |
|
|
|
|
|
if (shopBefRebateAmount.compareTo(commission) < 0) { |
|
|
|
|
|
// 如果提现金额大于返佣余额,则不允许提现
|
|
|
|
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
|
|
|
}*/ |
|
|
|
|
|
try { |
|
|
|
|
|
keepRequestLock = true; |
|
|
|
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
|
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
|
|
|
returnCommission.setStatus("1"); |
|
|
|
|
|
aliResult = "支付宝转账成功"; |
|
|
|
|
|
|
|
|
|
|
|
//.setShopBefRebateAmount(shopBefRebateAmount);
|
|
|
|
|
|
//returnCommission.setShopAfterRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
// 3. 更新店铺返佣金额
|
|
|
|
|
|
//shop.setRebateAmount(shopAfterRebateAmount);
|
|
|
|
|
|
worker.setDepoBalRel(worker.getDepoBalRel().subtract(commission)); |
|
|
|
|
|
workerServiceImpl.update(worker); |
|
|
|
|
|
|
|
|
|
|
|
//增加余额变动记录
|
|
|
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[4]); |
|
|
|
|
|
dealingsRecord.setAmount(commission); |
|
|
|
|
|
dealingsRecord.setLinkUserId(worker.getWorkerId()); |
|
|
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
|
|
dealingsRecord.setLinkId(returnCommission.getId()); |
|
|
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]); |
|
|
|
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[1]); |
|
|
|
|
|
dealingsRecord.setCreateBy(worker.getWorkerId()); |
|
|
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
|
|
} else { |
|
|
|
|
|
returnCommission.setStatus("2"); |
|
|
|
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
|
|
|
returnCommission.setRemark(payResult.getSubMsg()); |
|
|
|
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
|
|
|
} |
|
|
|
|
|
} catch (AlipayApiException e) { |
|
|
returnCommission.setStatus("2"); |
|
|
returnCommission.setStatus("2"); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
returnCommission.setRemark(payResult.getSubMsg()); |
|
|
returnCommission.setRemark(e.getErrMsg()); |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
} |
|
|
} |
|
|
} catch (AlipayApiException e) { |
|
|
//2.修改提现记录
|
|
|
returnCommission.setStatus("2"); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
returnCommission.setFailMessage("支付宝转账失败"); |
|
|
if (result) { |
|
|
returnCommission.setRemark(e.getErrMsg()); |
|
|
keepRequestLock = true; |
|
|
aliResult = "支付宝转账失败,请联系管理员!"; |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
|
|
|
} else { |
|
|
|
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
|
|
|
} |
|
|
|
|
|
} finally { |
|
|
|
|
|
releaseLock(accountLockKey); |
|
|
|
|
|
if (!keepRequestLock) { |
|
|
|
|
|
releaseLock(requestLockKey); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
//2.修改提现记录
|
|
|
|
|
|
result = returnCommissionService.save(returnCommission); |
|
|
} |
|
|
if (result) { |
|
|
|
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
private Result validateReturnCommission(ReturnCommission returnCommission) { |
|
|
} else { |
|
|
if (returnCommission == null) { |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
return ResultUtil.error("提现参数不能为空!"); |
|
|
|
|
|
} |
|
|
|
|
|
if (returnCommission.getCommission() == null) { |
|
|
|
|
|
return ResultUtil.error("提现金额不能为空!"); |
|
|
|
|
|
} |
|
|
|
|
|
if (returnCommission.getCommission().compareTo(BigDecimal.ZERO) <= 0) { |
|
|
|
|
|
return ResultUtil.error("提现金额必须大于0!"); |
|
|
|
|
|
} |
|
|
|
|
|
if (StringUtils.isEmpty(returnCommission.getAliName())) { |
|
|
|
|
|
return ResultUtil.error("支付宝实名名称不能为空!"); |
|
|
|
|
|
} |
|
|
|
|
|
if (StringUtils.isEmpty(returnCommission.getAliAccount())) { |
|
|
|
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
} |
|
|
} |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String ensureWithdrawId(ReturnCommission returnCommission) { |
|
|
|
|
|
if (StringUtils.isEmpty(returnCommission.getId())) { |
|
|
|
|
|
returnCommission.setId(SnowFlakeUtil.nextId().toString()); |
|
|
|
|
|
} |
|
|
|
|
|
return returnCommission.getId(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String buildRequestLockKey(String withdrawId) { |
|
|
|
|
|
return "return_commission:request:" + withdrawId; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String buildAccountLockKey(String accountType, String accountId) { |
|
|
|
|
|
return "return_commission:account:" + accountType + ":" + accountId; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private boolean tryLock(String key, long timeout, TimeUnit timeUnit) { |
|
|
|
|
|
return Boolean.TRUE.equals(stringRedisTemplate.opsForValue().setIfAbsent(key, "1", timeout, timeUnit)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void releaseLock(String key) { |
|
|
|
|
|
if (!StringUtils.isEmpty(key)) { |
|
|
|
|
|
stringRedisTemplate.delete(key); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|