This commit is contained in:
2026-08-19 09:42:07 +08:00
parent ff1d330c2d
commit b5864bfcda
56 changed files with 497 additions and 306 deletions
@@ -35,23 +35,23 @@ async function loadFeeItem(context, direction) {
const data = context.apiSuccess(MODULE, `读取 ${direction} ACTIVE 费用项目`, response, '', OPTIONS)
return rows(data).find((item) => item?.status === 'ACTIVE' && (direction === 'RECEIVABLE'
? item.warehouseReceivable === true
: item.warehousePayable === true && /BOOKING|FREIGHT|OCEAN|SHIPPING|订舱|海运|运费/i.test(`${item.feeCode || item.code || ''} ${item.feeName || item.name || ''}`))) || null
: item.warehousePayable === true)) || null
}
async function loadActivePartner(context) {
const response = await context.request('GET', '/api/platform/v1/suppliers?page=1&size=200&status=ACTIVE&category=BOOKING')
const data = context.apiSuccess(MODULE, '读取 Warehouse ACTIVE 订舱供应商', response, 'category=BOOKING', OPTIONS)
return rows(data).find((item) => item?.status === 'ACTIVE' && item?.category === 'BOOKING') || null
async function loadActiveSupplier(context, category) {
const suffix = category ? `&category=${encodeURIComponent(category)}` : ''
const response = await context.request('GET', `/api/platform/v1/suppliers?page=1&size=200&status=ACTIVE${suffix}`)
const data = context.apiSuccess(MODULE, '读取 Warehouse ACTIVE 供应商', response, category ? `category=${category}` : 'all categories', OPTIONS)
return rows(data).find((item) => item?.status === 'ACTIVE' && (!category || item?.category === category)) || null
}
async function createFee(context, resource, item, spec, partner) {
async function createFee(context, resource, item, spec, supplier) {
const base = `/api/platform/v1/inbounds/${encodeURIComponent(resource.inboundId)}/fee-details`
const path = `${base}?accountId=${encodeURIComponent(resource.tenantId)}`
const body = {
feeItemId: Number(item.id), direction: spec.direction, businessDate: spec.businessDate,
unitPrice: spec.amount, currency: 'CNY', amount: spec.amount, settlementIncluded: true,
partnerId: spec.direction === 'PAYABLE' ? String(partner.id) : null,
partnerName: spec.direction === 'PAYABLE' ? (partner.name || null) : null,
unitPrice: spec.amount, currency: 'CNY', amount: spec.amount,
supplierId: spec.direction === 'PAYABLE' ? String(supplier.id) : null,
remark: `${FIXED_MARKER}-${spec.name}`,
}
const response = await request(context, 'POST', path, body, `create-${spec.name}`)
@@ -127,10 +127,10 @@ export async function run(context) {
const receivableItem = await loadFeeItem(context, 'RECEIVABLE')
const payableItem = await loadFeeItem(context, 'PAYABLE')
const partner = await loadActivePartner(context)
if (!receivableItem || !payableItem || !partner?.id) {
const supplier = await loadActiveSupplier(context, payableItem?.supplierCategory || null)
if (!receivableItem || !payableItem || !supplier?.id) {
blocker(context, '费用状态矩阵前置主数据完整',
`receivableFeeItem=${id(receivableItem?.id) || 'missing'}, payableFeeItem=${id(payableItem?.id) || 'missing'}, activePartner=${id(partner?.id) || 'missing'}`)
`receivableFeeItem=${id(receivableItem?.id) || 'missing'}, payableFeeItem=${id(payableItem?.id) || 'missing'}, activeSupplier=${id(supplier?.id) || 'missing'}`)
return
}
@@ -146,7 +146,7 @@ export async function run(context) {
for (const [index, spec] of specs.entries()) {
const resource = resources[index % resources.length]
const fixture = await createFee(context, resource,
spec.direction === 'RECEIVABLE' ? receivableItem : payableItem, spec, partner)
spec.direction === 'RECEIVABLE' ? receivableItem : payableItem, spec, supplier)
if (!fixture) continue
if (spec.action === 'reject') {
const response = await request(context, 'POST', `${fixture.base}/${fixture.feeId}/reject?accountId=${encodeURIComponent(resource.tenantId)}`,
@@ -168,8 +168,7 @@ export async function run(context) {
const conflictTarget = fixtures.find((item) => item.name === 'AR-APPROVED')
if (conflictTarget) {
const adjustBody = { feeItemId: Number(receivableItem.id), direction: 'RECEIVABLE', businessDate: conflictTarget.businessDate,
unitPrice: 115, currency: 'CNY', amount: 115, settlementIncluded: true,
partnerId: null, partnerName: null, remark: `${FIXED_MARKER}-CONFLICT` }
unitPrice: 115, currency: 'CNY', amount: 115, remark: `${FIXED_MARKER}-CONFLICT` }
const conflict = await request(context, 'POST',
`${conflictTarget.base}/${conflictTarget.feeId}/adjust?accountId=${encodeURIComponent(conflictTarget.resource.tenantId)}&expectedSourceVersion=999`,
adjustBody, 'stale-adjust')
@@ -182,8 +181,7 @@ export async function run(context) {
if (replayTarget) {
const replayPath = `${replayTarget.base}?accountId=${encodeURIComponent(replayTarget.resource.tenantId)}`
const replayBody = { feeItemId: Number(receivableItem.id), direction: 'RECEIVABLE', businessDate: replayTarget.businessDate,
unitPrice: 116, currency: 'CNY', amount: 116, settlementIncluded: true,
partnerId: null, partnerName: null, remark: `${FIXED_MARKER}-IDEMPOTENT` }
unitPrice: 116, currency: 'CNY', amount: 116, remark: `${FIXED_MARKER}-IDEMPOTENT` }
const first = await request(context, 'POST', replayPath, replayBody, 'idempotent-create')
const second = await request(context, 'POST', replayPath, replayBody, 'idempotent-create')
const firstData = first?.body?.data; const secondData = second?.body?.data