소스 검색

@
fix: adjust 用请求体 quota_id 调支付宝,对齐 Python

- QuotaAdjustDTO 新增 quotaId/enterpriseId 字段
- adjustInternal 支付宝调用改用 dto.quotaId(非 URL path 的本地 UUID)
- URL path quota_id 仅用于本地 lookup,请求体 quota_id 用于支付宝同步
@

alphaH 12 시간 전
부모
커밋
1425e71a4f

+ 6 - 2
java/src/main/java/com/payment/platform/module/payment/expense/quota/dto/QuotaAdjustDTO.java

@@ -1,6 +1,5 @@
 package com.payment.platform.module.payment.expense.quota.dto;
 
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
@@ -8,9 +7,14 @@ import lombok.Data;
 import java.math.BigDecimal;
 
 @Data
-@JsonIgnoreProperties(ignoreUnknown = true)
 public class QuotaAdjustDTO {
 
+    @Schema(description = "支付宝侧额度ID(前端传入,用于调支付宝API)")
+    private String quotaId;
+
+    @Schema(description = "企业ID")
+    private String enterpriseId;
+
     @NotNull(message = "目标额度金额不能为空")
     @Schema(description = "目标额度金额(绝对值,系统自动计算差额后调支付宝 ADD/DEDUCT)")
     private BigDecimal amount;

+ 9 - 8
java/src/main/java/com/payment/platform/module/payment/expense/quota/service/QuotaService.java

@@ -250,16 +250,17 @@ public class QuotaService {
         }
 
         // 5. 调支付宝 alipay.ebpp.invoice.expensecontrol.quota.modify (ADD/DEDUCT)
-        //    仅当 quota_id 是支付宝侧真实 ID(以"20"开头的时间戳格式)时才同步
-        boolean isAlipayQuotaId = quotaId != null && quotaId.matches("^20\\d{26,}$");
-        if (diff.compareTo(BigDecimal.ZERO) != 0 && isAlipayQuotaId) {
+        //    quota_id 取自请求体(与 Python 一致),非本地 UUID
+        String alipayQuotaId = dto.getQuotaId();
+        if (diff.compareTo(BigDecimal.ZERO) != 0 && alipayQuotaId != null && !alipayQuotaId.isBlank()) {
             try {
                 AlipayEbppInvoiceExpensecontrolQuotaModifyModel model =
                         new AlipayEbppInvoiceExpensecontrolQuotaModifyModel();
-                model.setQuotaId(quotaId);
+                model.setQuotaId(alipayQuotaId);
                 model.setAction(diff.compareTo(BigDecimal.ZERO) > 0 ? "ADD" : "DEDUCT");
                 model.setOuterSourceId(UUID.randomUUID().toString().replace("-", ""));
-                model.setEnterpriseId(entity.getEnterpriseId());
+                model.setEnterpriseId(
+                        dto.getEnterpriseId() != null ? dto.getEnterpriseId() : entity.getEnterpriseId());
                 // 元 → 分(取绝对值)
                 model.setAmount(String.valueOf(diff.abs().multiply(new BigDecimal("100"))
                         .setScale(0, RoundingMode.DOWN).longValue()));
@@ -277,8 +278,8 @@ public class QuotaService {
                             response.getCode(), response.getMsg(), response.getSubCode(), response.getSubMsg());
                     throw new BusinessException(400, "支付宝额度调整失败: " + subMsg);
                 }
-                log.info("支付宝额度调整成功, quotaId={}, action={}, amount={}",
-                        quotaId, model.getAction(), model.getAmount());
+                log.info("支付宝额度调整成功, alipayQuotaId={}, action={}, amount={}",
+                        alipayQuotaId, model.getAction(), model.getAmount());
             } catch (BusinessException e) {
                 throw e;
             } catch (Exception e) {
@@ -286,7 +287,7 @@ public class QuotaService {
                 throw new BusinessException(500, "支付宝额度调整异常: " + e.getMessage());
             }
         } else if (diff.compareTo(BigDecimal.ZERO) != 0) {
-            log.info("本地额度调整(无支付宝quota_id,仅更新本地): quotaId={}, diff={}", quotaId, diff);
+            log.info("本地额度调整(无支付宝quota_id,仅更新本地): localId={}, diff={}", quotaId, diff);
         }
 
         // 6. 更新本地额度记录(同时更新 totalAmount 和 availableAmount)