From 5fd8c6fc31215d863c21d6538a9ba03e87668842 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Oct 2026 21:03:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(after-sale):=20=E5=94=AE=E5=90=8E=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=96=B0=E5=A2=9E=E3=80=8C=E6=A0=87=E8=AE=B0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=B7=B2=E9=80=80=E6=AC=BE=E3=80=8D=E5=8B=BE=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 展开的操作面板在状态下拉与备注旁新增「标记订单已退款」勾选框:勾选后点击确认,会先把关联订单推到已退款,再更新售后工单状态。订单本已退款时勾选框呈现为不可改的已选状态,且不提交该标记。 顺序不能反:OrderRepository::update_status 的退款闸门要求售后工单仍为待审核/处理中,一旦 set_status 先执行就不再放行。因此退款失败时整次操作中止,避免出现「工单已关、订单未退」的半完成状态。订单号由服务端按 after_sale_id 反查,不经客户端传递。 AfterSaleService::get() 由 private 改为 public 以支撑该反查。dev harness 扩展为可驱动 handler 的六个场景,覆盖勾选/未勾选、重复退款、非已支付订单、已关闭工单与非法状态。 --- src/Admin/Native/PayOrders.php | 47 +++++- src/Payment/AfterSaleService.php | 3 +- tests/dev/render-after-sales-harness.php | 135 ++++++++++++++++-- .../financial-flow-contract.test.cjs | 17 +++ 4 files changed, 187 insertions(+), 15 deletions(-) diff --git a/src/Admin/Native/PayOrders.php b/src/Admin/Native/PayOrders.php index 8399e095..e8385a05 100644 --- a/src/Admin/Native/PayOrders.php +++ b/src/Admin/Native/PayOrders.php @@ -417,6 +417,7 @@ class PayOrders { . '.aksrt-as-review-main{flex:1 1 460px;min-width:0;display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 12px;}' . '.aksrt-as-review-main p{margin:0;}' . '.aksrt-status-select{min-width:150px;}' + . '.aksrt-as-refund-flag{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;margin:0;}' . '.aksrt-as-review textarea{flex:1 1 240px;min-width:0;box-sizing:border-box;margin:0;}' . '.aksrt-as-review-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;margin-left:auto;}' . '.aksrt-as-field--wide{grid-column:1/-1;}' @@ -462,6 +463,7 @@ class PayOrders { if ($desc_cell === '') $desc_cell = '—'; $status_label = $status_labels[(string) $item['status']] ?? (string) $item['status']; $admin_note = (string) ($item['admin_note'] ?? ''); + $order_refunded = is_array($order) && (string) ($order['status'] ?? '') === \AKSRT\Core\DomainModel::ORDER_STATUS_REFUNDED; // 摘要行 + 手风琴详情行:点击「操作」展开整条记录的完整信息与状态面板 echo ''; echo '' . esc_html((string) $id) . '
' . esc_html((string) ($item['created_at'] ?? '')) . ''; @@ -509,6 +511,10 @@ class PayOrders { echo '

'; echo ''; echo ''; + // 勾选后在确认时把关联订单推到已退款;订单本已退款时呈现为不可改的已选状态 + echo ''; echo '
'; echo ''; echo '