Browse Source

对接拼团数据1

master
wangfukang 1 month ago
parent
commit
601ce79a4f
  1. 16
      hiver-admin/test-output/test-report.html
  2. 535
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java
  3. 217
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  4. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a>
</li>
<li class="m-r-10">
<a href="#"><span class="badge badge-primary">六月 23, 2026 16:55:30</span></a>
<a href="#"><span class="badge badge-primary">六月 24, 2026 14:41:22</span></a>
</li>
</ul>
</div>
@ -84,7 +84,7 @@
<div class="test-detail">
<span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p>
<p class="text-sm"><span>16:55:31 下午</span> / <span>0.032 secs</span></p>
<p class="text-sm"><span>14:41:23 下午</span> / <span>0.026 secs</span></p>
</div>
<div class="test-contents d-none">
<div class="detail-head">
@ -92,9 +92,9 @@
<div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>06.23.2026 16:55:31</span>
<span class='badge badge-danger'>06.23.2026 16:55:31</span>
<span class='badge badge-default'>0.032 secs</span>
<span class='badge badge-success'>06.24.2026 14:41:23</span>
<span class='badge badge-danger'>06.24.2026 14:41:23</span>
<span class='badge badge-default'>0.026 secs</span>
</div>
<div class="m-t-10 m-l-5"></div>
</div>
@ -104,7 +104,7 @@
<tbody>
<tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td>
<td>16:55:31</td>
<td>14:41:23</td>
<td>
Test passed
</td>
@ -128,13 +128,13 @@
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Started</p>
<h3>六月 23, 2026 16:55:30</h3>
<h3>六月 24, 2026 14:41:22</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>六月 23, 2026 16:55:31</h3>
<h3>六月 24, 2026 14:41:23</h3>
</div></div>
</div>
<div class="col-md-3">

535
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java

