From ce4099744719e41266eac9baa0d428a441477b08 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Fri, 21 Aug 2026 17:05:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=90=8E=E5=8F=B0=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E6=9F=A5=E8=AF=A2=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/worker-platform/admin-service.ts | 67 +------------------ .../admin-work-order-query-service.ts | 65 ++++++++++++++++++ .../src/services/worker-platform/index.ts | 1 + 3 files changed, 68 insertions(+), 65 deletions(-) create mode 100644 apps/backend/src/services/worker-platform/admin-work-order-query-service.ts diff --git a/apps/backend/src/services/worker-platform/admin-service.ts b/apps/backend/src/services/worker-platform/admin-service.ts index 61007fe8..90be03c3 100644 --- a/apps/backend/src/services/worker-platform/admin-service.ts +++ b/apps/backend/src/services/worker-platform/admin-service.ts @@ -15,16 +15,12 @@ import { deductPendingDepositUnfreeze, deleteWorkOrder, getWorkerUserById, - getWorkOrderStatistics, getWorkOrderByOrderItemId, listWorkOrders, - listWorkOrderEventsByOrderId, listWorkProductRules, listWorkProductRuleMappings, listWorkerUsers, listWorkOrderShares, - listWorkOrderSharesByOrderIds, - sumPendingUnfreezeByOrderIds, resolveProblemWorkOrder, reopenCancelledWorkOrder, listAdminWorkerCancelRequests as listWorkerCancelRequestsForAdmin, @@ -40,7 +36,7 @@ import type { OrderItemRow, OrderRow } from '../../types/repository/rows.js' import { createHttpError } from '../../utils/http.js' import { randomId } from '../../utils/random.js' import { nowIso } from '../../utils/time.js' -import { normalizePage, normalizePageSize, safeParseJson } from '../admin/admin-query-utils.js' +import { safeParseJson } from '../admin/admin-query-utils.js' import { getWorkerFinanceConfig } from './worker-finance-config-service.js' import { getWorkerProductMatchConfig } from './worker-product-match-config-service.js' import { getWorkerHallConfig, saveWorkerHallConfig } from './worker-hall-config-service.js' @@ -72,11 +68,9 @@ import { normalizeProblemResolutionAction, normalizeRequirementFields, normalizeRequirementFieldsFromPayload, - normalizeStatuses, normalizeSubmittedFields, normalizeUploadedFiles, resolveFreezeDepositAmount, - mapWorkOrderEvents, resolveMatchingProductRuleDecision, resolveKuaishouWorkProductMatchContext, resolveRequirementFields, @@ -229,64 +223,7 @@ function resolveAssignedDeadlineAt(timeoutMinutes: number, now: string): string return new Date(new Date(now).getTime() + timeoutMinutes * 60 * 1000).toISOString() } -export async function getAdminWorkOrderEvents(workOrderId: number | string) { - await getRequiredWorkOrder(workOrderId) - const events = await listWorkOrderEventsByOrderId(workOrderId) - return { items: await mapWorkOrderEvents(events, { includeWorkerSummary: true }) } -} - -export async function listAdminWorkOrders(query: JsonObject = {}) { - const page = normalizePage(query.page) - const pageSize = normalizePageSize(query.pageSize) - const workOrderId = normalizeOptionalId(query.workOrderId ?? query.work_order_id) || 0 - const workerId = normalizeOptionalId(query.workerId ?? query.worker_id) || 0 - const workerLevelIds = normalizeStatuses(query.workerLevelIds ?? query.worker_level_ids) - .map(normalizeOptionalId) - .filter((levelId): levelId is number => levelId !== null) - const statuses = normalizeStatuses(query.status) - const vipEvidencePending = normalizeBoolean(query.vipEvidencePending, false) - const { items, total } = await listWorkOrders({ - page, - pageSize, - statuses, - workOrderId, - keyword: String(query.keyword || '').trim(), - workerSharingId: workerId, - workerLevelIds, - vipEvidencePending, - useOperationalStatus: true, - }) - const statistics = await getWorkOrderStatistics({ - statuses, - workOrderId, - keyword: String(query.keyword || '').trim(), - workerSharingId: workerId, - workerLevelIds, - vipEvidencePending, - useOperationalStatus: true, - }) - const pendingUnfreezeByOrderId = await sumPendingUnfreezeByOrderIds( - items.map((item) => Number(item.id)), - ) - const shares = await listWorkOrderSharesByOrderIds(items.map((item) => Number(item.id))) - const sharesByOrderId = new Map() - for (const share of shares) { - const workOrderId = Number(share.work_order_id) - const current = sharesByOrderId.get(workOrderId) || [] - current.push(share) - sharesByOrderId.set(workOrderId, current) - } - return { - items: items.map((item) => { - return { - ...mapWorkOrderAdmin(item, sharesByOrderId.get(Number(item.id)) || []), - pendingUnfreezeAmount: pendingUnfreezeByOrderId.get(Number(item.id)) || 0, - } - }), - pagination: { page, pageSize, total }, - statistics, - } -} +export { getAdminWorkOrderEvents, listAdminWorkOrders } from './admin-work-order-query-service.js' export async function listAdminWorkerCancelRequests(query: JsonObject = {}) { const status = String(query.status || 'pending').trim() diff --git a/apps/backend/src/services/worker-platform/admin-work-order-query-service.ts b/apps/backend/src/services/worker-platform/admin-work-order-query-service.ts new file mode 100644 index 00000000..5a92952e --- /dev/null +++ b/apps/backend/src/services/worker-platform/admin-work-order-query-service.ts @@ -0,0 +1,65 @@ +import { + getWorkOrderStatistics, + listWorkOrderEventsByOrderId, + listWorkOrderSharesByOrderIds, + listWorkOrders, + sumPendingUnfreezeByOrderIds, +} from '../../repositories/worker-platform/index.js' +import type { JsonObject } from '../../types/json.js' +import { normalizePage, normalizePageSize } from '../admin/admin-query-utils.js' +import { + mapWorkOrderAdmin, + mapWorkOrderEvents, + normalizeBoolean, + normalizeOptionalId, + normalizeStatuses, +} from './mappers.js' +import { getRequiredWorkOrder } from './worker-session-context-service.js' + +export async function getAdminWorkOrderEvents(workOrderId: number | string) { + await getRequiredWorkOrder(workOrderId) + const events = await listWorkOrderEventsByOrderId(workOrderId) + return { items: await mapWorkOrderEvents(events, { includeWorkerSummary: true }) } +} + +export async function listAdminWorkOrders(query: JsonObject = {}) { + const page = normalizePage(query.page) + const pageSize = normalizePageSize(query.pageSize) + const workOrderId = normalizeOptionalId(query.workOrderId ?? query.work_order_id) || 0 + const workerId = normalizeOptionalId(query.workerId ?? query.worker_id) || 0 + const workerLevelIds = normalizeStatuses(query.workerLevelIds ?? query.worker_level_ids) + .map(normalizeOptionalId) + .filter((levelId): levelId is number => levelId !== null) + const statuses = normalizeStatuses(query.status) + const vipEvidencePending = normalizeBoolean(query.vipEvidencePending, false) + const filters = { + statuses, + workOrderId, + keyword: String(query.keyword || '').trim(), + workerSharingId: workerId, + workerLevelIds, + vipEvidencePending, + useOperationalStatus: true, + } + const { items, total } = await listWorkOrders({ page, pageSize, ...filters }) + const statistics = await getWorkOrderStatistics(filters) + const pendingUnfreezeByOrderId = await sumPendingUnfreezeByOrderIds( + items.map((item) => Number(item.id)), + ) + const shares = await listWorkOrderSharesByOrderIds(items.map((item) => Number(item.id))) + const sharesByOrderId = new Map() + for (const share of shares) { + const orderId = Number(share.work_order_id) + const current = sharesByOrderId.get(orderId) || [] + current.push(share) + sharesByOrderId.set(orderId, current) + } + return { + items: items.map((item) => ({ + ...mapWorkOrderAdmin(item, sharesByOrderId.get(Number(item.id)) || []), + pendingUnfreezeAmount: pendingUnfreezeByOrderId.get(Number(item.id)) || 0, + })), + pagination: { page, pageSize, total }, + statistics, + } +} diff --git a/apps/backend/src/services/worker-platform/index.ts b/apps/backend/src/services/worker-platform/index.ts index 17591c7e..7a8eb352 100644 --- a/apps/backend/src/services/worker-platform/index.ts +++ b/apps/backend/src/services/worker-platform/index.ts @@ -25,6 +25,7 @@ export * from './admin-worker-catalog-service.js' export * from './admin-kuaishou-match-service.js' export * from './admin-worker-config-service.js' export * from './admin-worker-user-service.js' +export * from './admin-work-order-query-service.js' export * from './worker-product-match-config-service.js' export * from './worker-announcement-config-service.js' export * from './worker-hall-config-service.js'