|
|
@@ -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,
|