feat: 展示PDD商品和采购订单信息 (#164)

This commit is contained in:
chengma
2026-08-11 16:46:49 +08:00
parent 24497c55fd
commit 1f48d3a857
9 changed files with 319 additions and 31 deletions
+41 -2
View File
@@ -8,7 +8,15 @@ os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from src.pdd_ui import CHECK_COLUMN, PDDTaskPage, TaskRow, TaskTableModel
from src.pdd_ui import (
CHECK_COLUMN,
GOODS_ID_COLUMN,
ORDER_NO_COLUMN,
TITLE_COLUMN,
PDDTaskPage,
TaskRow,
TaskTableModel,
)
class TaskTableModelCheckTests(unittest.TestCase):
@@ -166,7 +174,9 @@ class TaskTableModelCheckTests(unittest.TestCase):
page.detailRequested.connect(received.append)
self.assertNotIn("操作", page.taskModel.HEADERS)
self.assertEqual(page.taskModel.columnCount(), 11)
self.assertEqual(page.taskModel.columnCount(), 13)
self.assertEqual(page.taskModel.HEADERS[GOODS_ID_COLUMN], "PDD商品ID")
self.assertEqual(page.taskModel.HEADERS[ORDER_NO_COLUMN], "订单号")
page._on_table_activated(page.taskModel.index(0, CHECK_COLUMN))
page._on_table_activated(page.taskModel.index(0, 2))
@@ -174,6 +184,35 @@ class TaskTableModelCheckTests(unittest.TestCase):
self.assertIn("Enter", page.taskTable.accessibleDescription())
page.deleteLater()
def test_goods_id_order_no_and_full_value_tooltips_are_visible(self):
model = TaskTableModel()
model.set_tasks(
[
TaskRow(
"PUR-1",
"采购",
goods_id="897186799891",
title="很长的商品标题",
order_no="ORDER-20260811",
)
]
)
self.assertEqual(
model.data(model.index(0, GOODS_ID_COLUMN)), "897186799891"
)
self.assertEqual(
model.data(model.index(0, ORDER_NO_COLUMN)), "ORDER-20260811"
)
self.assertEqual(
model.data(model.index(0, TITLE_COLUMN), Qt.ToolTipRole),
"很长的商品标题",
)
self.assertEqual(
model.data(model.index(0, ORDER_NO_COLUMN), Qt.ToolTipRole),
"ORDER-20260811",
)
def test_remove_emits_stable_checked_task_ids(self):
page = PDDTaskPage()
page.set_tasks(
+2
View File
@@ -1086,6 +1086,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
quantity=2,
status=TaskStatus.MANUAL_REVIEW,
updated_at="2026-08-06T08:00:00Z",
order_no="ORDER-001",
)
row = summary_to_row(summary)
@@ -1093,6 +1094,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
self.assertEqual(row.task_type, "采购")
self.assertEqual(row.status, "需要人工处理")
self.assertEqual(row.goods_id, "")
self.assertEqual(row.order_no, "ORDER-001")
self.assertFalse(hasattr(row, "pdd_data"))
def test_summary_to_row_uses_task_specific_running_text(self):
+52 -1
View File
@@ -8,7 +8,7 @@ os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt5.QtCore import Qt
from PyQt5.QtTest import QTest
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QApplication, QWidget
from src.task_detail_view import (
CopyableBodyLabel,
@@ -145,6 +145,57 @@ class TaskDetailViewTest(unittest.TestCase):
expected,
)
def test_purchase_result_shows_order_and_prefers_raw_order_time(self):
purchase_data = {
"purchase": {
"mode": "live",
"confirmed": {
"options": {"color": "黑色", "size": "L"},
"quantity": 2,
"unit_price_cent": 3990,
"total_price_cent": 7980,
},
"order_no": "ORDER-20260811",
"ordered_at": "2026-08-11T08:00:00+08:00",
"ordered_at_raw": "2026-08-11 08:00:00",
"match_status": "matched",
"payment_status": "unpaid",
}
}
detail = replace(
make_detail(purchase_data),
remote_task_id="PUR-001",
task_type=TaskType.PURCHASE,
)
data = build_task_detail_view_data(detail)
self.assertEqual(data.purchase.mode, "真实采购")
self.assertEqual(data.purchase.confirmed_spec, "黑色 / L")
self.assertEqual(data.purchase.order_no, "ORDER-20260811")
self.assertEqual(data.purchase.ordered_at, "2026-08-11 08:00:00")
self.assertEqual(data.purchase.match_status, "已匹配")
self.assertEqual(data.purchase.payment_status, "待付款")
window = TaskDetailWindow(detail)
self.assertIsNotNone(window.findChild(QWidget, "purchaseResultCard"))
self.assertTrue(
any(
label.text() == "ORDER-20260811"
for label in window.findChildren(CopyableBodyLabel)
)
)
window.close()
self.app.processEvents()
def test_collect_detail_does_not_show_purchase_result_card(self):
window = TaskDetailWindow(make_detail(collected_data()))
self.assertIsNone(window.findChild(QWidget, "purchaseResultCard"))
window.close()
self.app.processEvents()
def test_window_builds_color_section_before_size_section(self):
window = TaskDetailWindow(make_detail(collected_data()))
+38
View File
@@ -228,6 +228,44 @@ class TaskRepositoryTests(unittest.TestCase):
self.assertEqual([task.remote_task_id for task in tasks], ["COLLECT-BLACK"])
self.assertEqual(self.repository.count_tasks(filters), 1)
def test_list_and_keyword_search_extract_purchase_order_no_safely(self) -> None:
self.repository.add_claimed_task(
self._task("PURCHASE-ORDER", TaskType.PURCHASE)
)
self.repository.add_claimed_task(self._task("COLLECT-BROKEN"))
connection = open_database(self.db_path)
try:
with connection:
connection.execute(
"UPDATE pdd_tasks SET pdd_data = ? WHERE remote_task_id = ?",
(
'{"purchase":{"order_no":"ORDER-20260811"}}',
"PURCHASE-ORDER",
),
)
connection.execute(
"UPDATE pdd_tasks SET pdd_data = ? WHERE remote_task_id = ?",
("不是有效JSON", "COLLECT-BROKEN"),
)
finally:
connection.close()
tasks = self.repository.list_tasks()
by_id = {task.remote_task_id: task for task in tasks}
searched = self.repository.list_tasks(
TaskFilters(keyword="20260811")
)
self.assertEqual(by_id["PURCHASE-ORDER"].order_no, "ORDER-20260811")
self.assertIsNone(by_id["COLLECT-BROKEN"].order_no)
self.assertEqual(
[task.remote_task_id for task in searched], ["PURCHASE-ORDER"]
)
self.assertEqual(
self.repository.count_tasks(TaskFilters(keyword="ORDER-20260811")),
1,
)
def test_keyword_treats_percent_as_normal_text(self) -> None:
self.repository.add_claimed_task(self._task("TASK-100%", title="百分号"))
self.repository.add_claimed_task(self._task("TASK-OTHER", title="普通商品"))