import { Router } from 'express' import { getAdminOrderDetail, getAdminOrders } from '../../services/admin/admin-read-service.js' import { resendAdminOrderKuaishouIndustryVoucherCodes } from '../../services/admin/write/kuaishou-industry-actions.js' import { updateAdminOrderClaimStatus, type UpdateOrderClaimStatusPayload, } from '../../services/admin/write/order-actions.js' import { createManualRefund, listOrderRefunds, voidOrderRefund, } from '../../services/finance/order-refund-service.js' import { createJsonHandler, requireAdminPermission, requireAdminRoles } from './session.js' import type { AdminOrderRouteParams, AdminOrderRouteQuery } from '../../types/admin/route-inputs.js' const router = Router() router.use('/orders', requireAdminRoles(['admin', 'operator', 'support', 'finance'])) router.get( '/orders', createJsonHandler((req) => getAdminOrders(req.query as AdminOrderRouteQuery), { successMessage: 'ok', errorMessage: '读取订单列表失败', scope: '[admin/orders]', }), ) router.get( '/orders/:orderId', createJsonHandler( (req) => getAdminOrderDetail( String((req.params as AdminOrderRouteParams).orderId || ''), req.adminSession || null, ), { successMessage: 'ok', errorMessage: '读取订单详情失败', scope: '[admin/orders/:orderId]', }, ), ) router.post( '/orders/:orderId/claim-status', requireAdminRoles(['admin', 'operator', 'support']), createJsonHandler( (req) => updateAdminOrderClaimStatus( String((req.params as AdminOrderRouteParams).orderId || ''), req.body as UpdateOrderClaimStatusPayload, req.adminSession || null, ), { successMessage: '订单兑换状态已更新', errorMessage: '更新订单兑换状态失败', scope: '[admin/orders/:orderId/claim-status]', audit: (req, data) => ({ action: 'order_claim_status_update', targetType: 'order', targetId: String((req.params as AdminOrderRouteParams).orderId || ''), data: data && typeof data === 'object' ? (data as Record) : {}, }), }, ), ) router.post( '/orders/:orderId/kuaishou-industry/resend-code', requireAdminRoles(['admin', 'operator', 'support']), createJsonHandler( (req) => resendAdminOrderKuaishouIndustryVoucherCodes( String((req.params as AdminOrderRouteParams).orderId || ''), req.adminSession || null, ), { successMessage: '电子凭证发码回调已重发', errorMessage: '重发电子凭证发码回调失败', scope: '[admin/orders/:orderId/kuaishou-industry/resend-code]', audit: (req, data) => ({ action: 'order_kuaishou_industry_resend_code', targetType: 'order', targetId: String((req.params as AdminOrderRouteParams).orderId || ''), data: data && typeof data === 'object' ? (data as Record) : {}, }), }, ), ) router.get( '/orders/:orderId/refunds', requireAdminPermission('finance.view'), createJsonHandler( (req) => listOrderRefunds(String((req.params as AdminOrderRouteParams).orderId || '')), { successMessage: 'ok', errorMessage: '读取退款记录失败', scope: '[admin/orders/:orderId/refunds]', }, ), ) router.post( '/orders/:orderId/refunds', requireAdminPermission('finance.post'), createJsonHandler( (req) => createManualRefund( { orderId: String((req.params as AdminOrderRouteParams).orderId || ''), orderItemId: (req.body as Record)?.orderItemId as string | undefined, amountFen: (req.body as Record)?.amountFen as string | undefined, reason: (req.body as Record)?.reason as string | undefined, note: (req.body as Record)?.note as string | undefined, refundedAt: (req.body as Record)?.refundedAt as string | undefined, }, req.adminSession || null, ), { successMessage: '退款已登记', errorMessage: '登记退款失败', scope: '[admin/orders/:orderId/refunds]', audit: (req, data) => ({ action: 'order_refund_created', targetType: 'order', targetId: String((req.params as AdminOrderRouteParams).orderId || ''), data: data && typeof data === 'object' ? (data as Record) : {}, }), }, ), ) router.post( '/orders/:orderId/refunds/:refundId/void', requireAdminPermission('finance.post'), createJsonHandler( (req) => voidOrderRefund( String((req.params as Record).refundId || ''), { reason: String((req.body as Record)?.reason || '') }, req.adminSession || null, ), { successMessage: '退款已撤销', errorMessage: '撤销退款失败', scope: '[admin/orders/:orderId/refunds/:refundId/void]', audit: (req, data) => ({ action: 'order_refund_voided', targetType: 'order_refund', targetId: String((req.params as Record).refundId || ''), data: data && typeof data === 'object' ? (data as Record) : {}, }), }, ), ) export default router