Browse Source

fix(expense): 编辑回显+使用规则期限制 - 调scope接口补充员工列表 新增日/月/季/年限额提取

alphah 2 tuần trước cách đây
mục cha
commit
de2e83cd1f

+ 37 - 2
backend/app/plugin/module_payment/expense/institution/service.py

@@ -615,6 +615,27 @@ class InstitutionService:
             scope_map = {"EMPLOYEE_SELECT": "employee", "EMPLOYEE_DEPARTMENT": "department", "EMPLOYEE_ALL": "all"}
             result_dict["applicable_scope"] = scope_map.get(adapter_type, result_dict.get("applicable_scope", "none"))
 
+        # 补充:从 scope 接口获取员工列表(detailinfo.query 可能不返回 owner_id_list)
+        if not result_dict.get("employee_ids"):
+            try:
+                scope_result = await InstitutionScopeService.scopepageinfo_query_service(
+                    auth=auth,
+                    institution_id=institution_id,
+                    enterprise_id=enterprise_id,
+                    page_num=1,
+                    page_size=500,
+                )
+                owner_list = scope_result.get("owner_id_list", []) or []
+                adapter = scope_result.get("adapter_type")
+                if owner_list and adapter in ("EMPLOYEE_SELECT", None):
+                    result_dict["employee_ids"] = owner_list
+                    result_dict["scope_owner_id_list"] = owner_list
+                if adapter and not result_dict.get("applicable_scope"):
+                    scope_map = {"EMPLOYEE_SELECT": "employee", "EMPLOYEE_DEPARTMENT": "department", "EMPLOYEE_ALL": "all"}
+                    result_dict["applicable_scope"] = scope_map.get(adapter, result_dict.get("applicable_scope", "none"))
+            except Exception as e:
+                log.debug(f"查询 scope 补充员工列表失败(不影响主流程): {e}")
+
         # 补充本地规则和额度
         from app.plugin.module_payment.expense.rule.model import ExpenseRuleModel
         from app.plugin.module_payment.expense.quota.model import QuotaModel
@@ -632,10 +653,24 @@ class InstitutionService:
                     "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)
+                if hasattr(r, 'condition_info') and r.condition_info:
+                    rule_item["condition_info"] = r.condition_info
+                    for cond in r.condition_info:
+                        factor = cond.get("rule_factor")
+                        try:
+                            value = float(cond.get("rule_value", 0))
+                        except (ValueError, TypeError):
+                            continue
+                        if factor == "QUOTA_DAY":
+                            rule_item["max_day_amount"] = value
+                        elif factor == "QUOTA_MONTH":
+                            rule_item["max_month_amount"] = value
+                        elif factor == "QUOTA_QUARTER":
+                            rule_item["max_quarter_amount"] = value
+                        elif factor == "QUOTA_YEAR":
+                            rule_item["max_year_amount"] = value
                 rule_list.append(rule_item)
             result_dict["rule_list"] = rule_list
 

+ 26 - 1
backend/app/plugin/module_payment/expense/rule/schema.py

@@ -1,7 +1,7 @@
 from datetime import datetime
 from typing import Optional
 
-from pydantic import BaseModel, ConfigDict, Field
+from pydantic import BaseModel, ConfigDict, Field, model_validator
 
 
 class StandardConditionInfoSchema(BaseModel):
@@ -110,10 +110,35 @@ class RuleListOutSchema(BaseModel):
     status: Optional[str] = Field(default=None, description="状态")
     enterprise_id: Optional[str] = Field(default=None, description="企业ID")
     single_limit: Optional[float] = Field(default=None, description="单笔限额")
+    max_day_amount: Optional[float] = Field(default=None, description="日限额")
+    max_month_amount: Optional[float] = Field(default=None, description="月限额")
+    max_quarter_amount: Optional[float] = Field(default=None, description="季限额")
+    max_year_amount: Optional[float] = Field(default=None, description="年限额")
     condition_info: Optional[list] = Field(default=None, description="规则条件列表")
     created_time: Optional[datetime] = Field(default=None, description="创建时间")
     updated_time: Optional[datetime] = Field(default=None, description="更新时间")
 
+    @model_validator(mode="after")
+    def extract_period_limits(self):
+        """从 condition_info 中提取日/月/季/年限额"""
+        if not self.condition_info:
+            return self
+        for cond in self.condition_info:
+            factor = cond.get("rule_factor")
+            try:
+                value = float(cond.get("rule_value", 0))
+            except (ValueError, TypeError):
+                continue
+            if factor == "QUOTA_DAY":
+                self.max_day_amount = value
+            elif factor == "QUOTA_MONTH":
+                self.max_month_amount = value
+            elif factor == "QUOTA_QUARTER":
+                self.max_quarter_amount = value
+            elif factor == "QUOTA_YEAR":
+                self.max_year_amount = value
+        return self
+
 
 class RuleOutSchema(BaseModel):
     """使用规则详情响应"""