Просмотр исходного кода

fix: rule 表加 condition_info/single_limit 字段并返回详情

alphah 2 недель назад
Родитель
Сommit
925d4fae1a

+ 64 - 8
backend/app/plugin/module_payment/expense/institution/service.py

@@ -213,6 +213,14 @@ class InstitutionService:
                 if hasattr(info, 'outer_source_id') and hasattr(info, 'standard_id'):
                     standard_id_map[info.outer_source_id] = info.standard_id
             for idx, std in enumerate(raw_data["standard_info_list"]):
+                condition_list = std.get("standard_condition_info_list", [])
+                single_limit_val = None
+                for cond in (condition_list or []):
+                    if cond.get("rule_factor") == "QUOTA_TOTAL":
+                        try:
+                            single_limit_val = float(cond.get("rule_value", 0))
+                        except (ValueError, TypeError):
+                            pass
                 std_data = {
                     "out_biz_no": std.get("outer_source_id", f"std_{institution_id}_{idx}"),
                     "institution_id": institution_id,
@@ -222,6 +230,8 @@ class InstitutionService:
                     "expense_type_sub_category": std.get("expense_type_sub_category", "DEFAULT"),
                     "enterprise_id": enterprise_id,
                     "tenant_id": auth.user.tenant_id if auth.user else 1,
+                    "condition_info": condition_list,
+                    "single_limit": single_limit_val,
                 }
                 try:
                     from app.plugin.module_payment.expense.rule.model import ExpenseRuleModel
@@ -325,10 +335,11 @@ class InstitutionService:
         enterprise_id: str,
     ) -> dict | None:
         """
-        从支付宝查询费控制度详情
+        从支付宝查询费控制度详情,并补充本地规则和额度数据
         调用: alipay.ebpp.invoice.institution.detailinfo.query
         失败时降级到本地DB
         """
+        result_dict = None
         try:
             model = AlipayEbppInvoiceInstitutionDetailinfoQueryModel()
             model.institution_id = institution_id
@@ -344,18 +355,63 @@ class InstitutionService:
                 result.parse_response_content(response)
 
                 if result.is_success():
-                    return result.to_alipay_dict()
+                    result_dict = result.to_alipay_dict()
 
-            log.warning("支付宝 detailinfo.query 失败,降级到本地DB")
+            if not result_dict:
+                log.warning("支付宝 detailinfo.query 失败,降级到本地DB")
         except Exception as e:
             log.warning(f"支付宝 detailinfo.query 异常: {e},降级到本地DB")
 
         # 降级:查本地DB
-        crud = InstitutionCRUD(auth)
-        obj = await crud.get(institution_id=institution_id, enterprise_id=enterprise_id)
-        if obj:
-            return InstitutionListOutSchema.model_validate(obj).model_dump()
-        return None
+        if not result_dict:
+            crud = InstitutionCRUD(auth)
+            obj = await crud.get(institution_id=institution_id, enterprise_id=enterprise_id)
+            if obj:
+                result_dict = InstitutionListOutSchema.model_validate(obj).model_dump()
+
+        if not result_dict:
+            return None
+
+        # 补充本地规则和额度
+        from app.plugin.module_payment.expense.rule.model import ExpenseRuleModel
+        from app.plugin.module_payment.expense.quota.model import QuotaModel
+        from sqlalchemy import select
+
+        # 查使用规则
+        rule_stmt = select(ExpenseRuleModel).where(ExpenseRuleModel.institution_id == institution_id)
+        rule_result = await auth.db.execute(rule_stmt)
+        rules = rule_result.scalars().all()
+        if rules:
+            rule_list = []
+            for r in rules:
+                rule_item = {
+                    "rule_id": r.rule_id,
+                    "standard_name": r.standard_name,
+                    "standard_desc": r.standard_desc,
+                }
+                if hasattr(r, 'condition_info') and r.condition_info:
+                    rule_item["condition_info"] = r.condition_info
+                if hasattr(r, 'single_limit') and r.single_limit:
+                    rule_item["single_limit"] = float(r.single_limit)
+                rule_list.append(rule_item)
+            result_dict["rule_list"] = rule_list
+
+        # 查额度
+        quota_stmt = select(QuotaModel).where(QuotaModel.institution_id == institution_id)
+        quota_result = await auth.db.execute(quota_stmt)
+        quotas = quota_result.scalars().all()
+        if quotas:
+            result_dict["quota_list"] = [
+                {
+                    "quota_id": q.quota_id,
+                    "total_amount": float(q.total_amount) if q.total_amount else 0,
+                    "available_amount": float(q.available_amount) if q.available_amount else 0,
+                    "status": q.status,
+                }
+                for q in quotas
+            ]
+
+        return result_dict
 
     @classmethod
     async def list_service(

+ 7 - 1
backend/app/plugin/module_payment/expense/rule/model.py

@@ -1,4 +1,4 @@
-from sqlalchemy import String, Text
+from sqlalchemy import JSON, Numeric, String, Text
 from sqlalchemy.orm import Mapped, mapped_column
 
 from app.common.enums import PermissionFilterStrategy
@@ -37,3 +37,9 @@ class ExpenseRuleModel(PaymentModelMixin, TenantMixin, EnterpriseMixin):
         default=RuleStatusEnum.RULE_ACTIVE.value,
         comment="状态: RULE_ACTIVE/RULE_INACTIVE"
     )
+    condition_info: Mapped[dict | None] = mapped_column(
+        JSON, comment="规则条件(standard_condition_info_list)"
+    )
+    single_limit: Mapped[float | None] = mapped_column(
+        Numeric(12, 2), comment="单笔限额"
+    )