From 2134e9dbc4d2b64327be2b6a04d3a7464c253478 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Fri, 21 Aug 2026 18:57:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=90=8E=E5=8F=B0=E6=89=93?= =?UTF-8?q?=E6=89=8B=E5=B9=B3=E5=8F=B0=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/routes/admin/worker-platform.ts | 1176 +---------------- .../admin/worker-platform/acceptance.ts | 156 +++ .../admin/worker-platform/after-sales.ts | 81 ++ .../routes/admin/worker-platform/config.ts | 395 ++++++ .../routes/admin/worker-platform/finance.ts | 40 + .../routes/admin/worker-platform/orders.ts | 360 +++++ .../routes/admin/worker-platform/review.ts | 75 ++ .../routes/admin/worker-platform/workers.ts | 116 ++ 8 files changed, 1237 insertions(+), 1162 deletions(-) create mode 100644 apps/backend/src/routes/admin/worker-platform/acceptance.ts create mode 100644 apps/backend/src/routes/admin/worker-platform/after-sales.ts create mode 100644 apps/backend/src/routes/admin/worker-platform/config.ts create mode 100644 apps/backend/src/routes/admin/worker-platform/finance.ts create mode 100644 apps/backend/src/routes/admin/worker-platform/orders.ts create mode 100644 apps/backend/src/routes/admin/worker-platform/review.ts create mode 100644 apps/backend/src/routes/admin/worker-platform/workers.ts diff --git a/apps/backend/src/routes/admin/worker-platform.ts b/apps/backend/src/routes/admin/worker-platform.ts index d575d0af..1d375196 100644 --- a/apps/backend/src/routes/admin/worker-platform.ts +++ b/apps/backend/src/routes/admin/worker-platform.ts @@ -1,1169 +1,21 @@ import { Router } from 'express' -import { - acceptAdminWorkOrder, - acceptAdminWorkOrderShare, - acceptAdminWorkOrders, - assignAdminWorkOrderToWorker, - cancelAdminWorkOrder, - cancelAdminWorkOrderShare, - unassignAdminWorkOrder, - creditAdminWorkerWallet, - createAdminMockWorkOrder, - createAdminAfterSalesCase, - deductAdminWorkOrderPendingDeposit, - deleteAdminWorkCategory, - deleteAdminWorkProductRule, - deleteAdminWorkOrder, - deleteAdminWorkerLevel, - getAdminWorkerFinanceConfig, - getAdminWorkerHallConfig, - getAdminWorkerProductMatchConfig, - getAdminWorkerAnnouncementConfig, - getAdminWorkerPlatformNotificationConfig, - getAdminWorkerPlatformSummary, - getAdminWorkOrderEvents, - getAdminAfterSalesCaseEvents, - getAdminWorkOrderSharing, - listAdminWorkerFinanceRequests, - listAdminWorkerWithdrawalAccounts, - listAdminWorkCategories, - listAdminKuaishouMatchSources, - listAdminWorkProductMatchLogs, - listAdminWorkProductRuleMappings, - listAdminWorkProductRules, - listAdminWorkerLevels, - listAdminWorkerUsers, - listAdminWorkOrders, - listAdminAfterSalesCases, - listAdminWorkerCancelRequests, - listAdminWorkerOrderFeedbacks, - markAdminWorkOrderProblem, - pinAdminWorkOrder, - publishAdminWorkOrder, - reopenAdminCancelledWorkOrder, - reprocessAdminKuaishouSendCodeWorkOrders, - reviewAdminWorkerFinanceRequest, - reviewAdminWorkerCancelRequest, - resolveAdminWorkerOrderFeedback, - resolveAdminProblemWorkOrder, - resolveAdminAfterSalesCase, - reviewAdminWorkerUser, - resetAdminWorkerPassword, - saveAdminWorkerFinanceConfig, - saveAdminWorkerHallConfig, - saveAdminWorkerProductMatchConfig, - saveAdminWorkerAnnouncementConfig, - saveAdminWorkerPlatformNotificationConfig, - saveAdminWorkerWithdrawalAccount, - saveAdminWorkCategory, - saveAdminWorkProductRuleMapping, - saveAdminWorkProductRule, - syncAdminWorkProductRulePrice, - testAdminKuaishouProductMatch, - saveAdminWorkerLevel, - submitAdminWorkOrderMaterial, - unpublishAdminWorkOrder, - updateAdminWorkOrder, - updateAdminWorkOrderSharing, - deleteAdminWorkProductRuleMapping, -} from '../../services/worker-platform/index.js' -import { createJsonHandler, requireAdminRoles } from './session.js' +import adminWorkerPlatformConfigRoutes from './worker-platform/config.js' +import adminWorkerPlatformWorkersRoutes from './worker-platform/workers.js' +import adminWorkerPlatformFinanceRoutes from './worker-platform/finance.js' +import adminWorkerPlatformOrdersRoutes from './worker-platform/orders.js' +import adminWorkerPlatformReviewRoutes from './worker-platform/review.js' +import adminWorkerPlatformAcceptanceRoutes from './worker-platform/acceptance.js' +import adminWorkerPlatformAfterSalesRoutes from './worker-platform/after-sales.js' const router = Router() -router.get( - '/worker-platform/summary', - createJsonHandler(() => getAdminWorkerPlatformSummary(), { - successMessage: 'ok', - errorMessage: '读取接单平台概览失败', - scope: '[admin/worker-platform/summary]', - }), -) - -router.get( - '/worker-platform/levels', - requireAdminRoles(['admin', 'operator']), - createJsonHandler(() => listAdminWorkerLevels(), { - successMessage: 'ok', - errorMessage: '读取接单等级失败', - scope: '[admin/worker-platform/levels]', - }), -) - -router.post( - '/worker-platform/levels', - requireAdminRoles(['admin']), - createJsonHandler((req) => saveAdminWorkerLevel(req.body || {}), { - successMessage: '接单等级已保存', - errorMessage: '保存接单等级失败', - scope: '[admin/worker-platform/levels]', - audit: (_req, data) => ({ - action: 'worker_level_saved', - targetType: 'worker_level', - targetId: String((data as { level?: { levelKey?: string } })?.level?.levelKey || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.delete( - '/worker-platform/levels/:levelId', - requireAdminRoles(['admin']), - createJsonHandler((req) => deleteAdminWorkerLevel(String(req.params.levelId || '')), { - successMessage: '接单等级已删除', - errorMessage: '删除接单等级失败', - scope: '[admin/worker-platform/levels/:levelId]', - audit: (_req, data) => ({ - action: 'worker_level_deleted', - targetType: 'worker_level', - targetId: String(_req.params.levelId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.get( - '/worker-platform/categories', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler(() => listAdminWorkCategories(), { - successMessage: 'ok', - errorMessage: '读取接单分类失败', - scope: '[admin/worker-platform/categories]', - }), -) - -router.post( - '/worker-platform/categories', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => saveAdminWorkCategory(req.body || {}), { - successMessage: '接单分类已保存', - errorMessage: '保存接单分类失败', - scope: '[admin/worker-platform/categories]', - audit: (_req, data) => ({ - action: 'work_category_saved', - targetType: 'work_category', - targetId: String( - (data as { category?: { categoryKey?: string } })?.category?.categoryKey || '', - ), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.delete( - '/worker-platform/categories/:categoryId', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => deleteAdminWorkCategory(String(req.params.categoryId || '')), { - successMessage: '接单分类已删除', - errorMessage: '删除接单分类失败', - scope: '[admin/worker-platform/categories/:categoryId]', - audit: (_req, data) => ({ - action: 'work_category_deleted', - targetType: 'work_category', - targetId: String(_req.params.categoryId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.get( - '/worker-platform/product-rules', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkProductRules(req.query), { - successMessage: 'ok', - errorMessage: '读取接单物品规则失败', - scope: '[admin/worker-platform/product-rules]', - }), -) - -router.post( - '/worker-platform/product-rules', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => saveAdminWorkProductRule(req.body || {}), { - successMessage: '接单物品规则已保存', - errorMessage: '保存接单物品规则失败', - scope: '[admin/worker-platform/product-rules]', - audit: (_req, data) => ({ - action: 'work_product_rule_saved', - targetType: 'work_product_rule', - targetId: String((data as { rule?: { ruleKey?: string } })?.rule?.ruleKey || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.post( - '/worker-platform/product-rules/:ruleId/sync-price', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - syncAdminWorkProductRulePrice( - String(req.params.ruleId || ''), - req.adminSession?.username || '', - ), - { - successMessage: '模板价格已同步', - errorMessage: '同步模板价格失败', - scope: '[admin/worker-platform/product-rules/:ruleId/sync-price]', - audit: (req, data) => ({ - action: 'work_product_rule_price_synced', - targetType: 'work_product_rule', - targetId: String(req.params.ruleId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.delete( - '/worker-platform/product-rules/:ruleId', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => deleteAdminWorkProductRule(String(req.params.ruleId || '')), { - successMessage: '接单物品规则已删除', - errorMessage: '删除接单物品规则失败', - scope: '[admin/worker-platform/product-rules/:ruleId]', - audit: (_req, data) => ({ - action: 'work_product_rule_deleted', - targetType: 'work_product_rule', - targetId: String(_req.params.ruleId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.get( - '/worker-platform/product-mappings', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkProductRuleMappings(req.query), { - successMessage: 'ok', - errorMessage: '读取商品映射失败', - scope: '[admin/worker-platform/product-mappings]', - }), -) - -router.post( - '/worker-platform/product-mappings', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => saveAdminWorkProductRuleMapping(req.body || {}), { - successMessage: '商品映射已保存', - errorMessage: '保存商品映射失败', - scope: '[admin/worker-platform/product-mappings]', - audit: (_req, data) => ({ - action: 'work_product_mapping_saved', - targetType: 'work_product_mapping', - targetId: String((data as { mapping?: { mappingId?: number } })?.mapping?.mappingId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.delete( - '/worker-platform/product-mappings/:mappingId', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => deleteAdminWorkProductRuleMapping(String(req.params.mappingId || '')), - { - successMessage: '商品映射已删除', - errorMessage: '删除商品映射失败', - scope: '[admin/worker-platform/product-mappings/:mappingId]', - }, - ), -) - -router.get( - '/worker-platform/product-match-config', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler(() => getAdminWorkerProductMatchConfig(), { - successMessage: 'ok', - errorMessage: '读取商品匹配配置失败', - scope: '[admin/worker-platform/product-match-config]', - }), -) - -router.get( - '/worker-platform/announcement', - requireAdminRoles(['admin', 'operator']), - createJsonHandler(() => getAdminWorkerAnnouncementConfig(), { - successMessage: 'ok', - errorMessage: '读取公告失败', - scope: '[admin/worker-platform/announcement]', - }), -) - -router.get( - '/worker-platform/hall-config', - requireAdminRoles(['admin', 'operator']), - createJsonHandler(() => getAdminWorkerHallConfig(), { - successMessage: 'ok', - errorMessage: '读取大厅配置失败', - scope: '[admin/worker-platform/hall-config]', - }), -) - -router.post( - '/worker-platform/hall-config', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => saveAdminWorkerHallConfig(req.body || {}), { - successMessage: '大厅配置已保存', - errorMessage: '保存大厅配置失败', - scope: '[admin/worker-platform/hall-config]', - audit: (_req, data) => ({ - action: 'worker_hall_config_saved', - targetType: 'worker_hall_config', - targetId: 'worker_hall', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.post( - '/worker-platform/announcement', - requireAdminRoles(['admin']), - createJsonHandler((req) => saveAdminWorkerAnnouncementConfig(req.body || {}), { - successMessage: '公告已保存', - errorMessage: '保存公告失败', - scope: '[admin/worker-platform/announcement]', - audit: (_req, data) => ({ - action: 'worker_announcement_saved', - targetType: 'worker_announcement', - targetId: 'worker_announcement', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.post( - '/worker-platform/product-match-config', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => saveAdminWorkerProductMatchConfig(req.body || {}), { - successMessage: '商品匹配配置已保存', - errorMessage: '保存商品匹配配置失败', - scope: '[admin/worker-platform/product-match-config]', - audit: (_req, data) => ({ - action: 'worker_product_match_config_saved', - targetType: 'worker_product_match_config', - targetId: 'worker_product_match', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.get( - '/worker-platform/product-match-sources', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminKuaishouMatchSources(req.query), { - successMessage: 'ok', - errorMessage: '读取快手匹配载荷失败', - scope: '[admin/worker-platform/product-match-sources]', - }), -) - -router.post( - '/worker-platform/product-match-test', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => testAdminKuaishouProductMatch(req.body || {}), { - successMessage: '匹配测试完成', - errorMessage: '匹配测试失败', - scope: '[admin/worker-platform/product-match-test]', - }), -) - -router.get( - '/worker-platform/product-match-logs', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkProductMatchLogs(req.query), { - successMessage: 'ok', - errorMessage: '读取匹配日志失败', - scope: '[admin/worker-platform/product-match-logs]', - }), -) - -router.get( - '/worker-platform/workers', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkerUsers(req.query), { - successMessage: 'ok', - errorMessage: '读取打手列表失败', - scope: '[admin/worker-platform/workers]', - }), -) - -router.post( - '/worker-platform/workers/:workerId/review', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => reviewAdminWorkerUser(String(req.params.workerId || ''), req.body || {}), - { - successMessage: '打手账号状态已更新', - errorMessage: '更新打手账号状态失败', - scope: '[admin/worker-platform/workers/:workerId/review]', - audit: (req, data) => ({ - action: 'worker_reviewed', - targetType: 'worker', - targetId: String(req.params.workerId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/workers/:workerId/reset-password', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => resetAdminWorkerPassword(String(req.params.workerId || ''), req.body || {}), - { - successMessage: '打手密码已重置', - errorMessage: '重置打手密码失败', - scope: '[admin/worker-platform/workers/:workerId/reset-password]', - audit: (req, data) => ({ - action: 'worker_password_reset', - targetType: 'worker', - targetId: String(req.params.workerId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/workers/:workerId/wallet-credit', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => creditAdminWorkerWallet(String(req.params.workerId || ''), req.body || {}), - { - successMessage: '打手余额已增加', - errorMessage: '人工充值失败', - scope: '[admin/worker-platform/workers/:workerId/wallet-credit]', - audit: (req, data) => ({ - action: 'worker_wallet_credited', - targetType: 'worker', - targetId: String(req.params.workerId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.get( - '/worker-platform/workers/:workerId/withdrawal-accounts', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => listAdminWorkerWithdrawalAccounts(String(req.params.workerId || '')), { - successMessage: 'ok', - errorMessage: '读取打手提现信息失败', - scope: '[admin/worker-platform/workers/:workerId/withdrawal-accounts]', - }), -) - -router.post( - '/worker-platform/workers/:workerId/withdrawal-accounts/:accountChannel', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - saveAdminWorkerWithdrawalAccount( - String(req.params.workerId || ''), - String(req.params.accountChannel || ''), - req.body || {}, - ), - { - successMessage: '打手提现信息已保存', - errorMessage: '保存打手提现信息失败', - scope: '[admin/worker-platform/workers/:workerId/withdrawal-accounts/:accountChannel]', - audit: (req) => ({ - action: 'worker_withdrawal_account_saved', - targetType: 'worker', - targetId: String(req.params.workerId || ''), - data: { accountChannel: String(req.params.accountChannel || '') }, - }), - }, - ), -) - -router.get( - '/worker-platform/finance-config', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler(() => getAdminWorkerFinanceConfig(), { - successMessage: 'ok', - errorMessage: '读取资金配置失败', - scope: '[admin/worker-platform/finance-config]', - }), -) - -router.post( - '/worker-platform/finance-config', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => saveAdminWorkerFinanceConfig(req.body || {}), { - successMessage: '资金配置已保存', - errorMessage: '保存资金配置失败', - scope: '[admin/worker-platform/finance-config]', - audit: (_req, data) => ({ - action: 'worker_finance_config_saved', - targetType: 'worker_finance_config', - targetId: 'worker_finance', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.get( - '/worker-platform/notification-config', - requireAdminRoles(['admin', 'operator']), - createJsonHandler(() => getAdminWorkerPlatformNotificationConfig(), { - successMessage: 'ok', - errorMessage: '读取通知配置失败', - scope: '[admin/worker-platform/notification-config]', - }), -) - -router.post( - '/worker-platform/notification-config', - requireAdminRoles(['admin']), - createJsonHandler((req) => saveAdminWorkerPlatformNotificationConfig(req.body || {}), { - successMessage: '通知配置已保存', - errorMessage: '保存通知配置失败', - scope: '[admin/worker-platform/notification-config]', - audit: (_req, data) => ({ - action: 'worker_platform_notification_config_saved', - targetType: 'worker_platform_notification_config', - targetId: 'worker_platform_notifications', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.get( - '/worker-platform/finance-requests', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkerFinanceRequests(req.query), { - successMessage: 'ok', - errorMessage: '读取资金申请失败', - scope: '[admin/worker-platform/finance-requests]', - }), -) - -router.post( - '/worker-platform/finance-requests/:requestId/review', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => reviewAdminWorkerFinanceRequest(String(req.params.requestId || ''), req.body || {}), - { - successMessage: '资金申请已处理', - errorMessage: '处理资金申请失败', - scope: '[admin/worker-platform/finance-requests/:requestId/review]', - audit: (req, data) => ({ - action: 'worker_finance_request_reviewed', - targetType: 'worker_finance_request', - targetId: String(req.params.requestId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.get( - '/worker-platform/orders', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkOrders(req.query), { - successMessage: 'ok', - errorMessage: '读取接单订单失败', - scope: '[admin/worker-platform/orders]', - }), -) - -router.get( - '/worker-platform/cancel-requests', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkerCancelRequests(req.query), { - successMessage: 'ok', - errorMessage: '读取撤单申请失败', - scope: '[admin/worker-platform/cancel-requests]', - }), -) - -router.get( - '/worker-platform/feedbacks', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminWorkerOrderFeedbacks(req.query), { - successMessage: 'ok', - errorMessage: '读取问题反馈失败', - scope: '[admin/worker-platform/feedbacks]', - }), -) - -router.post( - '/worker-platform/feedbacks/:feedbackId/resolve', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - resolveAdminWorkerOrderFeedback( - String(req.params.feedbackId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '问题反馈已处理', - errorMessage: '处理问题反馈失败', - scope: '[admin/worker-platform/feedbacks/:feedbackId/resolve]', - }, - ), -) - -router.post( - '/worker-platform/cancel-requests/:requestId/review', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - reviewAdminWorkerCancelRequest( - String(req.params.requestId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '撤单申请已审核', - errorMessage: '审核撤单申请失败', - scope: '[admin/worker-platform/cancel-requests/:requestId/review]', - audit: (req, data) => ({ - action: 'worker_cancel_request_reviewed', - targetType: 'worker_cancel_request', - targetId: String(req.params.requestId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/mock', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => createAdminMockWorkOrder(req.body || {}), { - successMessage: '接单工单 Mock 已生成', - errorMessage: '生成接单工单 Mock 失败', - scope: '[admin/worker-platform/orders/mock]', - audit: (_req, data) => ({ - action: 'work_order_mock_created', - targetType: 'work_order', - targetId: String((data as { order?: { workOrderId?: number } })?.order?.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.post( - '/worker-platform/orders/reprocess-matches', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => reprocessAdminKuaishouSendCodeWorkOrders(req.body || {}), { - successMessage: '快手订单重匹配完成', - errorMessage: '快手订单重匹配失败', - scope: '[admin/worker-platform/orders/reprocess-matches]', - audit: (_req, data) => ({ - action: 'work_order_kuaishou_reprocessed', - targetType: 'work_order', - targetId: '', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.post( - '/worker-platform/orders/:workOrderId/material', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - submitAdminWorkOrderMaterial( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '订单资料已保存', - errorMessage: '补充订单资料失败', - scope: '[admin/worker-platform/orders/:workOrderId/material]', - audit: (req, data) => ({ - action: 'work_order_material_saved', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.put( - '/worker-platform/orders/:workOrderId', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - updateAdminWorkOrder(String(req.params.workOrderId || ''), req.body || {}, { - canEditRequirementFields: req.adminSession?.role !== 'support', - actorName: req.adminSession?.username || '', - }), - { - successMessage: '工单信息已保存', - errorMessage: '保存工单信息失败', - scope: '[admin/worker-platform/orders/:workOrderId]', - audit: (req, data) => ({ - action: 'work_order_updated', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/assign', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - assignAdminWorkOrderToWorker( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '已指派打手', - errorMessage: '指派打手失败', - scope: '[admin/worker-platform/orders/:workOrderId/assign]', - audit: (req, data) => ({ - action: 'work_order_worker_assigned', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/unassign', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - unassignAdminWorkOrder( - String(req.params.workOrderId || ''), - req.adminSession?.username || '', - ), - { - successMessage: '已取消指派', - errorMessage: '取消指派失败', - scope: '[admin/worker-platform/orders/:workOrderId/unassign]', - audit: (req, data) => ({ - action: 'work_order_worker_unassigned', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/cancel', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - cancelAdminWorkOrder( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '撤单处理完成,打手额度已恢复', - errorMessage: '撤单失败', - scope: '[admin/worker-platform/orders/:workOrderId/cancel]', - audit: (req, data) => ({ - action: - String(req.body?.action || '').trim() === 'return_to_hall' - ? 'work_order_returned_to_hall' - : 'work_order_cancelled', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.delete( - '/worker-platform/orders/:workOrderId', - requireAdminRoles(['admin', 'operator']), - createJsonHandler((req) => deleteAdminWorkOrder(String(req.params.workOrderId || '')), { - successMessage: '工单已删除', - errorMessage: '删除工单失败', - scope: '[admin/worker-platform/orders/:workOrderId]', - audit: (req, data) => ({ - action: 'work_order_deleted', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }), -) - -router.post( - '/worker-platform/orders/:workOrderId/reopen', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - reopenAdminCancelledWorkOrder( - String(req.params.workOrderId || ''), - req.adminSession?.username || '', - ), - { - successMessage: '订单已恢复为未分配状态', - errorMessage: '重新启用订单失败', - scope: '[admin/worker-platform/orders/:workOrderId/reopen]', - audit: (req, data) => ({ - action: 'work_order_reopened', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/publish', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - publishAdminWorkOrder(String(req.params.workOrderId || ''), req.adminSession?.username || ''), - { - successMessage: '订单已进入大厅队列', - errorMessage: '发布接单订单失败', - scope: '[admin/worker-platform/orders/:workOrderId/publish]', - audit: (req, data) => ({ - action: 'work_order_published', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/unpublish', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - unpublishAdminWorkOrder( - String(req.params.workOrderId || ''), - req.adminSession?.username || '', - ), - { - successMessage: '订单已撤回到未分配', - errorMessage: '下架接单订单失败', - scope: '[admin/worker-platform/orders/:workOrderId/unpublish]', - audit: (req, data) => ({ - action: 'work_order_unpublished', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/pin', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - pinAdminWorkOrder( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '置顶状态已更新', - errorMessage: '更新置顶状态失败', - scope: '[admin/worker-platform/orders/:workOrderId/pin]', - audit: (req, data) => ({ - action: 'work_order_pin_toggled', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.get( - '/worker-platform/orders/:workOrderId/sharing', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => getAdminWorkOrderSharing(String(req.params.workOrderId || '')), { - successMessage: 'ok', - errorMessage: '读取拼单信息失败', - scope: '[admin/worker-platform/orders/:workOrderId/sharing]', - }), -) - -router.get( - '/worker-platform/orders/:workOrderId/events', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => getAdminWorkOrderEvents(String(req.params.workOrderId || '')), { - successMessage: 'ok', - errorMessage: '读取工单流转记录失败', - scope: '[admin/worker-platform/orders/:workOrderId/events]', - }), -) - -router.get( - '/worker-platform/after-sales-cases', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => listAdminAfterSalesCases(req.query), { - successMessage: 'ok', - errorMessage: '读取售后问题单失败', - scope: '[admin/worker-platform/after-sales-cases]', - }), -) - -router.get( - '/worker-platform/after-sales-cases/:caseId/events', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler((req) => getAdminAfterSalesCaseEvents(String(req.params.caseId || '')), { - successMessage: 'ok', - errorMessage: '读取售后问题单记录失败', - scope: '[admin/worker-platform/after-sales-cases/:caseId/events]', - }), -) - -router.post( - '/worker-platform/orders/:workOrderId/after-sales-cases', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - createAdminAfterSalesCase( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '售后问题单已创建', - errorMessage: '创建售后问题单失败', - scope: '[admin/worker-platform/orders/:workOrderId/after-sales-cases]', - audit: (req, data) => ({ - action: 'after_sales_case_created', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/after-sales-cases/:caseId/resolve', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - resolveAdminAfterSalesCase( - String(req.params.caseId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '售后问题单已处置', - errorMessage: '处置售后问题单失败', - scope: '[admin/worker-platform/after-sales-cases/:caseId/resolve]', - audit: (req, data) => ({ - action: 'after_sales_case_resolved', - targetType: 'after_sales_case', - targetId: String(req.params.caseId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/sharing', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - updateAdminWorkOrderSharing( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '拼单配置已保存', - errorMessage: '保存拼单配置失败', - scope: '[admin/worker-platform/orders/:workOrderId/sharing]', - audit: (req, data) => ({ - action: 'work_order_sharing_config_updated', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/problem', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - markAdminWorkOrderProblem( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '订单已标记为问题单', - errorMessage: '标记问题单失败', - scope: '[admin/worker-platform/orders/:workOrderId/problem]', - audit: (req, data) => ({ - action: 'work_order_marked_problem', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/problem/resolve', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - resolveAdminProblemWorkOrder( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '问题单已处置', - errorMessage: '处置问题单失败', - scope: '[admin/worker-platform/orders/:workOrderId/problem/resolve]', - audit: (req, data) => ({ - action: 'work_order_problem_resolved', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/accept', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - acceptAdminWorkOrder(String(req.params.workOrderId || ''), req.adminSession?.username || ''), - { - successMessage: '订单已验收通过', - errorMessage: '验收接单订单失败', - scope: '[admin/worker-platform/orders/:workOrderId/accept]', - audit: (req, data) => ({ - action: 'work_order_accepted', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/accept-batch', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => acceptAdminWorkOrders(req.body || {}, req.adminSession?.username || ''), - { - successMessage: '选中订单已验收通过', - errorMessage: '批量验收接单订单失败', - scope: '[admin/worker-platform/orders/accept-batch]', - audit: (req, data) => ({ - action: 'work_orders_batch_accepted', - targetType: 'work_order', - targetId: Array.isArray(req.body?.workOrderIds) - ? req.body.workOrderIds.map((item: unknown) => String(item)).join(',') - : '', - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/shares/:shareId/accept', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - acceptAdminWorkOrderShare( - String(req.params.workOrderId || ''), - String(req.params.shareId || ''), - req.adminSession?.username || '', - ), - { - successMessage: '拼单份额已验收通过', - errorMessage: '验收拼单份额失败', - scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/accept]', - audit: (req, data) => ({ - action: 'work_order_share_accepted', - targetType: 'work_order_share', - targetId: String(req.params.shareId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/shares/:shareId/cancel', - requireAdminRoles(['admin', 'operator', 'support']), - createJsonHandler( - (req) => - cancelAdminWorkOrderShare( - String(req.params.workOrderId || ''), - String(req.params.shareId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '拼单参与者已撤单,份数已退回大厅', - errorMessage: '撤销拼单参与者失败', - scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/cancel]', - audit: (req, data) => ({ - action: 'work_order_share_cancelled', - targetType: 'work_order_share', - targetId: String(req.params.shareId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) - -router.post( - '/worker-platform/orders/:workOrderId/deduct-pending-deposit', - requireAdminRoles(['admin', 'operator']), - createJsonHandler( - (req) => - deductAdminWorkOrderPendingDeposit( - String(req.params.workOrderId || ''), - req.body || {}, - req.adminSession?.username || '', - ), - { - successMessage: '待解冻押金已扣减', - errorMessage: '扣减待解冻押金失败', - scope: '[admin/worker-platform/orders/:workOrderId/deduct-pending-deposit]', - audit: (req, data) => ({ - action: 'work_order_pending_deposit_deducted', - targetType: 'work_order', - targetId: String(req.params.workOrderId || ''), - data: data && typeof data === 'object' ? (data as Record) : {}, - }), - }, - ), -) +router.use(adminWorkerPlatformConfigRoutes) +router.use(adminWorkerPlatformWorkersRoutes) +router.use(adminWorkerPlatformFinanceRoutes) +router.use(adminWorkerPlatformOrdersRoutes) +router.use(adminWorkerPlatformReviewRoutes) +router.use(adminWorkerPlatformAfterSalesRoutes) +router.use(adminWorkerPlatformAcceptanceRoutes) export default router diff --git a/apps/backend/src/routes/admin/worker-platform/acceptance.ts b/apps/backend/src/routes/admin/worker-platform/acceptance.ts new file mode 100644 index 00000000..2f99b324 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/acceptance.ts @@ -0,0 +1,156 @@ +import { Router } from 'express' + +import { + acceptAdminWorkOrder, + acceptAdminWorkOrderShare, + cancelAdminWorkOrderShare, + deductAdminWorkOrderPendingDeposit, + markAdminWorkOrderProblem, + resolveAdminProblemWorkOrder, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.post( + '/worker-platform/orders/:workOrderId/problem', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + markAdminWorkOrderProblem( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '订单已标记为问题单', + errorMessage: '标记问题单失败', + scope: '[admin/worker-platform/orders/:workOrderId/problem]', + audit: (req, data) => ({ + action: 'work_order_marked_problem', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/problem/resolve', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + resolveAdminProblemWorkOrder( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '问题单已处置', + errorMessage: '处置问题单失败', + scope: '[admin/worker-platform/orders/:workOrderId/problem/resolve]', + audit: (req, data) => ({ + action: 'work_order_problem_resolved', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/accept', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + acceptAdminWorkOrder(String(req.params.workOrderId || ''), req.adminSession?.username || ''), + { + successMessage: '订单已验收通过', + errorMessage: '验收接单订单失败', + scope: '[admin/worker-platform/orders/:workOrderId/accept]', + audit: (req, data) => ({ + action: 'work_order_accepted', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/shares/:shareId/accept', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + acceptAdminWorkOrderShare( + String(req.params.workOrderId || ''), + String(req.params.shareId || ''), + req.adminSession?.username || '', + ), + { + successMessage: '拼单份额已验收通过', + errorMessage: '验收拼单份额失败', + scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/accept]', + audit: (req, data) => ({ + action: 'work_order_share_accepted', + targetType: 'work_order_share', + targetId: String(req.params.shareId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/shares/:shareId/cancel', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + cancelAdminWorkOrderShare( + String(req.params.workOrderId || ''), + String(req.params.shareId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '拼单参与者已撤单,份数已退回大厅', + errorMessage: '撤销拼单参与者失败', + scope: '[admin/worker-platform/orders/:workOrderId/shares/:shareId/cancel]', + audit: (req, data) => ({ + action: 'work_order_share_cancelled', + targetType: 'work_order_share', + targetId: String(req.params.shareId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/deduct-pending-deposit', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + deductAdminWorkOrderPendingDeposit( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '待解冻押金已扣减', + errorMessage: '扣减待解冻押金失败', + scope: '[admin/worker-platform/orders/:workOrderId/deduct-pending-deposit]', + audit: (req, data) => ({ + action: 'work_order_pending_deposit_deducted', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +export default router diff --git a/apps/backend/src/routes/admin/worker-platform/after-sales.ts b/apps/backend/src/routes/admin/worker-platform/after-sales.ts new file mode 100644 index 00000000..97a48326 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/after-sales.ts @@ -0,0 +1,81 @@ +import { Router } from 'express' + +import { + createAdminAfterSalesCase, + getAdminAfterSalesCaseEvents, + listAdminAfterSalesCases, + resolveAdminAfterSalesCase, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.get( + '/worker-platform/after-sales-cases', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminAfterSalesCases(req.query), { + successMessage: 'ok', + errorMessage: '读取售后问题单失败', + scope: '[admin/worker-platform/after-sales-cases]', + }), +) + +router.get( + '/worker-platform/after-sales-cases/:caseId/events', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => getAdminAfterSalesCaseEvents(String(req.params.caseId || '')), { + successMessage: 'ok', + errorMessage: '读取售后问题单记录失败', + scope: '[admin/worker-platform/after-sales-cases/:caseId/events]', + }), +) + +router.post( + '/worker-platform/orders/:workOrderId/after-sales-cases', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + createAdminAfterSalesCase( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '售后问题单已创建', + errorMessage: '创建售后问题单失败', + scope: '[admin/worker-platform/orders/:workOrderId/after-sales-cases]', + audit: (req, data) => ({ + action: 'after_sales_case_created', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/after-sales-cases/:caseId/resolve', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + resolveAdminAfterSalesCase( + String(req.params.caseId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '售后问题单已处置', + errorMessage: '处置售后问题单失败', + scope: '[admin/worker-platform/after-sales-cases/:caseId/resolve]', + audit: (req, data) => ({ + action: 'after_sales_case_resolved', + targetType: 'after_sales_case', + targetId: String(req.params.caseId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +export default router diff --git a/apps/backend/src/routes/admin/worker-platform/config.ts b/apps/backend/src/routes/admin/worker-platform/config.ts new file mode 100644 index 00000000..ef769be2 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/config.ts @@ -0,0 +1,395 @@ +import { Router } from 'express' + +import { + deleteAdminWorkCategory, + deleteAdminWorkProductRule, + deleteAdminWorkProductRuleMapping, + deleteAdminWorkerLevel, + getAdminWorkerAnnouncementConfig, + getAdminWorkerFinanceConfig, + getAdminWorkerHallConfig, + getAdminWorkerPlatformNotificationConfig, + getAdminWorkerPlatformSummary, + getAdminWorkerProductMatchConfig, + listAdminKuaishouMatchSources, + listAdminWorkCategories, + listAdminWorkProductMatchLogs, + listAdminWorkProductRuleMappings, + listAdminWorkProductRules, + listAdminWorkerLevels, + saveAdminWorkCategory, + saveAdminWorkProductRule, + saveAdminWorkProductRuleMapping, + saveAdminWorkerAnnouncementConfig, + saveAdminWorkerFinanceConfig, + saveAdminWorkerHallConfig, + saveAdminWorkerLevel, + saveAdminWorkerPlatformNotificationConfig, + saveAdminWorkerProductMatchConfig, + syncAdminWorkProductRulePrice, + testAdminKuaishouProductMatch, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.get( + '/worker-platform/summary', + createJsonHandler(() => getAdminWorkerPlatformSummary(), { + successMessage: 'ok', + errorMessage: '读取接单平台概览失败', + scope: '[admin/worker-platform/summary]', + }), +) + +router.get( + '/worker-platform/levels', + requireAdminRoles(['admin', 'operator']), + createJsonHandler(() => listAdminWorkerLevels(), { + successMessage: 'ok', + errorMessage: '读取接单等级失败', + scope: '[admin/worker-platform/levels]', + }), +) + +router.post( + '/worker-platform/levels', + requireAdminRoles(['admin']), + createJsonHandler((req) => saveAdminWorkerLevel(req.body || {}), { + successMessage: '接单等级已保存', + errorMessage: '保存接单等级失败', + scope: '[admin/worker-platform/levels]', + audit: (_req, data) => ({ + action: 'worker_level_saved', + targetType: 'worker_level', + targetId: String((data as { level?: { levelKey?: string } })?.level?.levelKey || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.delete( + '/worker-platform/levels/:levelId', + requireAdminRoles(['admin']), + createJsonHandler((req) => deleteAdminWorkerLevel(String(req.params.levelId || '')), { + successMessage: '接单等级已删除', + errorMessage: '删除接单等级失败', + scope: '[admin/worker-platform/levels/:levelId]', + audit: (_req, data) => ({ + action: 'worker_level_deleted', + targetType: 'worker_level', + targetId: String(_req.params.levelId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.get( + '/worker-platform/categories', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler(() => listAdminWorkCategories(), { + successMessage: 'ok', + errorMessage: '读取接单分类失败', + scope: '[admin/worker-platform/categories]', + }), +) + +router.post( + '/worker-platform/categories', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => saveAdminWorkCategory(req.body || {}), { + successMessage: '接单分类已保存', + errorMessage: '保存接单分类失败', + scope: '[admin/worker-platform/categories]', + audit: (_req, data) => ({ + action: 'work_category_saved', + targetType: 'work_category', + targetId: String( + (data as { category?: { categoryKey?: string } })?.category?.categoryKey || '', + ), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.delete( + '/worker-platform/categories/:categoryId', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => deleteAdminWorkCategory(String(req.params.categoryId || '')), { + successMessage: '接单分类已删除', + errorMessage: '删除接单分类失败', + scope: '[admin/worker-platform/categories/:categoryId]', + audit: (_req, data) => ({ + action: 'work_category_deleted', + targetType: 'work_category', + targetId: String(_req.params.categoryId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.get( + '/worker-platform/product-rules', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkProductRules(req.query), { + successMessage: 'ok', + errorMessage: '读取接单物品规则失败', + scope: '[admin/worker-platform/product-rules]', + }), +) + +router.post( + '/worker-platform/product-rules', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => saveAdminWorkProductRule(req.body || {}), { + successMessage: '接单物品规则已保存', + errorMessage: '保存接单物品规则失败', + scope: '[admin/worker-platform/product-rules]', + audit: (_req, data) => ({ + action: 'work_product_rule_saved', + targetType: 'work_product_rule', + targetId: String((data as { rule?: { ruleKey?: string } })?.rule?.ruleKey || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.post( + '/worker-platform/product-rules/:ruleId/sync-price', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + syncAdminWorkProductRulePrice( + String(req.params.ruleId || ''), + req.adminSession?.username || '', + ), + { + successMessage: '模板价格已同步', + errorMessage: '同步模板价格失败', + scope: '[admin/worker-platform/product-rules/:ruleId/sync-price]', + audit: (req, data) => ({ + action: 'work_product_rule_price_synced', + targetType: 'work_product_rule', + targetId: String(req.params.ruleId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.delete( + '/worker-platform/product-rules/:ruleId', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => deleteAdminWorkProductRule(String(req.params.ruleId || '')), { + successMessage: '接单物品规则已删除', + errorMessage: '删除接单物品规则失败', + scope: '[admin/worker-platform/product-rules/:ruleId]', + audit: (_req, data) => ({ + action: 'work_product_rule_deleted', + targetType: 'work_product_rule', + targetId: String(_req.params.ruleId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.get( + '/worker-platform/product-mappings', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkProductRuleMappings(req.query), { + successMessage: 'ok', + errorMessage: '读取商品映射失败', + scope: '[admin/worker-platform/product-mappings]', + }), +) + +router.post( + '/worker-platform/product-mappings', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => saveAdminWorkProductRuleMapping(req.body || {}), { + successMessage: '商品映射已保存', + errorMessage: '保存商品映射失败', + scope: '[admin/worker-platform/product-mappings]', + audit: (_req, data) => ({ + action: 'work_product_mapping_saved', + targetType: 'work_product_mapping', + targetId: String((data as { mapping?: { mappingId?: number } })?.mapping?.mappingId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.delete( + '/worker-platform/product-mappings/:mappingId', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => deleteAdminWorkProductRuleMapping(String(req.params.mappingId || '')), + { + successMessage: '商品映射已删除', + errorMessage: '删除商品映射失败', + scope: '[admin/worker-platform/product-mappings/:mappingId]', + }, + ), +) + +router.get( + '/worker-platform/product-match-config', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler(() => getAdminWorkerProductMatchConfig(), { + successMessage: 'ok', + errorMessage: '读取商品匹配配置失败', + scope: '[admin/worker-platform/product-match-config]', + }), +) + +router.get( + '/worker-platform/announcement', + requireAdminRoles(['admin', 'operator']), + createJsonHandler(() => getAdminWorkerAnnouncementConfig(), { + successMessage: 'ok', + errorMessage: '读取公告失败', + scope: '[admin/worker-platform/announcement]', + }), +) + +router.get( + '/worker-platform/hall-config', + requireAdminRoles(['admin', 'operator']), + createJsonHandler(() => getAdminWorkerHallConfig(), { + successMessage: 'ok', + errorMessage: '读取大厅配置失败', + scope: '[admin/worker-platform/hall-config]', + }), +) + +router.post( + '/worker-platform/hall-config', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => saveAdminWorkerHallConfig(req.body || {}), { + successMessage: '大厅配置已保存', + errorMessage: '保存大厅配置失败', + scope: '[admin/worker-platform/hall-config]', + audit: (_req, data) => ({ + action: 'worker_hall_config_saved', + targetType: 'worker_hall_config', + targetId: 'worker_hall', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.post( + '/worker-platform/announcement', + requireAdminRoles(['admin']), + createJsonHandler((req) => saveAdminWorkerAnnouncementConfig(req.body || {}), { + successMessage: '公告已保存', + errorMessage: '保存公告失败', + scope: '[admin/worker-platform/announcement]', + audit: (_req, data) => ({ + action: 'worker_announcement_saved', + targetType: 'worker_announcement', + targetId: 'worker_announcement', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.post( + '/worker-platform/product-match-config', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => saveAdminWorkerProductMatchConfig(req.body || {}), { + successMessage: '商品匹配配置已保存', + errorMessage: '保存商品匹配配置失败', + scope: '[admin/worker-platform/product-match-config]', + audit: (_req, data) => ({ + action: 'worker_product_match_config_saved', + targetType: 'worker_product_match_config', + targetId: 'worker_product_match', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.get( + '/worker-platform/product-match-sources', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminKuaishouMatchSources(req.query), { + successMessage: 'ok', + errorMessage: '读取快手匹配载荷失败', + scope: '[admin/worker-platform/product-match-sources]', + }), +) + +router.post( + '/worker-platform/product-match-test', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => testAdminKuaishouProductMatch(req.body || {}), { + successMessage: '匹配测试完成', + errorMessage: '匹配测试失败', + scope: '[admin/worker-platform/product-match-test]', + }), +) + +router.get( + '/worker-platform/product-match-logs', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkProductMatchLogs(req.query), { + successMessage: 'ok', + errorMessage: '读取匹配日志失败', + scope: '[admin/worker-platform/product-match-logs]', + }), +) + +router.get( + '/worker-platform/finance-config', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler(() => getAdminWorkerFinanceConfig(), { + successMessage: 'ok', + errorMessage: '读取资金配置失败', + scope: '[admin/worker-platform/finance-config]', + }), +) + +router.post( + '/worker-platform/finance-config', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => saveAdminWorkerFinanceConfig(req.body || {}), { + successMessage: '资金配置已保存', + errorMessage: '保存资金配置失败', + scope: '[admin/worker-platform/finance-config]', + audit: (_req, data) => ({ + action: 'worker_finance_config_saved', + targetType: 'worker_finance_config', + targetId: 'worker_finance', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.get( + '/worker-platform/notification-config', + requireAdminRoles(['admin', 'operator']), + createJsonHandler(() => getAdminWorkerPlatformNotificationConfig(), { + successMessage: 'ok', + errorMessage: '读取通知配置失败', + scope: '[admin/worker-platform/notification-config]', + }), +) + +router.post( + '/worker-platform/notification-config', + requireAdminRoles(['admin']), + createJsonHandler((req) => saveAdminWorkerPlatformNotificationConfig(req.body || {}), { + successMessage: '通知配置已保存', + errorMessage: '保存通知配置失败', + scope: '[admin/worker-platform/notification-config]', + audit: (_req, data) => ({ + action: 'worker_platform_notification_config_saved', + targetType: 'worker_platform_notification_config', + targetId: 'worker_platform_notifications', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +export default router diff --git a/apps/backend/src/routes/admin/worker-platform/finance.ts b/apps/backend/src/routes/admin/worker-platform/finance.ts new file mode 100644 index 00000000..454afce1 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/finance.ts @@ -0,0 +1,40 @@ +import { Router } from 'express' + +import { + listAdminWorkerFinanceRequests, + reviewAdminWorkerFinanceRequest, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.get( + '/worker-platform/finance-requests', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkerFinanceRequests(req.query), { + successMessage: 'ok', + errorMessage: '读取资金申请失败', + scope: '[admin/worker-platform/finance-requests]', + }), +) + +router.post( + '/worker-platform/finance-requests/:requestId/review', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => reviewAdminWorkerFinanceRequest(String(req.params.requestId || ''), req.body || {}), + { + successMessage: '资金申请已处理', + errorMessage: '处理资金申请失败', + scope: '[admin/worker-platform/finance-requests/:requestId/review]', + audit: (req, data) => ({ + action: 'worker_finance_request_reviewed', + targetType: 'worker_finance_request', + targetId: String(req.params.requestId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +export default router diff --git a/apps/backend/src/routes/admin/worker-platform/orders.ts b/apps/backend/src/routes/admin/worker-platform/orders.ts new file mode 100644 index 00000000..d8696594 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/orders.ts @@ -0,0 +1,360 @@ +import { Router } from 'express' + +import { + acceptAdminWorkOrders, + assignAdminWorkOrderToWorker, + cancelAdminWorkOrder, + createAdminMockWorkOrder, + deleteAdminWorkOrder, + getAdminWorkOrderEvents, + getAdminWorkOrderSharing, + listAdminWorkOrders, + pinAdminWorkOrder, + publishAdminWorkOrder, + reopenAdminCancelledWorkOrder, + reprocessAdminKuaishouSendCodeWorkOrders, + submitAdminWorkOrderMaterial, + unassignAdminWorkOrder, + unpublishAdminWorkOrder, + updateAdminWorkOrder, + updateAdminWorkOrderSharing, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.get( + '/worker-platform/orders', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkOrders(req.query), { + successMessage: 'ok', + errorMessage: '读取接单订单失败', + scope: '[admin/worker-platform/orders]', + }), +) + +router.post( + '/worker-platform/orders/mock', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => createAdminMockWorkOrder(req.body || {}), { + successMessage: '接单工单 Mock 已生成', + errorMessage: '生成接单工单 Mock 失败', + scope: '[admin/worker-platform/orders/mock]', + audit: (_req, data) => ({ + action: 'work_order_mock_created', + targetType: 'work_order', + targetId: String((data as { order?: { workOrderId?: number } })?.order?.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.post( + '/worker-platform/orders/reprocess-matches', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => reprocessAdminKuaishouSendCodeWorkOrders(req.body || {}), { + successMessage: '快手订单重匹配完成', + errorMessage: '快手订单重匹配失败', + scope: '[admin/worker-platform/orders/reprocess-matches]', + audit: (_req, data) => ({ + action: 'work_order_kuaishou_reprocessed', + targetType: 'work_order', + targetId: '', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.post( + '/worker-platform/orders/:workOrderId/material', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + submitAdminWorkOrderMaterial( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '订单资料已保存', + errorMessage: '补充订单资料失败', + scope: '[admin/worker-platform/orders/:workOrderId/material]', + audit: (req, data) => ({ + action: 'work_order_material_saved', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.put( + '/worker-platform/orders/:workOrderId', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + updateAdminWorkOrder(String(req.params.workOrderId || ''), req.body || {}, { + canEditRequirementFields: req.adminSession?.role !== 'support', + actorName: req.adminSession?.username || '', + }), + { + successMessage: '工单信息已保存', + errorMessage: '保存工单信息失败', + scope: '[admin/worker-platform/orders/:workOrderId]', + audit: (req, data) => ({ + action: 'work_order_updated', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/assign', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + assignAdminWorkOrderToWorker( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '已指派打手', + errorMessage: '指派打手失败', + scope: '[admin/worker-platform/orders/:workOrderId/assign]', + audit: (req, data) => ({ + action: 'work_order_worker_assigned', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/unassign', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + unassignAdminWorkOrder( + String(req.params.workOrderId || ''), + req.adminSession?.username || '', + ), + { + successMessage: '已取消指派', + errorMessage: '取消指派失败', + scope: '[admin/worker-platform/orders/:workOrderId/unassign]', + audit: (req, data) => ({ + action: 'work_order_worker_unassigned', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/cancel', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + cancelAdminWorkOrder( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '撤单处理完成,打手额度已恢复', + errorMessage: '撤单失败', + scope: '[admin/worker-platform/orders/:workOrderId/cancel]', + audit: (req, data) => ({ + action: + String(req.body?.action || '').trim() === 'return_to_hall' + ? 'work_order_returned_to_hall' + : 'work_order_cancelled', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.delete( + '/worker-platform/orders/:workOrderId', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => deleteAdminWorkOrder(String(req.params.workOrderId || '')), { + successMessage: '工单已删除', + errorMessage: '删除工单失败', + scope: '[admin/worker-platform/orders/:workOrderId]', + audit: (req, data) => ({ + action: 'work_order_deleted', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }), +) + +router.post( + '/worker-platform/orders/:workOrderId/reopen', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + reopenAdminCancelledWorkOrder( + String(req.params.workOrderId || ''), + req.adminSession?.username || '', + ), + { + successMessage: '订单已恢复为未分配状态', + errorMessage: '重新启用订单失败', + scope: '[admin/worker-platform/orders/:workOrderId/reopen]', + audit: (req, data) => ({ + action: 'work_order_reopened', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/publish', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + publishAdminWorkOrder(String(req.params.workOrderId || ''), req.adminSession?.username || ''), + { + successMessage: '订单已进入大厅队列', + errorMessage: '发布接单订单失败', + scope: '[admin/worker-platform/orders/:workOrderId/publish]', + audit: (req, data) => ({ + action: 'work_order_published', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/unpublish', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + unpublishAdminWorkOrder( + String(req.params.workOrderId || ''), + req.adminSession?.username || '', + ), + { + successMessage: '订单已撤回到未分配', + errorMessage: '下架接单订单失败', + scope: '[admin/worker-platform/orders/:workOrderId/unpublish]', + audit: (req, data) => ({ + action: 'work_order_unpublished', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/:workOrderId/pin', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + pinAdminWorkOrder( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '置顶状态已更新', + errorMessage: '更新置顶状态失败', + scope: '[admin/worker-platform/orders/:workOrderId/pin]', + audit: (req, data) => ({ + action: 'work_order_pin_toggled', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.get( + '/worker-platform/orders/:workOrderId/sharing', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => getAdminWorkOrderSharing(String(req.params.workOrderId || '')), { + successMessage: 'ok', + errorMessage: '读取拼单信息失败', + scope: '[admin/worker-platform/orders/:workOrderId/sharing]', + }), +) + +router.get( + '/worker-platform/orders/:workOrderId/events', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => getAdminWorkOrderEvents(String(req.params.workOrderId || '')), { + successMessage: 'ok', + errorMessage: '读取工单流转记录失败', + scope: '[admin/worker-platform/orders/:workOrderId/events]', + }), +) + +router.post( + '/worker-platform/orders/:workOrderId/sharing', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + updateAdminWorkOrderSharing( + String(req.params.workOrderId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '拼单配置已保存', + errorMessage: '保存拼单配置失败', + scope: '[admin/worker-platform/orders/:workOrderId/sharing]', + audit: (req, data) => ({ + action: 'work_order_sharing_config_updated', + targetType: 'work_order', + targetId: String(req.params.workOrderId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/orders/accept-batch', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => acceptAdminWorkOrders(req.body || {}, req.adminSession?.username || ''), + { + successMessage: '选中订单已验收通过', + errorMessage: '批量验收接单订单失败', + scope: '[admin/worker-platform/orders/accept-batch]', + audit: (req, data) => ({ + action: 'work_orders_batch_accepted', + targetType: 'work_order', + targetId: Array.isArray(req.body?.workOrderIds) + ? req.body.workOrderIds.map((item: unknown) => String(item)).join(',') + : '', + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +export default router diff --git a/apps/backend/src/routes/admin/worker-platform/review.ts b/apps/backend/src/routes/admin/worker-platform/review.ts new file mode 100644 index 00000000..61de05d7 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/review.ts @@ -0,0 +1,75 @@ +import { Router } from 'express' + +import { + listAdminWorkerCancelRequests, + listAdminWorkerOrderFeedbacks, + resolveAdminWorkerOrderFeedback, + reviewAdminWorkerCancelRequest, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.get( + '/worker-platform/cancel-requests', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkerCancelRequests(req.query), { + successMessage: 'ok', + errorMessage: '读取撤单申请失败', + scope: '[admin/worker-platform/cancel-requests]', + }), +) + +router.get( + '/worker-platform/feedbacks', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkerOrderFeedbacks(req.query), { + successMessage: 'ok', + errorMessage: '读取问题反馈失败', + scope: '[admin/worker-platform/feedbacks]', + }), +) + +router.post( + '/worker-platform/feedbacks/:feedbackId/resolve', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + resolveAdminWorkerOrderFeedback( + String(req.params.feedbackId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '问题反馈已处理', + errorMessage: '处理问题反馈失败', + scope: '[admin/worker-platform/feedbacks/:feedbackId/resolve]', + }, + ), +) + +router.post( + '/worker-platform/cancel-requests/:requestId/review', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler( + (req) => + reviewAdminWorkerCancelRequest( + String(req.params.requestId || ''), + req.body || {}, + req.adminSession?.username || '', + ), + { + successMessage: '撤单申请已审核', + errorMessage: '审核撤单申请失败', + scope: '[admin/worker-platform/cancel-requests/:requestId/review]', + audit: (req, data) => ({ + action: 'worker_cancel_request_reviewed', + targetType: 'worker_cancel_request', + targetId: String(req.params.requestId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +export default router diff --git a/apps/backend/src/routes/admin/worker-platform/workers.ts b/apps/backend/src/routes/admin/worker-platform/workers.ts new file mode 100644 index 00000000..45be1037 --- /dev/null +++ b/apps/backend/src/routes/admin/worker-platform/workers.ts @@ -0,0 +1,116 @@ +import { Router } from 'express' + +import { + creditAdminWorkerWallet, + listAdminWorkerUsers, + listAdminWorkerWithdrawalAccounts, + resetAdminWorkerPassword, + reviewAdminWorkerUser, + saveAdminWorkerWithdrawalAccount, +} from '../../../services/worker-platform/index.js' +import { createJsonHandler, requireAdminRoles } from '../session.js' + +const router = Router() + +router.get( + '/worker-platform/workers', + requireAdminRoles(['admin', 'operator', 'support']), + createJsonHandler((req) => listAdminWorkerUsers(req.query), { + successMessage: 'ok', + errorMessage: '读取打手列表失败', + scope: '[admin/worker-platform/workers]', + }), +) + +router.post( + '/worker-platform/workers/:workerId/review', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => reviewAdminWorkerUser(String(req.params.workerId || ''), req.body || {}), + { + successMessage: '打手账号状态已更新', + errorMessage: '更新打手账号状态失败', + scope: '[admin/worker-platform/workers/:workerId/review]', + audit: (req, data) => ({ + action: 'worker_reviewed', + targetType: 'worker', + targetId: String(req.params.workerId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/workers/:workerId/reset-password', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => resetAdminWorkerPassword(String(req.params.workerId || ''), req.body || {}), + { + successMessage: '打手密码已重置', + errorMessage: '重置打手密码失败', + scope: '[admin/worker-platform/workers/:workerId/reset-password]', + audit: (req, data) => ({ + action: 'worker_password_reset', + targetType: 'worker', + targetId: String(req.params.workerId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.post( + '/worker-platform/workers/:workerId/wallet-credit', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => creditAdminWorkerWallet(String(req.params.workerId || ''), req.body || {}), + { + successMessage: '打手余额已增加', + errorMessage: '人工充值失败', + scope: '[admin/worker-platform/workers/:workerId/wallet-credit]', + audit: (req, data) => ({ + action: 'worker_wallet_credited', + targetType: 'worker', + targetId: String(req.params.workerId || ''), + data: data && typeof data === 'object' ? (data as Record) : {}, + }), + }, + ), +) + +router.get( + '/worker-platform/workers/:workerId/withdrawal-accounts', + requireAdminRoles(['admin', 'operator']), + createJsonHandler((req) => listAdminWorkerWithdrawalAccounts(String(req.params.workerId || '')), { + successMessage: 'ok', + errorMessage: '读取打手提现信息失败', + scope: '[admin/worker-platform/workers/:workerId/withdrawal-accounts]', + }), +) + +router.post( + '/worker-platform/workers/:workerId/withdrawal-accounts/:accountChannel', + requireAdminRoles(['admin', 'operator']), + createJsonHandler( + (req) => + saveAdminWorkerWithdrawalAccount( + String(req.params.workerId || ''), + String(req.params.accountChannel || ''), + req.body || {}, + ), + { + successMessage: '打手提现信息已保存', + errorMessage: '保存打手提现信息失败', + scope: '[admin/worker-platform/workers/:workerId/withdrawal-accounts/:accountChannel]', + audit: (req) => ({ + action: 'worker_withdrawal_account_saved', + targetType: 'worker', + targetId: String(req.params.workerId || ''), + data: { accountChannel: String(req.params.accountChannel || '') }, + }), + }, + ), +) + +export default router