Explorar o código

fix: scope 修改与基础修改拆分为两次独立请求

alphah hai 2 semanas
pai
achega
ea01394c8c

+ 9 - 7
backend/app/plugin/module_payment/expense/institution/controller.py

@@ -277,23 +277,25 @@ async def modify_institution_controller(
     EXPENSE_TYPE_MAP = {"GENERAL": "DEFAULT", "DEFAULT": "DEFAULT"}
     if data.get("expense_type") in EXPENSE_TYPE_MAP:
         data["expense_type"] = EXPENSE_TYPE_MAP[data["expense_type"]]
-    # 构造 scope 变更信息写入支付宝模型
+    # 提取 scope 变更数据(需与基础修改分两次请求)
     applicable_scope = data.get("applicable_scope", "")
+    scope_info = None
     if applicable_scope and applicable_scope not in ("NONE", "none"):
         ADAPTER_MAP = {"all": "EMPLOYEE_ALL", "employee": "EMPLOYEE_SELECT", "department": "DEPARTMENT_SELECT"}
         scope_info = {
             "adapter_type": ADAPTER_MAP.get(applicable_scope, applicable_scope),
             "owner_type": "ENTERPRISE_PAY_UID",
         }
-        if applicable_scope == "employee" and data.get("scope_owner_id_list"):
+        if applicable_scope in ("employee", "department") and data.get("scope_owner_id_list"):
             scope_info["add_owner_id_list"] = data["scope_owner_id_list"]
-        elif applicable_scope == "department" and data.get("scope_owner_id_list"):
-            scope_info["add_owner_id_list"] = data["scope_owner_id_list"]
-        data["modify_scope_info"] = scope_info
+        # 从请求中移除 scope 数据,避免与基础修改冲突
+        data.pop("modify_scope_info", None)
 
-    institution_modify_model = AlipayEbppInvoiceInstitutionModifyModel.from_alipay_dict(data)
+    # 第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)
     result = await InstitutionService.modify_institution_service(
-        auth=auth, data=institution_modify_model, raw_data=data
+        auth=auth, data=institution_modify_model, raw_data=base_data, scope_info=scope_info
     )
     log.info(f"编辑费控制度成功: institution_id={institution_modify_model.institution_id}")
     return SuccessResponse(data=result, msg="编辑费控制度成功")

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

@@ -499,11 +499,13 @@ class InstitutionService:
 
     @classmethod
     async def modify_institution_service(
-        cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionModifyModel, raw_data: dict | None = None
+        cls, auth: AuthSchema, data: AlipayEbppInvoiceInstitutionModifyModel, raw_data: dict | None = None,
+        scope_info: dict | None = None,
     ) -> dict:
         """
         编辑费控制度
         调用: alipay.ebpp.invoice.institution.modify
+        适用范围修改(scope_info)需单独调 scope.modify,与基础信息拆分两次请求
 
         支付宝成功后同步更新本地DB:
         - 制度基本信息
@@ -518,7 +520,7 @@ class InstitutionService:
         enterprise_id = getattr(data, 'enterprise_id', None) or (raw_data or {}).get("enterprise_id", "")
         raw_data = raw_data or {}
 
-        # 第1步:修改支付宝制度信息
+        # 第1步:修改支付宝制度基础信息(不含 scope)
         request = AlipayEbppInvoiceInstitutionModifyRequest()
         request.biz_model = data
         response = await asyncio.to_thread(cls._execute_alipay, request)
@@ -533,6 +535,17 @@ class InstitutionService:
             log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
             raise CustomException(msg=f"编辑费控制度失败: {result.msg}")
 
+        # 第1.5步:单独调用 scope.modify(不与基础修改在同一请求中)
+        if scope_info:
+            try:
+                await InstitutionScopeService.scope_modify_service(
+                    auth=auth, institution_id=institution_id, data=scope_info
+                )
+                log.info(f"适用范围已单独同步: adapter_type={scope_info.get('adapter_type')}")
+            except Exception as e:
+                log.warning(f"适用范围同步失败(不影响基础修改): {e}")
+                raise CustomException(msg=f"编辑费控制度失败: 适用范围修改失败: {e}")
+
         applicable_scope = raw_data.get("applicable_scope", "")
 
         # 第2步:同步更新本地数据库(scope 已在 Alipay modify 请求中通过 modify_scope_info 处理)