优化:寄售改名后实时快照与接单人员筛选保持一致

This commit is contained in:
2026-11-12 12:19:02 +08:00
parent be7f6f6f09
commit d0190f4017
5 changed files with 75 additions and 6 deletions
@@ -3,12 +3,14 @@ import type { Response } from 'express'
import { WORK_ORDER_STATUS } from '../../domain/work-order-status.js'
import {
type ConsignmentInventoryRow,
getLatestMaterialEventAtByOrderIds,
getPendingCancelRequestOrderIds,
getPendingFeedbackOrderIds,
getWorkerFinanceRequestById,
getWorkerUserById,
getWorkOrderById,
listConsignmentInventoriesByIds,
listWorkerTimeoutEventsByOrderIds,
listWorkerWorkOrderNotes,
listWorkerWorkOrderViews,
@@ -23,6 +25,7 @@ import {
type RealtimeEventRow,
} from '../../repositories/realtime-event-repo.js'
import { getAdminDashboardSummary } from '../admin/admin-dashboard-service.js'
import { safeParseJson } from '../admin/admin-query-utils.js'
import { mapAdminOrderListItem } from '../admin/admin-order-read-helpers.js'
import { mapAdminTaskListItem } from '../admin/admin-task-read-helpers.js'
import {
@@ -298,8 +301,27 @@ async function publishWorkOrderSnapshots(input: {
return
}
const pendingUnfreezeByOrderId = await sumPendingUnfreezeByOrderIds([workOrderId])
const shares = await listWorkOrderShares(workOrderId)
const material = safeParseJson(workOrder.material_json)
const consignmentMaterial = material.consignment
const consignmentInventoryId =
consignmentMaterial &&
typeof consignmentMaterial === 'object' &&
!Array.isArray(consignmentMaterial)
? Math.max(
0,
Math.floor(Number((consignmentMaterial as Record<string, unknown>).inventoryId) || 0),
)
: 0
const [pendingUnfreezeByOrderId, shares, consignmentInventories] = await Promise.all([
sumPendingUnfreezeByOrderIds([workOrderId]),
listWorkOrderShares(workOrderId),
consignmentInventoryId > 0
? listConsignmentInventoriesByIds([consignmentInventoryId])
: Promise.resolve([] as ConsignmentInventoryRow[]),
])
// 寄售工单的快照也要带库存实时供货人:前端会整行替换,
// 若只给 material 里的旧快照,改名后的列表会被实时事件刷回旧名。
const consignmentInventory = consignmentInventories[0] || null
// 事件驱动缓存失效:这里已经拿到的工单与拼单快照恰好给出完整的受影响打手集合
// (当前指派 + 历史保留 + 全部拼单人 + 调用方显式指定的)。
@@ -317,7 +339,7 @@ async function publishWorkOrderSnapshots(input: {
.reduce((sum, share) => sum + Number(share.quantity || 0), 0)
const pendingSubmissionCount = shares.filter((share) => share.status === 'joined').length
const adminSnapshot = {
...mapWorkOrderAdmin(workOrder, shares),
...mapWorkOrderAdmin(workOrder, shares, consignmentInventory),
pendingUnfreezeAmount: pendingUnfreezeByOrderId.get(workOrderId) || 0,
sharingProgress: {
joinedQuantity,
@@ -296,6 +296,12 @@ export function mapWorkOrderAdmin(
const giftPhase = String(workOrder.gift_phase || '').trim()
const resolvedGiftPhase = resolveWorkOrderGiftPhase(workOrder)
const internalConsignment = hasInternalConsignmentFulfillment(workOrder)
const consignmentMaterial = safeParseJson(
safeParseJson(workOrder.material_json).consignment,
) as JsonObject
const consignmentWorkerIdRaw =
consignmentInventory?.worker_id || consignmentMaterial.workerId || 0
const consignmentWorkerId = Math.max(0, Math.floor(Number(consignmentWorkerIdRaw) || 0))
const hallAvailable =
workOrder.status === WORK_ORDER_STATUS.OPEN &&
(!workOrder.sharing_enabled || activeShareQuantity < sharingTotalQuantity)
@@ -474,6 +480,8 @@ export function mapWorkOrderAdmin(
displayName: workOrder.worker_display_name || '',
}
: null,
/** 寄售供货打手:后台「接单人员」筛选也认这个 id(内部寄售直接履约没有 assigned_worker_id)。 */
consignmentWorkerId: consignmentWorkerId > 0 ? consignmentWorkerId : null,
...(shares ? { sharingWorkers: mapWorkOrderSharingWorkers(shares) } : {}),
publishedAt: workOrder.published_at,
pinnedAt: workOrder.pinned_at,