Skip to content

Commit 2d392f7

Browse files
committed
Refine the business codes
1 parent fbef368 commit 2d392f7

File tree

9 files changed

+1484
-1053
lines changed

9 files changed

+1484
-1053
lines changed

backend/app/task/api/v1/scheduler.py

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,30 @@
22
# -*- coding: utf-8 -*-
33
from typing import Annotated
44

5-
from fastapi import APIRouter, Depends, Path
5+
from fastapi import APIRouter, Depends, Path, Query
66

7+
from backend.app.task.schema.scheduler import CreateTaskSchedulerParam, GetTaskSchedulerDetail, UpdateTaskSchedulerParam
78
from backend.app.task.service.scheduler_service import task_scheduler_service
8-
from backend.common.pagination import DependsPagination
9+
from backend.common.pagination import DependsPagination, PageData, paging_data
910
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1011
from backend.common.security.jwt import DependsJwtAuth
1112
from backend.common.security.permission import RequestPermission
1213
from backend.common.security.rbac import DependsRBAC
14+
from backend.database.db import CurrentSession
1315

1416
router = APIRouter()
1517

1618

1719
@router.get('/all', summary='获取所有任务调度', dependencies=[DependsJwtAuth])
18-
async def get_all_schedulers() -> ResponseModel:
19-
return response_base.success()
20+
async def get_all_task_schedulers() -> ResponseModel:
21+
schedulers = await task_scheduler_service.get_all()
22+
return response_base.success(data=schedulers)
2023

2124

2225
@router.get('/{pk}', summary='获取任务调度详情', dependencies=[DependsJwtAuth])
23-
async def get_scheduler():
24-
return response_base.success()
26+
async def get_task_scheduler(pk: Annotated[int, Path(description='任务调度 ID')]):
27+
task_scheduler = await task_scheduler_service.get(pk=pk)
28+
return response_base.success(data=task_scheduler)
2529

2630

2731
@router.get(
@@ -32,8 +36,14 @@ async def get_scheduler():
3236
DependsPagination,
3337
],
3438
)
35-
async def get_scheduler_paged():
36-
return response_base.success()
39+
async def get_task_scheduler_paged(
40+
db: CurrentSession,
41+
name: Annotated[int, Path(description='任务调度名称')] = None,
42+
type: Annotated[int | None, Query(description='任务调度类型')] = None,
43+
) -> ResponseSchemaModel[PageData[GetTaskSchedulerDetail]]:
44+
task_scheduler_select = await task_scheduler_service.get_select(name=name, type=type)
45+
page_data = await paging_data(db, task_scheduler_select)
46+
return response_base.success(data=page_data)
3747

3848

3949
@router.post(
@@ -44,7 +54,8 @@ async def get_scheduler_paged():
4454
DependsRBAC,
4555
],
4656
)
47-
async def create_scheduler():
57+
async def create_task_scheduler(obj: CreateTaskSchedulerParam):
58+
await task_scheduler_service.create(obj=obj)
4859
return response_base.success()
4960

5061

@@ -56,8 +67,11 @@ async def create_scheduler():
5667
DependsRBAC,
5768
],
5869
)
59-
async def update_scheduler(pk: Annotated[int, Path(description='任务调度 ID')]):
60-
return response_base.success()
70+
async def update_task_scheduler(pk: Annotated[int, Path(description='任务调度 ID')], obj: UpdateTaskSchedulerParam):
71+
count = await task_scheduler_service.update(pk=pk, obj=obj)
72+
if count > 0:
73+
return response_base.success()
74+
return response_base.fail()
6175

6276

