cost-center.ts 从 898 行、48 个端点拆成 4 个子路由 + 54 行入口: - cost-center-catalog 商品主数据、渠道映射、模板/自动发货/接单平台回填 - cost-center-cost 成本项、成本版本、快照、异常 - cost-center-manual 人工履约 SKU 配置 - cost-center-credits 客服平台积分钱包 入口只保留角色校验、overview/options 与挂载顺序;子路由路径仍是完整路径, 不需要再加前缀。 验证: - 静态核对:拆分前后 (method, path) 集合完全一致,48 → 48; - 运行时核对:遍历 Express router stack,仍注册 48 条 /cost-center 路由; - 端点正文逐字保留,只有 import 与文件边界变化。
161 lines
5.0 KiB
TypeScript
161 lines
5.0 KiB
TypeScript
/**
|
|
* 成本中心 · 人工履约 SKU 配置路由。
|
|
*
|
|
* 链路:扫描内部 SKU → 配置履约渠道与消耗积分 → 重新匹配历史订单项。
|
|
*/
|
|
import { Router } from 'express'
|
|
import {
|
|
deleteManualFulfillmentConfig,
|
|
getManualFulfillmentConfig,
|
|
getManualSkuOverview,
|
|
listManualPlatformOptions,
|
|
listManualSkus,
|
|
rematchManualFulfillments,
|
|
saveManualFulfillmentConfig,
|
|
scanManualSkus,
|
|
} from '../../services/cost-center/manual-fulfillment-config-service.js'
|
|
import { bodyOf } from './request-helpers.js'
|
|
import { createJsonHandler, requireAdminPermission } from './session.js'
|
|
|
|
const router = Router()
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 人工履约 SKU 配置:扫描 → 配置 → 重新匹配
|
|
// ---------------------------------------------------------------------------
|
|
|
|
router.get(
|
|
'/cost-center/manual-skus',
|
|
requireAdminPermission('finance.view'),
|
|
createJsonHandler((req) => listManualSkus(req.query as Record<string, unknown>), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取人工 SKU 清单失败',
|
|
scope: '[admin/cost-center/manual-skus]',
|
|
}),
|
|
)
|
|
|
|
router.get(
|
|
'/cost-center/manual-skus/overview',
|
|
requireAdminPermission('finance.view'),
|
|
createJsonHandler(() => getManualSkuOverview(), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取人工 SKU 概览失败',
|
|
scope: '[admin/cost-center/manual-skus/overview]',
|
|
}),
|
|
)
|
|
|
|
router.get(
|
|
'/cost-center/manual-platforms',
|
|
requireAdminPermission('finance.view'),
|
|
createJsonHandler(() => listManualPlatformOptions(), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取人工履约渠道失败',
|
|
scope: '[admin/cost-center/manual-platforms]',
|
|
}),
|
|
)
|
|
|
|
router.get(
|
|
'/cost-center/manual-configs/:skuKey',
|
|
requireAdminPermission('finance.view'),
|
|
createJsonHandler((req) => getManualFulfillmentConfig(String(req.params.skuKey || '')), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取人工履约配置失败',
|
|
scope: '[admin/cost-center/manual-configs/:skuKey]',
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/cost-center/manual-skus/scan',
|
|
requireAdminPermission('finance.config'),
|
|
createJsonHandler((req) => scanManualSkus(bodyOf(req) as never), {
|
|
successMessage: '扫描完成',
|
|
errorMessage: '扫描人工 SKU 失败',
|
|
scope: '[admin/cost-center/manual-skus/scan]',
|
|
audit: (req, data) => {
|
|
const result = data as { scanned?: number; fromDate?: string; toDate?: string }
|
|
return {
|
|
action: 'manual_skus_scanned',
|
|
targetType: 'manual_sku_registry',
|
|
targetId: '',
|
|
data: {
|
|
scanned: result.scanned || 0,
|
|
fromDate: result.fromDate || '',
|
|
toDate: result.toDate || '',
|
|
},
|
|
}
|
|
},
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/cost-center/manual-configs',
|
|
requireAdminPermission('finance.config'),
|
|
createJsonHandler((req) => saveManualFulfillmentConfig(bodyOf(req)), {
|
|
successMessage: '人工履约配置已保存',
|
|
errorMessage: '保存人工履约配置失败',
|
|
scope: '[admin/cost-center/manual-configs]',
|
|
audit: (req, data) => {
|
|
const config = data as {
|
|
id?: number
|
|
skuKey?: string
|
|
platformKey?: string
|
|
creditQuantity?: number
|
|
costFen?: number
|
|
}
|
|
return {
|
|
action: 'manual_fulfillment_config_saved',
|
|
targetType: 'manual_fulfillment_config',
|
|
targetId: String(config.id || ''),
|
|
data: {
|
|
skuKey: config.skuKey || '',
|
|
platformKey: config.platformKey || '',
|
|
creditQuantity: config.creditQuantity || 0,
|
|
costFen: config.costFen || 0,
|
|
},
|
|
}
|
|
},
|
|
}),
|
|
)
|
|
|
|
router.delete(
|
|
'/cost-center/manual-configs/:skuKey',
|
|
requireAdminPermission('finance.config'),
|
|
createJsonHandler((req) => deleteManualFulfillmentConfig(String(req.params.skuKey || '')), {
|
|
successMessage: '人工履约配置已删除',
|
|
errorMessage: '删除人工履约配置失败',
|
|
scope: '[admin/cost-center/manual-configs/:skuKey]',
|
|
audit: (req, data) => {
|
|
const result = data as { skuKey?: string; deleted?: number }
|
|
return {
|
|
action: 'manual_fulfillment_config_deleted',
|
|
targetType: 'manual_fulfillment_config',
|
|
targetId: String(req.params.skuKey || ''),
|
|
data: { skuKey: result.skuKey || '', deleted: result.deleted || 0 },
|
|
}
|
|
},
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/cost-center/manual-configs/rematch',
|
|
requireAdminPermission('finance.config'),
|
|
createJsonHandler((req) => rematchManualFulfillments(bodyOf(req)), {
|
|
successMessage: '重新匹配完成',
|
|
errorMessage: '重新匹配失败',
|
|
scope: '[admin/cost-center/manual-configs/rematch]',
|
|
audit: (req, data) => {
|
|
const result = data as { updatedCount?: number; skuKey?: string }
|
|
return {
|
|
action: 'manual_fulfillment_rematched',
|
|
targetType: 'order_items',
|
|
targetId: '',
|
|
data: {
|
|
updatedCount: result.updatedCount || 0,
|
|
skuKey: result.skuKey || '',
|
|
},
|
|
}
|
|
},
|
|
}),
|
|
)
|
|
|
|
export default router
|