This commit is contained in:
2026-08-13 09:52:59 +08:00
parent c331133016
commit 5a48992d78
2 changed files with 50 additions and 4 deletions
@@ -9,7 +9,9 @@ const REQUIRED_PERMISSIONS = [
'platform:finance:reconciliation:adjust',
'platform:finance:reconciliation:void',
'platform:finance:settlement-ar:create',
'platform:finance:settlement-ar:view',
'platform:finance:settlement-ap:create',
'platform:finance:settlement-ap:view',
]
function id(value) { return value == null ? '' : String(value) }
@@ -43,6 +45,19 @@ function sameIds(actual, expected) {
const right = [...new Set(expected)].sort()
return left.length === right.length && left.every((value, index) => value === right[index])
}
async function findSettlementInOfficialList(context, direction, customerId, targetId, label) {
const segment = direction === 'RECEIVABLE' ? 'receivable-settlements' : 'payable-settlements'
const response = await context.request('GET',
`${BASE}/${segment}?customerId=${encodeURIComponent(customerId)}`)
const summaries = context.apiSuccess(MODULE, `从正式${label}列表查回结算单`, response,
`settlementId=${targetId}, customerId=${customerId}`, OPTIONS)
const found = rows(summaries).find((item) => settlementId(item) === targetId)
context.assert(MODULE, `正式${label}列表包含同一 settlementId`, response,
found?.direction === direction && id(found?.customerId) === id(customerId),
`expected=${targetId}, actual=${settlementId(found) || 'missing'}, direction=${found?.direction ?? 'missing'}`, OPTIONS)
return found ?? null
}
function dates(sources) {
const values = sources.map((source) => source.businessDate).sort()
return { start: values[0], end: values.at(-1) }
@@ -214,6 +229,12 @@ async function createReceivable(context, statement, index) {
const replay = context.apiSuccess(MODULE, `第 ${index} 张应收结算单幂等重放`, replayResponse, '', OPTIONS)
context.assert(MODULE, `第 ${index} 张 AR 幂等保持同一资源`, replayResponse,
settlementId(replay) === settlementId(settlement), `settlementId=${settlementId(settlement)}`, OPTIONS)
const listed = await findSettlementInOfficialList(context, 'RECEIVABLE', settlement.customerId,
settlementId(settlement), `应收第 ${index} 张`)
context.assert(MODULE, `第 ${index} 张 AR 正式列表金额与创建结果一致`, null,
listed && Number(listed.totalAmount) === Number(settlement.totalAmount)
&& Number(listed.outstandingAmount) === Number(settlement.outstandingAmount),
`createdTotal=${settlement.totalAmount ?? 'missing'}, listedTotal=${listed?.totalAmount ?? 'missing'}`, OPTIONS)
return settlement
}
@@ -387,6 +408,14 @@ export async function run(context) {
const response = await write(context, 'POST', `${BASE}/payable-settlements`, body, 'payable-settlement')
payableSettlement = context.apiSuccess(MODULE, '按 Fixture PAYABLE 与 partnerId/supplierId 生成应付结算单',
response, `sources=${payables.length}, supplierId=${supplierId}, supplierName=${supplierName ?? 'null'}`, OPTIONS)
if (payableSettlement) {
const listed = await findSettlementInOfficialList(context, 'PAYABLE', fixture.customerId,
settlementId(payableSettlement), '应付')
context.assert(MODULE, 'AP 正式列表供应商与金额和创建结果一致', null,
listed && id(listed.supplierId) === id(payableSettlement.supplierId)
&& Number(listed.totalAmount) === Number(payableSettlement.totalAmount),
`createdSupplier=${id(payableSettlement.supplierId)}, listedSupplier=${id(listed?.supplierId) || 'missing'}`, OPTIONS)
}
if (!payableSettlement) {
blocker(context, 'PAYABLE 真实接口创建失败',
`HTTP=${response.http}, code=${response.body?.code ?? 'missing'}, requestId=${response.requestId ?? 'null'}, traceId=${response.traceId ?? 'null'}`,