feat: 财务看板口径重构与半年模拟数据及报销状态注册表
- 重构 finance_dashboard 口径计算,新增模拟公司画像数据生成与筛选 - 引入 expense_claim_status_registry 统一报销状态流转 - 完善报销草稿流程、Item Sync 与本体解析器 - 优化总览页趋势图、分页组件与请求进度步骤 - 增强报销申请快速预览、本体工具与详情展示 - 新增半年报销模拟数据种子脚本与状态审计工具 - 补充财务看板、报销状态注册与模拟数据测试覆盖
This commit is contained in:
@@ -164,9 +164,10 @@ test('application preview renders ordered editable rows and submit text uses edi
|
||||
const rows = buildApplicationPreviewRows(editedPreview)
|
||||
assert.deepEqual(
|
||||
rows.map((row) => row.label),
|
||||
['申请类型', '姓名', '职级', '部门', '岗位', '直属领导', '行程时间', '地点', '事由', '天数', '出行方式', '住宿上限/天', '补贴标准/天', '交通费用口径', '规则测算参考', '系统预估费用']
|
||||
['申请类型', '姓名', '职级', '部门', '岗位', '直属领导', '出发时间', '返回时间', '地点', '事由', '天数', '出行方式', '住宿上限/天', '补贴标准/天', '交通费用口径', '规则测算参考', '系统预估费用']
|
||||
)
|
||||
assert.match(buildApplicationPreviewSubmitText(editedPreview), /行程时间:2026-05-25 至 2026-05-28/)
|
||||
assert.match(buildApplicationPreviewSubmitText(editedPreview), /出发时间:2026-05-25/)
|
||||
assert.match(buildApplicationPreviewSubmitText(editedPreview), /返回时间:2026-05-28/)
|
||||
assert.doesNotMatch(buildApplicationPreviewSubmitText(editedPreview), /发生时间:/)
|
||||
assert.equal(rows.find((row) => row.key === 'amount')?.value, '1900元')
|
||||
assert.equal(rows.find((row) => row.key === 'amount')?.highlight, true)
|
||||
@@ -212,7 +213,7 @@ test('application estimate builds deterministic mock transport amount and total'
|
||||
assert.equal(datedTrainEstimate.queryDate, '2026-05-25')
|
||||
assert.equal(datedTrainEstimate.amountDisplay, '1,100')
|
||||
assert.equal(datedTrainEstimate.source, 'mock_ticket_price_query_v1')
|
||||
assert.match(datedTrainEstimate.basisText, /查询耗时 \d+ms/)
|
||||
assert.equal(datedTrainEstimate.basisText, '预估交通费用 1,100元')
|
||||
assert.ok(datedTrainEstimate.simulatedLatencyMs >= 360)
|
||||
assert.ok(datedTrainEstimate.simulatedLatencyMs <= 779)
|
||||
assert.equal(resolveMockApplicationTransportWaitMs(datedTrainEstimate), 320)
|
||||
@@ -247,16 +248,43 @@ test('application preview uses selected date range and business-specific time la
|
||||
const rows = buildApplicationPreviewRows(preview)
|
||||
const submitText = buildApplicationPreviewSubmitText(preview)
|
||||
|
||||
assert.equal(resolveApplicationTimeLabel(preview.fields.applicationType), '行程时间')
|
||||
assert.equal(resolveApplicationTimeLabel(preview.fields.applicationType), '出发时间')
|
||||
assert.equal(preview.fields.time, '2026-02-20 至 2026-02-23')
|
||||
assert.equal(preview.fields.days, '4天')
|
||||
assert.equal(preview.fields.reason, '支撑国网仿生产环境部署')
|
||||
assert.equal(rows.find((row) => row.key === 'time')?.label, '行程时间')
|
||||
assert.match(submitText, /行程时间:2026-02-20 至 2026-02-23/)
|
||||
assert.equal(rows.find((row) => row.key === 'time')?.label, '出发时间')
|
||||
assert.equal(rows.find((row) => row.key === 'time')?.value, '2026-02-20')
|
||||
assert.equal(rows.find((row) => row.key === 'time_return')?.label, '返回时间')
|
||||
assert.equal(rows.find((row) => row.key === 'time_return')?.value, '2026-02-23')
|
||||
assert.match(submitText, /出发时间:2026-02-20/)
|
||||
assert.match(submitText, /返回时间:2026-02-23/)
|
||||
assert.match(submitText, /事由:支撑国网仿生产环境部署/)
|
||||
assert.doesNotMatch(submitText, /发生时间:/)
|
||||
})
|
||||
|
||||
test('application preview keeps labeled reason in structured travel form', () => {
|
||||
const preview = buildLocalApplicationPreview([
|
||||
'发生时间:2026-02-20 至 2026-02-23',
|
||||
'地点:上海',
|
||||
'事由:支撑国网仿生产环境建设',
|
||||
'天数:4天'
|
||||
].join('\n'), {
|
||||
name: '曹笑竹',
|
||||
grade: 'P5'
|
||||
})
|
||||
const rows = buildApplicationPreviewRows(preview)
|
||||
|
||||
assert.equal(preview.fields.applicationType, '差旅费用申请')
|
||||
assert.equal(preview.fields.time, '2026-02-20 至 2026-02-23')
|
||||
assert.equal(preview.fields.location, '上海')
|
||||
assert.equal(preview.fields.reason, '支撑国网仿生产环境建设')
|
||||
assert.equal(preview.fields.days, '4天')
|
||||
assert.equal(rows.find((row) => row.key === 'reason')?.value, '支撑国网仿生产环境建设')
|
||||
assert.equal(rows.find((row) => row.key === 'reason')?.missing, false)
|
||||
assert.equal(rows.find((row) => row.key === 'time')?.label, '出发时间')
|
||||
assert.equal(rows.find((row) => row.key === 'time_return')?.label, '返回时间')
|
||||
})
|
||||
|
||||
test('application preview cleans empty time labels and keeps only business reason', () => {
|
||||
const preview = buildLocalApplicationPreview('发生时间:,去九江出差3天,服务美团业务部署,预计费用1800元,火车', {
|
||||
name: '李文静',
|
||||
@@ -622,7 +650,7 @@ test('application duplicate confirmation flow marks submit step as blocked dupli
|
||||
status: 'succeeded',
|
||||
result: {
|
||||
answer: [
|
||||
'检测到同一申请人、同一申请类型、同一行程时间已存在申请单,系统没有重复创建。',
|
||||
'检测到同一申请人、同一申请类型、同一出发时间已存在申请单,系统没有重复创建。',
|
||||
'已有申请单号:AP-20260602010101-ABCDEFGH',
|
||||
'当前节点:直属领导审批'
|
||||
].join('\n')
|
||||
@@ -679,9 +707,8 @@ test('application preview merges rule center travel estimate into highlighted ro
|
||||
|
||||
assert.equal(estimatedPreview.fields.lodgingDailyCap, '600元/天')
|
||||
assert.equal(estimatedPreview.fields.subsidyDailyCap, '120元/天')
|
||||
assert.match(estimatedPreview.fields.transportPolicy, /参考票价/)
|
||||
assert.match(estimatedPreview.fields.transportPolicy, /2026-05-25/)
|
||||
assert.match(estimatedPreview.fields.transportPolicy, /查询耗时 \d+ms/)
|
||||
assert.equal(estimatedPreview.fields.transportPolicy, '预估交通费用 1,100元')
|
||||
assert.doesNotMatch(estimatedPreview.fields.transportPolicy, /参考票价|查询耗时|2026-05-25|真实票据/)
|
||||
assert.match(estimatedPreview.fields.policyEstimate, /交通 1,100元/)
|
||||
assert.match(estimatedPreview.fields.policyEstimate, /3,260元/)
|
||||
assert.equal(estimatedPreview.fields.transportEstimatedAmount, '1,100元')
|
||||
@@ -734,8 +761,8 @@ test('application preview editor refreshes transport estimate after mode change'
|
||||
assert.equal(message.applicationPreview.fields.transportMode, '飞机')
|
||||
assert.equal(message.applicationPreview.fields.transportEstimatedAmount, '2,330元')
|
||||
assert.equal(message.applicationPreview.fields.amount, '4,490元')
|
||||
assert.match(message.applicationPreview.fields.transportPolicy, /已查询 2026-05-25 飞机参考票价/)
|
||||
assert.match(message.applicationPreview.fields.transportPolicy, /查询耗时 \d+ms/)
|
||||
assert.equal(message.applicationPreview.fields.transportPolicy, '预估交通费用 2,330元')
|
||||
assert.doesNotMatch(message.applicationPreview.fields.transportPolicy, /参考票价|查询耗时|2026-05-25|真实票据/)
|
||||
assert.doesNotMatch(message.applicationPreview.fields.transportPolicy, /模拟/)
|
||||
assert.ok(persistCount >= 2)
|
||||
assert.equal(toastMessages.at(-1), '已更新出行方式和费用测算。')
|
||||
|
||||
Reference in New Issue
Block a user