清理旧履约模型残留

This commit is contained in:
yml
2026-05-27 14:22:23 +08:00
parent 5583c60e72
commit 837e1c6e66
19 changed files with 218 additions and 595 deletions
@@ -98,7 +98,7 @@ function resolveLabel(status: string) {
refunding: '退款中',
closed: '已关闭',
pending_payment: '待支付',
cdk_reserved: '已预占',
cdk_reserved: '资源已准备',
link_generated: '已生成链接',
claimed: '已创建会话',
role_confirmed: '已确认角色',
@@ -108,9 +108,9 @@ function resolveLabel(status: string) {
manual_review: '人工处理',
expired: '已过期',
available: '可用',
reserved: '已预占',
reserved: '资源已准备',
delivered: '已发放',
consumed: '已消耗',
consumed: '已使用',
invalid: '已作废',
active: '生效中',
admin: '管理员',
@@ -123,21 +123,29 @@ function resolveLabel(status: string) {
pending: '待触发',
waiting: '等待中',
processing: '处理中',
system_bound: '系统已绑定',
pending_binding: '待系统绑定',
system_bound: '资源已准备',
pending_binding: '待准备资源',
resource_ready: '资源已准备',
pending_prepare: '待准备资源',
pending_config: '待配置',
pending_binding_prepare: '待准备绑定',
pending_binding_prepare: '待准备资源',
not_started: '未开始',
waiting_binding: '待客户绑定',
dispatched_pending_return: '待退还号码',
completed: '已完成',
waiting_user_claim: '待户打开链接',
waiting_user_claim: '待户打开链接',
waiting_customer: '待客户绑定',
link_opened: '已打开链接',
binding_confirmed: '已提交绑定',
binding_in_progress: '绑定处理中',
binding_completed: '完整绑定成功',
binding_exception: '绑定异常',
user_binding: '用户绑定中',
binding_confirmed: '已提交',
binding_in_progress: '处理中',
binding_completed: '履约完成',
binding_exception: '履约异常',
customer_confirmed: '已提交',
customer_processing: '处理中',
customer_completed: '履约完成',
customer_exception: '履约异常',
resource_exception: '资源异常',
user_binding: '客户处理中',
}
if (!props.showRaw) {
+1 -2
View File
@@ -15,14 +15,13 @@ export type { AdminDashboardSummary } from './dashboard'
// Orders types
export type {
AdminOrderBindingSummary,
AdminOrderFulfillmentProgress,
AdminOrderListItem,
AdminOrderDetail,
} from './orders'
// Tasks types
export type {
AdminTaskBindingSummary,
AdminTaskListItem,
AdminTaskOperations,
AdminTaskActionResponse,
+10 -18
View File
@@ -1,15 +1,11 @@
import type { AdminTaskListItem } from './tasks'
export interface AdminOrderBindingSummary {
export interface AdminOrderFulfillmentProgress {
totalTaskCount: number
systemBoundTaskCount: number
completedBindingTaskCount: number
totalBindingCount: number
reservedBindingCount: number
consumedBindingCount: number
releasedBindingCount: number
systemBindingStatus: string
userBindingStatus: string
preparedTaskCount: number
completedTaskCount: number
resourceStatus: string
customerStatus: string
}
export interface AdminOrderListItem {
@@ -34,14 +30,10 @@ export interface AdminOrderListItem {
totalQuantity: number
itemSummary: string
taskCount: number
systemBindingStatus: string
userBindingStatus: string
systemBoundTaskCount: number
completedBindingTaskCount: number
totalBindingCount: number
reservedBindingCount: number
consumedBindingCount: number
releasedBindingCount: number
resourceStatus: string
customerStatus: string
preparedTaskCount: number
completedTaskCount: number
}
export interface AdminOrderDetail {
@@ -65,7 +57,7 @@ export interface AdminOrderDetail {
updatedAt: string
itemSummary: string
rawPayload: Record<string, unknown>
bindingSummary: AdminOrderBindingSummary
fulfillmentProgress: AdminOrderFulfillmentProgress
}
items: Array<{
orderItemId: number
+2 -11
View File
@@ -1,11 +1,3 @@
export interface AdminTaskBindingSummary {
totalBindingCount: number
reservedBindingCount: number
consumedBindingCount: number
releasedBindingCount: number
roleKeys: string[]
}
export interface AdminTaskListItem {
taskId: number
taskNo: string
@@ -17,8 +9,8 @@ export interface AdminTaskListItem {
deliveryStatus: string
resultCode: string
resultMessage: string
systemBindingStatus: string
userBindingStatus: string
resourceStatus: string
customerStatus: string
loginType: string
roleName: string
roleId: string
@@ -27,7 +19,6 @@ export interface AdminTaskListItem {
roleConfirmedAt: string | null
redeemedAt: string | null
retryCount: number
bindingSummary: AdminTaskBindingSummary
lastError: string
createdAt: string
updatedAt: string
@@ -41,12 +41,15 @@ function formatSpecSummary(spec: Record<string, unknown>) {
function resolveResourceStageLabel(status: string) {
const normalized = String(status || '').trim()
const labelMap: Record<string, string> = {
system_bound: '资源已准备',
pending_binding: '待准备资源',
resource_ready: '资源已准备',
pending_prepare: '待准备资源',
pending_payment: '待支付',
pending_binding_prepare: '待准备资源',
retry_pending: '待重试',
manual_review: '人工处理',
binding_exception: '资源异常',
resource_exception: '资源异常',
closed: '已关闭',
expired: '已过期',
completed: '已完成',
not_started: '未开始',
}
@@ -58,15 +61,14 @@ function resolveCustomerStageLabel(status: string) {
const normalized = String(status || '').trim()
const labelMap: Record<string, string> = {
not_started: '待打开链接',
waiting_user_claim: '待打开链接',
waiting_binding: '待客户绑定',
waiting_customer: '待客户绑定',
link_opened: '已打开链接',
user_binding: '客户绑定中',
binding_confirmed: '已提交',
binding_in_progress: '处理中',
binding_completed: '客户已完成',
binding_exception: '客户步骤异常',
completed: '已完成',
customer_processing: '处理中',
customer_confirmed: '已提交',
customer_completed: '客户已完成',
customer_exception: '客户步骤异常',
closed: '已关闭',
expired: '已过期',
}
return labelMap[normalized] || normalized || '-'
@@ -74,32 +76,30 @@ function resolveCustomerStageLabel(status: string) {
function resolveStageTone(status: string): TagType {
const normalized = String(status || '').trim()
if (['system_bound', 'binding_completed', 'completed'].includes(normalized)) return 'success'
if (['resource_ready', 'customer_completed', 'completed'].includes(normalized)) return 'success'
if (
[
'waiting_binding',
'waiting_user_claim',
'waiting_customer',
'link_opened',
'user_binding',
'binding_confirmed',
'binding_in_progress',
'customer_confirmed',
'customer_processing',
].includes(normalized)
) return 'primary'
if (['binding_exception', 'manual_review', 'failed'].includes(normalized)) return 'danger'
if (['pending_binding', 'pending_binding_prepare', 'retry_pending'].includes(normalized)) return 'warning'
if (['resource_exception', 'customer_exception', 'manual_review', 'failed'].includes(normalized)) return 'danger'
if (['pending_prepare', 'pending_binding_prepare', 'retry_pending'].includes(normalized)) return 'warning'
return 'info'
}
function resolveOrderProgressText(summary: AdminOrderDetail['order']['bindingSummary']) {
function resolveOrderProgressText(summary: AdminOrderDetail['order']['fulfillmentProgress']) {
if (!summary.totalTaskCount) return '未生成履约任务'
if (summary.completedBindingTaskCount >= summary.totalTaskCount) return '履约完成'
if (summary.systemBoundTaskCount > 0) return '等待客户绑定'
if (summary.completedTaskCount >= summary.totalTaskCount) return '履约完成'
if (summary.preparedTaskCount > 0) return '等待客户绑定'
return '待准备领取链接'
}
function resolveOrderProgressTone(summary: AdminOrderDetail['order']['bindingSummary']): TagType {
function resolveOrderProgressTone(summary: AdminOrderDetail['order']['fulfillmentProgress']): TagType {
if (!summary.totalTaskCount) return 'warning'
if (summary.completedBindingTaskCount >= summary.totalTaskCount) return 'success'
if (summary.completedTaskCount >= summary.totalTaskCount) return 'success'
return 'warning'
}
</script>
@@ -145,12 +145,12 @@ function resolveOrderProgressTone(summary: AdminOrderDetail['order']['bindingSum
</div>
<div class="summary-block">
<span>履约进度</span>
<el-tag :type="resolveOrderProgressTone(detail.order.bindingSummary)" effect="light">
{{ resolveOrderProgressText(detail.order.bindingSummary) }}
<el-tag :type="resolveOrderProgressTone(detail.order.fulfillmentProgress)" effect="light">
{{ resolveOrderProgressText(detail.order.fulfillmentProgress) }}
</el-tag>
<small>
完成 {{ detail.order.bindingSummary.completedBindingTaskCount }}/{{ detail.order.bindingSummary.totalTaskCount }}
· 资源 {{ detail.order.bindingSummary.systemBoundTaskCount }}/{{ detail.order.bindingSummary.totalTaskCount }}
完成 {{ detail.order.fulfillmentProgress.completedTaskCount }}/{{ detail.order.fulfillmentProgress.totalTaskCount }}
· 资源 {{ detail.order.fulfillmentProgress.preparedTaskCount }}/{{ detail.order.fulfillmentProgress.totalTaskCount }}
</small>
</div>
</div>
@@ -186,15 +186,15 @@ function resolveOrderProgressTone(summary: AdminOrderDetail['order']['bindingSum
</el-table-column>
<el-table-column label="资源准备">
<template #default="{ row }">
<el-tag :type="resolveStageTone(row.systemBindingStatus)" effect="light" size="small">
{{ resolveResourceStageLabel(row.systemBindingStatus) }}
<el-tag :type="resolveStageTone(row.resourceStatus)" effect="light" size="small">
{{ resolveResourceStageLabel(row.resourceStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="客户步骤">
<template #default="{ row }">
<el-tag :type="resolveStageTone(row.userBindingStatus)" effect="light" size="small">
{{ resolveCustomerStageLabel(row.userBindingStatus) }}
<el-tag :type="resolveStageTone(row.customerStatus)" effect="light" size="small">
{{ resolveCustomerStageLabel(row.customerStatus) }}
</el-tag>
</template>
</el-table-column>
@@ -50,7 +50,7 @@ const summary = computed(() => ({
completedCount: items.value.filter(
(item) =>
item.taskCount > 0 &&
item.completedBindingTaskCount >= item.taskCount &&
item.completedTaskCount >= item.taskCount &&
item.payStatus === "paid"
).length,
issueCount: items.value.filter((item) => hasOrderIssue(item)).length,
@@ -86,8 +86,8 @@ function resolveItemSummary(item: AdminOrderListItem) {
function hasOrderIssue(item: AdminOrderListItem) {
return (
["refunded", "failed", "unpaid"].includes(item.payStatus) ||
item.systemBindingStatus === "binding_exception" ||
item.userBindingStatus === "binding_exception"
["resource_exception", "manual_review", "retry_pending"].includes(item.resourceStatus) ||
item.customerStatus === "customer_exception"
);
}
@@ -96,20 +96,20 @@ function resolveFollowUpText(item: AdminOrderListItem) {
if (item.payStatus === "refunded") return "已退款";
if (item.payStatus === "failed") return "支付失败";
if (
item.userBindingStatus === "binding_exception" ||
item.systemBindingStatus === "binding_exception"
item.customerStatus === "customer_exception" ||
["resource_exception", "manual_review", "retry_pending"].includes(item.resourceStatus)
) {
return "履约异常";
}
if (item.taskCount <= 0) return "未生成履约任务";
if (item.completedBindingTaskCount >= item.taskCount) return "履约完成";
if (item.systemBoundTaskCount > 0) return "等待客户绑定";
if (item.completedTaskCount >= item.taskCount) return "履约完成";
if (item.preparedTaskCount > 0) return "等待客户绑定";
return "待准备领取链接";
}
function resolveFollowUpTone(item: AdminOrderListItem) {
if (hasOrderIssue(item)) return "danger";
if (item.taskCount <= 0 || item.completedBindingTaskCount < item.taskCount)
if (item.taskCount <= 0 || item.completedTaskCount < item.taskCount)
return "warning";
return "success";
}
@@ -117,12 +117,15 @@ function resolveFollowUpTone(item: AdminOrderListItem) {
function resolveResourceStageLabel(status: string) {
const normalized = String(status || "").trim();
const labelMap: Record<string, string> = {
system_bound: "资源已准备",
pending_binding: "待准备资源",
resource_ready: "资源已准备",
pending_prepare: "待准备资源",
pending_payment: "待支付",
pending_binding_prepare: "待准备资源",
retry_pending: "待重试",
manual_review: "人工处理",
binding_exception: "资源异常",
resource_exception: "资源异常",
closed: "已关闭",
expired: "已过期",
completed: "已完成",
not_started: "未开始",
};
@@ -134,15 +137,14 @@ function resolveCustomerStageLabel(status: string) {
const normalized = String(status || "").trim();
const labelMap: Record<string, string> = {
not_started: "待打开链接",
waiting_user_claim: "待打开链接",
waiting_binding: "待客户绑定",
waiting_customer: "待客户绑定",
link_opened: "已打开链接",
user_binding: "客户绑定中",
binding_confirmed: "已提交",
binding_in_progress: "处理中",
binding_completed: "客户已完成",
binding_exception: "客户步骤异常",
completed: "已完成",
customer_processing: "处理中",
customer_confirmed: "已提交",
customer_completed: "客户已完成",
customer_exception: "客户步骤异常",
closed: "已关闭",
expired: "已过期",
};
return labelMap[normalized] || normalized || "-";
@@ -315,9 +317,9 @@ onMounted(() => {
<AdminStatusTag :status="row.payStatus" :show-raw="false" />
</div>
<p class="status-note">
客户 {{ resolveCustomerStageLabel(row.userBindingStatus) }}
· 资源 {{ resolveResourceStageLabel(row.systemBindingStatus) }}
· {{ row.completedBindingTaskCount }}/{{ row.taskCount }}
客户 {{ resolveCustomerStageLabel(row.customerStatus) }}
· 资源 {{ resolveResourceStageLabel(row.resourceStatus) }}
· {{ row.completedTaskCount }}/{{ row.taskCount }}
</p>
</div>
</template>
@@ -129,12 +129,15 @@ function resetFilters() {
function resolveResourceStageLabel(status: string) {
const normalized = String(status || "").trim();
const labelMap: Record<string, string> = {
system_bound: "资源已准备",
pending_binding: "待准备资源",
resource_ready: "资源已准备",
pending_prepare: "待准备资源",
pending_payment: "待支付",
pending_binding_prepare: "待准备资源",
retry_pending: "待重试",
manual_review: "人工处理",
binding_exception: "资源异常",
resource_exception: "资源异常",
closed: "已关闭",
expired: "已过期",
completed: "已完成",
not_started: "未开始",
};
@@ -146,15 +149,14 @@ function resolveCustomerStageLabel(status: string) {
const normalized = String(status || "").trim();
const labelMap: Record<string, string> = {
not_started: "待打开链接",
waiting_user_claim: "待打开链接",
waiting_binding: "待客户绑定",
waiting_customer: "待客户绑定",
link_opened: "已打开链接",
user_binding: "客户绑定中",
binding_confirmed: "已提交",
binding_in_progress: "处理中",
binding_completed: "客户已完成",
binding_exception: "客户步骤异常",
completed: "已完成",
customer_processing: "处理中",
customer_confirmed: "已提交",
customer_completed: "客户已完成",
customer_exception: "客户步骤异常",
closed: "已关闭",
expired: "已过期",
};
return labelMap[normalized] || normalized || "-";
@@ -164,8 +166,8 @@ 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.customerStatus === "waiting_customer") return "等待客户绑定";
if (item.resourceStatus === "resource_ready") return "资源已准备";
if (item.status === "pending_binding_prepare") return "待准备资源";
return item.status || "处理中";
}
@@ -332,8 +334,8 @@ onMounted(() => {
{{ resolveTaskMainText(row) }}
</span>
<p class="task-status-note">
客户 {{ resolveCustomerStageLabel(row.userBindingStatus) }}
· 资源 {{ resolveResourceStageLabel(row.systemBindingStatus) }}
客户 {{ resolveCustomerStageLabel(row.customerStatus) }}
· 资源 {{ resolveResourceStageLabel(row.resourceStatus) }}
</p>
<p v-if="row.roleName || row.roleId" class="task-status-note">
角色 {{ row.roleName || "-" }} / {{ row.roleId || "-" }}
@@ -17,12 +17,15 @@ defineProps<Props>()
function resolveResourceStageLabel(status: string) {
const normalized = String(status || '').trim()
const labelMap: Record<string, string> = {
system_bound: '资源已准备',
pending_binding: '待准备资源',
resource_ready: '资源已准备',
pending_prepare: '待准备资源',
pending_payment: '待支付',
pending_binding_prepare: '待准备资源',
retry_pending: '待重试',
manual_review: '人工处理',
binding_exception: '资源异常',
resource_exception: '资源异常',
closed: '已关闭',
expired: '已过期',
completed: '已完成',
not_started: '未开始',
}
@@ -34,15 +37,14 @@ function resolveCustomerStageLabel(status: string) {
const normalized = String(status || '').trim()
const labelMap: Record<string, string> = {
not_started: '待打开链接',
waiting_user_claim: '待打开链接',
waiting_binding: '待客户绑定',
waiting_customer: '待客户绑定',
link_opened: '已打开链接',
user_binding: '客户绑定中',
binding_confirmed: '已提交',
binding_in_progress: '处理中',
binding_completed: '客户已完成',
binding_exception: '客户步骤异常',
completed: '已完成',
customer_processing: '处理中',
customer_confirmed: '已提交',
customer_completed: '客户已完成',
customer_exception: '客户步骤异常',
closed: '已关闭',
expired: '已过期',
}
return labelMap[normalized] || normalized || '-'
@@ -85,8 +87,8 @@ function resolveCustomerStageLabel(status: string) {
</el-card>
</div>
<div class="hero-inline">
<span>资源 {{ resolveResourceStageLabel(detail.task.systemBindingStatus) }}</span>
<span>客户 {{ resolveCustomerStageLabel(detail.task.userBindingStatus) }}</span>
<span>资源 {{ resolveResourceStageLabel(detail.task.resourceStatus) }}</span>
<span>客户 {{ resolveCustomerStageLabel(detail.task.customerStatus) }}</span>
<span v-if="detail.task.lastError">最近异常 {{ detail.task.lastError }}</span>
</div>
<div v-if="claimUrl" class="hero-link-row">
@@ -113,8 +115,8 @@ function resolveCustomerStageLabel(status: string) {
/>
</p>
<p>
资源{{ resolveResourceStageLabel(detail.task.systemBindingStatus) }} ·
客户{{ resolveCustomerStageLabel(detail.task.userBindingStatus) }}
资源{{ resolveResourceStageLabel(detail.task.resourceStatus) }} ·
客户{{ resolveCustomerStageLabel(detail.task.customerStatus) }}
</p>
<p>
角色{{ detail.task.roleName || '-' }} /