jettask 0.2.15__py3-none-any.whl → 0.2.16__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. jettask/__init__.py +14 -35
  2. jettask/{webui/__main__.py → __main__.py} +4 -4
  3. jettask/api/__init__.py +103 -0
  4. jettask/api/v1/__init__.py +29 -0
  5. jettask/api/v1/alerts.py +226 -0
  6. jettask/api/v1/analytics.py +323 -0
  7. jettask/api/v1/namespaces.py +134 -0
  8. jettask/api/v1/overview.py +136 -0
  9. jettask/api/v1/queues.py +530 -0
  10. jettask/api/v1/scheduled.py +420 -0
  11. jettask/api/v1/settings.py +44 -0
  12. jettask/{webui/api.py → api.py} +4 -46
  13. jettask/{webui/backend → backend}/main.py +21 -109
  14. jettask/{webui/backend → backend}/main_unified.py +1 -1
  15. jettask/{webui/backend → backend}/namespace_api_old.py +3 -30
  16. jettask/{webui/backend → backend}/namespace_data_access.py +2 -1
  17. jettask/{webui/backend → backend}/unified_api_router.py +14 -74
  18. jettask/{core/cli.py → cli.py} +106 -26
  19. jettask/config/nacos_config.py +386 -0
  20. jettask/core/app.py +8 -100
  21. jettask/core/db_manager.py +515 -0
  22. jettask/core/event_pool.py +5 -2
  23. jettask/core/unified_manager_base.py +47 -14
  24. jettask/{webui/db_init.py → db_init.py} +1 -1
  25. jettask/executors/asyncio.py +2 -2
  26. jettask/{webui/integrated_gradio_app.py → integrated_gradio_app.py} +1 -1
  27. jettask/{webui/multi_namespace_consumer.py → multi_namespace_consumer.py} +5 -2
  28. jettask/{webui/pg_consumer.py → pg_consumer.py} +137 -69
  29. jettask/{webui/run.py → run.py} +1 -1
  30. jettask/{webui/run_webui.py → run_webui.py} +4 -4
  31. jettask/scheduler/multi_namespace_scheduler.py +2 -2
  32. jettask/scheduler/unified_manager.py +5 -5
  33. jettask/scheduler/unified_scheduler_manager.py +1 -1
  34. jettask/schemas/__init__.py +166 -0
  35. jettask/schemas/alert.py +99 -0
  36. jettask/schemas/backlog.py +122 -0
  37. jettask/schemas/common.py +139 -0
  38. jettask/schemas/monitoring.py +181 -0
  39. jettask/schemas/namespace.py +168 -0
  40. jettask/schemas/queue.py +83 -0
  41. jettask/schemas/scheduled_task.py +128 -0
  42. jettask/schemas/task.py +70 -0
  43. jettask/services/__init__.py +24 -0
  44. jettask/services/alert_service.py +454 -0
  45. jettask/services/analytics_service.py +46 -0
  46. jettask/services/overview_service.py +978 -0
  47. jettask/services/queue_service.py +711 -0
  48. jettask/services/redis_monitor_service.py +151 -0
  49. jettask/services/scheduled_task_service.py +207 -0
  50. jettask/services/settings_service.py +758 -0
  51. jettask/services/task_service.py +157 -0
  52. jettask/{webui/task_center.py → task_center.py} +30 -8
  53. jettask/{webui/task_center_client.py → task_center_client.py} +1 -1
  54. jettask/{webui/config.py → webui_config.py} +6 -1
  55. jettask/webui_exceptions.py +67 -0
  56. jettask/webui_sql/verify_database.sql +72 -0
  57. {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/METADATA +2 -1
  58. jettask-0.2.16.dist-info/RECORD +150 -0
  59. {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/entry_points.txt +1 -1
  60. jettask/webui/backend/data_api.py +0 -3294
  61. jettask/webui/backend/namespace_api.py +0 -295
  62. jettask/webui/backend/queue_backlog_api.py +0 -727
  63. jettask/webui/backend/redis_monitor_api.py +0 -476
  64. jettask/webui/frontend/index.html +0 -13
  65. jettask/webui/frontend/package.json +0 -30
  66. jettask/webui/frontend/src/App.css +0 -109
  67. jettask/webui/frontend/src/App.jsx +0 -66
  68. jettask/webui/frontend/src/components/NamespaceSelector.jsx +0 -166
  69. jettask/webui/frontend/src/components/QueueBacklogChart.jsx +0 -298
  70. jettask/webui/frontend/src/components/QueueBacklogTrend.jsx +0 -638
  71. jettask/webui/frontend/src/components/QueueDetailsTable.css +0 -65
  72. jettask/webui/frontend/src/components/QueueDetailsTable.jsx +0 -487
  73. jettask/webui/frontend/src/components/QueueDetailsTableV2.jsx +0 -465
  74. jettask/webui/frontend/src/components/ScheduledTaskFilter.jsx +0 -423
  75. jettask/webui/frontend/src/components/TaskFilter.jsx +0 -425
  76. jettask/webui/frontend/src/components/TimeRangeSelector.css +0 -21
  77. jettask/webui/frontend/src/components/TimeRangeSelector.jsx +0 -160
  78. jettask/webui/frontend/src/components/charts/QueueChart.jsx +0 -111
  79. jettask/webui/frontend/src/components/charts/QueueTrendChart.jsx +0 -115
  80. jettask/webui/frontend/src/components/charts/WorkerChart.jsx +0 -40
  81. jettask/webui/frontend/src/components/common/StatsCard.jsx +0 -18
  82. jettask/webui/frontend/src/components/layout/AppLayout.css +0 -95
  83. jettask/webui/frontend/src/components/layout/AppLayout.jsx +0 -49
  84. jettask/webui/frontend/src/components/layout/Header.css +0 -106
  85. jettask/webui/frontend/src/components/layout/Header.jsx +0 -106
  86. jettask/webui/frontend/src/components/layout/SideMenu.css +0 -137
  87. jettask/webui/frontend/src/components/layout/SideMenu.jsx +0 -209
  88. jettask/webui/frontend/src/components/layout/TabsNav.css +0 -244
  89. jettask/webui/frontend/src/components/layout/TabsNav.jsx +0 -206
  90. jettask/webui/frontend/src/components/layout/UserInfo.css +0 -197
  91. jettask/webui/frontend/src/components/layout/UserInfo.jsx +0 -197
  92. jettask/webui/frontend/src/contexts/LoadingContext.jsx +0 -27
  93. jettask/webui/frontend/src/contexts/NamespaceContext.jsx +0 -72
  94. jettask/webui/frontend/src/contexts/TabsContext.backup.jsx +0 -245
  95. jettask/webui/frontend/src/index.css +0 -114
  96. jettask/webui/frontend/src/main.jsx +0 -22
  97. jettask/webui/frontend/src/pages/Alerts.jsx +0 -684
  98. jettask/webui/frontend/src/pages/Dashboard/index.css +0 -35
  99. jettask/webui/frontend/src/pages/Dashboard/index.jsx +0 -281
  100. jettask/webui/frontend/src/pages/Dashboard.jsx +0 -1330
  101. jettask/webui/frontend/src/pages/QueueDetail.jsx +0 -1117
  102. jettask/webui/frontend/src/pages/QueueMonitor.jsx +0 -527
  103. jettask/webui/frontend/src/pages/Queues.jsx +0 -12
  104. jettask/webui/frontend/src/pages/ScheduledTasks.jsx +0 -810
  105. jettask/webui/frontend/src/pages/Settings.jsx +0 -801
  106. jettask/webui/frontend/src/pages/Workers.jsx +0 -12
  107. jettask/webui/frontend/src/services/api.js +0 -159
  108. jettask/webui/frontend/src/services/queueTrend.js +0 -166
  109. jettask/webui/frontend/src/utils/suppressWarnings.js +0 -22
  110. jettask/webui/frontend/src/utils/userPreferences.js +0 -154
  111. jettask/webui/frontend/vite.config.js +0 -26
  112. jettask/webui/sql/init_database.sql +0 -640
  113. jettask-0.2.15.dist-info/RECORD +0 -172
  114. /jettask/{webui/backend → backend}/__init__.py +0 -0
  115. /jettask/{webui/backend → backend}/api/__init__.py +0 -0
  116. /jettask/{webui/backend → backend}/api/v1/__init__.py +0 -0
  117. /jettask/{webui/backend → backend}/api/v1/monitoring.py +0 -0
  118. /jettask/{webui/backend → backend}/api/v1/namespaces.py +0 -0
  119. /jettask/{webui/backend → backend}/api/v1/queues.py +0 -0
  120. /jettask/{webui/backend → backend}/api/v1/tasks.py +0 -0
  121. /jettask/{webui/backend → backend}/config.py +0 -0
  122. /jettask/{webui/backend → backend}/core/__init__.py +0 -0
  123. /jettask/{webui/backend → backend}/core/cache.py +0 -0
  124. /jettask/{webui/backend → backend}/core/database.py +0 -0
  125. /jettask/{webui/backend → backend}/core/exceptions.py +0 -0
  126. /jettask/{webui/backend → backend}/data_access.py +0 -0
  127. /jettask/{webui/backend → backend}/dependencies.py +0 -0
  128. /jettask/{webui/backend → backend}/init_meta_db.py +0 -0
  129. /jettask/{webui/backend → backend}/main_v2.py +0 -0
  130. /jettask/{webui/backend → backend}/models/__init__.py +0 -0
  131. /jettask/{webui/backend → backend}/models/requests.py +0 -0
  132. /jettask/{webui/backend → backend}/models/responses.py +0 -0
  133. /jettask/{webui/backend → backend}/queue_stats_v2.py +0 -0
  134. /jettask/{webui/backend → backend}/services/__init__.py +0 -0
  135. /jettask/{webui/backend → backend}/start.py +0 -0
  136. /jettask/{webui/cleanup_deprecated_tables.sql → cleanup_deprecated_tables.sql} +0 -0
  137. /jettask/{webui/gradio_app.py → gradio_app.py} +0 -0
  138. /jettask/{webui/__init__.py → main.py} +0 -0
  139. /jettask/{webui/models.py → models.py} +0 -0
  140. /jettask/{webui/run_monitor.py → run_monitor.py} +0 -0
  141. /jettask/{webui/schema.sql → schema.sql} +0 -0
  142. /jettask/{webui/unified_consumer_manager.py → unified_consumer_manager.py} +0 -0
  143. /jettask/{webui/models → webui_models}/__init__.py +0 -0
  144. /jettask/{webui/models → webui_models}/namespace.py +0 -0
  145. /jettask/{webui/sql → webui_sql}/batch_upsert_functions.sql +0 -0
  146. {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/WHEEL +0 -0
  147. {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/licenses/LICENSE +0 -0
  148. {jettask-0.2.15.dist-info → jettask-0.2.16.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,83 @@
1
+ """
2
+ 队列相关的数据模型
3
+ """
4
+ from typing import Optional, List, Dict, Any
5
+ from datetime import datetime
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class TimeRangeQuery(BaseModel):
10
+ """时间范围查询模型"""
11
+ queues: Optional[List[str]] = Field(None, description="队列名称列表,为空时统计所有队列")
12
+ time_range: Optional[str] = Field(None, description="时间范围(如 '1h', '24h', '7d'),与 start_time/end_time 二选一")
13
+ start_time: Optional[str] = Field(None, description="开始时间,与 time_range 二选一")
14
+ end_time: Optional[str] = Field(None, description="结束时间,与 time_range 二选一")
15
+ interval: Optional[str] = Field(default="1h", description="时间间隔")
16
+
17
+
18
+ class QueueStatsResponse(BaseModel):
19
+ """队列统计响应模型"""
20
+ queue_name: str = Field(..., description="队列名称")
21
+ pending_count: int = Field(default=0, description="待处理任务数")
22
+ processing_count: int = Field(default=0, description="处理中任务数")
23
+ completed_count: int = Field(default=0, description="已完成任务数")
24
+ failed_count: int = Field(default=0, description="失败任务数")
25
+ success_rate: float = Field(default=0.0, description="成功率")
26
+ avg_processing_time: Optional[float] = Field(None, description="平均处理时间")
27
+
28
+
29
+ class QueueTimelineResponse(BaseModel):
30
+ """队列时间线响应模型"""
31
+ queue_name: str = Field(..., description="队列名称")
32
+ timeline: List[Dict[str, Any]] = Field(default=[], description="时间线数据")
33
+
34
+
35
+ class TrimQueueRequest(BaseModel):
36
+ """修剪队列请求模型"""
37
+ queue_name: str = Field(..., description="队列名称")
38
+ max_length: int = Field(..., ge=1, description="最大长度")
39
+ trim_strategy: str = Field(default="oldest", description="修剪策略", pattern="^(oldest|newest)$")
40
+
41
+
42
+ class QueueInfo(BaseModel):
43
+ """队列信息模型"""
44
+ name: str = Field(..., description="队列名称")
45
+ namespace: str = Field(..., description="命名空间")
46
+ pending_count: int = Field(default=0, description="待处理任务数")
47
+ processing_count: int = Field(default=0, description="处理中任务数")
48
+ completed_count: int = Field(default=0, description="已完成任务数")
49
+ failed_count: int = Field(default=0, description="失败任务数")
50
+ created_at: Optional[datetime] = Field(None, description="创建时间")
51
+ updated_at: Optional[datetime] = Field(None, description="更新时间")
52
+
53
+ class Config:
54
+ json_encoders = {
55
+ datetime: lambda v: v.isoformat() if v else None
56
+ }
57
+
58
+
59
+ class QueueStats(BaseModel):
60
+ """队列统计模型"""
61
+ queue_name: str = Field(..., description="队列名称")
62
+ total_tasks: int = Field(default=0, description="总任务数")
63
+ pending_tasks: int = Field(default=0, description="待处理任务数")
64
+ processing_tasks: int = Field(default=0, description="处理中任务数")
65
+ completed_tasks: int = Field(default=0, description="已完成任务数")
66
+ failed_tasks: int = Field(default=0, description="失败任务数")
67
+ success_rate: float = Field(default=0.0, description="成功率")
68
+ avg_processing_time: Optional[float] = Field(None, description="平均处理时间")
69
+ throughput: Optional[float] = Field(None, description="吞吐量(任务/秒)")
70
+ last_activity: Optional[datetime] = Field(None, description="最后活动时间")
71
+
72
+ class Config:
73
+ json_encoders = {
74
+ datetime: lambda v: v.isoformat() if v else None
75
+ }
76
+
77
+
78
+ class QueueActionRequest(BaseModel):
79
+ """队列操作请求模型"""
80
+ queue_names: List[str] = Field(..., min_items=1, description="队列名称列表")
81
+ action: str = Field(..., description="操作类型", pattern="^(pause|resume|clear|delete)$")
82
+ reason: Optional[str] = Field(None, description="操作原因")
83
+ force: bool = Field(default=False, description="是否强制执行")
@@ -0,0 +1,128 @@
1
+ """
2
+ 定时任务相关的数据模型
3
+ """
4
+ from typing import Optional, Dict, Any
5
+ from datetime import datetime
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class ScheduleConfig(BaseModel):
10
+ """调度配置模型"""
11
+ schedule_type: str = Field(..., description="调度类型", pattern="^(cron|interval)$")
12
+ cron_expression: Optional[str] = Field(None, description="Cron表达式(当schedule_type为cron时)")
13
+ interval_seconds: Optional[int] = Field(None, ge=1, description="间隔秒数(当schedule_type为interval时)")
14
+ timezone: str = Field(default="UTC", description="时区")
15
+ max_instances: int = Field(default=1, ge=1, description="最大实例数")
16
+
17
+ def validate_schedule_config(self):
18
+ """验证调度配置"""
19
+ if self.schedule_type == "cron" and not self.cron_expression:
20
+ raise ValueError("Cron类型调度必须提供cron_expression")
21
+ if self.schedule_type == "interval" and not self.interval_seconds:
22
+ raise ValueError("Interval类型调度必须提供interval_seconds")
23
+
24
+
25
+ class ScheduledTaskRequest(BaseModel):
26
+ """定时任务请求模型"""
27
+ task_name: str = Field(..., description="任务名称")
28
+ task_function: str = Field(..., description="任务函数")
29
+ schedule_config: ScheduleConfig = Field(..., description="调度配置")
30
+ task_args: Optional[list] = Field(default=[], description="任务参数")
31
+ task_kwargs: Optional[Dict[str, Any]] = Field(default={}, description="任务关键字参数")
32
+ queue_name: Optional[str] = Field(None, description="队列名称")
33
+ priority: int = Field(default=0, description="优先级")
34
+ enabled: bool = Field(default=True, description="是否启用")
35
+ description: Optional[str] = Field(None, description="任务描述")
36
+
37
+
38
+ class ScheduledTaskCreate(BaseModel):
39
+ """创建定时任务请求模型"""
40
+ name: str = Field(..., description="任务名称")
41
+ task_function: str = Field(..., description="任务函数")
42
+ schedule_type: str = Field(..., description="调度类型", pattern="^(cron|interval)$")
43
+ cron_expression: Optional[str] = Field(None, description="Cron表达式")
44
+ interval_seconds: Optional[int] = Field(None, ge=1, description="间隔秒数")
45
+ task_args: Optional[list] = Field(default=[], description="任务参数")
46
+ task_kwargs: Optional[Dict[str, Any]] = Field(default={}, description="任务关键字参数")
47
+ enabled: bool = Field(default=True, description="是否启用")
48
+ description: Optional[str] = Field(None, description="任务描述")
49
+
50
+
51
+ class ScheduledTaskUpdate(BaseModel):
52
+ """更新定时任务请求模型"""
53
+ name: Optional[str] = Field(None, description="任务名称")
54
+ task_function: Optional[str] = Field(None, description="任务函数")
55
+ schedule_type: Optional[str] = Field(None, description="调度类型")
56
+ cron_expression: Optional[str] = Field(None, description="Cron表达式")
57
+ interval_seconds: Optional[int] = Field(None, ge=1, description="间隔秒数")
58
+ task_args: Optional[list] = Field(None, description="任务参数")
59
+ task_kwargs: Optional[Dict[str, Any]] = Field(None, description="任务关键字参数")
60
+ enabled: Optional[bool] = Field(None, description="是否启用")
61
+ description: Optional[str] = Field(None, description="任务描述")
62
+
63
+
64
+ class ScheduledTaskCreateRequest(BaseModel):
65
+ """定时任务创建请求模型(详细版)"""
66
+ task_name: str = Field(..., min_length=1, max_length=255, description="任务名称")
67
+ task_function: str = Field(..., min_length=1, description="任务函数路径")
68
+ schedule_type: str = Field(..., description="调度类型", pattern="^(cron|interval|once)$")
69
+ cron_expression: Optional[str] = Field(None, description="Cron表达式")
70
+ interval_seconds: Optional[int] = Field(None, ge=1, le=86400*365, description="间隔秒数")
71
+ start_time: Optional[datetime] = Field(None, description="开始时间")
72
+ end_time: Optional[datetime] = Field(None, description="结束时间")
73
+ task_args: list = Field(default=[], description="任务参数")
74
+ task_kwargs: Dict[str, Any] = Field(default={}, description="任务关键字参数")
75
+ queue_name: Optional[str] = Field(None, description="目标队列")
76
+ priority: int = Field(default=0, ge=0, le=100, description="优先级")
77
+ max_retries: int = Field(default=3, ge=0, le=10, description="最大重试次数")
78
+ timeout: Optional[int] = Field(None, ge=1, description="超时时间(秒)")
79
+ enabled: bool = Field(default=True, description="是否启用")
80
+ description: Optional[str] = Field(None, max_length=1000, description="任务描述")
81
+
82
+
83
+ class ScheduledTaskResponse(BaseModel):
84
+ """定时任务响应模型"""
85
+ id: str = Field(..., description="任务ID")
86
+ task_name: str = Field(..., description="任务名称")
87
+ task_function: str = Field(..., description="任务函数")
88
+ schedule_type: str = Field(..., description="调度类型")
89
+ next_run_time: Optional[datetime] = Field(None, description="下次运行时间")
90
+ last_run_time: Optional[datetime] = Field(None, description="上次运行时间")
91
+ status: str = Field(..., description="任务状态")
92
+ enabled: bool = Field(..., description="是否启用")
93
+
94
+ class Config:
95
+ json_encoders = {
96
+ datetime: lambda v: v.isoformat() if v else None
97
+ }
98
+
99
+
100
+ class ScheduledTaskInfo(BaseModel):
101
+ """定时任务详细信息模型"""
102
+ id: str = Field(..., description="任务ID")
103
+ task_name: str = Field(..., description="任务名称")
104
+ task_function: str = Field(..., description="任务函数")
105
+ schedule_type: str = Field(..., description="调度类型")
106
+ cron_expression: Optional[str] = Field(None, description="Cron表达式")
107
+ interval_seconds: Optional[int] = Field(None, description="间隔秒数")
108
+ task_args: list = Field(default=[], description="任务参数")
109
+ task_kwargs: Dict[str, Any] = Field(default={}, description="任务关键字参数")
110
+ queue_name: Optional[str] = Field(None, description="队列名称")
111
+ priority: int = Field(default=0, description="优先级")
112
+ max_retries: int = Field(default=3, description="最大重试次数")
113
+ timeout: Optional[int] = Field(None, description="超时时间")
114
+ enabled: bool = Field(default=True, description="是否启用")
115
+ status: str = Field(..., description="任务状态")
116
+ created_at: datetime = Field(..., description="创建时间")
117
+ updated_at: Optional[datetime] = Field(None, description="更新时间")
118
+ next_run_time: Optional[datetime] = Field(None, description="下次运行时间")
119
+ last_run_time: Optional[datetime] = Field(None, description="上次运行时间")
120
+ run_count: int = Field(default=0, description="运行次数")
121
+ success_count: int = Field(default=0, description="成功次数")
122
+ failure_count: int = Field(default=0, description="失败次数")
123
+ description: Optional[str] = Field(None, description="任务描述")
124
+
125
+ class Config:
126
+ json_encoders = {
127
+ datetime: lambda v: v.isoformat() if v else None
128
+ }
@@ -0,0 +1,70 @@
1
+ """
2
+ 任务相关的数据模型
3
+ """
4
+ from typing import Optional, List, Dict, Any
5
+ from datetime import datetime
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class TasksRequest(BaseModel):
10
+ """任务查询请求模型"""
11
+ queue_name: str = Field(..., description="队列名称")
12
+ page: int = Field(default=1, ge=1, description="页码")
13
+ page_size: int = Field(default=20, ge=1, le=100, description="每页大小")
14
+ filters: Optional[List[Dict]] = Field(default=[], description="筛选条件")
15
+ time_range: Optional[str] = Field(None, description="时间范围,如 '15m', '1h', '7d'")
16
+ start_time: Optional[str] = Field(None, description="开始时间")
17
+ end_time: Optional[str] = Field(None, description="结束时间")
18
+
19
+
20
+ class TaskInfo(BaseModel):
21
+ """任务信息模型"""
22
+ id: str = Field(..., description="任务ID")
23
+ queue_name: str = Field(..., description="队列名称")
24
+ status: str = Field(..., description="任务状态")
25
+ created_at: datetime = Field(..., description="创建时间")
26
+ started_at: Optional[datetime] = Field(None, description="开始时间")
27
+ completed_at: Optional[datetime] = Field(None, description="完成时间")
28
+ worker_id: Optional[str] = Field(None, description="工作节点ID")
29
+ task_name: Optional[str] = Field(None, description="任务名称")
30
+ task_data: Optional[Dict[str, Any]] = Field(None, description="任务数据")
31
+ result: Optional[Any] = Field(None, description="任务结果")
32
+ error: Optional[str] = Field(None, description="错误信息")
33
+ retry_count: int = Field(default=0, description="重试次数")
34
+ execution_time: Optional[float] = Field(None, description="执行时间(秒)")
35
+ priority: Optional[int] = Field(None, description="优先级")
36
+ consumer_group: Optional[str] = Field(None, description="消费者组")
37
+
38
+ class Config:
39
+ json_encoders = {
40
+ datetime: lambda v: v.isoformat() if v else None
41
+ }
42
+
43
+
44
+ class TaskDetailResponse(BaseModel):
45
+ """任务详细信息响应模型"""
46
+ success: bool = Field(default=True, description="请求是否成功")
47
+ data: Optional[TaskInfo] = Field(None, description="任务详细信息")
48
+ error: Optional[str] = Field(None, description="错误信息")
49
+
50
+ class Config:
51
+ json_encoders = {
52
+ datetime: lambda v: v.isoformat() if v else None
53
+ }
54
+
55
+
56
+ class TaskActionRequest(BaseModel):
57
+ """任务操作请求模型"""
58
+ task_ids: List[str] = Field(..., min_items=1, description="任务ID列表")
59
+ action: str = Field(..., description="操作类型", pattern="^(retry|cancel|delete)$")
60
+ reason: Optional[str] = Field(None, description="操作原因")
61
+
62
+
63
+ class TaskListResponse(BaseModel):
64
+ """任务列表响应模型"""
65
+ success: bool = Field(default=True, description="请求是否成功")
66
+ data: List[TaskInfo] = Field(default=[], description="任务列表")
67
+ total: int = Field(default=0, description="总记录数")
68
+ page: int = Field(default=1, description="当前页码")
69
+ page_size: int = Field(default=20, description="每页大小")
70
+ error: Optional[str] = Field(None, description="错误信息")
@@ -0,0 +1,24 @@
1
+ """
2
+ 业务逻辑服务层
3
+ 包含所有业务逻辑处理
4
+ """
5
+
6
+ from .overview_service import OverviewService
7
+ from .queue_service import QueueService
8
+ from .scheduled_task_service import ScheduledTaskService
9
+ from .alert_service import AlertService
10
+ from .analytics_service import AnalyticsService
11
+ from .settings_service import SettingsService
12
+ from .task_service import TaskService
13
+ from .redis_monitor_service import RedisMonitorService
14
+
15
+ __all__ = [
16
+ 'OverviewService',
17
+ 'QueueService',
18
+ 'ScheduledTaskService',
19
+ 'AlertService',
20
+ 'AnalyticsService',
21
+ 'SettingsService',
22
+ 'TaskService',
23
+ 'RedisMonitorService'
24
+ ]