清理旧履约模型残留

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
@@ -7,7 +7,7 @@ import {
} from './admin-read-shared-helpers.js'
import type {
AdminTaskBindingSummary,
AdminOrderFulfillmentProgress,
AdminTaskListItem,
} from '../../types/admin/read-models.js'
import type { AdminTaskActionPayload } from '../../types/admin/write-models.js'
@@ -19,36 +19,23 @@ import type { AdminViewerContext } from './admin-read-shared-helpers.js'
type JsonRecord = Record<string, any>
type TaskBindingState = {
systemBindingStatus: string
userBindingStatus: string
}
type OrderBindingSummary = {
totalTaskCount: number
systemBoundTaskCount: number
completedBindingTaskCount: number
totalBindingCount: number
reservedBindingCount: number
consumedBindingCount: number
releasedBindingCount: number
systemBindingStatus: string
userBindingStatus: string
type TaskFulfillmentState = {
resourceStatus: string
customerStatus: string
}
export function mapAdminTaskSummary(
task: TaskRow,
bindingSummary: AdminTaskBindingSummary = createEmptyTaskBindingSummary(),
): JsonRecord {
const binding = buildTaskBindingState(task)
const fulfillment = buildTaskFulfillmentState(task)
return {
taskId: task.id,
taskNo: task.task_no,
deliveryStatus: task.delivery_status || '',
status: task.task_status,
systemBindingStatus: binding.systemBindingStatus,
userBindingStatus: binding.userBindingStatus,
resourceStatus: fulfillment.resourceStatus,
customerStatus: fulfillment.customerStatus,
loginType: task.login_type,
runtimeSessionId: task.runtime_session_id,
claimedAt: task.claimed_at,
@@ -56,7 +43,6 @@ export function mapAdminTaskSummary(
redeemedAt: task.redeemed_at,
lastError: task.last_error,
retryCount: getTaskRetryCount(task),
bindingSummary,
createdAt: task.created_at,
updatedAt: task.updated_at,
}
@@ -95,8 +81,7 @@ export function mapAdminTaskListItem(
task: TaskRow,
viewerContext: AdminViewerContext = createAdminViewerContext(),
): AdminTaskListItem {
const binding = buildTaskBindingState(task)
const bindingSummary = createEmptyTaskBindingSummary()
const fulfillment = buildTaskFulfillmentState(task)
return {
taskId: task.id,
@@ -109,8 +94,8 @@ export function mapAdminTaskListItem(
deliveryStatus: task.delivery_status || '',
resultCode: task.result_code || '',
resultMessage: task.result_message || '',
systemBindingStatus: binding.systemBindingStatus,
userBindingStatus: binding.userBindingStatus,
resourceStatus: fulfillment.resourceStatus,
customerStatus: fulfillment.customerStatus,
loginType: task.login_type,
roleName: task.role_name,
roleId: task.role_id,
@@ -119,7 +104,6 @@ export function mapAdminTaskListItem(
roleConfirmedAt: task.role_confirmed_at,
redeemedAt: task.redeemed_at,
retryCount: getTaskRetryCount(task),
bindingSummary,
lastError: task.last_error,
createdAt: task.created_at,
updatedAt: task.updated_at,
@@ -139,158 +123,140 @@ export function mapAdminTaskEvent(event: TaskEventRow): JsonRecord {
}
}
export function createEmptyTaskBindingSummary(): AdminTaskBindingSummary {
return {
totalBindingCount: 0,
reservedBindingCount: 0,
consumedBindingCount: 0,
releasedBindingCount: 0,
roleKeys: [],
}
}
export function buildOrderBindingSummary(
export function buildOrderFulfillmentProgress(
tasks: TaskRow[] | null | undefined,
): OrderBindingSummary {
): AdminOrderFulfillmentProgress {
const normalizedTasks = Array.isArray(tasks) ? tasks : []
const totalTaskCount = normalizedTasks.length
const taskBindings = normalizedTasks.map((task) => buildTaskBindingState(task))
const systemBoundTaskCount = normalizedTasks.filter((task) => isTaskSystemBound(task)).length
const completedBindingTaskCount = normalizedTasks.filter((task) => String(task?.task_status || '') === 'redeemed').length
const totalBindingCount = 0
const reservedBindingCount = 0
const consumedBindingCount = 0
const releasedBindingCount = 0
const taskFulfillments = normalizedTasks.map((task) => buildTaskFulfillmentState(task))
const preparedTaskCount = normalizedTasks.filter((task) => isTaskResourcePrepared(task)).length
const completedTaskCount = normalizedTasks.filter((task) => isTaskFulfillmentCompleted(task)).length
let systemBindingStatus = 'pending_binding'
let userBindingStatus = 'not_started'
let resourceStatus = 'pending_prepare'
let customerStatus = 'not_started'
if (totalTaskCount === 0) {
return {
totalTaskCount,
systemBoundTaskCount,
completedBindingTaskCount,
totalBindingCount,
reservedBindingCount,
consumedBindingCount,
releasedBindingCount,
systemBindingStatus,
userBindingStatus,
preparedTaskCount,
completedTaskCount,
resourceStatus,
customerStatus,
}
}
if (normalizedTasks.every((task) => String(task.task_status || '') === 'redeemed')) {
systemBindingStatus = 'system_bound'
userBindingStatus = 'binding_completed'
} else if (taskBindings.some((item) => ['binding_in_progress', 'binding_confirmed', 'link_opened'].includes(item.userBindingStatus))) {
systemBindingStatus = systemBoundTaskCount > 0 ? 'system_bound' : 'pending_binding'
userBindingStatus = 'user_binding'
} else if (taskBindings.some((item) => item.userBindingStatus === 'waiting_user_claim')) {
systemBindingStatus = systemBoundTaskCount > 0 ? 'system_bound' : 'pending_binding'
userBindingStatus = 'waiting_user_claim'
} else if (taskBindings.some((item) => item.userBindingStatus === 'binding_exception')) {
systemBindingStatus = systemBoundTaskCount > 0 ? 'system_bound' : 'pending_binding'
userBindingStatus = 'binding_exception'
} else if (systemBoundTaskCount > 0) {
systemBindingStatus = 'system_bound'
} else if (taskBindings.some((item) => ['manual_review', 'retry_pending'].includes(item.systemBindingStatus))) {
systemBindingStatus = 'binding_exception'
if (normalizedTasks.every((task) => isTaskFulfillmentCompleted(task))) {
resourceStatus = 'resource_ready'
customerStatus = 'customer_completed'
} else if (taskFulfillments.some((item) => ['customer_processing', 'customer_confirmed', 'link_opened'].includes(item.customerStatus))) {
resourceStatus = preparedTaskCount > 0 ? 'resource_ready' : 'pending_prepare'
customerStatus = 'customer_processing'
} else if (taskFulfillments.some((item) => item.customerStatus === 'waiting_customer')) {
resourceStatus = preparedTaskCount > 0 ? 'resource_ready' : 'pending_prepare'
customerStatus = 'waiting_customer'
} else if (taskFulfillments.some((item) => item.customerStatus === 'customer_exception')) {
resourceStatus = preparedTaskCount > 0 ? 'resource_ready' : 'pending_prepare'
customerStatus = 'customer_exception'
} else if (preparedTaskCount > 0) {
resourceStatus = 'resource_ready'
} else if (taskFulfillments.some((item) => ['manual_review', 'retry_pending'].includes(item.resourceStatus))) {
resourceStatus = 'resource_exception'
}
return {
totalTaskCount,
systemBoundTaskCount,
completedBindingTaskCount,
totalBindingCount,
reservedBindingCount,
consumedBindingCount,
releasedBindingCount,
systemBindingStatus,
userBindingStatus,
preparedTaskCount,
completedTaskCount,
resourceStatus,
customerStatus,
}
}
function buildTaskBindingState(task: TaskRow | null | undefined): TaskBindingState {
function buildTaskFulfillmentState(task: TaskRow | null | undefined): TaskFulfillmentState {
const normalizedStatus = String(task?.task_status || '').trim()
if (!normalizedStatus) {
return {
systemBindingStatus: 'pending_binding',
userBindingStatus: 'not_started',
resourceStatus: 'pending_prepare',
customerStatus: 'not_started',
}
}
if (normalizedStatus === 'pending_payment') {
return { systemBindingStatus: 'pending_payment', userBindingStatus: 'not_started' }
return { resourceStatus: 'pending_payment', customerStatus: 'not_started' }
}
if (normalizedStatus === 'paid') {
return { systemBindingStatus: 'pending_binding', userBindingStatus: 'not_started' }
return { resourceStatus: 'pending_prepare', customerStatus: 'not_started' }
}
if (normalizedStatus === 'pending_binding_prepare') {
return { systemBindingStatus: 'pending_binding', userBindingStatus: 'not_started' }
return { resourceStatus: 'pending_prepare', customerStatus: 'not_started' }
}
if (normalizedStatus === 'waiting_binding') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'waiting_user_claim' }
return { resourceStatus: 'resource_ready', customerStatus: 'waiting_customer' }
}
if (normalizedStatus === 'dispatched_pending_return') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'binding_completed' }
return { resourceStatus: 'resource_ready', customerStatus: 'customer_completed' }
}
if (normalizedStatus === 'completed') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'binding_completed' }
return { resourceStatus: 'resource_ready', customerStatus: 'customer_completed' }
}
if (normalizedStatus === 'manual_review') {
return { systemBindingStatus: 'manual_review', userBindingStatus: 'binding_exception' }
return { resourceStatus: 'manual_review', customerStatus: 'customer_exception' }
}
if (normalizedStatus === 'retry_pending') {
return { systemBindingStatus: 'retry_pending', userBindingStatus: 'binding_exception' }
return { resourceStatus: 'retry_pending', customerStatus: 'customer_exception' }
}
if (normalizedStatus === 'closed') {
return { systemBindingStatus: 'closed', userBindingStatus: 'closed' }
return { resourceStatus: 'closed', customerStatus: 'closed' }
}
if (normalizedStatus === 'expired') {
return { systemBindingStatus: 'expired', userBindingStatus: 'expired' }
return { resourceStatus: 'expired', customerStatus: 'expired' }
}
if (normalizedStatus === 'link_generated') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'waiting_user_claim' }
return { resourceStatus: 'resource_ready', customerStatus: 'waiting_customer' }
}
if (normalizedStatus === 'claimed') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'link_opened' }
return { resourceStatus: 'resource_ready', customerStatus: 'link_opened' }
}
if (normalizedStatus === 'role_confirmed') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'binding_confirmed' }
return { resourceStatus: 'resource_ready', customerStatus: 'customer_confirmed' }
}
if (normalizedStatus === 'redeeming') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'binding_in_progress' }
return { resourceStatus: 'resource_ready', customerStatus: 'customer_processing' }
}
if (normalizedStatus === 'redeemed') {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'binding_completed' }
return { resourceStatus: 'resource_ready', customerStatus: 'customer_completed' }
}
if (isTaskSystemBound(task)) {
return { systemBindingStatus: 'system_bound', userBindingStatus: 'waiting_user_claim' }
if (isTaskResourcePrepared(task)) {
return { resourceStatus: 'resource_ready', customerStatus: 'waiting_customer' }
}
return { systemBindingStatus: 'pending_binding', userBindingStatus: 'not_started' }
return { resourceStatus: 'pending_prepare', customerStatus: 'not_started' }
}
function isTaskSystemBound(task: TaskRow | null | undefined): boolean {
function isTaskResourcePrepared(task: TaskRow | null | undefined): boolean {
return Boolean(task && getTaskPrimaryClaimTokenId(task))
}
function isTaskFulfillmentCompleted(task: TaskRow | null | undefined): boolean {
return ['redeemed', 'completed', 'dispatched_pending_return'].includes(String(task?.task_status || '').trim())
}
function normalizeRecord(value: unknown): JsonRecord {
return value && typeof value === 'object' && !Array.isArray(value) ? value : {}
}