diff --git a/apps/backend/src/routes/admin/manual-redeem.js b/apps/backend/src/routes/admin/manual-redeem.ts similarity index 74% rename from apps/backend/src/routes/admin/manual-redeem.js rename to apps/backend/src/routes/admin/manual-redeem.ts index e9b50d80..dd4af358 100644 --- a/apps/backend/src/routes/admin/manual-redeem.js +++ b/apps/backend/src/routes/admin/manual-redeem.ts @@ -1,5 +1,3 @@ -// @ts-check - import { Router } from 'express' import { @@ -15,10 +13,28 @@ import { } from '../../services/admin/admin-manual-redeem-service.js' import { getAdminInventorySkuSuggestions } from '../../services/admin/admin-read-service.js' import { createJsonHandler, requireAdminRoles } from './shared.js' +import type { + AdminInventorySkuSuggestionRouteQuery, + AdminManualRedeemCreateRouteBody, + AdminManualRedeemRouteParams, +} from '../../types/admin-route-inputs.js' -/** @typedef {import('../../types/admin-route-inputs.js').AdminInventorySkuSuggestionRouteQuery} AdminInventorySkuSuggestionRouteQuery */ -/** @typedef {import('../../types/admin-route-inputs.js').AdminManualRedeemCreateRouteBody} AdminManualRedeemCreateRouteBody */ -/** @typedef {import('../../types/admin-route-inputs.js').AdminManualRedeemRouteParams} AdminManualRedeemRouteParams */ +type AdminManualRedeemSessionRouteBody = { + loginType?: string + forceRecreate?: boolean +} + +type AdminManualRedeemMutationResult = { + task?: { + taskId?: number + taskNo?: string + status?: string + deliveryStatus?: string + } + manualRequest?: { proofValue?: string } + order?: { platformOrderId?: string } + orderItem?: { skuCode?: string } +} const router = Router() @@ -26,7 +42,7 @@ router.use('/manual-redeem', requireAdminRoles(['admin', 'operator', 'support']) router.get('/manual-redeem/sku-suggestions', createJsonHandler( (req) => getAdminInventorySkuSuggestions( - /** @type {AdminInventorySkuSuggestionRouteQuery} */ (req.query), + req.query as AdminInventorySkuSuggestionRouteQuery, req.adminSession || null, ), { @@ -38,7 +54,7 @@ router.get('/manual-redeem/sku-suggestions', createJsonHandler( router.post('/manual-redeem', createJsonHandler( (req) => createAdminManualRedeemTask( - /** @type {AdminManualRedeemCreateRouteBody} */ (req.body), + req.body as AdminManualRedeemCreateRouteBody, req.adminSession || null, ), { @@ -46,7 +62,7 @@ router.post('/manual-redeem', createJsonHandler( errorMessage: '创建人工兑换任务失败', scope: '[admin/manual-redeem]', audit: (req, data) => { - const result = /** @type {{ task?: { taskId?: number, taskNo?: string }, manualRequest?: { proofValue?: string }, order?: { platformOrderId?: string }, orderItem?: { skuCode?: string } }} */ (data) + const result = data as AdminManualRedeemMutationResult return { action: 'manual_redeem_created', targetType: 'task', @@ -64,7 +80,7 @@ router.post('/manual-redeem', createJsonHandler( router.get('/manual-redeem/:taskId', createJsonHandler( (req) => getAdminManualRedeemDetail( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -76,8 +92,8 @@ router.get('/manual-redeem/:taskId', createJsonHandler( router.post('/manual-redeem/:taskId/session', createJsonHandler( (req) => createAdminManualRedeemSession( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, - /** @type {{ loginType?: string, forceRecreate?: boolean }} */ (req.body), + (req.params as AdminManualRedeemRouteParams).taskId, + req.body as AdminManualRedeemSessionRouteBody, req.adminSession || null, ), { @@ -89,7 +105,7 @@ router.post('/manual-redeem/:taskId/session', createJsonHandler( router.get('/manual-redeem/:taskId/session/summary', createJsonHandler( (req) => getAdminManualRedeemSessionSummary( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -101,7 +117,7 @@ router.get('/manual-redeem/:taskId/session/summary', createJsonHandler( router.post('/manual-redeem/:taskId/session/refresh', createJsonHandler( (req) => reloadAdminManualRedeemSession( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -113,7 +129,7 @@ router.post('/manual-redeem/:taskId/session/refresh', createJsonHandler( router.delete('/manual-redeem/:taskId/session', createJsonHandler( (req) => closeAdminManualRedeemSession( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -125,7 +141,7 @@ router.delete('/manual-redeem/:taskId/session', createJsonHandler( router.post('/manual-redeem/:taskId/confirm-role', createJsonHandler( (req) => confirmAdminManualRedeemRole( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -133,7 +149,7 @@ router.post('/manual-redeem/:taskId/confirm-role', createJsonHandler( errorMessage: '确认人工兑换角色失败', scope: '[admin/manual-redeem/:taskId/confirm-role]', audit: (req, data) => { - const result = /** @type {{ task?: { taskId?: number, taskNo?: string, status?: string } }} */ (data) + const result = data as AdminManualRedeemMutationResult return { action: 'manual_redeem_role_confirmed', targetType: 'task', @@ -150,7 +166,7 @@ router.post('/manual-redeem/:taskId/confirm-role', createJsonHandler( router.post('/manual-redeem/:taskId/redeem', createJsonHandler( (req) => redeemAdminManualRedeemTask( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -158,7 +174,7 @@ router.post('/manual-redeem/:taskId/redeem', createJsonHandler( errorMessage: '执行人工兑换失败', scope: '[admin/manual-redeem/:taskId/redeem]', audit: (req, data) => { - const result = /** @type {{ task?: { taskId?: number, taskNo?: string, status?: string, deliveryStatus?: string } }} */ (data) + const result = data as AdminManualRedeemMutationResult return { action: 'manual_redeem_started', targetType: 'task', @@ -176,7 +192,7 @@ router.post('/manual-redeem/:taskId/redeem', createJsonHandler( router.post('/manual-redeem/:taskId/close', createJsonHandler( (req) => closeAdminManualRedeemTask( - (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, + (req.params as AdminManualRedeemRouteParams).taskId, req.adminSession || null, ), { @@ -184,7 +200,7 @@ router.post('/manual-redeem/:taskId/close', createJsonHandler( errorMessage: '关闭人工兑换任务失败', scope: '[admin/manual-redeem/:taskId/close]', audit: (req, data) => { - const result = /** @type {{ task?: { taskId?: number, taskNo?: string, status?: string } }} */ (data) + const result = data as AdminManualRedeemMutationResult return { action: 'manual_redeem_closed', targetType: 'task', diff --git a/docs/backend-typescript-migration-plan.md b/docs/backend-typescript-migration-plan.md index 87d9368c..2969010e 100644 --- a/docs/backend-typescript-migration-plan.md +++ b/docs/backend-typescript-migration-plan.md @@ -829,6 +829,13 @@ - `npm run typecheck` - `npm run build` - `npm test` 共 139 个用例通过 +215. 后台人工兑换路由迁移到 `.ts`: + - `src/routes/admin/manual-redeem.ts` +216. 人工兑换 SKU 建议、任务创建 / 详情、登录会话创建 / 摘要 / 刷新 / 关闭、确认角色、启动兑换和关闭任务路由已进入 TS 编译链路;route query、params、body、session body 与人工兑换 mutation audit result 补齐类型 +217. Docker 内验证通过: + - `npm run typecheck` + - `npm run build` + - `npm test` 共 139 个用例通过 ## 下一步建议