diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index 80c5a240..506af16c 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -ÁùÔÂ 23, 2026 16:55:30 +ÁùÔÂ 24, 2026 14:41:22
  • @@ -84,7 +84,7 @@

    passTest

    -

    16:55:31 ÏÂÎç / 0.032 secs

    +

    14:41:23 ÏÂÎç / 0.026 secs

    @@ -92,9 +92,9 @@
    #test-id=1
    passTest
    -06.23.2026 16:55:31 -06.23.2026 16:55:31 -0.032 secs +06.24.2026 14:41:23 +06.24.2026 14:41:23 +0.026 secs
    @@ -104,7 +104,7 @@ Pass - 16:55:31 + 14:41:23 Test passed @@ -128,13 +128,13 @@

    Started

    -

    ÁùÔÂ 23, 2026 16:55:30

    +

    ÁùÔÂ 24, 2026 14:41:22

    Ended

    -

    ÁùÔÂ 23, 2026 16:55:31

    +

    ÁùÔÂ 24, 2026 14:41:23

    diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java index 1caa674c..df70e116 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java +++ b/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); + } } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java index e55b37b2..8eb0c543 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java +++ b/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 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 completedOrders = new ArrayList<>(); + LambdaUpdateWrapper 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 orderIdList = Arrays.stream(group.getGroupOrderIds().split(",")) - .filter(StringUtils::isNotBlank) - .collect(Collectors.toList()); - List orderInnerList = mallOrderService.listByIds(orderIdList); - completedOrders = orderInnerList.stream() - .filter(order -> order != null && order.getStatus() == ORDER_STATUS_DELIVERING) - .collect(Collectors.toList()); - List completedOrderIds = completedOrders.stream() - .map(MallOrder::getId) - .collect(Collectors.toList()); - if (!completedOrderIds.isEmpty()) { - LambdaUpdateWrapper oqw = new LambdaUpdateWrapper<>(); - oqw.in(MallOrder::getId, completedOrderIds).set(MallOrder::getStatus,ORDER_STATUS_DONE); - mallOrderService.update(oqw); - - //更新优惠券已使用 - LambdaUpdateWrapper 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 completedOrders = new ArrayList<>(); + + //如果是有groupIdè¯æ˜Žæ˜¯é¢å¯¹é¢é…é€ï¼Œéœ€è¦æ›´æ–°æ‰€æœ‰å­è®¢å•状æ€ä¸ºå®Œæˆ + if(StringUtils.isNotBlank(delivery.getGroupId())){ + MallOrderGroup group = mallOrderGroupMapper.selectById(delivery.getGroupId()); + if(group.getIsFace() == 1){ + List orderIdList = Arrays.stream(group.getGroupOrderIds().split(",")) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + List orderInnerList = mallOrderService.listByIds(orderIdList); + completedOrders = orderInnerList.stream() + .filter(order -> order != null && order.getStatus() == ORDER_STATUS_DELIVERING) + .collect(Collectors.toList()); + List completedOrderIds = completedOrders.stream() + .map(MallOrder::getId) + .collect(Collectors.toList()); + if (!completedOrderIds.isEmpty()) { + LambdaUpdateWrapper oqw = new LambdaUpdateWrapper<>(); + oqw.in(MallOrder::getId, completedOrderIds).set(MallOrder::getStatus,ORDER_STATUS_DONE); + mallOrderService.update(oqw); + + //更新优惠券已使用 + LambdaUpdateWrapper 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 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 oUw = new LambdaUpdateWrapper<>(); oUw.eq(MallOrder::getId, delivery.getOrderId()) @@ -684,68 +716,65 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl å·²å®Œæˆ - if (StringUtils.isNotBlank(delivery.getOrderId())) { - LambdaUpdateWrapper 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 completedOrders, int freeOrderCount) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java index b90008e3..ac387cf5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java @@ -1974,7 +1974,7 @@ public class MallOrderServiceImpl extends ServiceImpl