feat(consignment): 新增和平精英寄卖库存管理、定向收集审核与工单智能匹配履约

This commit is contained in:
yml2213
2026-09-14 11:39:15 +08:00
parent 38c0cf1223
commit 1aa6dba931
30 changed files with 6350 additions and 44 deletions
+11 -6
View File
@@ -84,13 +84,17 @@ export function requireAdminPermission(permission: string) {
return (req: Request, res: Response, next: NextFunction): void => {
try {
const session = getRequiredAdminSession(req)
if (!session.permissions.includes(String(permission || '').trim())) {
throw createHttpError('当前账号没有此操作权限', {
statusCode: 403,
errorCode: 'admin_permission_denied',
})
if (
session.role === 'admin' ||
session.permissions.includes(String(permission || '').trim())
) {
next()
return
}
next()
throw createHttpError('当前账号没有此操作权限', {
statusCode: 403,
errorCode: 'admin_permission_denied',
})
} catch (error) {
sendRouteError(res, error, '后台鉴权失败', '[admin/auth/permission]')
}
@@ -102,6 +106,7 @@ export function requireAnyAdminPermission(permissions: string[]) {
try {
const session = getRequiredAdminSession(req)
if (
session.role === 'admin' ||
permissions.some((permission) =>
session.permissions.includes(String(permission || '').trim()),
)
@@ -8,6 +8,7 @@ import adminWorkerPlatformReviewRoutes from './worker-platform/review.js'
import adminWorkerPlatformAcceptanceRoutes from './worker-platform/acceptance.js'
import adminWorkerPlatformAfterSalesRoutes from './worker-platform/after-sales.js'
import adminWorkerPlatformLeaderboardRoutes from './worker-platform/leaderboard.js'
import adminWorkerPlatformConsignmentRoutes from './worker-platform/consignment.js'
const router = Router()
@@ -19,5 +20,6 @@ router.use(adminWorkerPlatformReviewRoutes)
router.use(adminWorkerPlatformAfterSalesRoutes)
router.use(adminWorkerPlatformAcceptanceRoutes)
router.use(adminWorkerPlatformLeaderboardRoutes)
router.use(adminWorkerPlatformConsignmentRoutes)
export default router
@@ -0,0 +1,280 @@
import { Router } from 'express'
import {
approveAdminConsignmentSubmission,
archiveAdminConsignmentInventory,
createAdminConsignmentInventory,
createAdminConsignmentLink,
fetchAdminConsignmentInventories,
fetchAdminConsignmentLinks,
fetchAdminConsignmentStats,
fetchAdminConsignmentSubmissions,
getAdminConsignmentInventory,
getAdminConsignmentSubmission,
rejectAdminConsignmentSubmission,
returnAdminConsignmentInventory,
toggleAdminConsignmentMatching,
updateAdminConsignmentInventory,
updateAdminConsignmentLink,
} from '../../../services/worker-platform/consignment-admin-service.js'
import {
checkWorkOrderInventoryMatches,
fulfillWorkOrderWithConsignment,
revokeWorkOrderConsignmentFulfillment,
} from '../../../services/worker-platform/consignment-fulfillment-service.js'
import { createJsonHandler, requireAdminRoles } from '../session.js'
const router = Router()
// ---------------- 库存管理与统计 ----------------
router.get(
'/worker-platform/consignment/inventories',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => fetchAdminConsignmentInventories(req.query), {
successMessage: 'ok',
errorMessage: '读取寄卖库存失败',
scope: '[admin/consignment/inventories]',
}),
)
router.get(
'/worker-platform/consignment/stats',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(() => fetchAdminConsignmentStats(), {
successMessage: 'ok',
errorMessage: '读取寄卖统计失败',
scope: '[admin/consignment/stats]',
}),
)
router.get(
'/worker-platform/consignment/inventories/:id',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => getAdminConsignmentInventory(String(req.params.id || '')), {
successMessage: 'ok',
errorMessage: '读取寄卖物品详情失败',
scope: '[admin/consignment/inventories/:id]',
}),
)
router.post(
'/worker-platform/consignment/inventories',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) => createAdminConsignmentInventory(req.body, req.adminSession?.username || 'admin'),
{
successMessage: '寄卖物品已入库',
errorMessage: '创建寄卖物品失败',
scope: '[admin/consignment/inventories/create]',
},
),
)
router.put(
'/worker-platform/consignment/inventories/:id',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
updateAdminConsignmentInventory(
String(req.params.id || ''),
req.body,
req.adminSession?.username || 'admin',
),
{
successMessage: '寄卖物品已更新',
errorMessage: '更新寄卖物品失败',
scope: '[admin/consignment/inventories/update]',
},
),
)
router.patch(
'/worker-platform/consignment/inventories/:id/matching',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
toggleAdminConsignmentMatching(String(req.params.id || ''), Boolean(req.body?.allowMatching)),
{
successMessage: '匹配开关已更新',
errorMessage: '更新匹配开关失败',
scope: '[admin/consignment/inventories/matching]',
},
),
)
router.post(
'/worker-platform/consignment/inventories/:id/archive',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => archiveAdminConsignmentInventory(String(req.params.id || '')), {
successMessage: '物品已下架作废',
errorMessage: '作废寄卖物品失败',
scope: '[admin/consignment/inventories/archive]',
}),
)
router.post(
'/worker-platform/consignment/inventories/:id/return',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
returnAdminConsignmentInventory(
String(req.params.id || ''),
req.body,
req.adminSession?.username || 'admin',
),
{
successMessage: '物品已退回复库',
errorMessage: '退回复库失败',
scope: '[admin/consignment/inventories/return]',
},
),
)
// ---------------- 收集链接管理 ----------------
router.get(
'/worker-platform/consignment/links',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(() => fetchAdminConsignmentLinks(), {
successMessage: 'ok',
errorMessage: '读取收集链接列表失败',
scope: '[admin/consignment/links]',
}),
)
router.post(
'/worker-platform/consignment/links',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) => createAdminConsignmentLink(req.body, req.adminSession?.username || 'admin'),
{
successMessage: '收集链接已生成',
errorMessage: '生成收集链接失败',
scope: '[admin/consignment/links/create]',
},
),
)
router.put(
'/worker-platform/consignment/links/:id',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => updateAdminConsignmentLink(String(req.params.id || ''), req.body), {
successMessage: '收集链接已更新',
errorMessage: '更新收集链接失败',
scope: '[admin/consignment/links/update]',
}),
)
// ---------------- 提报单审核 ----------------
router.get(
'/worker-platform/consignment/submissions',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => fetchAdminConsignmentSubmissions(req.query), {
successMessage: 'ok',
errorMessage: '读取提报列表失败',
scope: '[admin/consignment/submissions]',
}),
)
router.get(
'/worker-platform/consignment/submissions/:id',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => getAdminConsignmentSubmission(String(req.params.id || '')), {
successMessage: 'ok',
errorMessage: '读取提报详情失败',
scope: '[admin/consignment/submissions/:id]',
}),
)
router.post(
'/worker-platform/consignment/submissions/:id/approve',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
approveAdminConsignmentSubmission(
String(req.params.id || ''),
req.body,
req.adminSession?.username || 'admin',
),
{
successMessage: '审核通过,已正式入库',
errorMessage: '审核入库失败',
scope: '[admin/consignment/submissions/approve]',
},
),
)
router.post(
'/worker-platform/consignment/submissions/:id/reject',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
rejectAdminConsignmentSubmission(
String(req.params.id || ''),
req.body,
req.adminSession?.username || 'admin',
),
{
successMessage: '已驳回该提报',
errorMessage: '驳回提报失败',
scope: '[admin/consignment/submissions/reject]',
},
),
)
// ---------------- 匹配与履约 ----------------
router.get(
'/worker-platform/consignment/matches/:workOrderId',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler((req) => checkWorkOrderInventoryMatches(String(req.params.workOrderId || '')), {
successMessage: 'ok',
errorMessage: '检查寄售库存匹配失败',
scope: '[admin/consignment/matches]',
}),
)
router.post(
'/worker-platform/consignment/fulfill',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
fulfillWorkOrderWithConsignment({
workOrderId: String(req.body?.workOrderId || ''),
inventoryId: String(req.body?.inventoryId || ''),
actorName: req.adminSession?.username || 'admin',
}),
{
successMessage: '已使用内部寄售库存直接履约!',
errorMessage: '内部履约失败',
scope: '[admin/consignment/fulfill]',
},
),
)
router.post(
'/worker-platform/consignment/revoke',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(
(req) =>
revokeWorkOrderConsignmentFulfillment({
workOrderId: String(req.body?.workOrderId || ''),
action:
req.body?.action === 'cancel_order'
? 'cancel_order'
: req.body?.action === 'archive_inventory'
? 'archive_inventory'
: 'reopen',
reason: String(req.body?.reason || ''),
actorName: req.adminSession?.username || 'admin',
}),
{
successMessage: '寄售履约已撤销',
errorMessage: '撤销履约失败',
scope: '[admin/consignment/revoke]',
},
),
)
export default router