feat(admin): 履约完成或终态时自动隐藏暂停与关闭兑换按钮

- 任务详情页(AdminTaskDetailPage):若任务已履约完成(completed/delivered/success)或订单已完成/已退款,自动隐藏【暂停兑换】和【关闭兑换】按钮,避免误操作
- 订单详情页(AdminOrderDetailPage):若订单下任务已全部履约完成或订单终态,同样自动隐藏【暂停兑换】和【关闭兑换】
- 针对已被暂停/关闭的历史订单,始终保留【恢复启用】入口以便误操作时补救
- 验证方式:前端类型检查(0 error)、前端单测 132 项全通及前端 Vite 重新构建成功
This commit is contained in:
yml2213
2026-10-10 18:42:12 +08:00
parent 9b29f7513a
commit 6971002579
2 changed files with 25 additions and 5 deletions
@@ -147,6 +147,18 @@ export default function AdminOrderDetailPage() {
},
]
const allTasksCompleted =
detail.tasks.length > 0 &&
detail.tasks.every(
(t) =>
['completed', 'redeemed', 'delivered', 'success'].includes(t.status) ||
t.deliveryStatus === 'delivered',
)
const isOrderFulfilled = detail.order.orderStatus === 'completed' || allTasksCompleted
const isOrderRefundedOrCancelled =
detail.order.payStatus === 'refunded' || detail.order.orderStatus === 'cancelled'
const canPauseOrClose = !isOrderFulfilled && !isOrderRefundedOrCancelled
return (
<section className="page-stack">
<PageHeader
@@ -171,7 +183,7 @@ export default function AdminOrderDetailPage() {
>
恢复启用
</Button>
) : (
) : canPauseOrClose ? (
<Button
danger
icon={<PauseCircleOutlined />}
@@ -180,8 +192,8 @@ export default function AdminOrderDetailPage() {
>
暂停兑换
</Button>
)}
{detail.order.claimStatus !== 'closed' ? (
) : null}
{canPauseOrClose && detail.order.claimStatus !== 'closed' ? (
<Button
danger
icon={<StopOutlined />}
@@ -266,6 +266,14 @@ export default function AdminTaskDetailPage() {
: ''
const claimStatus = resolvedDetail.order?.claimStatus || 'active'
const claimStatusReason = resolvedDetail.order?.claimStatusReason || ''
const isTaskFulfilled =
['completed', 'redeemed', 'delivered', 'success'].includes(resolvedDetail.task.status) ||
resolvedDetail.task.deliveryStatus === 'delivered'
const isOrderRefundedOrCancelled =
resolvedDetail.order?.payStatus === 'refunded' ||
resolvedDetail.order?.orderStatus === 'cancelled'
const isOrderCompleted = resolvedDetail.order?.orderStatus === 'completed'
const canPauseOrClose = !isTaskFulfilled && !isOrderCompleted && !isOrderRefundedOrCancelled
const handleCopyH5Link = () => {
if (!h5ClaimUrl) return
@@ -452,7 +460,7 @@ export default function AdminTaskDetailPage() {
</Button>
{orderId ? (
<>
{claimStatus !== 'paused' && (
{canPauseOrClose && claimStatus !== 'paused' && (
<Button
danger
style={{ color: '#fa8c16', borderColor: '#ffa39e' }}
@@ -462,7 +470,7 @@ export default function AdminTaskDetailPage() {
暂停兑换
</Button>
)}
{claimStatus !== 'closed' && (
{canPauseOrClose && claimStatus !== 'closed' && (
<Button
danger
icon={<StopOutlined />}