feat: 安全继续失败采购核单 (#262)

This commit is contained in:
chengma
2026-08-18 09:55:32 +08:00
parent a92b8746b2
commit 5ea8aa3d68
8 changed files with 480 additions and 20 deletions
+69
View File
@@ -313,6 +313,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
number: int,
task_type: TaskType = TaskType.COLLECT,
title: str = "测试商品",
execution_mode: str = "dry_run",
) -> None:
self.repository.add_claimed_task(
NewClaimedTask(
@@ -325,6 +326,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
target_size="M",
price_cent=3990,
quantity=1 if task_type is TaskType.PURCHASE else None,
execution_mode=execution_mode,
),
received_at="2026-08-06T08:00:00Z",
)
@@ -762,6 +764,73 @@ class PDDTaskPageEventTest(unittest.TestCase):
events.shutdown()
page.deleteLater()
def test_purchase_rerun_confirmation_routes_reconcile_before_purchase(self):
self._add_task(
1,
TaskType.PURCHASE,
execution_mode="live",
)
self._add_task(
2,
TaskType.PURCHASE,
execution_mode="live",
)
started = self.repository.start_purchase_run("PDD-001", "USB-001")
self.repository.mark_purchase_irreversible(
"PDD-001",
started.attempt_id,
{
"options": {"color": "黑色", "size": "M"},
"quantity": 1,
"unit_price_cent": 3990,
"total_price_cent": 3990,
},
)
self.repository.move_purchase_to_reconcile(
"PDD-001", started.attempt_id
)
self.repository.save_purchase_reconciliation(
"PDD-001",
started.attempt_id,
"unknown",
{"error_code": "RECONCILE_READ_FAILED"},
)
connection = open_database(self.db_path)
try:
with connection:
connection.execute(
"UPDATE pdd_tasks SET status = 'failed'"
" WHERE remote_task_id = 'PDD-002'"
)
finally:
connection.close()
page = PDDTaskPage()
events = PDDTaskPageEvent(
page,
self.repository,
claim_gateway=RecordingClaimGateway(),
settings_repository=self._saved_settings(),
)
with (
patch("src.pdd_ui_event.MessageBox") as message_box,
patch.object(events, "_start_rerun_worker") as start_worker,
):
message_box.return_value.exec.return_value = True
page.purchaseRerunRequested.emit(("PDD-002", "PDD-001"))
detail = message_box.call_args.args[1]
self.assertIn("可重新采购 1 条", detail)
self.assertIn("只继续核单 1 条", detail)
message_box.return_value.yesButton.setText.assert_called_once_with(
"继续处理"
)
command = start_worker.call_args.args[0]
self.assertEqual(command.task_ids, ("PDD-001", "PDD-002"))
self.assertEqual(command.reconcile_task_ids, ("PDD-001",))
events.shutdown()
page.deleteLater()
def test_running_rerun_can_request_cooperative_cancel_once(self):
self._add_task(1)
first = self.repository.start_collect_run("PDD-001", "USB-001")