修复履约任务创建筛选
This commit is contained in:
@@ -1,7 +1,42 @@
|
|||||||
import test from 'node:test'
|
import test from 'node:test'
|
||||||
import assert from 'node:assert/strict'
|
import assert from 'node:assert/strict'
|
||||||
|
|
||||||
import { mergeSourceOrderState } from './order-service.js'
|
import {
|
||||||
|
isOrderItemConfiguredForFulfillment,
|
||||||
|
mergeSourceOrderState,
|
||||||
|
} from './order-service.js'
|
||||||
|
import type { OrderItemRow } from '../../types/repository/rows.js'
|
||||||
|
|
||||||
|
function buildOrderItem(snapshot: OrderItemRow['item_snapshot_json']): OrderItemRow {
|
||||||
|
return {
|
||||||
|
id: 1,
|
||||||
|
order_id: 1,
|
||||||
|
sku_code: 'TEST-SKU',
|
||||||
|
sku_name: '测试商品',
|
||||||
|
quantity: 1,
|
||||||
|
spec_json: '{}',
|
||||||
|
item_snapshot_json: snapshot,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('isOrderItemConfiguredForFulfillment accepts PostgreSQL JSONB object results', () => {
|
||||||
|
assert.equal(
|
||||||
|
isOrderItemConfiguredForFulfillment(buildOrderItem({ isConfigured: true })),
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('isOrderItemConfiguredForFulfillment accepts serialized snapshots', () => {
|
||||||
|
assert.equal(
|
||||||
|
isOrderItemConfiguredForFulfillment(buildOrderItem('{"isConfigured":true}')),
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('isOrderItemConfiguredForFulfillment rejects unconfigured or malformed snapshots', () => {
|
||||||
|
assert.equal(isOrderItemConfiguredForFulfillment(buildOrderItem({})), false)
|
||||||
|
assert.equal(isOrderItemConfiguredForFulfillment(buildOrderItem('{invalid')), false)
|
||||||
|
})
|
||||||
|
|
||||||
test('mergeSourceOrderState keeps paid state when a late created source event arrives', () => {
|
test('mergeSourceOrderState keeps paid state when a late created source event arrives', () => {
|
||||||
const merged = mergeSourceOrderState(
|
const merged = mergeSourceOrderState(
|
||||||
|
|||||||
@@ -283,17 +283,24 @@ export function mergeSourceOrderState(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isOrderItemConfiguredForFulfillment(item: OrderItemRow): boolean {
|
export function isOrderItemConfiguredForFulfillment(item: OrderItemRow): boolean {
|
||||||
|
const rawSnapshot = item.item_snapshot_json
|
||||||
|
const snapshot =
|
||||||
|
rawSnapshot && typeof rawSnapshot === 'object' && !Array.isArray(rawSnapshot)
|
||||||
|
? rawSnapshot
|
||||||
|
: parseOrderItemSnapshot(rawSnapshot)
|
||||||
|
|
||||||
|
return Boolean(snapshot && snapshot.isConfigured === true)
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseOrderItemSnapshot(value: unknown): Record<string, unknown> | null {
|
||||||
try {
|
try {
|
||||||
const snapshot = JSON.parse(String(item.item_snapshot_json || '{}'))
|
const parsed = JSON.parse(String(value || '{}'))
|
||||||
return Boolean(
|
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
||||||
snapshot &&
|
? parsed as Record<string, unknown>
|
||||||
typeof snapshot === 'object' &&
|
: null
|
||||||
!Array.isArray(snapshot) &&
|
|
||||||
snapshot.isConfigured === true,
|
|
||||||
)
|
|
||||||
} catch {
|
} catch {
|
||||||
return false
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user