feat(admin): 履约完成或终态时自动隐藏暂停与关闭兑换按钮
- 任务详情页(AdminTaskDetailPage):若任务已履约完成(completed/delivered/success)或订单已完成/已退款,自动隐藏【暂停兑换】和【关闭兑换】按钮,避免误操作 - 订单详情页(AdminOrderDetailPage):若订单下任务已全部履约完成或订单终态,同样自动隐藏【暂停兑换】和【关闭兑换】 - 针对已被暂停/关闭的历史订单,始终保留【恢复启用】入口以便误操作时补救 - 验证方式:前端类型检查(0 error)、前端单测 132 项全通及前端 Vite 重新构建成功
This commit is contained in:
@@ -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 />}
|
||||
|
||||
Reference in New Issue
Block a user