删除库存和旧回调管理

This commit is contained in:
yml
2026-05-25 23:07:19 +08:00
parent 90ad866ecc
commit 2c7464b1eb
87 changed files with 94 additions and 5794 deletions
@@ -5,7 +5,6 @@ import {
closeAdminTask,
markAdminTaskManualReview,
regenerateAdminTaskClaimLink,
releaseAdminTaskInventoryBinding,
retryAdminTask,
} from '@/services/admin'
@@ -14,7 +13,6 @@ import AdminTaskActionBar from './components/AdminTaskActionBar.vue'
import AdminTaskEventsSection from './components/AdminTaskEventsSection.vue'
import AdminTaskHeroSection from './components/AdminTaskHeroSection.vue'
import AdminTaskInfoSection from './components/AdminTaskInfoSection.vue'
import AdminTaskInventoryBindingsSection from './components/AdminTaskInventoryBindingsSection.vue'
import AdminTaskManualDispatchSection from './components/AdminTaskManualDispatchSection.vue'
import AdminTaskRedeemResolutionSection from './components/AdminTaskRedeemResolutionSection.vue'
import AdminTaskScreenshotSection from './components/AdminTaskScreenshotSection.vue'
@@ -135,20 +133,6 @@ onMounted(loadDetail)
<AdminTaskRedeemResolutionSection v-if="detail.redeemResolution" :detail="detail" />
<AdminTaskInventoryBindingsSection
v-if="!isKuaishouCloudTask"
:detail="detail"
:can-view-sensitive-task-data="canViewSensitiveTaskData"
:action-loading="actionLoading"
@release-binding="
runAction(
() => releaseAdminTaskInventoryBinding(detail!.task.taskId, $event),
'库存绑定已释放',
`确认释放该库存绑定吗?`,
)
"
/>
<AdminTaskManualDispatchSection
v-if="detail.task.executorKey === 'manual_dispatch'"
:detail="detail"
@@ -14,10 +14,6 @@ import {
} from "@/services/admin";
import type { AdminTaskListItem } from "@/types/admin";
import { hasAdminRole } from "@/utils/admin-auth";
import {
formatBindingRoleSummary,
formatBindingCountSummary,
} from "@/utils/admin-display";
import { adminTaskStatusOptions } from "@/utils/admin-options";
import { formatAdminDateTime } from "@/utils/admin-time";
@@ -140,7 +136,7 @@ onMounted(() => {
<div class="tasks-page list-page">
<AdminPageHeader
title="交付任务"
description="更紧凑地查看任务状态、角色绑定、库存凭据和异常信息。"
description="更紧凑地查看任务状态、角色绑定和异常信息。"
>
<template #extra>
<span class="total-badge"> {{ pagination.total }} 条任务</span>
@@ -292,7 +288,7 @@ onMounted(() => {
</div>
</template>
</el-table-column>
<el-table-column label="角色 / 凭据" min-width="180">
<el-table-column label="角色信息" min-width="180">
<template #default="{ row }">
<div class="cell-stack">
<span
@@ -306,32 +302,6 @@ onMounted(() => {
<span class="cell-subline"
>登录 {{ row.loginType || "-" }}</span
>
<span
class="cell-subline"
:title="row.inventoryDisplayMasked || '-'"
>凭据 {{ row.inventoryDisplayMasked || "-" }}</span
>
<span
class="cell-subline"
:title="
formatBindingRoleSummary(
row.bindingSummary.roleKeys,
'无绑定角色'
)
"
>绑定
{{
formatBindingRoleSummary(
row.bindingSummary.roleKeys,
"无绑定角色"
)
}}</span
>
<span
class="cell-subline cell-subline--strong"
:title="formatBindingCountSummary(row.bindingSummary)"
>{{ formatBindingCountSummary(row.bindingSummary) }}</span
>
</div>
</template>
</el-table-column>
@@ -367,11 +337,7 @@ onMounted(() => {
v-if="canManageTaskLifecycle"
:disabled="
row.executorKey === 'manual_dispatch' ||
![
'retry_pending',
'manual_review',
'waiting_inventory',
].includes(row.status)
!['retry_pending', 'manual_review'].includes(row.status)
"
:loading="actionLoadingId === row.taskId"
size="small"
@@ -36,21 +36,12 @@ defineProps<Props>()
{{ detail.task.resultMessage || '-' }}
</el-descriptions-item>
<template v-if="canViewSensitiveTaskData">
<el-descriptions-item label="库存凭据">
{{ detail.inventory?.displayValue || '-' }}
</el-descriptions-item>
<el-descriptions-item label="凭据类型">
{{ detail.inventory?.credentialType || '-' }}
</el-descriptions-item>
<el-descriptions-item label="库存状态">
<AdminStatusTag :status="detail.inventory?.status || ''" />
</el-descriptions-item>
<el-descriptions-item label="Claim Token">
{{ detail.claimToken?.token || '-' }}
</el-descriptions-item>
</template>
<el-descriptions-item v-else label="库存 / Token" :span="2">
客服账号不可查看库存凭据与原始领取 Token
<el-descriptions-item v-else label="Claim Token" :span="2">
客服账号不可查看原始领取 Token
</el-descriptions-item>
<el-descriptions-item label="Token 状态">
<AdminStatusTag :status="detail.claimToken?.status || ''" />
@@ -1,98 +0,0 @@
<script setup lang="ts">
import AdminStatusTag from '@/components/admin/AdminStatusTag.vue'
import type { AdminTaskDetail } from '@/types/admin'
import { hasAdminRole } from '@/utils/admin-auth'
import { formatAdminDateTime } from '@/utils/admin-time'
interface Props {
detail: AdminTaskDetail
canViewSensitiveTaskData: boolean
actionLoading: boolean
}
defineProps<Props>()
const emit = defineEmits<{
releaseBinding: [bindingId: number]
}>()
</script>
<template>
<el-card shadow="never" class="section-card">
<h3>库存绑定</h3>
<p class="section-copy">
这里展示任务当前和历史绑定过的库存项便于核对多库存任务的真实履约轨迹
</p>
<el-table :data="detail.inventoryBindings" size="small">
<el-table-column label="绑定" width="100">
<template #default="{ row: binding }">
<div>#{{ binding.bindingId }}</div>
<div v-if="binding.isPrimary" class="binding-primary">主库存项</div>
</template>
</el-table-column>
<el-table-column label="角色" min-width="120">
<template #default="{ row: binding }">
<div>{{ binding.roleKey || '-' }}</div>
<div class="binding-meta">数量 {{ binding.quantity }}</div>
</template>
</el-table-column>
<el-table-column label="库存项" min-width="180">
<template #default="{ row: binding }">
<div>ID {{ binding.inventoryItemId }}</div>
<div>{{ binding.skuCode || '-' }}</div>
<div class="binding-meta">
{{ binding.credentialType || '-' }} ·
{{ binding.batchNo || '无批次' }}
</div>
</template>
</el-table-column>
<el-table-column label="状态" min-width="160">
<template #default="{ row: binding }">
<div class="status-stack">
<AdminStatusTag :status="binding.bindingStatus" />
<AdminStatusTag :status="binding.inventoryStatus" />
</div>
<div v-if="binding.invalidReason" class="binding-meta">
{{
binding.inventoryStatus === 'invalid'
? '作废原因'
: binding.inventoryStatus === 'consumed'
? '消耗原因'
: '处理原因'
}}{{ binding.invalidReason }}
</div>
</template>
</el-table-column>
<el-table-column label="凭据内容" min-width="180">
<template #default="{ row: binding }">
{{ canViewSensitiveTaskData ? binding.displayValue || '-' : '客服不可见' }}
</template>
</el-table-column>
<el-table-column label="时间" min-width="180">
<template #default="{ row: binding }">
<div>绑定 {{ formatAdminDateTime(binding.createdAt) }}</div>
<div class="binding-meta">消费 {{ formatAdminDateTime(binding.consumedAt) }}</div>
<div class="binding-meta">释放 {{ formatAdminDateTime(binding.releasedAt) }}</div>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ row: binding }">
<el-button
v-if="hasAdminRole('admin') && binding.canRelease"
:loading="actionLoading"
link
@click="emit('releaseBinding', binding.bindingId)"
>
释放绑定
</el-button>
<span v-else class="binding-meta">-</span>
</template>
</el-table-column>
<template #empty>
<el-empty description="当前任务还没有库存绑定记录" :image-size="60" />
</template>
</el-table>
</el-card>
</template>
<style scoped src="../AdminTaskDetail.css"></style>
@@ -40,7 +40,7 @@ defineProps<Props>()
<el-card
shadow="never"
v-for="attempt in detail.redeemResolution!.attempts"
:key="`${attempt.attempt}-${attempt.inventoryItemId || 'na'}`"
:key="attempt.attempt"
class="redeem-attempt-card"
>
<div class="redeem-attempt-head">
@@ -48,10 +48,6 @@ defineProps<Props>()
<span class="redeem-outcome">{{ formatRedeemOutcomeLabel(attempt.outcome) }}</span>
</div>
<div class="redeem-attempt-grid">
<div>
<span>库存项</span>
<strong>{{ attempt.inventoryItemId ? `#${attempt.inventoryItemId}` : '-' }}</strong>
</div>
<div>
<span>凭据</span>
<strong>{{ attempt.codeMasked || '-' }}</strong>