feat(finance): P2 手动退款登记与成本异常闭环
- 迁移 112:order_refunds(订单项级退款,整单拆多条共享 batch_no,source/external_ref 预留平台 API)+ cost_exceptions.resolution_note - 新服务 order-refund-service:整单/指定商品退款、可退金额校验、撤销、全额退完同步 pay_status - 销售事实改为按有效退款记录冲减;无记录时仍兼容 pay_status=refunded 的历史全额退款 - 订单详情新增退款登记与退款记录表,商品明细显示收入/已退/可退 - 全额退款自动关闭该订单项成本异常并写处理备注;成本异常处理改为带备注弹窗 - 财务事件 UNION 接入退款记录,文档同步 P2 状态与 API
This commit is contained in:
@@ -6,7 +6,12 @@ import {
|
||||
updateAdminOrderClaimStatus,
|
||||
type UpdateOrderClaimStatusPayload,
|
||||
} from '../../services/admin/write/order-actions.js'
|
||||
import { createJsonHandler, requireAdminRoles } from './session.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()
|
||||
@@ -85,4 +90,71 @@ router.post(
|
||||
),
|
||||
)
|
||||
|
||||
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.config'),
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
createManualRefund(
|
||||
{
|
||||
orderId: String((req.params as AdminOrderRouteParams).orderId || ''),
|
||||
orderItemId: (req.body as Record<string, unknown>)?.orderItemId as string | undefined,
|
||||
amountFen: (req.body as Record<string, unknown>)?.amountFen as string | undefined,
|
||||
reason: (req.body as Record<string, unknown>)?.reason as string | undefined,
|
||||
note: (req.body as Record<string, unknown>)?.note as string | undefined,
|
||||
refundedAt: (req.body as Record<string, unknown>)?.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<string, unknown>) : {},
|
||||
}),
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/orders/:orderId/refunds/:refundId/void',
|
||||
requireAdminPermission('finance.config'),
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
voidOrderRefund(
|
||||
String((req.params as Record<string, string>).refundId || ''),
|
||||
{ reason: String((req.body as Record<string, unknown>)?.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<string, string>).refundId || ''),
|
||||
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
||||
}),
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
Reference in New Issue
Block a user