拆分后台工单查询服务

This commit is contained in:
yml2213
2026-08-21 17:05:12 +08:00
parent 18d690ab9b
commit ce40997447
3 changed files with 68 additions and 65 deletions
@@ -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<number, typeof shares>()
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()
@@ -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<number, typeof shares>()
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,
}
}
@@ -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'