2026-05-25 13:35:39 +08:00
|
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
|
import test from 'node:test'
|
|
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
|
buildApplicationFieldsFromOntology,
|
|
|
|
|
|
expandApplicationTimeWithDays,
|
|
|
|
|
|
resolveApplicationReason,
|
|
|
|
|
|
resolveApplicationTimeRange,
|
|
|
|
|
|
resolvePromptField
|
|
|
|
|
|
} from '../src/utils/expenseApplicationOntology.js'
|
|
|
|
|
|
|
|
|
|
|
|
const structuredApplicationPrompt = [
|
|
|
|
|
|
'发生时间:2026-05-25',
|
|
|
|
|
|
'地点:上海',
|
|
|
|
|
|
'事由:支撑国网服务器部署',
|
|
|
|
|
|
'天数:3天'
|
|
|
|
|
|
].join('\n')
|
|
|
|
|
|
|
|
|
|
|
|
test('expense application fields use labeled reason and filter resolved missing slots', () => {
|
|
|
|
|
|
const fields = buildApplicationFieldsFromOntology(
|
|
|
|
|
|
{
|
|
|
|
|
|
scenario: 'expense',
|
|
|
|
|
|
intent: 'draft',
|
|
|
|
|
|
entities: [],
|
|
|
|
|
|
time_range: {},
|
|
|
|
|
|
missing_slots: ['time_range', 'location', 'reason', 'amount']
|
|
|
|
|
|
},
|
|
|
|
|
|
structuredApplicationPrompt,
|
|
|
|
|
|
{ name: '申请员工', departmentName: '交付部' }
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2026-05-30 15:46:51 +08:00
|
|
|
|
assert.equal(fields.timeRange, '2026-05-25 至 2026-05-27')
|
2026-06-02 16:22:59 +08:00
|
|
|
|
assert.equal(fields.expenseTypeCode, 'travel')
|
|
|
|
|
|
assert.equal(fields.expenseTypeLabel, '差旅费')
|
2026-05-25 13:35:39 +08:00
|
|
|
|
assert.equal(fields.location, '上海')
|
|
|
|
|
|
assert.equal(fields.reason, '支撑国网服务器部署')
|
|
|
|
|
|
assert.deepEqual(
|
|
|
|
|
|
fields.missingSlots.map((item) => item.key),
|
|
|
|
|
|
['amount']
|
|
|
|
|
|
)
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test('expense application prompt field parser supports multiline labels', () => {
|
|
|
|
|
|
assert.equal(resolvePromptField(structuredApplicationPrompt, ['事由']), '支撑国网服务器部署')
|
|
|
|
|
|
assert.equal(resolveApplicationReason(structuredApplicationPrompt), '支撑国网服务器部署')
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-05-26 09:15:14 +08:00
|
|
|
|
test('expense application reason prefers model entity and strips context fragments', () => {
|
|
|
|
|
|
assert.equal(
|
|
|
|
|
|
resolveApplicationReason(
|
|
|
|
|
|
'发生时间:,去九江出差3天,服务美团业务部署',
|
|
|
|
|
|
{
|
|
|
|
|
|
entities: [
|
|
|
|
|
|
{ type: 'location', value: '九江', normalized_value: '九江' },
|
|
|
|
|
|
{ type: 'reason', value: '服务美团业务部署', normalized_value: '服务美团业务部署' }
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
),
|
|
|
|
|
|
'服务美团业务部署'
|
|
|
|
|
|
)
|
|
|
|
|
|
assert.equal(resolveApplicationReason('发生时间:,去九江出差3天,服务美团业务部署'), '服务美团业务部署')
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-05-25 13:35:39 +08:00
|
|
|
|
test('expense application expands a single selected date with natural days', () => {
|
|
|
|
|
|
const prompt = [
|
|
|
|
|
|
'发生时间:2026-05-25',
|
|
|
|
|
|
'去上海出差3天,支撑国网服务器部署'
|
|
|
|
|
|
].join('\n')
|
|
|
|
|
|
|
2026-05-30 15:46:51 +08:00
|
|
|
|
assert.equal(expandApplicationTimeWithDays('2026-05-25', 3), '2026-05-25 至 2026-05-27')
|
|
|
|
|
|
assert.equal(resolveApplicationTimeRange({ time_range: {} }, prompt), '2026-05-25 至 2026-05-27')
|
2026-05-25 13:35:39 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test('expense application keeps explicit time range before applying days', () => {
|
|
|
|
|
|
assert.equal(
|
|
|
|
|
|
resolveApplicationTimeRange(
|
|
|
|
|
|
{
|
|
|
|
|
|
time_range: {
|
|
|
|
|
|
start_date: '2026-05-25',
|
|
|
|
|
|
end_date: '2026-05-27'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
'去上海出差3天,支撑国网服务器部署'
|
|
|
|
|
|
),
|
|
|
|
|
|
'2026-05-25 至 2026-05-27'
|
|
|
|
|
|
)
|
|
|
|
|
|
})
|