Преглед на файлове

feat:转帐失败不回滚

gatsby преди 1 седмица
родител
ревизия
d32b6fb135
променени са 1 файла, в които са добавени 18 реда и са изтрити 4 реда
  1. 18 4
      backend/app/plugin/module_payment/account/service.py

+ 18 - 4
backend/app/plugin/module_payment/account/service.py

@@ -334,7 +334,9 @@ class AccountService:
         result.parse_response_content(response)
         sub_code = getattr(result, 'sub_code', '') or ''
         sub_msg = getattr(result, 'sub_msg', '') or ''
-        # 无论是否成功都写入转账记录,记录接口调用结果和错误信息,方便后续查询和排查
+        # 构建转账记录数据,但延迟写入:
+        # - 成功时在当前会话写入
+        # - 失败时使用独立事务写入并提交,避免被外层回滚吞掉
         transfer_crud = TransferCRUD(auth)
         transfer_data = {
             "enterprise_id": model.enterprise_id,
@@ -346,13 +348,11 @@ class AccountService:
             "status": result.status,
             "order_no": result.order_no,
             "fund_order_id": result.fund_order_id,
-            "remark":f"{result.code} - {result.msg} (sub_code={sub_code}, sub_msg={sub_msg})"
+            "remark": f"{result.code} - {result.msg} (sub_code={sub_code}, sub_msg={sub_msg})",
         }
         log.info(f"记录转账: {transfer_data}")
-        await transfer_crud.create(transfer_data)
 
         if not result.is_success():
-
             # 优先用 sub_code 匹配
             hint = _TRANSFER_ERROR_HINTS.get(sub_code)
             # sub_code 无匹配时,尝试从 sub_msg 中提取错误码(支付宝部分接口sub_code返回unknown-sub-code)
@@ -364,8 +364,22 @@ class AccountService:
             hint = hint or sub_msg or result.msg or "转账失败"
 
             log.error(f"支付宝接口调用失败: {result.code} - {result.msg} (sub_code={sub_code}, sub_msg={sub_msg})")
+
+            # 使用独立的 session/事务保证失败记录能被持久化
+            from app.core.database import async_db_session
+
+            async with async_db_session() as _session:
+                async with _session.begin():
+                    new_auth = AuthSchema(db=_session, check_data_scope=False)
+                    # 保持 tenant_id
+                    new_auth.tenant_id = getattr(auth, "tenant_id", None)
+                    await TransferCRUD(new_auth).create(transfer_data)
+
             raise CustomException(msg=f"转账失败: {hint}")
 
+        # 成功时写入当前会话
+        await transfer_crud.create(transfer_data)
+
         return AccountTransferOutSchema(
             status=result.status,
             order_no=result.order_no,