- 根因排查:此前超时扫描仅针对整单 in_progress,而拼单母单为 open 且 deadline_at 为空,导致打手超时的拼单份额无法被定时扫描命中与释放; - 定时扫描:在 settleOverdueWorkOrders 中引入 listOverdueWorkOrderShares,自动扫描超时未提交资料的拼单份额(joined); - 超时处置:新增 settleOverdueWorkOrderShare 事务处理,按母单 timeout_policy 释放或扣除押金,份额标记 cancelled,母单保持或恢复 open 状态重回抢单大厅,记录 timeout 事件并推送实时变更; - 提交防呆:在打手提交拼单验收时检测个人份额是否已超时,超时则立即执行处置并拦截提交; - 倒计时展示:在 mapWorkOrderForWorker 中根据 myShare.created_at + timeout_minutes 为拼单打手计算并展示个人履约截止时间; - 质量验证:补齐拼单截止时间计算与处置链路测试,全量 676 个测试均通过,通过 npm run check 校验。
89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
import { Router } from 'express'
|
|
|
|
import { getAdminOrderDetail, getAdminOrders } from '../../services/admin/admin-read-service.js'
|
|
import { resendAdminOrderKuaishouIndustryVoucherCodes } from '../../services/admin/write/kuaishou-industry-actions.js'
|
|
import {
|
|
updateAdminOrderClaimStatus,
|
|
type UpdateOrderClaimStatusPayload,
|
|
} from '../../services/admin/write/order-actions.js'
|
|
import { createJsonHandler, requireAdminRoles } from './session.js'
|
|
import type { AdminOrderRouteParams, AdminOrderRouteQuery } from '../../types/admin/route-inputs.js'
|
|
|
|
const router = Router()
|
|
|
|
router.use('/orders', requireAdminRoles(['admin', 'operator', 'support']))
|
|
|
|
router.get(
|
|
'/orders',
|
|
createJsonHandler((req) => getAdminOrders(req.query as AdminOrderRouteQuery), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取订单列表失败',
|
|
scope: '[admin/orders]',
|
|
}),
|
|
)
|
|
|
|
router.get(
|
|
'/orders/:orderId',
|
|
createJsonHandler(
|
|
(req) =>
|
|
getAdminOrderDetail(
|
|
String((req.params as AdminOrderRouteParams).orderId || ''),
|
|
req.adminSession || null,
|
|
),
|
|
{
|
|
successMessage: 'ok',
|
|
errorMessage: '读取订单详情失败',
|
|
scope: '[admin/orders/:orderId]',
|
|
},
|
|
),
|
|
)
|
|
|
|
router.post(
|
|
'/orders/:orderId/claim-status',
|
|
requireAdminRoles(['admin', 'operator', 'support']),
|
|
createJsonHandler(
|
|
(req) =>
|
|
updateAdminOrderClaimStatus(
|
|
String((req.params as AdminOrderRouteParams).orderId || ''),
|
|
req.body as UpdateOrderClaimStatusPayload,
|
|
req.adminSession || null,
|
|
),
|
|
{
|
|
successMessage: '订单兑换状态已更新',
|
|
errorMessage: '更新订单兑换状态失败',
|
|
scope: '[admin/orders/:orderId/claim-status]',
|
|
audit: (req, data) => ({
|
|
action: 'order_claim_status_update',
|
|
targetType: 'order',
|
|
targetId: String((req.params as AdminOrderRouteParams).orderId || ''),
|
|
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
|
}),
|
|
},
|
|
),
|
|
)
|
|
|
|
router.post(
|
|
'/orders/:orderId/kuaishou-industry/resend-code',
|
|
requireAdminRoles(['admin', 'operator', 'support']),
|
|
createJsonHandler(
|
|
(req) =>
|
|
resendAdminOrderKuaishouIndustryVoucherCodes(
|
|
String((req.params as AdminOrderRouteParams).orderId || ''),
|
|
req.adminSession || null,
|
|
),
|
|
{
|
|
successMessage: '电子凭证发码回调已重发',
|
|
errorMessage: '重发电子凭证发码回调失败',
|
|
scope: '[admin/orders/:orderId/kuaishou-industry/resend-code]',
|
|
audit: (req, data) => ({
|
|
action: 'order_kuaishou_industry_resend_code',
|
|
targetType: 'order',
|
|
targetId: String((req.params as AdminOrderRouteParams).orderId || ''),
|
|
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
|
}),
|
|
},
|
|
),
|
|
)
|
|
|
|
export default router
|