From 5583c60e724e09137ee362d8a3598a2510c4f3bb Mon Sep 17 00:00:00 2001 From: yml Date: Wed, 27 May 2026 14:00:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96-=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=92=8C=E8=AF=A6=E6=83=85=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/admin/tasks/AdminTaskDetail.css | 13 ++ .../src/views/admin/tasks/AdminTasksView.vue | 187 +++++++++++------- .../tasks/components/AdminTaskHeroSection.vue | 67 +++++-- .../tasks/components/AdminTaskInfoSection.vue | 4 +- .../AdminTaskKuaishouCloudPanel.vue | 61 ++---- 5 files changed, 196 insertions(+), 136 deletions(-) diff --git a/apps/frontend/src/views/admin/tasks/AdminTaskDetail.css b/apps/frontend/src/views/admin/tasks/AdminTaskDetail.css index 66d64170..2ec66c8b 100644 --- a/apps/frontend/src/views/admin/tasks/AdminTaskDetail.css +++ b/apps/frontend/src/views/admin/tasks/AdminTaskDetail.css @@ -27,9 +27,17 @@ linear-gradient(135deg, rgba(255, 255, 255, 0.98), rgba(239, 246, 255, 0.96)); } +.hero-head { + display: flex; + justify-content: space-between; + gap: var(--space-4); + align-items: flex-start; +} + .hero-copy { display: grid; gap: 6px; + min-width: 0; } .hero-copy h2 { @@ -45,6 +53,10 @@ color: var(--text-secondary); } +.hero-copy p { + line-height: 1.6; +} + .hero-eyebrow { color: var(--color-primary); font-size: var(--text-xs); @@ -458,6 +470,7 @@ } @media (max-width: 900px) { + .hero-head, .hero-inline, .hero-link-row, .flow-card-head, diff --git a/apps/frontend/src/views/admin/tasks/AdminTasksView.vue b/apps/frontend/src/views/admin/tasks/AdminTasksView.vue index 67bed10e..1752cb17 100644 --- a/apps/frontend/src/views/admin/tasks/AdminTasksView.vue +++ b/apps/frontend/src/views/admin/tasks/AdminTasksView.vue @@ -4,7 +4,6 @@ import { onMounted, ref } from "vue"; import { useAdminAction } from "@/composables/useAdminAction"; import { useAdminListPage } from "@/composables/useAdminListPage"; import AdminPageHeader from "@/components/admin/AdminPageHeader.vue"; -import AdminStatusTag from "@/components/admin/AdminStatusTag.vue"; import { closeAdminTask, fetchAdminTasks, @@ -127,6 +126,56 @@ function resetFilters() { void loadTasks(1); } +function resolveResourceStageLabel(status: string) { + const normalized = String(status || "").trim(); + const labelMap: Record = { + system_bound: "资源已准备", + pending_binding: "待准备资源", + pending_binding_prepare: "待准备资源", + retry_pending: "待重试", + manual_review: "人工处理", + binding_exception: "资源异常", + completed: "已完成", + not_started: "未开始", + }; + + return labelMap[normalized] || normalized || "-"; +} + +function resolveCustomerStageLabel(status: string) { + const normalized = String(status || "").trim(); + const labelMap: Record = { + not_started: "待打开链接", + waiting_user_claim: "待打开链接", + waiting_binding: "待客户绑定", + link_opened: "已打开链接", + user_binding: "客户绑定中", + binding_confirmed: "已提交", + binding_in_progress: "处理中", + binding_completed: "客户已完成", + binding_exception: "客户步骤异常", + completed: "已完成", + }; + + return labelMap[normalized] || normalized || "-"; +} + +function resolveTaskMainText(item: AdminTaskListItem) { + if (item.lastError) return "需要关注"; + if (["failed", "manual_review", "retry_pending"].includes(item.status)) return "待处理"; + if (["redeemed", "completed", "closed"].includes(item.status)) return "已完成"; + if (item.userBindingStatus === "waiting_binding") return "等待客户绑定"; + if (item.systemBindingStatus === "system_bound") return "资源已准备"; + if (item.status === "pending_binding_prepare") return "待准备资源"; + return item.status || "处理中"; +} + +function resolveTaskTone(item: AdminTaskListItem) { + if (item.lastError || ["failed", "manual_review", "retry_pending"].includes(item.status)) return "danger"; + if (["redeemed", "completed", "closed"].includes(item.status)) return "success"; + return "warning"; +} + onMounted(() => { void loadTasks(1); }); @@ -136,7 +185,7 @@ onMounted(() => {
@@ -175,13 +224,13 @@ onMounted(() => { /> @@ -245,7 +294,7 @@ onMounted(() => { size="small" class="tasks-table data-table" > - + + + + - + - - - @@ -343,21 +379,7 @@ onMounted(() => { size="small" type="danger" plain - @click=" - runAction({ - id: row.taskId, - action: async () => { - const response = await retryAdminTask(row.taskId); - if (response.data.claimUrl) - lastClaimUrl = response.data.claimUrl; - }, - successMessage: '任务已重试', - confirmText: `确认重试任务 ${row.taskNo} 吗?`, - onAfterAction: async () => { - await loadTasks(); - }, - }) - " + @click="handleActionCommand('retry', row)" > 重试 @@ -421,37 +443,54 @@ onMounted(() => { width: 100%; } -.progress-row { - display: flex; - align-items: center; - gap: var(--space-2); +.task-status-summary { + display: grid; + gap: 6px; min-width: 0; } -.progress-row :deep(.el-tag) { - min-width: 0; - max-width: calc(100% - 42px); -} -.progress-row :deep(.el-tag__content) { - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.progress-label { +.task-main-chip { display: inline-flex; align-items: center; justify-content: center; - min-width: 34px; - min-height: 22px; - padding: 0 7px; + width: fit-content; + min-height: 26px; + padding: 0 10px; border-radius: var(--radius-full); - background: #f7f9fc; - border: 1px solid var(--border-default); + border: 1px solid transparent; + font-size: var(--text-xs); + font-weight: 800; + white-space: nowrap; +} + +.task-main-chip[data-tone="success"] { + color: #0f766e; + background: var(--color-success-light); + border-color: #a6f4c5; +} + +.task-main-chip[data-tone="warning"] { + color: #b54708; + background: var(--color-warning-light); + border-color: #fedf89; +} + +.task-main-chip[data-tone="danger"] { + color: var(--color-danger-dark); + background: var(--color-danger-light); + border-color: #fecaca; +} + +.task-status-note { + margin: 0; color: var(--text-secondary); - font-size: 11px; + font-size: var(--text-xs); + line-height: 1.5; +} + +.task-status-note + .task-status-note { + color: var(--text-primary); font-weight: 700; - flex: 0 0 auto; } .cell-error { diff --git a/apps/frontend/src/views/admin/tasks/components/AdminTaskHeroSection.vue b/apps/frontend/src/views/admin/tasks/components/AdminTaskHeroSection.vue index 974a4dec..65e9384c 100644 --- a/apps/frontend/src/views/admin/tasks/components/AdminTaskHeroSection.vue +++ b/apps/frontend/src/views/admin/tasks/components/AdminTaskHeroSection.vue @@ -13,6 +13,40 @@ interface Props { } defineProps() + +function resolveResourceStageLabel(status: string) { + const normalized = String(status || '').trim() + const labelMap: Record = { + system_bound: '资源已准备', + pending_binding: '待准备资源', + pending_binding_prepare: '待准备资源', + retry_pending: '待重试', + manual_review: '人工处理', + binding_exception: '资源异常', + completed: '已完成', + not_started: '未开始', + } + + return labelMap[normalized] || normalized || '-' +} + +function resolveCustomerStageLabel(status: string) { + const normalized = String(status || '').trim() + const labelMap: Record = { + not_started: '待打开链接', + waiting_user_claim: '待打开链接', + waiting_binding: '待客户绑定', + link_opened: '已打开链接', + user_binding: '客户绑定中', + binding_confirmed: '已提交', + binding_in_progress: '处理中', + binding_completed: '客户已完成', + binding_exception: '客户步骤异常', + completed: '已完成', + } + + return labelMap[normalized] || normalized || '-' +}