feat: 完成T-204b采集自动回写
采集完成且本轮有成功采集任务时,Tab① 自动启动 WriteBackWorker 回写旧标题和旧封面路径到当前批次 Excel。 保留手动回写旧数据到 Excel 作为自动回写失败后的重试入口;原 Excel 被占用时提示关闭文件后手动重试,SQLite 采集结果不回滚。 新增 GUI 测试覆盖自动触发、无成功采集不触发、锁文件提示手动重试;同步 T-204b 任务状态、current-state、api、architecture 与 progress。
This commit is contained in:
+47
-15
@@ -349,16 +349,34 @@ if QT_IMPORT_ERROR is None:
|
||||
if not batch_id:
|
||||
self._set_status("没有可回写批次")
|
||||
return
|
||||
self._start_write_back(batch_id)
|
||||
|
||||
def _start_write_back(self, batch_id, auto=False):
|
||||
if self.write_back_thread is not None:
|
||||
self._set_status("Excel 回写正在进行...")
|
||||
return False
|
||||
worker = WriteBackWorker(batch_id, db_path=self.db_path)
|
||||
worker.failed.connect(self._on_write_back_failed)
|
||||
worker.finished.connect(self._on_write_back_finished)
|
||||
worker.failed.connect(
|
||||
lambda task_id, error, auto=auto: self._on_write_back_failed(
|
||||
task_id,
|
||||
error,
|
||||
auto=auto,
|
||||
)
|
||||
)
|
||||
worker.finished.connect(
|
||||
lambda payload, auto=auto: self._on_write_back_finished(
|
||||
payload,
|
||||
auto=auto,
|
||||
)
|
||||
)
|
||||
thread = run_worker(worker, thread_name="WriteBackWorker", start=False)
|
||||
thread.finished.connect(lambda: self._forget_write_back_thread(thread))
|
||||
self.write_back_worker = worker
|
||||
self.write_back_thread = thread
|
||||
self._set_write_back_running(True)
|
||||
self._set_status("正在回写旧数据到 Excel...")
|
||||
self._set_status("正在自动回写旧数据到 Excel..." if auto else "正在回写旧数据到 Excel...")
|
||||
thread.start()
|
||||
return True
|
||||
|
||||
def _active_batch_id(self):
|
||||
if self.current_batch_id:
|
||||
@@ -415,13 +433,22 @@ if QT_IMPORT_ERROR is None:
|
||||
def _on_collect_finished(self, payload):
|
||||
self._set_collect_running(False)
|
||||
self.refresh_tasks()
|
||||
self._set_status(
|
||||
"采集完成:成功{collected},略过{skipped},失败{failed}".format(
|
||||
collected=payload.get("collected", 0),
|
||||
skipped=payload.get("skipped", 0),
|
||||
failed=payload.get("failed", 0),
|
||||
)
|
||||
message = "采集完成:成功{collected},略过{skipped},失败{failed}".format(
|
||||
collected=payload.get("collected", 0),
|
||||
skipped=payload.get("skipped", 0),
|
||||
failed=payload.get("failed", 0),
|
||||
)
|
||||
if payload.get("collected", 0) > 0:
|
||||
batch_id = self._active_batch_id()
|
||||
if batch_id and self._start_write_back(batch_id, auto=True):
|
||||
self._set_status(f"{message},正在自动回写 Excel...")
|
||||
return
|
||||
if not batch_id:
|
||||
self._set_status(f"{message},但没有可回写批次")
|
||||
return
|
||||
self._set_status(f"{message},Excel 回写已在进行")
|
||||
return
|
||||
self._set_status(message)
|
||||
|
||||
def _on_collect_cancelled(self, payload):
|
||||
self._set_collect_running(False)
|
||||
@@ -433,22 +460,27 @@ if QT_IMPORT_ERROR is None:
|
||||
)
|
||||
)
|
||||
|
||||
def _on_write_back_failed(self, task_id, error):
|
||||
message = f"Excel 回写失败:{error}"
|
||||
def _on_write_back_failed(self, task_id, error, auto=False):
|
||||
message = f"Excel {'自动' if auto else ''}回写失败:{error}"
|
||||
if "被占用" in str(error):
|
||||
message += "\n请关闭原 Excel 后重试;SQLite 已保留采集结果,也可另存副本。"
|
||||
if auto:
|
||||
message += "\n请关闭原 Excel 后点击「回写旧数据到 Excel」手动重试;SQLite 已保留采集结果,也可另存副本。"
|
||||
else:
|
||||
message += "\n请关闭原 Excel 后重试;SQLite 已保留采集结果,也可另存副本。"
|
||||
QMessageBox.warning(self, "回写旧数据", message)
|
||||
self._set_status(message.replace("\n", " "))
|
||||
|
||||
def _on_write_back_finished(self, payload):
|
||||
def _on_write_back_finished(self, payload, auto=False):
|
||||
self._set_write_back_running(False)
|
||||
if payload.get("ok") is False:
|
||||
error = payload.get("error") or "未知错误"
|
||||
self._set_status(f"Excel 回写失败:{error}")
|
||||
retry_hint = ",可点击「回写旧数据到 Excel」手动重试" if auto else ""
|
||||
self._set_status(f"Excel {'自动' if auto else ''}回写失败:{error}{retry_hint}")
|
||||
return
|
||||
self.refresh_tasks()
|
||||
self._set_status(
|
||||
"Excel 回写完成:文件{files},行{rows}".format(
|
||||
"Excel {prefix}回写完成:文件{files},行{rows}".format(
|
||||
prefix="自动" if auto else "",
|
||||
files=payload.get("files", 0),
|
||||
rows=payload.get("rows", 0),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user