@ -3,6 +3,7 @@ package cc.hiver.mall.controller;
import cc.hiver.core.common.constant.DealingsRecordConstant;
import cc.hiver.core.common.utils.ResultUtil;
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.vo.Result;
import cc.hiver.core.entity.User;
@ -24,19 +25,24 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
@Api(tags = "店铺提现接口")
@Api(tags = "提现接口")
@RequestMapping("/hiver/app/returnCommission/")
@Transactional
public class ReturnCommissionController {
private static final long WITHDRAW_REQUEST_LOCK_MINUTES = 30L;
private static final long WITHDRAW_ACCOUNT_LOCK_SECONDS = 120L;
@Autowired
private ReturnCommissionService returnCommissionService;
@ -55,6 +61,9 @@ public class ReturnCommissionController {
@Autowired
private DealingsRecordService dealingsRecordService;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping(value = "/save", method = RequestMethod.POST)
@ApiOperation("新增店铺提现")
public Result save(ReturnCommission returnCommission) {
@ -113,87 +122,109 @@ public class ReturnCommissionController {
@Transactional
@RequestMapping(value = "/handleReturn", method = RequestMethod.POST)
@ApiOperation("提现处理")
@ApiOperation("店铺提现处理")
public Result handleReturn(@RequestBody ReturnCommission returnCommission) {
//final String shopId = securityUtil.getShopId();
if(returnCommission.getCommission() == null ){
return ResultUtil.error("提现金额不能为空!");
}
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){
return ResultUtil.error("提现金额不能为0!");
final Result validateResult = validateReturnCommission(returnCommission);
if (validateResult != null) {
return validateResult;
}
if(StringUtils.isEmpty(returnCommission.getAliName())){
return ResultUtil.error("支付宝实名名称不能为空!");
if (StringUtils.isEmpty(returnCommission.getShopId())) {
return ResultUtil.error("商铺id不能为空!");
}
if(StringUtils.isEmpty(returnCommission.getAliAccount())){
return ResultUtil.error("支付宝手机号不能为空!");
final String withdrawId = ensureWithdrawId(returnCommission);
final String requestLockKey = buildRequestLockKey(withdrawId);
if (!tryLock(requestLockKey, WITHDRAW_REQUEST_LOCK_MINUTES, TimeUnit.MINUTES)) {
return ResultUtil.error("提现处理中,请勿重复提交!");
}
boolean result = 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("提现金额不可大于佣金余额!");
}*/
String accountLockKey = null;
boolean keepRequestLock = false;
try {
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 {
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;
String aliResult = "";
final Shop shop = shopService.findById(returnCommission.getShopId());
if (shop == null) {
return ResultUtil.error("商铺不存在!");
}
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 {
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.setFailMessage("支付宝转账失败");
returnCommission.setRemark(payResult.getSubMsg());
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
} catch (AlipayApiException e) {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
return ResultUtil.success("处理完成," + aliResult);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
keepRequestLock = true;
return ResultUtil.success("处理完成," + aliResult);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
}
} finally {
releaseLock(accountLockKey);
if (!keepRequestLock) {
releaseLock(requestLockKey);
}
}
}
@ -204,83 +235,105 @@ public class ReturnCommissionController {
public Result handleReturnUser(@RequestBody ReturnCommission returnCommission) {
//final String shopId = securityUtil.getShopId();
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("支付宝实名名称不能为空!");
final Result validateResult = validateReturnCommission(returnCommission);
if (validateResult != null) {
return validateResult;
}
if(StringUtils.isEmpty(returnCommission.getAliAccount())){
return ResultUtil.error("支付宝手机号不能为空!");
if (StringUtils.isEmpty(returnCommission.getUserId())) {
return ResultUtil.error("用户id不能为空!");
}
boolean result = false;
String aliResult = "";
final User user = userService.findById(returnCommission.getUserId());
returnCommission.setRemark("用户" + user.getUsername() + "提现");
if (user.getDepoBal().compareTo(returnCommission.getCommission()) < 0) {
// 如果提现金额大于余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
final String withdrawId = ensureWithdrawId(returnCommission);
final String requestLockKey = buildRequestLockKey(withdrawId);
if (!tryLock(requestLockKey, WITHDRAW_REQUEST_LOCK_MINUTES, TimeUnit.MINUTES)) {
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("提现金额不可大于佣金余额!");
}*/
String accountLockKey = null;
boolean keepRequestLock = false;
try {
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 {
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;
String aliResult = "";
final User user = userService.findById(returnCommission.getUserId());
if (user == null) {
return ResultUtil.error("用户不存在!");
}
returnCommission.setRemark("用户" + user.getUsername() + "提现");
if (user.getDepoBal().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 {
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.setFailMessage("支付宝转账失败");
returnCommission.setRemark(payResult.getSubMsg());
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
} catch (AlipayApiException e) {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
return ResultUtil.success("处理完成," + aliResult);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
keepRequestLock = true;
return ResultUtil.success("处理完成," + aliResult);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
}
} finally {
releaseLock(accountLockKey);
if (!keepRequestLock) {
releaseLock(requestLockKey);
}
}
}
@ -291,85 +344,151 @@ public class ReturnCommissionController {
public Result handleReturnWorker(@RequestBody ReturnCommission returnCommission) {
//final String shopId = securityUtil.getShopId();
if(returnCommission.getCommission() == null ){
return ResultUtil.error("提现金额不能为空!");
}
if(returnCommission.getCommission().compareTo(BigDecimal.ZERO) == 0){
return ResultUtil.error("提现金额不能为0!");
final Result validateResult = validateReturnCommission(returnCommission);
if (validateResult != null) {
return validateResult;
}
if(StringUtils.isEmpty(returnCommission.getAliName())){
return ResultUtil.error("支付宝实名名称不能为空!");
}
if(StringUtils.isEmpty(returnCommission.getAliAccount())){
return ResultUtil.error("支付宝手机号不能为空!");
if (StringUtils.isEmpty(returnCommission.getWorkerId())) {
return ResultUtil.error("配送员id不能为空!");
}
boolean result = false;
String aliResult = "";
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId());
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现");
if (worker.getDepoBalRel().compareTo(returnCommission.getCommission()) < 0) {
// 如果提现金额大于余额,则不允许提现
return ResultUtil.error("提现金额不可大于佣金余额!");
final String withdrawId = ensureWithdrawId(returnCommission);
final String requestLockKey = buildRequestLockKey(withdrawId);
if (!tryLock(requestLockKey, WITHDRAW_REQUEST_LOCK_MINUTES, TimeUnit.MINUTES)) {
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("提现金额不可大于佣金余额!");
}*/
String accountLockKey = null;
boolean keepRequestLock = false;
try {
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 {
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;
String aliResult = "";
Worker worker = workerServiceImpl.findByWorkerId(returnCommission.getWorkerId());
if (worker == null) {
return ResultUtil.error("配送员不存在!");
}
returnCommission.setRemark("配送员" + worker.getWorkerName() + "提现");
if (worker.getDepoBalRel().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 {
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.setFailMessage("支付宝转账失败");
returnCommission.setRemark(payResult.getSubMsg());
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
}
} catch (AlipayApiException e) {
returnCommission.setStatus("2");
returnCommission.setFailMessage("支付宝转账失败");
returnCommission.setRemark(e.getErrMsg());
aliResult = "支付宝转账失败,请联系管理员!";
//2.修改提现记录
result = returnCommissionService.save(returnCommission);
if (result) {
keepRequestLock = true;
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);
} else {
return ResultUtil.error("修改提现数据失败," + aliResult);
}
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);
}
}
}

217
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -41,6 +41,7 @@ import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@ -65,6 +66,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
private static final int ORDER_STATUS_RETURN = 7; // 已完成
private static final int PAGE_SIZE = 100;
private static final int PAGE_SIZE_TWENTY = 20;
private static final long COMPLETE_LOCK_SECONDS = 60L;
@Autowired
@Lazy
@ -628,45 +630,75 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Override
@Transactional(rollbackFor = Exception.class)
public void workerComplete(String deliveryId, String workerId) {
MallDeliveryOrder delivery = checkWorkerAndStatus(deliveryId, workerId, STATUS_DELIVERING);
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
.set(MallDeliveryOrder::getStatus, STATUS_DONE)
.set(MallDeliveryOrder::getFinishTime, new Date());
this.update(uw);
String completeLockKey = buildCompleteLockKey(deliveryId);
if (!tryCompleteLock(completeLockKey)) {
throw new RuntimeException("送达处理中,请勿重复提交");
}
try {
MallDeliveryOrder delivery = checkWorkerAndStatus(deliveryId, workerId, STATUS_DELIVERING);
Boolean isFantuan = true;
int freeOrderCount = 0;
List<MallOrder> completedOrders = new ArrayList<>();
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
.eq(MallDeliveryOrder::getWorkerId, workerId)
.eq(MallDeliveryOrder::getStatus, STATUS_DELIVERING)
.set(MallDeliveryOrder::getStatus, STATUS_DONE)
.set(MallDeliveryOrder::getFinishTime, new Date());
int updated = this.baseMapper.update(null, uw);
if (updated <= 0) {
throw new RuntimeException("订单已送达,请勿重复操作");
}
//如果是有groupId证明是面对面配送,需要更新所有子订单状态为完成
if(StringUtils.isNotBlank(delivery.getGroupId())){
MallOrderGroup group = mallOrderGroupMapper.selectById(delivery.getGroupId());
if(group.getIsFace() == 1){
List<String> orderIdList = Arrays.stream(group.getGroupOrderIds().split(","))
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
List<MallOrder> orderInnerList = mallOrderService.listByIds(orderIdList);
completedOrders = orderInnerList.stream()
.filter(order -> order != null && order.getStatus() == ORDER_STATUS_DELIVERING)
.collect(Collectors.toList());
List<String> completedOrderIds = completedOrders.stream()
.map(MallOrder::getId)
.collect(Collectors.toList());
if (!completedOrderIds.isEmpty()) {
LambdaUpdateWrapper<MallOrder> oqw = new LambdaUpdateWrapper<>();
oqw.in(MallOrder::getId, completedOrderIds).set(MallOrder::getStatus,ORDER_STATUS_DONE);
mallOrderService.update(oqw);
//更新优惠券已使用
LambdaUpdateWrapper<MallUserCoupon> oqwCoupon = new LambdaUpdateWrapper<>();
oqwCoupon.in(MallUserCoupon::getOrderId, completedOrderIds).set(MallUserCoupon::getStatus,2);
mallUserCouponService.update(oqwCoupon);
freeOrderCount = completedOrderIds.size();
Boolean isFantuan = true;
int freeOrderCount = 0;
List<MallOrder> completedOrders = new ArrayList<>();
//如果是有groupId证明是面对面配送,需要更新所有子订单状态为完成
if(StringUtils.isNotBlank(delivery.getGroupId())){
MallOrderGroup group = mallOrderGroupMapper.selectById(delivery.getGroupId());
if(group.getIsFace() == 1){
List<String> orderIdList = Arrays.stream(group.getGroupOrderIds().split(","))
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
List<MallOrder> orderInnerList = mallOrderService.listByIds(orderIdList);
completedOrders = orderInnerList.stream()
.filter(order -> order != null && order.getStatus() == ORDER_STATUS_DELIVERING)
.collect(Collectors.toList());
List<String> completedOrderIds = completedOrders.stream()
.map(MallOrder::getId)
.collect(Collectors.toList());
if (!completedOrderIds.isEmpty()) {
LambdaUpdateWrapper<MallOrder> oqw = new LambdaUpdateWrapper<>();
oqw.in(MallOrder::getId, completedOrderIds).set(MallOrder::getStatus,ORDER_STATUS_DONE);
mallOrderService.update(oqw);
//更新优惠券已使用
LambdaUpdateWrapper<MallUserCoupon> oqwCoupon = new LambdaUpdateWrapper<>();
oqwCoupon.in(MallUserCoupon::getOrderId, completedOrderIds).set(MallUserCoupon::getStatus,2);
mallUserCouponService.update(oqwCoupon);
freeOrderCount = completedOrderIds.size();
}
isFantuan = false;
}else{
if (StringUtils.isNotBlank(delivery.getOrderId())) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getStatus, ORDER_STATUS_DONE);
mallOrderService.update(oUw);
MallOrder orderInner = mallOrderService.getById(delivery.getOrderId());
if (orderInner != null) {
completedOrders.add(orderInner);
if(orderInner.getOtherOrder() != null){
isFantuan = false;
}
}
//优惠券变成已使用
mallUserCouponService.useCoupon(delivery.getOrderId());
}
}
isFantuan = false;
//isFantuan = false; // 已在上方逐单计数,跳过底部统一计数
}else{
// 同步订单状态 -> 已完成
if (StringUtils.isNotBlank(delivery.getOrderId())) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
@ -684,68 +716,65 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
mallUserCouponService.useCoupon(delivery.getOrderId());
}
}
//isFantuan = false; // 已在上方逐单计数,跳过底部统一计数
}else{
// 同步订单状态 -> 已完成
if (StringUtils.isNotBlank(delivery.getOrderId())) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getStatus, ORDER_STATUS_DONE);
mallOrderService.update(oUw);
MallOrder orderInner = mallOrderService.getById(delivery.getOrderId());
if (orderInner != null) {
completedOrders.add(orderInner);
if(orderInner.getOtherOrder() != null){
isFantuan = false;
}
}
//优惠券变成已使用
mallUserCouponService.useCoupon(delivery.getOrderId());
if (isFantuan && !completedOrders.isEmpty()) {
freeOrderCount = 1;
}
//增加配送员余额
Worker worker = workerServiceImpl.findByWorkerId(delivery.getWorkerId());
//更新余额
worker.setDepoBal(worker.getDepoBal().add(delivery.getDeliveryFee()));
Integer oldCount = worker.getOrderCount() == null ? 0 : worker.getOrderCount();
//更新单量
worker.setOrderCount(oldCount + 1);
//更新配送时间
// 3.1 计算本次配送耗时 (毫秒)
long currentDuration = new Date().getTime() - delivery.getAcceptTime().getTime();
double minutesDouble = currentDuration / 60000.0;
// 2. 转换为 BigDecimal 并保留两位小数 (四舍五入)
BigDecimal minutesDecimal = new BigDecimal(minutesDouble)
.setScale(2, RoundingMode.HALF_UP);
BigDecimal oldAvgTime = worker.getAvgTime();
Integer newCount = oldCount + 1;
// 新的平均时间 = (旧平均时间 * 旧单量 + 本次配送时间) / 新单量
BigDecimal newAvgTime = oldAvgTime.multiply(new BigDecimal(oldCount))
.add(minutesDecimal)
.divide(new BigDecimal(newCount), 2, RoundingMode.HALF_UP);
DecimalFormat df = new DecimalFormat("00.00");
String formattedResult = df.format(newAvgTime);
worker.setAvgTime(new BigDecimal(formattedResult));
workerServiceImpl.update(worker);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[0]);
dealingsRecord.setAmount(delivery.getDeliveryFee());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(deliveryId);
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
sendWorkerCompleteAsyncAfterCommit(delivery, worker, completedOrders, freeOrderCount);
} finally {
releaseCompleteLock(completeLockKey);
}
if (isFantuan && !completedOrders.isEmpty()) {
freeOrderCount = 1;
}
private String buildCompleteLockKey(String deliveryId) {
return "mall_delivery:complete:" + deliveryId;
}
private boolean tryCompleteLock(String key) {
return Boolean.TRUE.equals(stringRedisTemplate.opsForValue().setIfAbsent(key, "1", COMPLETE_LOCK_SECONDS, TimeUnit.SECONDS));
}
private void releaseCompleteLock(String key) {
if (StringUtils.isNotBlank(key)) {
stringRedisTemplate.delete(key);
}
//增加配送员余额
Worker worker = workerServiceImpl.findByWorkerId(delivery.getWorkerId());
//更新余额
worker.setDepoBal(worker.getDepoBal().add(delivery.getDeliveryFee()));
Integer oldCount = worker.getOrderCount() == null ? 0 : worker.getOrderCount();
//更新单量
worker.setOrderCount(oldCount + 1);
//更新配送时间
// 3.1 计算本次配送耗时 (毫秒)
long currentDuration = new Date().getTime() - delivery.getAcceptTime().getTime();
double minutesDouble = currentDuration / 60000.0;
// 2. 转换为 BigDecimal 并保留两位小数 (四舍五入)
BigDecimal minutesDecimal = new BigDecimal(minutesDouble)
.setScale(2, RoundingMode.HALF_UP);
BigDecimal oldAvgTime = worker.getAvgTime();
Integer newCount = oldCount + 1;
// 新的平均时间 = (旧平均时间 * 旧单量 + 本次配送时间) / 新单量
BigDecimal newAvgTime = oldAvgTime.multiply(new BigDecimal(oldCount))
.add(minutesDecimal)
.divide(new BigDecimal(newCount), 2, RoundingMode.HALF_UP);
DecimalFormat df = new DecimalFormat("00.00");
String formattedResult = df.format(newAvgTime);
worker.setAvgTime(new BigDecimal(formattedResult));
workerServiceImpl.update(worker);
//增加余额变动记录
DealingsRecord dealingsRecord = new DealingsRecord();
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[0]);
dealingsRecord.setAmount(delivery.getDeliveryFee());
dealingsRecord.setDealingsTime(new Date());
dealingsRecord.setLinkId(deliveryId);
dealingsRecord.setLinkUserId(worker.getWorkerId());
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]);
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]);
dealingsRecord.setCreateBy(worker.getWorkerId());
dealingsRecordService.save(dealingsRecord);
sendWorkerCompleteAsyncAfterCommit(delivery, worker, completedOrders, freeOrderCount);
}
private void sendWorkerCompleteAsyncAfterCommit(MallDeliveryOrder delivery, Worker worker, List<MallOrder> completedOrders, int freeOrderCount) {

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -1974,7 +1974,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
//商家、配送员都加一条
record.setLinkId(order.getShopId());
if(ratio != null){
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).multiply(ratio).setScale(2, RoundingMode.HALF_UP));
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).subtract(order.getGoodsAmount().add(order.getPackageFee()).multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
}else{
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).setScale(2, RoundingMode.HALF_UP));
}
@ -1994,7 +1994,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(workerId);
if(ratio != null){
mallRefundRecord1.setRefundAmount(order.getDeliveryFee().multiply(ratio).setScale(2, RoundingMode.HALF_UP));
mallRefundRecord1.setRefundAmount(order.getDeliveryFee().subtract(order.getDeliveryFee().multiply(ratio)).setScale(2, RoundingMode.HALF_UP));
}else{
mallRefundRecord1.setRefundAmount(order.getDeliveryFee());
}

Loading…
Cancel
Save