|
|
@ -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,26 +122,40 @@ 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){ |
|
|
if (StringUtils.isEmpty(returnCommission.getShopId())) { |
|
|
return ResultUtil.error("提现金额不能为0!"); |
|
|
return ResultUtil.error("商铺id不能为空!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliName())){ |
|
|
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("提现处理中,请勿重复提交!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliAccount())){ |
|
|
String accountLockKey = null; |
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
boolean keepRequestLock = false; |
|
|
|
|
|
try { |
|
|
|
|
|
if (returnCommissionService.getById(withdrawId) != null) { |
|
|
|
|
|
keepRequestLock = true; |
|
|
|
|
|
return ResultUtil.error("请勿重复提交提现申请!"); |
|
|
|
|
|
} |
|
|
|
|
|
accountLockKey = buildAccountLockKey("shop", returnCommission.getShopId()); |
|
|
|
|
|
if (!tryLock(accountLockKey, WITHDRAW_ACCOUNT_LOCK_SECONDS, TimeUnit.SECONDS)) { |
|
|
|
|
|
return ResultUtil.error("当前账户已有提现处理中,请稍后再试!"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
boolean result = false; |
|
|
boolean result = false; |
|
|
String aliResult = ""; |
|
|
String aliResult = ""; |
|
|
final Shop shop = shopService.findById(returnCommission.getShopId()); |
|
|
final Shop shop = shopService.findById(returnCommission.getShopId()); |
|
|
|
|
|
if (shop == null) { |
|
|
|
|
|
return ResultUtil.error("商铺不存在!"); |
|
|
|
|
|
} |
|
|
returnCommission.setRemark("商家" + shop.getShopName() + "提现"); |
|
|
returnCommission.setRemark("商家" + shop.getShopName() + "提现"); |
|
|
if (shop.getBalance().compareTo(returnCommission.getCommission()) < 0) { |
|
|
if (shop.getBalance().compareTo(returnCommission.getCommission()) < 0) { |
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
@ -153,6 +176,7 @@ public class ReturnCommissionController { |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
}*/ |
|
|
}*/ |
|
|
try { |
|
|
try { |
|
|
|
|
|
keepRequestLock = true; |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
returnCommission.setStatus("1"); |
|
|
returnCommission.setStatus("1"); |
|
|
@ -191,10 +215,17 @@ public class ReturnCommissionController { |
|
|
//2.修改提现记录
|
|
|
//2.修改提现记录
|
|
|
result = returnCommissionService.save(returnCommission); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
if (result) { |
|
|
if (result) { |
|
|
|
|
|
keepRequestLock = true; |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
} else { |
|
|
} else { |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
} |
|
|
} |
|
|
|
|
|
} finally { |
|
|
|
|
|
releaseLock(accountLockKey); |
|
|
|
|
|
if (!keepRequestLock) { |
|
|
|
|
|
releaseLock(requestLockKey); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -204,22 +235,36 @@ 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){ |
|
|
if (StringUtils.isEmpty(returnCommission.getUserId())) { |
|
|
return ResultUtil.error("提现金额不能为0!"); |
|
|
return ResultUtil.error("用户id不能为空!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliName())){ |
|
|
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("提现处理中,请勿重复提交!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliAccount())){ |
|
|
String accountLockKey = null; |
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
boolean keepRequestLock = false; |
|
|
|
|
|
try { |
|
|
|
|
|
if (returnCommissionService.getById(withdrawId) != null) { |
|
|
|
|
|
keepRequestLock = true; |
|
|
|
|
|
return ResultUtil.error("请勿重复提交提现申请!"); |
|
|
|
|
|
} |
|
|
|
|
|
accountLockKey = buildAccountLockKey("user", returnCommission.getUserId()); |
|
|
|
|
|
if (!tryLock(accountLockKey, WITHDRAW_ACCOUNT_LOCK_SECONDS, TimeUnit.SECONDS)) { |
|
|
|
|
|
return ResultUtil.error("当前账户已有提现处理中,请稍后再试!"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
boolean result = false; |
|
|
boolean result = false; |
|
|
String aliResult = ""; |
|
|
String aliResult = ""; |
|
|
final User user = userService.findById(returnCommission.getUserId()); |
|
|
final User user = userService.findById(returnCommission.getUserId()); |
|
|
|
|
|
if (user == null) { |
|
|
|
|
|
return ResultUtil.error("用户不存在!"); |
|
|
|
|
|
} |
|
|
returnCommission.setRemark("用户" + user.getUsername() + "提现"); |
|
|
returnCommission.setRemark("用户" + user.getUsername() + "提现"); |
|
|
if (user.getDepoBal().compareTo(returnCommission.getCommission()) < 0) { |
|
|
if (user.getDepoBal().compareTo(returnCommission.getCommission()) < 0) { |
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
@ -240,6 +285,7 @@ public class ReturnCommissionController { |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
}*/ |
|
|
}*/ |
|
|
try { |
|
|
try { |
|
|
|
|
|
keepRequestLock = true; |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
returnCommission.setStatus("1"); |
|
|
returnCommission.setStatus("1"); |
|
|
@ -278,10 +324,17 @@ public class ReturnCommissionController { |
|
|
//2.修改提现记录
|
|
|
//2.修改提现记录
|
|
|
result = returnCommissionService.save(returnCommission); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
if (result) { |
|
|
if (result) { |
|
|
|
|
|
keepRequestLock = true; |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
} else { |
|
|
} else { |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
} |
|
|
} |
|
|
|
|
|
} finally { |
|
|
|
|
|
releaseLock(accountLockKey); |
|
|
|
|
|
if (!keepRequestLock) { |
|
|
|
|
|
releaseLock(requestLockKey); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -291,22 +344,36 @@ 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){ |
|
|
if (StringUtils.isEmpty(returnCommission.getWorkerId())) { |
|
|
return ResultUtil.error("提现金额不能为0!"); |
|
|
return ResultUtil.error("配送员id不能为空!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliName())){ |
|
|
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("提现处理中,请勿重复提交!"); |
|
|
} |
|
|
} |
|
|
if(StringUtils.isEmpty(returnCommission.getAliAccount())){ |
|
|
String accountLockKey = null; |
|
|
return ResultUtil.error("支付宝手机号不能为空!"); |
|
|
boolean keepRequestLock = false; |
|
|
|
|
|
try { |
|
|
|
|
|
if (returnCommissionService.getById(withdrawId) != null) { |
|
|
|
|
|
keepRequestLock = true; |
|
|
|
|
|
return ResultUtil.error("请勿重复提交提现申请!"); |
|
|
|
|
|
} |
|
|
|
|
|
accountLockKey = buildAccountLockKey("worker", returnCommission.getWorkerId()); |
|
|
|
|
|
if (!tryLock(accountLockKey, WITHDRAW_ACCOUNT_LOCK_SECONDS, TimeUnit.SECONDS)) { |
|
|
|
|
|
return ResultUtil.error("当前账户已有提现处理中,请稍后再试!"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
boolean result = false; |
|
|
boolean result = false; |
|
|
String aliResult = ""; |
|
|
String aliResult = ""; |
|
|
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId()); |
|
|
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId()); |
|
|
|
|
|
if (worker == null) { |
|
|
|
|
|
return ResultUtil.error("配送员不存在!"); |
|
|
|
|
|
} |
|
|
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现"); |
|
|
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现"); |
|
|
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) { |
|
|
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) { |
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
// 如果提现金额大于余额,则不允许提现
|
|
|
@ -327,6 +394,7 @@ public class ReturnCommissionController { |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
return ResultUtil.error("提现金额不可大于佣金余额!"); |
|
|
}*/ |
|
|
}*/ |
|
|
try { |
|
|
try { |
|
|
|
|
|
keepRequestLock = true; |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
final AlipayFundTransUniTransferResponse payResult = AliPayNewUtil.pay(phoneNumber, name, String.valueOf(commission), returnCommission.getId()); |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
if ("SUCCESS".equals(payResult.getStatus())) { |
|
|
returnCommission.setStatus("1"); |
|
|
returnCommission.setStatus("1"); |
|
|
@ -365,11 +433,62 @@ public class ReturnCommissionController { |
|
|
//2.修改提现记录
|
|
|
//2.修改提现记录
|
|
|
result = returnCommissionService.save(returnCommission); |
|
|
result = returnCommissionService.save(returnCommission); |
|
|
if (result) { |
|
|
if (result) { |
|
|
|
|
|
keepRequestLock = true; |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
return ResultUtil.success("处理完成," + aliResult); |
|
|
} else { |
|
|
} else { |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
return ResultUtil.error("修改提现数据失败," + aliResult); |
|
|
} |
|
|
} |
|
|
|
|
|
} finally { |
|
|
|
|
|
releaseLock(accountLockKey); |
|
|
|
|
|
if (!keepRequestLock) { |
|
|
|
|
|
releaseLock(requestLockKey); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Result validateReturnCommission(ReturnCommission returnCommission) { |
|
|
|
|
|
if (returnCommission == null) { |
|
|
|
|
|
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); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|