feat: 安全继续失败采购核单 (#262)
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user