增加分组库存与客服
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user