修复余额不足仍可启动充电问题

统一启动金额优先级并在启动前校验会员余额。

同步完成订单创建和余额支付后再返回鉴权成功,并增加支付凭证补偿、异常停机和结算保护。
This commit is contained in:
Guoqs
2026-07-25 09:54:37 +08:00
parent bfa209becb
commit 1b37a7d5e8
18 changed files with 851 additions and 126 deletions

View File

@@ -8,6 +8,7 @@ import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.controller.BaseController;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.adapay.AdapayPayChannelEnum;
import com.jsowell.common.enums.ykc.OrderPayModeEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.response.RestApiResponse;
@@ -125,7 +126,8 @@ public class PayController extends BaseController {
if (StringUtils.isBlank(memberId)) {
throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR);
}
if (dto.getPayAmount() == null) {
if (dto.getPayAmount() == null
&& !StringUtils.equals(OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue(), dto.getPayMode())) {
throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR);
}
dto.setMemberId(memberId);

View File

@@ -0,0 +1,33 @@
package com.jsowell.pile.util;
import com.jsowell.common.constant.Constants;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ChargeAmountUtilsTest {
@Test
void resolveStartupAmount_shouldPreferFrontendAmount() {
BigDecimal amount = ChargeAmountUtils.resolveStartupAmount(
new BigDecimal("100"), new BigDecimal("300"));
assertEquals(new BigDecimal("100"), amount);
}
@Test
void resolveStartupAmount_shouldUseMemberDefaultWhenFrontendAmountIsNull() {
BigDecimal amount = ChargeAmountUtils.resolveStartupAmount(null, new BigDecimal("300"));
assertEquals(new BigDecimal("300"), amount);
}
@Test
void resolveStartupAmount_shouldUseCodeDefaultWhenOtherAmountsAreUnavailable() {
BigDecimal amount = ChargeAmountUtils.resolveStartupAmount(null, BigDecimal.ZERO);
assertEquals(Constants.BALANCE_PAY_MAX_AMOUNT_NEW, amount);
}
}