feat(client): connect PDD task list to SQLite (#9)
This commit is contained in:
@@ -19,3 +19,118 @@
|
||||
(模板见 `docs/client/05-ui-specification.md` §9.1);
|
||||
只有必须让用户当场做决定时才用模态对话框。
|
||||
"""
|
||||
|
||||
from typing import Dict, Optional
|
||||
|
||||
from PyQt5.QtCore import QObject
|
||||
|
||||
from .pdd_ui import PDDTaskPage, TaskRow
|
||||
from .task_models import TaskFilters, TaskStatus, TaskSummary, TaskType
|
||||
from .task_repository import TaskRepository
|
||||
|
||||
|
||||
TASK_TYPE_BY_TEXT = {
|
||||
"采集": TaskType.COLLECT,
|
||||
"采购": TaskType.PURCHASE,
|
||||
}
|
||||
|
||||
TASK_STATUS_BY_TEXT = {
|
||||
"待执行": TaskStatus.CLAIMED,
|
||||
"执行中": TaskStatus.RUNNING,
|
||||
"结果待提交": TaskStatus.RESULT_PENDING,
|
||||
"等待重试": TaskStatus.RETRY_WAIT,
|
||||
"需要人工处理": TaskStatus.MANUAL_REVIEW,
|
||||
"已完成": TaskStatus.SUCCEEDED,
|
||||
"失败": TaskStatus.FAILED,
|
||||
"已取消": TaskStatus.CANCELLED,
|
||||
}
|
||||
|
||||
TASK_TYPE_TEXT = {
|
||||
TaskType.COLLECT: "采集",
|
||||
TaskType.PURCHASE: "采购",
|
||||
}
|
||||
|
||||
TASK_STATUS_TEXT = {
|
||||
TaskStatus.CLAIMED: "待执行",
|
||||
TaskStatus.RUNNING: "执行中",
|
||||
TaskStatus.RESULT_PENDING: "结果待提交",
|
||||
TaskStatus.RETRY_WAIT: "等待重试",
|
||||
TaskStatus.MANUAL_REVIEW: "需要人工处理",
|
||||
TaskStatus.SUCCEEDED: "已完成",
|
||||
TaskStatus.FAILED: "失败",
|
||||
TaskStatus.CANCELLED: "已取消",
|
||||
}
|
||||
|
||||
|
||||
class PDDTaskPageEvent(QObject):
|
||||
"""把 PDD 页面只读操作连接到本地任务 Repository。"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
page: PDDTaskPage,
|
||||
repository: Optional[TaskRepository] = None,
|
||||
parent=None,
|
||||
):
|
||||
super().__init__(parent or page)
|
||||
self._page = page
|
||||
self._repository = repository or TaskRepository()
|
||||
self._filters = TaskFilters()
|
||||
|
||||
page.searchRequested.connect(self.search_tasks)
|
||||
page.refreshRequested.connect(self.refresh_tasks)
|
||||
page.taskModel.loadMoreRequested.connect(self._load_page)
|
||||
|
||||
def load_initial_tasks(self) -> None:
|
||||
"""应用启动后读取第一页本地任务。"""
|
||||
|
||||
self._reload()
|
||||
|
||||
def search_tasks(self, values: Dict[str, str]) -> None:
|
||||
"""把界面中文筛选值转换成领域筛选,并重新查询。"""
|
||||
|
||||
self._filters = TaskFilters(
|
||||
task_type=TASK_TYPE_BY_TEXT.get(values.get("task_type", "全部")),
|
||||
status=TASK_STATUS_BY_TEXT.get(values.get("status", "全部")),
|
||||
keyword=values.get("keyword", "").strip(),
|
||||
)
|
||||
self._reload()
|
||||
|
||||
def refresh_tasks(self) -> None:
|
||||
"""使用当前筛选条件刷新列表。"""
|
||||
|
||||
self._reload()
|
||||
|
||||
def _reload(self) -> None:
|
||||
self._page.begin_task_reload()
|
||||
self._page.taskModel.fetchMore()
|
||||
|
||||
def _load_page(self, offset: int, limit: int) -> None:
|
||||
try:
|
||||
summaries = self._repository.list_tasks(
|
||||
filters=self._filters,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
)
|
||||
except Exception:
|
||||
self._page.set_load_error("无法读取本地任务,请检查数据库后重试。")
|
||||
return
|
||||
|
||||
rows = [summary_to_row(summary) for summary in summaries]
|
||||
self._page.append_task_page(rows, has_more=len(rows) == limit)
|
||||
|
||||
|
||||
def summary_to_row(summary: TaskSummary) -> TaskRow:
|
||||
"""把领域摘要转换成只供表格显示的轻量行。"""
|
||||
|
||||
return TaskRow(
|
||||
remote_task_id=summary.remote_task_id,
|
||||
task_type=TASK_TYPE_TEXT[summary.task_type],
|
||||
goods_id=summary.goods_id or "",
|
||||
title=summary.title or "",
|
||||
color=summary.target_color or "",
|
||||
size=summary.target_size or "",
|
||||
price_cents=summary.price_cent,
|
||||
quantity=summary.quantity,
|
||||
status=TASK_STATUS_TEXT[summary.status],
|
||||
updated_at=summary.updated_at,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user