Sfoglia il codice sorgente

@
feat: 修改制度金额/限额时同步支付宝 modify_standard_detail_info

- ExtendedInstitutionModifyModel 扩展 SDK 模型支持 modify_standard_detail_info
- update() 检测 amount/singleLimit 变化 → 查支付宝 detail → 构建条件 → institution.modify
- 仅金额/限额变更时才触发,不影响其他编辑场景
@

alphaH 5 ore fa
parent
commit
1e8ad4e974

+ 121 - 0
java/src/main/java/com/payment/platform/core/alipay/ExtendedInstitutionModifyModel.java

@@ -0,0 +1,121 @@
+package com.payment.platform.core.alipay;
+
+import com.alipay.api.domain.AlipayEbppInvoiceInstitutionModifyModel;
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 扩展 InstitutionModifyModel,补齐 SDK 未支持的 modify_standard_detail_info 和 modify_issue_rule_detail_info
+ * 对应 Python modify_institution_controller 中的数据结构
+ */
+public class ExtendedInstitutionModifyModel extends AlipayEbppInvoiceInstitutionModifyModel {
+
+    @SerializedName("modify_standard_detail_info")
+    private ModifyStandardDetailInfo modifyStandardDetailInfo;
+
+    @SerializedName("modify_issue_rule_detail_info")
+    private ModifyIssueRuleDetailInfo modifyIssueRuleDetailInfo;
+
+    public ModifyStandardDetailInfo getModifyStandardDetailInfo() {
+        return modifyStandardDetailInfo;
+    }
+
+    public void setModifyStandardDetailInfo(ModifyStandardDetailInfo modifyStandardDetailInfo) {
+        this.modifyStandardDetailInfo = modifyStandardDetailInfo;
+    }
+
+    public ModifyIssueRuleDetailInfo getModifyIssueRuleDetailInfo() {
+        return modifyIssueRuleDetailInfo;
+    }
+
+    public void setModifyIssueRuleDetailInfo(ModifyIssueRuleDetailInfo modifyIssueRuleDetailInfo) {
+        this.modifyIssueRuleDetailInfo = modifyIssueRuleDetailInfo;
+    }
+
+    public static class ModifyStandardDetailInfo {
+        @SerializedName("modify_standard_list")
+        private List<ModifyStandardItem> modifyStandardList;
+
+        public List<ModifyStandardItem> getModifyStandardList() {
+            return modifyStandardList;
+        }
+
+        public void setModifyStandardList(List<ModifyStandardItem> modifyStandardList) {
+            this.modifyStandardList = modifyStandardList;
+        }
+    }
+
+    public static class ModifyStandardItem {
+        @SerializedName("standard_id")
+        private String standardId;
+
+        @SerializedName("modify_condition_list")
+        private List<ModifyCondition> modifyConditionList;
+
+        public String getStandardId() {
+            return standardId;
+        }
+
+        public void setStandardId(String standardId) {
+            this.standardId = standardId;
+        }
+
+        public List<ModifyCondition> getModifyConditionList() {
+            return modifyConditionList;
+        }
+
+        public void setModifyConditionList(List<ModifyCondition> modifyConditionList) {
+            this.modifyConditionList = modifyConditionList;
+        }
+    }
+
+    public static class ModifyCondition {
+        @SerializedName("rule_id")
+        private String ruleId;
+
+        @SerializedName("rule_factor")
+        private String ruleFactor;
+
+        @SerializedName("rule_value")
+        private String ruleValue;
+
+        public String getRuleId() {
+            return ruleId;
+        }
+
+        public void setRuleId(String ruleId) {
+            this.ruleId = ruleId;
+        }
+
+        public String getRuleFactor() {
+            return ruleFactor;
+        }
+
+        public void setRuleFactor(String ruleFactor) {
+            this.ruleFactor = ruleFactor;
+        }
+
+        public String getRuleValue() {
+            return ruleValue;
+        }
+
+        public void setRuleValue(String ruleValue) {
+            this.ruleValue = ruleValue;
+        }
+    }
+
+    public static class ModifyIssueRuleDetailInfo {
+        @SerializedName("modify_issue_rule_list")
+        private List<Map<String, Object>> modifyIssueRuleList;
+
+        public List<Map<String, Object>> getModifyIssueRuleList() {
+            return modifyIssueRuleList;
+        }
+
+        public void setModifyIssueRuleList(List<Map<String, Object>> modifyIssueRuleList) {
+            this.modifyIssueRuleList = modifyIssueRuleList;
+        }
+    }
+}

+ 69 - 1
java/src/main/java/com/payment/platform/module/payment/expense/institution/service/InstitutionService.java

