feat(collect): 补资料查询仅限待完善并优化页面展示

- 公开查询只返回待完善工单,待分配/已验收等状态提示「该订单当前无需补充资料」
- 404 失败查询按 IP 冷却 2 秒,成功查询不计数;前端显示「查询过于频繁」
- 提交成功后本地展示成功页,刷新后按严格模式提示无需补充资料
- 收敛补资料页重复提示,移除状态标签与工单号,商品与订单号合并展示
- 修复 React StrictMode 下刷新重复请求查询接口的问题
This commit is contained in:
2026-11-02 10:38:09 +08:00
parent db73e8f820
commit a9e2de443e
7 changed files with 391 additions and 77 deletions
@@ -3,10 +3,12 @@ import test from 'node:test'
import {
formatPublicMaterialStatus,
pickPendingMaterialOrders,
pickSubmittedMaterialFields,
resolveMaterialResetBlockReason,
resolvePublicMaterialOrderState,
} from './work-order-material-link-service.js'
import type { WorkOrderRow } from '../../repositories/worker-platform/types.js'
test('公开补资料:只有待完善且未指派/无份额可提交', () => {
const editable = resolvePublicMaterialOrderState({
@@ -128,6 +130,22 @@ test('客服重置补资料:只允许待分配、未指派、无份额、未
)
})
test('公开补资料:只查询待完善工单,其他状态一律不返回', () => {
const orders = [
{ status: 'pending_material' },
{ status: 'unassigned' },
{ status: 'open' },
{ status: 'accepted' },
{ status: 'cancelled' },
] as WorkOrderRow[]
assert.deepEqual(
pickPendingMaterialOrders(orders).map((order) => order.status),
['pending_material'],
)
assert.deepEqual(pickPendingMaterialOrders([]), [])
})
test('公开补资料:提交字段只保留 requirements 白名单,额外字段被丢弃', () => {
const result = pickSubmittedMaterialFields([{ key: 'gameId' }, { key: 'gameNickname' }], {
gameId: '123',
@@ -232,12 +232,21 @@ async function resolvePublicMaterialTarget(
return orders[0]!
}
/**
* 公开页只允许查询待完善工单。
*
* 待分配、待抢单、代练中、已验收、已取消等状态一律不返回,
* 避免客户用订单号看到已完成订单的商品与状态。
*/
export function pickPendingMaterialOrders(orders: WorkOrderRow[]): WorkOrderRow[] {
return orders.filter((order) => order.status === WORK_ORDER_STATUS.PENDING_MATERIAL)
}
/**
* 公开页按平台订单号读取补资料内容。
*
* 不再要求客服先生成链接;只要订单号存在,就返回该订单号下所有工单的
* 状态与准入信息。只有可提交的待完善工单返回字段/已填值/截图,其他状态
* 只返回商品、工单号、状态和客服提示。
* 不再要求客服先生成链接;订单号存在且仍有待完善工单时才返回内容。
* 只返回待完善工单;已提交(待分配)及其他状态统一提示无需补充资料。
*/
export async function getPublicWorkOrderMaterialLink(platformOrderId: string) {
const code = String(platformOrderId || '').trim()
@@ -256,7 +265,15 @@ export async function getPublicWorkOrderMaterialLink(platformOrderId: string) {
})
}
const publicOrders = orders.map(mapPublicMaterialOrder)
const pendingOrders = pickPendingMaterialOrders(orders)
if (pendingOrders.length === 0) {
throw createHttpError('该订单当前无需补充资料', {
statusCode: 404,
errorCode: 'material_link_not_pending',
})
}
const publicOrders = pendingOrders.map(mapPublicMaterialOrder)
return {
platformOrderId: code,
orders: publicOrders,