Ver código fonte

feat(account): 手动同步转账状态接口,修复 DEALING 问题

alphah 2 semanas atrás
pai
commit
4d0ccc293a

+ 17 - 0
backend/app/plugin/module_payment/account/controller.py

@@ -29,6 +29,7 @@ from .schema import (
     ReceiptQueryOutSchema,
     TransferListOutSchema,
     TransferOutSchema,
+    TransferSyncStatusSchema,
     TransferTaskOutSchema,
     ConsumeDetailOutSchema,
 )
@@ -255,6 +256,22 @@ async def transfer_list_controller(
     return SuccessResponse(data=result, msg="查询转账记录列表成功")
 
 
+@AccountRouter.post(
+    "/transfer/sync-status",
+    summary="手动同步转账状态",
+    description="手动修复卡在 DEALING 的转账记录状态(管理员在支付宝核实后使用)",
+    response_model=ResponseSchema[dict],
+)
+async def transfer_sync_status_controller(
+    data: TransferSyncStatusSchema,
+    auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:account:transfer:update"]))],
+) -> JSONResponse:
+    """手动同步转账状态"""
+    result = await AccountService.transfer_sync_status_service(auth=auth, data=data)
+    log.info(f"手动同步转账状态成功: out_biz_no={data.out_biz_no}, status={data.status}")
+    return SuccessResponse(data=result, msg="同步转账状态成功")
+
+
 @AccountRouter.get(
     "/consume-detail",
     summary="账单详情查询",

+ 9 - 0
backend/app/plugin/module_payment/account/schema.py

@@ -243,6 +243,15 @@ class TransferTaskSchema(BaseModel):
     created_at: str = Field(description="创建时间")
 
 
+class TransferSyncStatusSchema(BaseModel):
+    """手动同步转账状态请求"""
+
+    out_biz_no: str = Field(description="商家侧订单号")
+    status: str = Field(description="同步后的状态: SUCCESS/FAIL")
+    error_code: Optional[str] = Field(default=None, description="错误码")
+    error_msg: Optional[str] = Field(default=None, description="错误信息")
+
+
 class TransferTaskOutSchema(BaseModel):
     """转账任务响应"""
 

+ 43 - 0
backend/app/plugin/module_payment/account/service.py

@@ -801,6 +801,49 @@ class AccountService:
         return data
 
 
+    @classmethod
+    async def transfer_sync_status_service(
+        cls,
+        auth: AuthSchema,
+        data: "TransferSyncStatusSchema",
+    ) -> dict:
+        """
+        手动同步转账状态(管理员补录)
+        用于修复因通知丢失而卡在 DEALING 的转账记录
+        """
+        from app.plugin.module_payment.account.crud import TransferCRUD
+        from app.plugin.module_payment.account.schema import TransferSyncStatusSchema
+
+        crud = TransferCRUD(auth)
+        transfer = await crud.get_by_out_biz_no(data.out_biz_no)
+        if not transfer:
+            raise CustomException(msg=f"转账记录不存在: {data.out_biz_no}")
+
+        if transfer.status != "DEALING" and data.status == "SUCCESS":
+            raise CustomException(msg=f"转账记录当前状态为 {transfer.status},无需同步")
+
+        update_data = {"status": data.status}
+        if data.error_code:
+            update_data["error_code"] = data.error_code
+        if data.error_msg:
+            update_data["error_msg"] = data.error_msg
+
+        for key, value in update_data.items():
+            if hasattr(transfer, key):
+                setattr(transfer, key, value)
+
+        await auth.db.flush()
+        await auth.db.refresh(transfer)
+
+        log.info(f"手动同步转账状态成功: out_biz_no={data.out_biz_no}, {transfer.status}")
+        return {
+            "out_biz_no": transfer.out_biz_no,
+            "status": transfer.status,
+            "error_code": transfer.error_code,
+            "error_msg": transfer.error_msg,
+        }
+
+
     @classmethod
     async def update_transfer_status_service(
         cls,