增加分组库存与客服

This commit is contained in:
yml2213
2026-04-23 13:38:21 +08:00
parent 2a05a68959
commit f0b31121d7
31 changed files with 675 additions and 80 deletions
@@ -5,9 +5,15 @@ import {
} from '../../repositories/inventory-repo.js'
import { nowIso } from '../../utils/time.js'
export async function reserveInventoryForTask({ skuCode, taskId, credentialType = 'tencent_code', roleKey = 'primary_code' }) {
export async function reserveInventoryForTask({
skuCode,
taskId,
credentialType = 'tencent_code',
roleKey = 'primary_code',
inventoryGroupCodes = null,
}) {
return reserveInventoryForTaskWithDeps(
{ skuCode, taskId, credentialType, roleKey },
{ skuCode, taskId, credentialType, roleKey, inventoryGroupCodes },
{
assignReservedInventoryItem,
findFirstAvailableInventoryItemBySkuCode,
@@ -17,7 +23,13 @@ export async function reserveInventoryForTask({ skuCode, taskId, credentialType
}
export async function reserveInventoryForTaskWithDeps(
{ skuCode, taskId, credentialType = 'tencent_code', roleKey = 'primary_code' },
{
skuCode,
taskId,
credentialType = 'tencent_code',
roleKey = 'primary_code',
inventoryGroupCodes = null,
},
{
assignReservedInventoryItem: assignReserved = assignReservedInventoryItem,
findFirstAvailableInventoryItemBySkuCode: findAvailable = findFirstAvailableInventoryItemBySkuCode,
@@ -28,7 +40,11 @@ export async function reserveInventoryForTaskWithDeps(
return null
}
const available = await findAvailable(skuCode, credentialType)
if (Array.isArray(inventoryGroupCodes) && inventoryGroupCodes.length === 0) {
return null
}
const available = await findAvailable(skuCode, credentialType, inventoryGroupCodes)
if (!available) {
return null
@@ -28,8 +28,8 @@ test('reserveInventoryForTaskWithDeps reserves first available inventory item wi
const result = await reserveInventoryForTaskWithDeps(
{ skuCode: 'dnf-cdk-a', taskId: 88 },
{
findFirstAvailableInventoryItemBySkuCode: async (skuCode, credentialType) => {
calls.push(['find', skuCode, credentialType])
findFirstAvailableInventoryItemBySkuCode: async (skuCode, credentialType, inventoryGroupCodes) => {
calls.push(['find', skuCode, credentialType, inventoryGroupCodes])
return { id: 321 }
},
assignReservedInventoryItem: async (inventoryItemId, taskId, updatedAt, roleKey) => {
@@ -41,13 +41,50 @@ test('reserveInventoryForTaskWithDeps reserves first available inventory item wi
)
assert.deepEqual(calls, [
['find', 'dnf-cdk-a', 'tencent_code'],
['find', 'dnf-cdk-a', 'tencent_code', null],
['assign', 321, 88, '2026-04-14T12:00:00.000Z', 'primary_code'],
])
assert.equal(result?.id, 321)
assert.equal(result?.reserved_by_task_id, 88)
})
test('reserveInventoryForTaskWithDeps forwards inventory group filters', async () => {
const calls = []
await reserveInventoryForTaskWithDeps(
{ skuCode: 'dnf-cdk-a', taskId: 88, inventoryGroupCodes: ['A组', 'B组'] },
{
findFirstAvailableInventoryItemBySkuCode: async (skuCode, credentialType, inventoryGroupCodes) => {
calls.push(['find', skuCode, credentialType, inventoryGroupCodes])
return { id: 321 }
},
assignReservedInventoryItem: async () => ({ id: 321 }),
nowIso: () => '2026-04-14T12:00:00.000Z',
},
)
assert.deepEqual(calls, [
['find', 'dnf-cdk-a', 'tencent_code', ['A组', 'B组']],
])
})
test('reserveInventoryForTaskWithDeps returns null when restricted inventory groups are empty', async () => {
let findCalled = false
const result = await reserveInventoryForTaskWithDeps(
{ skuCode: 'dnf-cdk-a', taskId: 12, inventoryGroupCodes: [] },
{
findFirstAvailableInventoryItemBySkuCode: async () => {
findCalled = true
return null
},
},
)
assert.equal(result, null)
assert.equal(findCalled, false)
})
test('releaseReservedInventoryItemsWithDeps skips empty ids and keeps successful releases only', async () => {
const calls = []
const result = await releaseReservedInventoryItemsWithDeps(