后端迁移库存服务模块

This commit is contained in:
yml
2026-05-21 14:17:14 +08:00
parent 5711d38c8f
commit ab3a8caa9f
2 changed files with 55 additions and 10 deletions
@@ -3,15 +3,49 @@ import {
findFirstAvailableInventoryItemBySkuCode, findFirstAvailableInventoryItemBySkuCode,
releaseReservedInventoryItem, releaseReservedInventoryItem,
} from '../../repositories/inventory-repo.js' } from '../../repositories/inventory-repo.js'
import type { InventoryItemRow } from '../../types/repository-rows.js'
import { nowIso } from '../../utils/time.js' import { nowIso } from '../../utils/time.js'
type InventoryItemId = number | string | null | undefined
type InventoryGroupCodesInput = string | string[] | null | undefined
type ReserveInventoryForTaskInput = {
skuCode?: string
taskId: number | string
credentialType?: string
roleKey?: string
inventoryGroupCodes?: InventoryGroupCodesInput
}
type ReserveInventoryForTaskDeps = {
assignReservedInventoryItem?: (
inventoryItemId: number | string,
taskId: number | string,
updatedAt: string,
roleKey?: string,
) => Promise<InventoryItemRow | null>
findFirstAvailableInventoryItemBySkuCode?: (
skuCode: string,
credentialType?: string,
inventoryGroupCodes?: InventoryGroupCodesInput,
) => Promise<InventoryItemRow | null>
nowIso?: () => string
}
type ReleaseReservedInventoryItemsDeps = {
releaseReservedInventoryItem?: (
inventoryItemId: number | string,
updatedAt: string,
) => Promise<InventoryItemRow | null>
}
export async function reserveInventoryForTask({ export async function reserveInventoryForTask({
skuCode, skuCode,
taskId, taskId,
credentialType = 'tencent_code', credentialType = 'tencent_code',
roleKey = 'primary_code', roleKey = 'primary_code',
inventoryGroupCodes = null, inventoryGroupCodes = null,
}) { }: ReserveInventoryForTaskInput): Promise<InventoryItemRow | null> {
return reserveInventoryForTaskWithDeps( return reserveInventoryForTaskWithDeps(
{ skuCode, taskId, credentialType, roleKey, inventoryGroupCodes }, { skuCode, taskId, credentialType, roleKey, inventoryGroupCodes },
{ {
@@ -29,13 +63,13 @@ export async function reserveInventoryForTaskWithDeps(
credentialType = 'tencent_code', credentialType = 'tencent_code',
roleKey = 'primary_code', roleKey = 'primary_code',
inventoryGroupCodes = null, inventoryGroupCodes = null,
}, }: ReserveInventoryForTaskInput,
{ {
assignReservedInventoryItem: assignReserved = assignReservedInventoryItem, assignReservedInventoryItem: assignReserved = assignReservedInventoryItem,
findFirstAvailableInventoryItemBySkuCode: findAvailable = findFirstAvailableInventoryItemBySkuCode, findFirstAvailableInventoryItemBySkuCode: findAvailable = findFirstAvailableInventoryItemBySkuCode,
nowIso: getNowIso = nowIso, nowIso: getNowIso = nowIso,
} = {}, }: ReserveInventoryForTaskDeps = {},
) { ): Promise<InventoryItemRow | null> {
if (!skuCode) { if (!skuCode) {
return null return null
} }
@@ -53,7 +87,10 @@ export async function reserveInventoryForTaskWithDeps(
return assignReserved(available.id, taskId, getNowIso(), roleKey) return assignReserved(available.id, taskId, getNowIso(), roleKey)
} }
export async function releaseReservedInventoryItems(inventoryItemIds = [], updatedAt = nowIso()) { export async function releaseReservedInventoryItems(
inventoryItemIds: InventoryItemId[] = [],
updatedAt = nowIso(),
): Promise<InventoryItemRow[]> {
return releaseReservedInventoryItemsWithDeps( return releaseReservedInventoryItemsWithDeps(
inventoryItemIds, inventoryItemIds,
updatedAt, updatedAt,
@@ -62,13 +99,13 @@ export async function releaseReservedInventoryItems(inventoryItemIds = [], updat
} }
export async function releaseReservedInventoryItemsWithDeps( export async function releaseReservedInventoryItemsWithDeps(
inventoryItemIds = [], inventoryItemIds: InventoryItemId[] = [],
updatedAt = nowIso(), updatedAt = nowIso(),
{ {
releaseReservedInventoryItem: releaseReserved = releaseReservedInventoryItem, releaseReservedInventoryItem: releaseReserved = releaseReservedInventoryItem,
} = {}, }: ReleaseReservedInventoryItemsDeps = {},
) { ): Promise<InventoryItemRow[]> {
const released = [] const released: InventoryItemRow[] = []
for (const inventoryItemId of inventoryItemIds) { for (const inventoryItemId of inventoryItemIds) {
if (!inventoryItemId) { if (!inventoryItemId) {
+9 -1
View File
@@ -256,13 +256,21 @@
- `npm run typecheck` - `npm run typecheck`
- `npm run build` - `npm run build`
- `npm test` 共 125 个用例通过 - `npm test` 共 125 个用例通过
25. 服务层首批迁移到 `.ts`
- `src/services/order/inventory-service.ts`
26. 库存服务的 reserve/release 输入、依赖注入函数、返回库存行已显式类型化
27. Docker 内验证通过:
- `src/services/order/inventory-service.test.js` 共 5 个用例通过
- `npm run typecheck`
- `npm run build`
- `npm test` 共 125 个用例通过
## 下一步建议 ## 下一步建议
第一批继续推进时,建议按这个顺序: 第一批继续推进时,建议按这个顺序:
1. 继续迁移服务层中最核心、最常改的订单 / 履约 / claim 模块 1. 继续迁移服务层中最核心、最常改的订单 / 履约 / claim 模块
2. 逐步移除服务层 `@ts-nocheck`,优先处理自动发货、claim session、webhook service 2. 逐步移除服务层 `@ts-nocheck`,优先处理 claim session、webhook service、自动发货
## 执行原则 ## 执行原则