mirror of
https://github.com/Cccc-owo/CheckInApp.git
synced 2026-06-17 05:56:29 +00:00
feat: 支持创建任务时自定义crontab并清理冗余代码
- 添加创建任务时的crontab编辑控件 - 修复创建任务按钮状态重置问题 - 创建任务后自动加载到调度器 - 删除废弃的手动创建任务API和相关代码
This commit is contained in:
+2
-32
@@ -5,7 +5,7 @@ from datetime import datetime, timedelta
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from backend.models import get_db, User
|
||||
from backend.schemas.task import TaskCreate, TaskUpdate, TaskResponse
|
||||
from backend.schemas.task import TaskUpdate, TaskResponse
|
||||
from backend.services.task_service import TaskService
|
||||
from backend.dependencies import get_current_user
|
||||
|
||||
@@ -16,37 +16,7 @@ class CronValidateRequest(BaseModel):
|
||||
"""Cron 表达式验证请求"""
|
||||
cron_expression: str = Field(..., min_length=9, description="Crontab 表达式")
|
||||
|
||||
|
||||
@router.post("/", response_model=TaskResponse, status_code=status.HTTP_201_CREATED, summary="创建打卡任务")
|
||||
async def create_task(
|
||||
task_data: TaskCreate,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
创建新的打卡任务(基于模板)
|
||||
|
||||
现在的任务创建流程:
|
||||
1. 管理员在后台创建模板(包含完整的 payload_config)
|
||||
2. 用户基于模板创建任务,填写字段值
|
||||
3. 系统自动生成完整的 payload_config
|
||||
|
||||
注意:直接创建任务的方式已废弃,请使用模板接口。
|
||||
"""
|
||||
try:
|
||||
task = TaskService.create_task(current_user.id, task_data, db)
|
||||
return task
|
||||
except ValueError as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=str(e)
|
||||
)
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f"创建任务失败: {str(e)}"
|
||||
)
|
||||
|
||||
# create_task_from_template: 已在 templates.py 中定义
|
||||
|
||||
@router.get("/", response_model=List[TaskResponse], summary="获取当前用户的任务列表")
|
||||
async def get_tasks(
|
||||
|
||||
@@ -200,6 +200,7 @@ async def create_task_from_template(
|
||||
- **thread_id**: 接龙项目 ID
|
||||
- **field_values**: 用户填写的字段值
|
||||
- **task_name**: 任务名称(可选)
|
||||
- **cron_expression**: Cron 表达式(可选,默认每天 20:00)
|
||||
"""
|
||||
task = TemplateService.create_task_from_template(
|
||||
template_id=request.template_id,
|
||||
@@ -207,6 +208,7 @@ async def create_task_from_template(
|
||||
field_values=request.field_values,
|
||||
user_id=current_user.id,
|
||||
task_name=request.task_name,
|
||||
db=db
|
||||
db=db,
|
||||
cron_expression=request.cron_expression
|
||||
)
|
||||
return task
|
||||
|
||||
@@ -137,6 +137,7 @@ class TaskFromTemplateRequest(BaseModel):
|
||||
thread_id: str = Field(..., min_length=1, description="接龙项目 ID")
|
||||
field_values: Dict[str, Any] = Field(default_factory=dict, description="用户填写的字段值")
|
||||
task_name: Optional[str] = Field(None, max_length=100, description="任务名称(可选)")
|
||||
cron_expression: Optional[str] = Field("0 20 * * *", description="Cron 表达式(可选,默认每天 20:00)")
|
||||
|
||||
|
||||
class TemplatePreviewResponse(BaseModel):
|
||||
|
||||
@@ -503,7 +503,8 @@ class TemplateService:
|
||||
field_values: Dict[str, Any],
|
||||
user_id: int,
|
||||
task_name: Optional[str],
|
||||
db: Session
|
||||
db: Session,
|
||||
cron_expression: Optional[str] = "0 20 * * *"
|
||||
) -> CheckInTask:
|
||||
"""
|
||||
从模板创建打卡任务
|
||||
@@ -515,6 +516,7 @@ class TemplateService:
|
||||
user_id: 用户 ID
|
||||
task_name: 任务名称(可选)
|
||||
db: 数据库会话
|
||||
cron_expression: Cron 表达式(可选,默认每天 20:00)
|
||||
|
||||
Returns:
|
||||
创建的任务对象
|
||||
@@ -544,19 +546,26 @@ class TemplateService:
|
||||
signature = payload.get('Signature', 'Unknown')
|
||||
task_name = f"{template.name} - {signature}"
|
||||
|
||||
# 创建任务(只存储 payload_config,不再需要 thread_id 和 email)
|
||||
# 创建任务(包含 cron_expression)
|
||||
try:
|
||||
task = CheckInTask(
|
||||
user_id=user_id,
|
||||
payload_config=json.dumps(payload, ensure_ascii=False),
|
||||
name=task_name,
|
||||
is_active=True
|
||||
is_active=True,
|
||||
cron_expression=cron_expression or "0 20 * * *"
|
||||
)
|
||||
db.add(task)
|
||||
db.commit()
|
||||
db.refresh(task)
|
||||
|
||||
logger.info(f"从模板创建任务成功: {task.name} (ID: {task.id}, 模板: {template.name}, ThreadId: {thread_id})")
|
||||
|
||||
# 如果任务启用且包含 cron_expression,立即添加到调度器
|
||||
if task.is_scheduled_enabled:
|
||||
from backend.services.task_service import TaskService
|
||||
TaskService._reload_scheduler_for_task(task, db)
|
||||
|
||||
return task
|
||||
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user