Procházet zdrojové kódy

fix: 费控制度修改时同步金额变更到支付宝(institution.modify)

alphah před 1 týdnem
rodič
revize
109dab0a8d

+ 57 - 0
backend/app/plugin/module_payment/expense/institution/controller.py

@@ -275,6 +275,7 @@ async def modify_institution_controller(
     auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:modify"]))],
 ) -> JSONResponse:
     """编辑费控制度"""
+    institution_id = data.get("institution_id", "")
     # enterprise_id 推导
     if not data.get("enterprise_id"):
         from app.plugin.module_payment.enterprise.model import EnterpriseModel
@@ -366,6 +367,62 @@ async def modify_institution_controller(
     # 从请求中移除 scope 数据,避免与基础修改冲突
     data.pop("modify_scope_info", None)
 
+    # 构建金额/限额变更的标准规则信息(同步到支付宝)
+    new_amount = data.get("amount")
+    new_single_limit = data.get("single_limit")
+    period_type = data.get("period_type", "")
+    grant_mode = data.get("grant_mode", "")
+
+    if institution_id and (new_amount is not None or new_single_limit is not None):
+        try:
+            from app.plugin.module_payment.expense.rule.model import ExpenseRuleModel
+            from sqlalchemy import select as sa_select
+            stmt = sa_select(ExpenseRuleModel).where(
+                ExpenseRuleModel.institution_id == institution_id
+            )
+            exec_result = await auth.db.execute(stmt)
+            rules = exec_result.scalars().all()
+
+            modify_standard_list = []
+            for rule in rules:
+                if not rule.rule_id:
+                    continue
+                std_item = {"standard_id": rule.rule_id}
+                condition_list = []
+
+                if new_single_limit is not None:
+                    condition_list.append({
+                        "rule_factor": "QUOTA_TOTAL",
+                        "rule_name": "单次消费金额",
+                        "rule_value": str(new_single_limit),
+                    })
+
+                if grant_mode == "period" and period_type and new_amount:
+                    PERIOD_FACTOR_MAP = {
+                        "daily": "QUOTA_DAY", "weekly": "QUOTA_WEEK",
+                        "monthly": "QUOTA_MONTH", "quarterly": "QUOTA_QUARTER",
+                        "yearly": "QUOTA_YEAR",
+                    }
+                    factor = PERIOD_FACTOR_MAP.get(period_type)
+                    if factor:
+                        condition_list.append({
+                            "rule_factor": factor,
+                            "rule_name": f"{period_type}限额",
+                            "rule_value": str(new_amount),
+                        })
+
+                if condition_list:
+                    std_item["standard_condition_info_list"] = condition_list
+                    modify_standard_list.append(std_item)
+
+            if modify_standard_list:
+                data["modify_standard_detail_info"] = {
+                    "modify_standard_list": modify_standard_list
+                }
+                log.info(f"已构建金额变更信息: amount={new_amount}, single_limit={new_single_limit}, rules_count={len(modify_standard_list)}")
+        except Exception as e:
+            log.warning(f"构建标准规则变更信息失败(将跳过金额同步): {e}")
+
     # 第1次请求:仅修改制度基础信息(不含 scope)
     base_data = {k: v for k, v in data.items() if k != "modify_scope_info"}
     institution_modify_model = AlipayEbppInvoiceInstitutionModifyModel.from_alipay_dict(base_data)