feat(consignment): 新增和平精英寄卖库存管理、定向收集审核与工单智能匹配履约
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user