@@ -742,7 +742,8 @@ public class InstitutionService {
 
         // 调用支付宝 alipay.ebpp.invoice.institution.modify 同步
         try {
-            AlipayEbppInvoiceInstitutionModifyModel modifyModel = new AlipayEbppInvoiceInstitutionModifyModel();
+            com.payment.platform.core.alipay.ExtendedInstitutionModifyModel modifyModel =
+                    new com.payment.platform.core.alipay.ExtendedInstitutionModifyModel();
             modifyModel.setInstitutionId(existing.getInstitutionId());
             modifyModel.setEnterpriseId(existing.getEnterpriseId());
             if (StrUtil.isNotBlank(existing.getInstitutionName())) {
@@ -764,6 +765,60 @@ public class InstitutionService {
                 modifyModel.setConsultMode(existing.getConsultMode());
             }
 
+            // 金额/限额变更 → 构建 modify_standard_detail_info 同步支付宝
+            boolean amountChanged = dto.getAmount() != null
+                    && !dto.getAmount().equals(existing.getAmount());
+            boolean limitChanged = dto.getSingleLimit() != null
+                    && !dto.getSingleLimit().equals(existing.getSingleLimit());
+            if ((amountChanged || limitChanged) && StrUtil.isNotBlank(existing.getEnterpriseId())) {
+                try {
+                    // 查询支付宝制度详情获取已有 standard_id
+                    var detailModel = new AlipayEbppInvoiceInstitutionDetailinfoQueryModel();
+                    detailModel.setInstitutionId(existing.getInstitutionId());
+                    detailModel.setEnterpriseId(existing.getEnterpriseId());
+                    var detailReq = new AlipayEbppInvoiceInstitutionDetailinfoQueryRequest();
+                    detailReq.setBizModel(detailModel);
+                    var detailResp = alipayClientFactory.getClient(existing.getEnterpriseId()).execute(detailReq);
+                    if (detailResp.isSuccess() && detailResp.getStandardIdInfoList() != null) {
+                        String periodFactor = mapPeriodTypeToFactor(existing.getPeriodType());
+                        java.util.List<com.payment.platform.core.alipay.ExtendedInstitutionModifyModel.ModifyStandardItem>
+                                modifyList = new java.util.ArrayList<>();
+                        for (com.alipay.api.domain.StandardIdInfo info : detailResp.getStandardIdInfoList()) {
+                            if (info.getStandardId() == null) continue;
+                            java.util.List<com.payment.platform.core.alipay.ExtendedInstitutionModifyModel.ModifyCondition>
+                                    condList = new java.util.ArrayList<>();
+                            if (amountChanged && periodFactor != null) {
+                                var c = new com.payment.platform.core.alipay.ExtendedInstitutionModifyModel.ModifyCondition();
+                                c.setRuleFactor(periodFactor);
+                                c.setRuleValue(dto.getAmount().toPlainString());
+                                condList.add(c);
+                            }
+                            if (limitChanged) {
+                                var c = new com.payment.platform.core.alipay.ExtendedInstitutionModifyModel.ModifyCondition();
+                                c.setRuleFactor("QUOTA_TOTAL");
+                                c.setRuleValue(dto.getSingleLimit().toPlainString());
+                                condList.add(c);
+                            }
+                            if (!condList.isEmpty()) {
+                                var item = new com.payment.platform.core.alipay.ExtendedInstitutionModifyModel.ModifyStandardItem();
+                                item.setStandardId(info.getStandardId());
+                                item.setModifyConditionList(condList);
+                                modifyList.add(item);
+                            }
+                        }
+                        if (!modifyList.isEmpty()) {
+                            var detailInfo = new com.payment.platform.core.alipay.ExtendedInstitutionModifyModel.ModifyStandardDetailInfo();
+                            detailInfo.setModifyStandardList(modifyList);
+                            modifyModel.setModifyStandardDetailInfo(detailInfo);
+                            log.info("已构建 modify_standard_detail_info: amountChanged={}, limitChanged={}",
+                                    amountChanged, limitChanged);
+                        }
+                    }
+                } catch (Exception e) {
+                    log.warn("构建 modify_standard_detail_info 失败(不影响基础修改): {}", e.getMessage());
+                }
+            }
+
             AlipayEbppInvoiceInstitutionModifyRequest modifyRequest =
                     new AlipayEbppInvoiceInstitutionModifyRequest();
             modifyRequest.setBizModel(modifyModel);
@@ -1403,6 +1458,19 @@ public class InstitutionService {
         };
     }
 
+    /** 周期类型 → 支付宝 QUOTA 因子 */
+    private static String mapPeriodTypeToFactor(String periodType) {
+        if (periodType == null) return null;
+        return switch (periodType) {
+            case "daily" -> "QUOTA_DAY";
+            case "weekly" -> "QUOTA_WEEK";
+            case "monthly" -> "QUOTA_MONTH";
+            case "quarterly" -> "QUOTA_QUARTER";
+            case "yearly" -> "QUOTA_YEAR";
+            default -> null;
+        };
+    }
+
     /**
      * 构建发放规则数据 (对应 Python controller create_institution_controller)
      * <p>