feat(collect): support soft deletion of one task
This commit is contained in:
@@ -178,6 +178,7 @@ class CollectTab(QWidget):
|
||||
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||
self.table.setSelectionMode(QAbstractItemView.SingleSelection)
|
||||
self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
||||
self.table.setContextMenuPolicy(Qt.CustomContextMenu)
|
||||
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
||||
for column in (3, 4):
|
||||
self.table.horizontalHeader().setSectionResizeMode(column, QHeaderView.ResizeToContents)
|
||||
@@ -219,6 +220,7 @@ class CollectTab(QWidget):
|
||||
self.product_status_filter.currentIndexChanged.connect(self.refresh_tasks)
|
||||
self.status_filter.currentIndexChanged.connect(self.refresh_tasks)
|
||||
self.delete_batch_button.clicked.connect(self.delete_current_batch)
|
||||
self.table.customContextMenuRequested.connect(self._show_task_context_menu)
|
||||
self.collect_button.clicked.connect(self.collect_old_data)
|
||||
self.stop_collect_button.clicked.connect(self.stop_collect)
|
||||
self.write_back_button.clicked.connect(self.write_back_old_data)
|
||||
@@ -682,6 +684,85 @@ class CollectTab(QWidget):
|
||||
running = bool(self.collect_thread or self.write_back_thread)
|
||||
self.delete_batch_button.setEnabled((not running) and bool(self._selected_batch_id()))
|
||||
|
||||
def _show_task_context_menu(self, position):
|
||||
index = self.table.indexAt(position)
|
||||
if not index.isValid():
|
||||
return
|
||||
self.table.selectRow(index.row())
|
||||
self.table.setCurrentIndex(index)
|
||||
task = self.model.task_at(index.row())
|
||||
if task is None:
|
||||
return
|
||||
menu = QMenu(self.table)
|
||||
delete_action = menu.addAction("删除本条记录")
|
||||
delete_action.setEnabled(
|
||||
not bool(self.collect_thread or self.write_back_thread)
|
||||
and getattr(task, "status", "") != "running"
|
||||
)
|
||||
delete_action.triggered.connect(self.delete_selected_task)
|
||||
menu.exec(self.table.viewport().mapToGlobal(position))
|
||||
|
||||
def delete_selected_task(self, checked=False):
|
||||
if self.collect_thread or self.write_back_thread:
|
||||
self._set_status("采集或回写正在进行,不能删除记录", level="warning")
|
||||
return
|
||||
index = self.table.currentIndex()
|
||||
task = self.model.task_at(index.row()) if index.isValid() else None
|
||||
if task is None:
|
||||
self._set_status("请选择要删除的记录", level="warning")
|
||||
return
|
||||
if getattr(task, "status", "") == "running":
|
||||
self._set_status("任务正在处理,不能删除", level="warning")
|
||||
return
|
||||
batch = db.get_batch(task.batch_id, path=self.db_path)
|
||||
batch_text = self._batch_label(batch) if batch is not None else task.batch_id
|
||||
lines = [
|
||||
"确定要删除本条本地记录吗?",
|
||||
f"商品ID:{task.item_id}",
|
||||
f"店铺:{task.account_name or task.alias}({task.alias})",
|
||||
f"所属批次:{batch_text}",
|
||||
]
|
||||
if int(getattr(task, "committed", 0) or 0) == 1:
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
"该商品已提交过蝦皮。本次仅删除本地记录,不会回滚蝦皮线上商品。",
|
||||
]
|
||||
)
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
"删除后,该记录不会出现在①、②、③的列表、筛选、采集、生成、更新或回写范围。",
|
||||
"不会删除原 Excel、本地图片或账号 Chrome 数据。",
|
||||
]
|
||||
)
|
||||
answer = QMessageBox.question(
|
||||
self,
|
||||
"删除本条记录",
|
||||
"\n".join(lines),
|
||||
QMessageBox.Yes | QMessageBox.No,
|
||||
QMessageBox.No,
|
||||
)
|
||||
if answer != QMessageBox.Yes:
|
||||
self._set_status("已取消删除本条记录")
|
||||
return
|
||||
try:
|
||||
result = db.delete_task(
|
||||
task.id,
|
||||
reason="用户在导入采集页删除单条记录",
|
||||
path=self.db_path,
|
||||
)
|
||||
except Exception as exc:
|
||||
QMessageBox.warning(self, "删除本条记录", str(exc))
|
||||
self._set_status(f"删除本条记录失败:{exc}", level="danger")
|
||||
return
|
||||
self.refresh_tasks()
|
||||
if self.refresh_workflow_callback is not None:
|
||||
self.refresh_workflow_callback()
|
||||
message = f"已删除本地记录:商品 {result['item_id']}"
|
||||
self._set_status(message, level="success")
|
||||
QMessageBox.information(self, "删除本条记录", message)
|
||||
|
||||
def delete_current_batch(self, checked=False):
|
||||
batch_id = self._selected_batch_id()
|
||||
if not batch_id:
|
||||
|
||||
Reference in New Issue
Block a user