From 89754802d15d553ec20e17ead3115b5ae9b0f5be Mon Sep 17 00:00:00 2001 From: yml Date: Thu, 21 May 2026 16:49:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E8=BF=81=E7=A7=BB=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E8=AF=BB=E4=BE=A7=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ers.js => admin-inventory-read-helpers.ts} | 14 +++------ ...helpers.js => admin-order-read-helpers.ts} | 14 +++------ .../{admin-service.js => admin-service.ts} | 2 -- ...lpers.js => admin-webhook-read-helpers.ts} | 31 ++++++++++--------- docs/backend-typescript-migration-plan.md | 11 +++++++ 5 files changed, 36 insertions(+), 36 deletions(-) rename apps/backend/src/services/admin/{admin-inventory-read-helpers.js => admin-inventory-read-helpers.ts} (79%) rename apps/backend/src/services/admin/{admin-order-read-helpers.js => admin-order-read-helpers.ts} (87%) rename apps/backend/src/services/admin/{admin-service.js => admin-service.ts} (99%) rename apps/backend/src/services/admin/{admin-webhook-read-helpers.js => admin-webhook-read-helpers.ts} (87%) diff --git a/apps/backend/src/services/admin/admin-inventory-read-helpers.js b/apps/backend/src/services/admin/admin-inventory-read-helpers.ts similarity index 79% rename from apps/backend/src/services/admin/admin-inventory-read-helpers.js rename to apps/backend/src/services/admin/admin-inventory-read-helpers.ts index f8bb6e29..1f9c8aec 100644 --- a/apps/backend/src/services/admin/admin-inventory-read-helpers.js +++ b/apps/backend/src/services/admin/admin-inventory-read-helpers.ts @@ -1,19 +1,13 @@ -// @ts-check - import { getInventoryItemById } from '../../repositories/inventory-repo.js' import { getOrderById } from '../../repositories/order-repo.js' import { getTaskById } from '../../repositories/task-repo.js' import { createHttpError } from '../../utils/http.js' import { mapAdminTaskSummary } from './admin-task-read-helpers.js' -/** @typedef {import('../../types/admin-read-models.js').AdminInventoryItemListItem} AdminInventoryItemListItem */ -/** @typedef {import('../../types/repository-rows.js').InventoryItemRow} InventoryItemRow */ +import type { AdminInventoryItemListItem } from '../../types/admin-read-models.js' +import type { InventoryItemRow } from '../../types/repository-rows.js' -/** - * @param {InventoryItemRow} item - * @returns {Promise} - */ -export async function mapAdminInventoryListItem(item) { +export async function mapAdminInventoryListItem(item: InventoryItemRow): Promise { const task = item.reserved_by_task_id ? await getTaskById(item.reserved_by_task_id) : null const order = task?.order_id ? await getOrderById(task.order_id) : null const taskSummary = task ? mapAdminTaskSummary(task) : null @@ -38,7 +32,7 @@ export async function mapAdminInventoryListItem(item) { } } -export async function getRequiredInventoryItem(inventoryItemId) { +export async function getRequiredInventoryItem(inventoryItemId: number | string): Promise { const inventoryItem = await getInventoryItemById(Number(inventoryItemId)) if (!inventoryItem) { diff --git a/apps/backend/src/services/admin/admin-order-read-helpers.js b/apps/backend/src/services/admin/admin-order-read-helpers.ts similarity index 87% rename from apps/backend/src/services/admin/admin-order-read-helpers.js rename to apps/backend/src/services/admin/admin-order-read-helpers.ts index b6d4266d..f1db9eb9 100644 --- a/apps/backend/src/services/admin/admin-order-read-helpers.js +++ b/apps/backend/src/services/admin/admin-order-read-helpers.ts @@ -1,19 +1,13 @@ -// @ts-check - import { listOrderItemsByOrderId } from '../../repositories/order-item-repo.js' import { listTasksByOrderId } from '../../repositories/task-repo.js' import { formatFenToAmount, normalizeFen } from '../../utils/money.js' import { resolveDisplayShopName, resolveOrderItemTitle } from './admin-read-shared-helpers.js' import { buildOrderBindingSummary, getTaskBindingSummaryMap } from './admin-task-read-helpers.js' -/** @typedef {import('../../types/admin-read-models.js').AdminOrderListItem} AdminOrderListItem */ -/** @typedef {import('../../types/repository-rows.js').OrderListRow} OrderListRow */ +import type { AdminOrderListItem } from '../../types/admin-read-models.js' +import type { OrderItemRow, OrderListRow } from '../../types/repository-rows.js' -/** - * @param {OrderListRow} item - * @returns {Promise} - */ -export async function mapAdminOrderListItem(item) { +export async function mapAdminOrderListItem(item: OrderListRow): Promise { const [tasks, orderItems] = await Promise.all([ listTasksByOrderId(item.id), listOrderItemsByOrderId(item.id), @@ -55,7 +49,7 @@ export async function mapAdminOrderListItem(item) { } } -export function summarizeOrderItems(items) { +export function summarizeOrderItems(items: OrderItemRow[] | null | undefined): string { const normalizedItems = Array.isArray(items) ? items : [] if (normalizedItems.length === 0) { diff --git a/apps/backend/src/services/admin/admin-service.js b/apps/backend/src/services/admin/admin-service.ts similarity index 99% rename from apps/backend/src/services/admin/admin-service.js rename to apps/backend/src/services/admin/admin-service.ts index 54f372d4..6a5767ab 100644 --- a/apps/backend/src/services/admin/admin-service.js +++ b/apps/backend/src/services/admin/admin-service.ts @@ -1,5 +1,3 @@ -// @ts-check - export { getRequiredInventoryItem, mapAdminInventoryListItem, diff --git a/apps/backend/src/services/admin/admin-webhook-read-helpers.js b/apps/backend/src/services/admin/admin-webhook-read-helpers.ts similarity index 87% rename from apps/backend/src/services/admin/admin-webhook-read-helpers.js rename to apps/backend/src/services/admin/admin-webhook-read-helpers.ts index 33482b26..76827730 100644 --- a/apps/backend/src/services/admin/admin-webhook-read-helpers.js +++ b/apps/backend/src/services/admin/admin-webhook-read-helpers.ts @@ -1,19 +1,22 @@ -// @ts-check - import { listTasksByOrderId } from '../../repositories/task-repo.js' import { formatFenToAmount, parseAmountToFen } from '../../utils/money.js' import { extractAgisoTradePayload, resolveAgisoTradePlatformOrderId } from '../order/agiso-trade-parsing.js' import { safeParseJson } from './admin-query-utils.js' import { resolveDisplayShopName } from './admin-read-shared-helpers.js' -/** @typedef {import('../../types/admin-read-models.js').AdminWebhookEventListItem} AdminWebhookEventListItem */ -/** @typedef {import('../../types/repository-rows.js').WebhookEventRow} WebhookEventRow */ +import type { AdminWebhookEventListItem } from '../../types/admin-read-models.js' +import type { WebhookEventRow } from '../../types/repository-rows.js' -/** - * @param {WebhookEventRow} item - * @returns {Promise} - */ -export async function mapAdminWebhookEvent(item, { includeRaw = false } = {}) { +type JsonRecord = Record + +type MapAdminWebhookEventOptions = { + includeRaw?: boolean +} + +export async function mapAdminWebhookEvent( + item: WebhookEventRow, + { includeRaw = false }: MapAdminWebhookEventOptions = {}, +): Promise { const headers = normalizeRecord(safeParseJson(item.headers_json)) const query = normalizeRecord(safeParseJson(item.query_json)) const body = normalizeRecord(safeParseJson(item.body_json)) @@ -131,11 +134,11 @@ export async function mapAdminWebhookEvent(item, { includeRaw = false } = {}) { } } -function extractWebhookPayload(body) { +function extractWebhookPayload(body: JsonRecord): JsonRecord { return extractAgisoTradePayload(body) } -function extractWebhookItemSources(payload) { +function extractWebhookItemSources(payload: unknown): JsonRecord[] { const normalizedPayload = normalizeRecord(payload) const candidates = [ normalizedPayload.orders, @@ -167,7 +170,7 @@ function extractWebhookItemSources(payload) { return [] } -export function resolveWebhookVisibilityLevel(processError) { +export function resolveWebhookVisibilityLevel(processError: unknown): string { const normalized = String(processError || '').trim() if (normalized.startsWith('ignored_')) { @@ -177,11 +180,11 @@ export function resolveWebhookVisibilityLevel(processError) { return 'important' } -function normalizeRecord(value) { +function normalizeRecord(value: unknown): JsonRecord { return value && typeof value === 'object' && !Array.isArray(value) ? value : {} } -function pickFirstNonEmpty(values) { +function pickFirstNonEmpty(values: unknown[]): string { for (const value of values) { if (typeof value === 'string' && value.trim()) { return value.trim() diff --git a/docs/backend-typescript-migration-plan.md b/docs/backend-typescript-migration-plan.md index e41b4c23..9f432509 100644 --- a/docs/backend-typescript-migration-plan.md +++ b/docs/backend-typescript-migration-plan.md @@ -715,6 +715,17 @@ - `npm run typecheck` - `npm run build` - `npm test` 共 139 个用例通过 +177. 后台 Admin 读侧聚合与订单 / 库存 / Webhook 映射 helper 迁移到 `.ts`: + - `src/services/admin/admin-inventory-read-helpers.ts` + - `src/services/admin/admin-order-read-helpers.ts` + - `src/services/admin/admin-webhook-read-helpers.ts` + - `src/services/admin/admin-service.ts` +178. Admin 库存占用任务映射、订单商品摘要、Webhook 原始 payload 展开与后台服务聚合出口已进入 TS 编译链路;列表 row、Webhook options、动态 JSON record 与导出入口补齐类型 +179. Docker 内验证通过: + - `src/services/admin/*.test.js` 共 8 个用例通过 + - `npm run typecheck` + - `npm run build` + - `npm test` 共 139 个用例通过 ## 下一步建议