6377
@router.put(
@@ -68,8 +82,11 @@ async def update_scheduler(pk: Annotated[int, Path(description='任务调度 ID'
6882
DependsRBAC,
6983
],
7084
)
71-
async def update_scheduler_status(pk: Annotated[int, Path(description='任务调度 ID')]):
72-
return response_base.success()
85+
async def update_task_scheduler_status(pk: Annotated[int, Path(description='任务调度 ID')]):
86+
count = await task_scheduler_service.update_status(pk=pk)
87+
if count > 0:
88+
return response_base.success()
89+
return response_base.fail()
7390

7491

7592
@router.delete(
@@ -80,8 +97,11 @@ async def update_scheduler_status(pk: Annotated[int, Path(description='任务调
8097
DependsRBAC,
8198
],
8299
)
83-
async def delete_scheduler(pk: Annotated[int, Path(description='任务调度 ID')]):
84-
return response_base.success()
100+
async def delete_task_scheduler(pk: Annotated[int, Path(description='任务调度 ID')]):
101+
count = await task_scheduler_service.delete(pk=pk)
102+
if count > 0:
103+
return response_base.success()
104+
return response_base.fail()
85105

86106

87107
@router.post(
@@ -93,8 +113,8 @@ async def delete_scheduler(pk: Annotated[int, Path(description='任务调度 ID'
93113
],
94114
)
95115
async def execute_task(pk: Annotated[int, Path(description='任务调度 ID')]) -> ResponseSchemaModel[str]:
96-
task = task_scheduler_service.execute(pk=pk)
97-
return response_base.success(data=task)
116+
await task_scheduler_service.execute(pk=pk)
117+
return response_base.success()
98118

99119

100120
@router.delete(
@@ -106,5 +126,5 @@ async def execute_task(pk: Annotated[int, Path(description='任务调度 ID')])
106126
],
107127
)
108128
async def revoke_task(task_id: Annotated[str, Path(description='任务 UUID')]) -> ResponseModel:
109-
task_scheduler_service.revoke(task_id=task_id)
129+
await task_scheduler_service.revoke(task_id=task_id)
110130
return response_base.success()
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
from typing import Sequence
4+
5+
from sqlalchemy import Select
6+
from sqlalchemy.ext.asyncio import AsyncSession
7+
from sqlalchemy_crud_plus import CRUDPlus
8+
9+
from backend.app.task.model import TaskScheduler
10+
from backend.app.task.schema.scheduler import CreateTaskSchedulerParam, UpdateTaskSchedulerParam
11+
12+
13+
class CRUDTaskScheduler(CRUDPlus[TaskScheduler]):
14+
"""任务调度数据库操作类"""
15+
16+
async def get(self, db: AsyncSession, pk: int) -> TaskScheduler | None:
17+
"""
18+
获取任务调度
19+
20+
:param db: 数据库会话
21+
:param pk: 任务调度 ID
22+
:return:
23+
"""
24+
return await task_scheduler_dao.select_model(db, pk)
25+
26+
async def get_all(self, db: AsyncSession) -> Sequence[TaskScheduler]:
27+
"""
28+
获取所有任务调度
29+
30+
:param db: 数据库会话
31+
:return:
32+
"""
33+
return await self.select_models(db)
34+
35+
async def get_list(self, name: str | None, type: int | None) -> Select:
36+
"""
37+
获取任务调度列表
38+
39+
:param name: 任务调度名称
40+
:param type: 任务调度类型
41+
:return:
42+
"""
43+
filters = {}
44+
45+
if name is not None:
46+
filters['name__like'] = f'%{name}%'
47+
if type is not None:
48+
filters['type'] = type
49+
50+
return await self.select_order('id', **filters)
51+
52+
async def get_by_name(self, db: AsyncSession, name: str) -> TaskScheduler | None:
53+
"""
54+
通过名称获取任务调度
55+
56+
:param db: 数据库会话
57+
:param name: 任务调度名称
58+
:return:
59+
"""
60+
return await self.select_model_by_column(db, name=name)
61+
62+
async def create(self, db: AsyncSession, obj: CreateTaskSchedulerParam) -> None:
63+
"""
64+
创建任务调度
65+
66+
:param db: 数据库会话
67+
:param obj: 创建任务调度参数
68+
:return:
69+
"""
70+
await self.create_model(db, obj)
71+
72+
async def update(self, db: AsyncSession, pk: int, obj: UpdateTaskSchedulerParam) -> int:
73+
"""
74+
更新任务调度
75+
76+
:param db: 数据库会话
77+
:param pk: 任务调度 ID
78+
:param obj: 更新任务调度参数
79+
:return:
80+
"""
81+
return await self.update_model(db, pk, obj)
82+
83+
async def set_status(self, db: AsyncSession, pk: int, status: bool) -> int:
84+
"""
85+
设置任务调度状态
86+
87+
:param db: 数据库会话
88+
:param pk: 任务调度 ID
89+
:param status: 状态
90+
:return:
91+
"""
92+
return await self.update_model(db, pk, {'status': status})
93+
94+
async def delete(self, db: AsyncSession, pk: int) -> int:
95+
"""
96+
删除任务调度
97+
98+
:param db: 数据库会话
99+
:param pk: 任务调度 ID
100+
:return:
101+
"""
102+
return await self.delete_model(db, pk)
103+
104+
105+
task_scheduler_dao: CRUDTaskScheduler = CRUDTaskScheduler(TaskScheduler)

backend/app/task/schema/scheduler.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
# -*- coding: utf-8 -*-
33
from datetime import datetime
44

5-
from pydantic import Field
5+
from pydantic import ConfigDict, Field
66

77
from backend.app.task.enums import PeriodType, TaskSchedulerType
88
from backend.common.schema import SchemaBase
99

1010

11-
class TaskSchedulerParam(SchemaBase):
11+
class TaskSchedulerSchemeBase(SchemaBase):
1212
"""任务调度参数"""
1313

1414
name: str = Field(description='任务名称')
@@ -25,16 +25,25 @@ class TaskSchedulerParam(SchemaBase):
2525
type: TaskSchedulerType = Field(default=TaskSchedulerType.INTERVAL, description='任务调度类型(0间隔 1定时)')
2626
interval_every: int | None = Field(default=None, description='任务再次运行前的间隔周期数')
2727
interval_period: PeriodType = Field(default=None, description='任务运行之间的周期类型')
28-
crontab_minute: str | None = Field(default=None, description='运行的分钟,"*" 表示全部')
29-
crontab_hour: str | None = Field(default=None, description='运行的小时,"*" 表示全部')
30-
crontab_day_of_week: str | None = Field(default=None, description='运行的星期,"*" 表示全部')
31-
crontab_day_of_month: str | None = Field(default=None, description='运行的每月日期,"*" 表示全部')
32-
crontab_month_of_year: str | None = Field(default=None, description='运行的月份,"*" 表示全部')
28+
crontab_minute: str | None = Field(default='*', description='运行的分钟,"*" 表示全部')
29+
crontab_hour: str | None = Field(default='*', description='运行的小时,"*" 表示全部')
30+
crontab_day_of_week: str | None = Field(default='*', description='运行的星期,"*" 表示全部')
31+
crontab_day_of_month: str | None = Field(default='*', description='运行的每月日期,"*" 表示全部')
32+
crontab_month_of_year: str | None = Field(default='*', description='运行的月份,"*" 表示全部')
3333
one_off: bool = Field(default=False, description='是否仅运行一次')
34-
enabled: bool = Field(default=True, description='是否启用任务')
3534
total_run_count: int = Field(default=0, description='任务触发的总次数')
3635
remark: str | None = Field(default=None, description='备注')
3736

3837

39-
class CreateTaskSchedulerParam(TaskSchedulerParam):
38+
class CreateTaskSchedulerParam(TaskSchedulerSchemeBase):
4039
"""创建任务调度参数"""
40+
41+
42+
class UpdateTaskSchedulerParam(TaskSchedulerSchemeBase):
43+
"""更新任务调度参数"""
44+
45+
46+
class GetTaskSchedulerDetail(TaskSchedulerSchemeBase):
47+
"""任务调度详情"""
48+
49+
model_config = ConfigDict(from_attributes=True)

0 commit comments

Comments
 (0)