jerry 3 тижнів тому
батько
коміт
45e9cdd6ca

+ 5 - 0
app/api/router.py

@@ -1466,6 +1466,11 @@ async def vas_task_pending(
     tasks = await VasTaskService.get_active_task_by_order_id(db, order_id)
     return success(data=tasks)
 
+@admin_required_router.post("/vas/task/pause", summary="暂停任务", tags=["Visafly签证系统"], response_model=ApiResponse[VasTaskOut])
+async def vas_task_pause(task_id:int, db: AsyncSession = Depends(get_db)):
+    obj = await VasTaskService.pause(db, task_id)
+    return success(data=obj)
+
 @admin_required_router.post("/vas/task/return_to_queue", summary="重新进入等候状态", tags=["Visafly签证系统"], response_model=ApiResponse[VasTaskOut])
 async def vas_task_return_to_queue(task_id:int, db: AsyncSession = Depends(get_db)):
     obj = await VasTaskService.return_to_queue(db, task_id)

+ 4 - 4
app/models/account.py

@@ -1,4 +1,4 @@
-from sqlalchemy import Column, Integer, String, Text, Float, JSON, TIMESTAMP
+from sqlalchemy import Column, Integer, String, Text, Float, JSON, TIMESTAMP, Enum
 from sqlalchemy.sql import func
 from sqlalchemy.ext.declarative import declarative_base
 from app.core.database import Base
@@ -11,10 +11,10 @@ class Account(Base):
     pool_name = Column(String(50), nullable=False, index=True)
     username = Column(String(100), nullable=False)
     password = Column(String(255), nullable=True)
-    extra_data = Column(JSON, nullable=True) # 存储 Cookies 等
-    
+    extra_data = Column(JSON, nullable=True)
     # 锁定截止时间戳 (0 表示未锁定,> time.time() 表示锁定中)
     lock_until = Column(Float, default=0, index=True)
     
     # 状态: active, disabled, removed
-    status = Column(String(20), default="active", index=True)
+    status = Column(
+        Enum('active','disable'), default="active", index=True)

+ 1 - 1
app/models/vas_task.py

@@ -15,7 +15,7 @@ class VasTask(Base):
 
     config = Column(JSON)
     status = Column(
-        Enum('pending','grabbed','running','cancelled','completed'),
+        Enum('pending','grabbed','running','pause','cancelled','completed'),
         default='pending'
     )
 

+ 23 - 15
app/schemas/account.py

@@ -1,24 +1,31 @@
-from pydantic import BaseModel
-from typing import Optional, Dict, Any
-from app.schemas.common import ApiResponse
-from app.schemas.user import VasUserOut
+import json
+from pydantic import BaseModel, field_validator
+from typing import Optional, Dict, Any, Literal
 
-
-# --- 4. 请求/响应 Schema (Pydantic) ---
-class AccountCreate(BaseModel):
+class AccountBase(BaseModel):
     pool_name: str
     username: str
     password: Optional[str] = None
     extra_data: Optional[Dict[str, Any]] = None
+    status: Optional[Literal['active','disable']] = None
+    lock_until: float = 0
+    @field_validator("extra_data", mode="before")
+    def normalize_json_field(cls, v):
+        if v is None:
+            return None
+        if isinstance(v, str):
+            try:
+                return json.loads(v)
+            except Exception:
+                return {}
+        return v
+
+# --- 4. 请求/响应 Schema (Pydantic) ---
+class AccountCreate(AccountBase):
+    pass
 
-class AccountResponse(BaseModel):
+class AccountResponse(AccountBase):
     id: int
-    pool_name: str
-    username: str
-    password: Optional[str] = None
-    lock_until: float
-    extra_data: Optional[Dict[str, Any]] = None
-    status: str
     model_config = {
         "from_attributes": True
     }
@@ -26,4 +33,5 @@ class AccountResponse(BaseModel):
 class LockRequest(BaseModel):
     pool_name: str
     username: str
-    duration: Optional[int] = None
+    duration: Optional[int] = None
+    

+ 1 - 1
app/schemas/vas_task.py

@@ -5,7 +5,7 @@ from typing import Optional, Dict, Any, Literal, List
 from datetime import datetime
 
 class VasTaskBase(BaseModel):
-    status: Optional[Literal['pending','grabbed','running','cancelled','completed']] = None
+    status: Optional[Literal['pending','grabbed','running','pause','cancelled','completed']] = None
     priority: Optional[int] = 10
     config: Optional[Dict[str, Any]] = None
     user_inputs: Optional[Dict[str, Any]] = None

+ 14 - 0
app/services/vas_task_service.py

@@ -231,6 +231,20 @@ class VasTaskService:
         await db.commit()
         await db.refresh(rec)
         return rec
+    
+    @staticmethod
+    async def pause(db: AsyncSession, id: int) -> VasTask:
+        stmt = select(VasTask).where(VasTask.id == id)
+        result = await db.execute(stmt)
+        rec = result.scalar_one_or_none()
+
+        if not rec:
+            raise NotFoundError("Task not exist")
+        
+        rec.status = "pause"
+        await db.commit()
+        await db.refresh(rec)
+        return rec
 
     @staticmethod
     async def manual_confirm(db: AsyncSession, id: int, redis_client: Redis) -> VasTask: