feat(collect): show and filter product status

This commit is contained in:
chengma
2026-07-20 10:16:25 +08:00
parent c81a24d173
commit a92f1c86f4
6 changed files with 199 additions and 12 deletions
+107
View File
@@ -424,6 +424,82 @@ class GuiTests(TempDirMixin, unittest.TestCase):
model.data(model.index(0, 3), gui.Qt.ToolTipRole),
)
def test_collect_task_model_displays_product_statuses_and_snapshot_note(self):
account = SimpleNamespace(alias="papa", account_name="papa 店铺")
tasks = [
SimpleNamespace(
alias="papa",
account_name="papa 店铺",
item_id="1001",
stage="imported",
status="pending",
last_error="",
product_status="normal",
product_status_note="历史批次默认按架上商品处理(未实时检测)",
product_status_at=None,
),
SimpleNamespace(
alias="papa",
account_name="papa 店铺",
item_id="1002",
stage="imported",
status="pending",
last_error="",
product_status="unlisted",
product_status_note="商品未上架",
product_status_at="2026-07-20T09:00:00",
),
SimpleNamespace(
alias="papa",
account_name="papa 店铺",
item_id="1003",
stage="imported",
status="pending",
last_error="",
product_status="reviewing",
product_status_note="商品审核中",
product_status_at=None,
),
SimpleNamespace(
alias="papa",
account_name="papa 店铺",
item_id="1004",
stage="imported",
status="pending",
last_error="",
product_status="unknown",
product_status_note="",
product_status_at=None,
),
SimpleNamespace(
alias="papa",
account_name="papa 店铺",
item_id="1005",
stage="imported",
status="pending",
last_error="",
product_status=None,
product_status_note=None,
product_status_at=None,
),
]
model = gui.TaskTableModel()
model.set_tasks(tasks, [account])
self.assertEqual(["账号", "别名", "商品ID", "阶段", "商品状态"], model.HEADERS)
self.assertEqual(
["架上商品", "未上架", "审核中", "状态未知", "待检测"],
[model.index(row, 4).data() for row in range(model.rowCount())],
)
self.assert_foreground(model, 0, 4, gui.COLOR_SUCCESS)
self.assert_foreground(model, 1, 4, gui.COLOR_DANGER)
self.assert_foreground(model, 2, 4, gui.COLOR_WARNING)
self.assert_foreground(model, 3, 4, gui.COLOR_MUTED)
self.assert_foreground(model, 4, 4, gui.COLOR_MUTED)
self.assertIn("未实时检测", model.index(0, 4).data(Qt.ToolTipRole))
self.assertIn("检测时间", model.index(1, 4).data(Qt.ToolTipRole))
self.assertEqual("尚未检测商品状态", model.index(4, 4).data(Qt.ToolTipRole))
def test_workflow_failed_tooltips_show_failed_step_and_reason(self):
account = SimpleNamespace(alias="papa", account_name="papa 店铺")
collect_task = SimpleNamespace(
@@ -8329,18 +8405,48 @@ class GuiTests(TempDirMixin, unittest.TestCase):
tasks = {task.item_id: task for task in db.list_tasks(batch_id=batch_id, path=cfg["db_path"])}
db.set_collected(tasks["1002"].id, "旧标题", os.path.join(temp_dir, "old.jpg"), path=cfg["db_path"])
db.mark_failed(tasks["2002"].id, "collect", "采集失败", path=cfg["db_path"])
db.set_product_status(tasks["1002"].id, "normal", path=cfg["db_path"])
db.set_product_status(tasks["2001"].id, "unlisted", path=cfg["db_path"])
db.set_product_status(tasks["2002"].id, "reviewing", path=cfg["db_path"])
db.set_product_status(tasks["3001"].id, "unknown", path=cfg["db_path"])
tab = CollectTab(config=cfg)
self.addCleanup(tab.close)
self.assertEqual("collectShopFilter", tab.shop_filter.objectName())
self.assertEqual("collectItemFilter", tab.item_filter.objectName())
self.assertEqual("collectProductStatusFilter", tab.product_status_filter.objectName())
self.assertEqual("collectStatusFilter", tab.status_filter.objectName())
self.assertEqual(
["全部商品状态", "架上商品", "未上架", "审核中", "状态未知", "待检测"],
[
tab.product_status_filter.itemText(index)
for index in range(tab.product_status_filter.count())
],
)
self.assertEqual(5, tab.model.rowCount())
self.assertEqual("待检测", tab.model.index(0, 4).data())
self.assertEqual("架上商品", tab.model.index(1, 4).data())
self.assertIn("5 行", tab.summary_label.text())
self.assertEqual("未匹配(1)", tab.show_unmatched_button.text())
self.assertIn("总数5", tab.batch_progress_label.text())
tab.product_status_filter.setCurrentIndex(
tab.product_status_filter.findData("normal")
)
self.assertEqual(1, tab.model.rowCount())
self.assertEqual("1002", tab.model.index(0, 2).data())
tab.status_filter.setCurrentIndex(tab.status_filter.findData("collected"))
self.assertEqual(1, tab.model.rowCount())
tab.product_status_filter.setCurrentIndex(
tab.product_status_filter.findData("unlisted")
)
self.assertEqual(0, tab.model.rowCount())
tab.status_filter.setCurrentIndex(tab.status_filter.findData("all"))
self.assertEqual(1, tab.model.rowCount())
self.assertEqual("2001", tab.model.index(0, 2).data())
tab.product_status_filter.setCurrentIndex(tab.product_status_filter.findData("all"))
tab.shop_filter.setCurrentIndex(tab.shop_filter.findData("alias-a"))
self.assertEqual(2, tab.model.rowCount())
self.assertEqual(["1001", "1002"], [tab.model.index(row, 2).data() for row in range(tab.model.rowCount())])
@@ -8418,6 +8524,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
self.assertEqual("normal_only", captured["kwargs"]["collect_scope"])
self.assertFalse(tab.shop_filter.isEnabled())
self.assertFalse(tab.item_filter.isEnabled())
self.assertFalse(tab.product_status_filter.isEnabled())
self.assertFalse(tab.status_filter.isEnabled())
self.assert_removed(temp_dir)