新增开发 Mock 后台菜单与造单能力

非生产环境在后台提供 lewan/feifei 领取造单与 91 查单模拟,CLI 复用同一服务,避免依赖真实平台联调。
This commit is contained in:
yml2213
2026-07-10 13:35:42 +08:00
parent bb060e81a4
commit 3c0d1f108c
13 changed files with 1593 additions and 533 deletions
+93
View File
@@ -0,0 +1,93 @@
import { Router } from 'express'
import {
buildOpen91QueryMock,
createFeifeiMockClaim,
createLewanMockClaim,
getDevMockStatus,
isDevMockEnabled,
} from '../../services/dev-mock/dev-mock-service.js'
import { createHttpError } from '../../utils/http.js'
import { createJsonHandler, requireAdminRoles } from './session.js'
const router = Router()
function requireDevMockEnabled() {
return (
_req: unknown,
_res: unknown,
next: (error?: unknown) => void,
) => {
if (!isDevMockEnabled()) {
next(
createHttpError('开发 Mock 仅在非 production 环境可用(或设置 ENABLE_DEV_MOCK=1', {
statusCode: 403,
errorCode: 'dev_mock_disabled',
}),
)
return
}
next()
}
}
router.get(
'/dev-mock/status',
requireAdminRoles(['admin', 'operator', 'support']),
createJsonHandler(() => getDevMockStatus(), {
successMessage: 'ok',
errorMessage: '读取 Mock 状态失败',
scope: '[admin/dev-mock/status]',
}),
)
router.use('/dev-mock', requireAdminRoles(['admin', 'operator']), requireDevMockEnabled())
router.post(
'/dev-mock/lewan',
createJsonHandler((req) => createLewanMockClaim(req.body || {}), {
successMessage: 'lewan mock 已生成',
errorMessage: '生成 lewan mock 失败',
scope: '[admin/dev-mock/lewan]',
audit: (_req, data) => ({
action: 'dev_mock_create_lewan',
targetType: 'dev_mock',
targetId: String((data as { orderNo?: string })?.orderNo || ''),
data: {
platform: 'lewan',
orderNo: (data as { orderNo?: string })?.orderNo,
step: (data as { step?: string })?.step,
},
}),
}),
)
router.post(
'/dev-mock/feifei',
createJsonHandler((req) => createFeifeiMockClaim(req.body || {}), {
successMessage: 'feifei mock 已生成',
errorMessage: '生成 feifei mock 失败',
scope: '[admin/dev-mock/feifei]',
audit: (_req, data) => ({
action: 'dev_mock_create_feifei',
targetType: 'dev_mock',
targetId: String((data as { orderNo?: string })?.orderNo || ''),
data: {
platform: 'feifei',
orderNo: (data as { orderNo?: string })?.orderNo,
step: (data as { step?: string })?.step,
},
}),
}),
)
router.post(
'/dev-mock/open91/query',
createJsonHandler((req) => buildOpen91QueryMock(req.body || {}), {
successMessage: '91 查单 mock 已生成',
errorMessage: '生成 91 查单 mock 失败',
scope: '[admin/dev-mock/open91/query]',
}),
)
export default router