后端拆分风险规则生成为解释器、语义分析、本体对齐等子模块, 优化模板执行和流程图生成,完善员工种子数据和导入逻辑,增强 报销单权限策略和草稿持久化,前端新增预算中心视图和趋势图 组件,重构审计页面和风险规则测试对话框交互,完善文档中心 和报销创建页面细节,补充单元测试覆盖。
107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
function normalizeText(value) {
|
|
return String(value || '').trim()
|
|
}
|
|
|
|
function isProvided(value) {
|
|
const text = normalizeText(value)
|
|
return Boolean(text) && !['待补充', '暂无', '无', '未知'].includes(text)
|
|
}
|
|
|
|
function resolveApplicationDetailPayload(request = {}) {
|
|
const flags = Array.isArray(request.risk_flags_json)
|
|
? request.risk_flags_json
|
|
: Array.isArray(request.riskFlags)
|
|
? request.riskFlags
|
|
: []
|
|
const detailFlag = flags.find((flag) =>
|
|
flag &&
|
|
typeof flag === 'object' &&
|
|
normalizeText(flag.source) === 'application_detail'
|
|
)
|
|
const detail = detailFlag?.application_detail || detailFlag?.applicationDetail || {}
|
|
return detail && typeof detail === 'object' ? detail : {}
|
|
}
|
|
|
|
function pickDetailValue(detail, request, keys = [], fallback = '') {
|
|
for (const key of keys) {
|
|
const value = normalizeText(detail[key] ?? request[key])
|
|
if (isProvided(value)) return value
|
|
}
|
|
return normalizeText(fallback)
|
|
}
|
|
|
|
export function buildApplicationDetailFactItems(request = {}) {
|
|
const detail = resolveApplicationDetailPayload(request)
|
|
const amountDisplay = normalizeText(request.amountDisplay || request.amount)
|
|
const rows = [
|
|
{
|
|
key: 'application_type',
|
|
label: '申请类型',
|
|
value: pickDetailValue(detail, request, ['application_type', 'typeLabel'], request.typeLabel)
|
|
},
|
|
{
|
|
key: 'time',
|
|
label: '发生时间',
|
|
value: pickDetailValue(detail, request, ['time', 'occurredDisplay', 'period'], request.occurredDisplay)
|
|
},
|
|
{
|
|
key: 'location',
|
|
label: '地点',
|
|
value: pickDetailValue(detail, request, ['location', 'sceneTarget', 'city'], request.sceneTarget)
|
|
},
|
|
{
|
|
key: 'reason',
|
|
label: '事由',
|
|
value: pickDetailValue(detail, request, ['reason'], request.reason)
|
|
},
|
|
{
|
|
key: 'days',
|
|
label: '天数',
|
|
value: pickDetailValue(detail, request, ['days'])
|
|
},
|
|
{
|
|
key: 'transport_mode',
|
|
label: '出行方式',
|
|
value: pickDetailValue(detail, request, ['transport_mode'])
|
|
},
|
|
{
|
|
key: 'grade',
|
|
label: '职级',
|
|
value: pickDetailValue(detail, request, ['grade', 'profileGrade', 'employee_grade'], request.profileGrade),
|
|
highlight: true
|
|
},
|
|
{
|
|
key: 'lodging_daily_cap',
|
|
label: '住宿上限/天',
|
|
value: pickDetailValue(detail, request, ['lodging_daily_cap']),
|
|
highlight: true
|
|
},
|
|
{
|
|
key: 'subsidy_daily_cap',
|
|
label: '补贴标准/天',
|
|
value: pickDetailValue(detail, request, ['subsidy_daily_cap']),
|
|
highlight: true
|
|
},
|
|
{
|
|
key: 'transport_policy',
|
|
label: '交通费用口径',
|
|
value: pickDetailValue(detail, request, ['transport_policy'], '车票、机票暂无实时价格接口,按真实票据实报实销')
|
|
},
|
|
{
|
|
key: 'policy_estimate',
|
|
label: '规则测算参考',
|
|
value: pickDetailValue(detail, request, ['policy_estimate']),
|
|
highlight: true
|
|
},
|
|
{
|
|
key: 'amount',
|
|
label: '用户预估费用',
|
|
value: pickDetailValue(detail, request, ['amount'], amountDisplay),
|
|
highlight: true,
|
|
emphasis: true
|
|
}
|
|
]
|
|
|
|
return rows.filter((row) => isProvided(row.value))
|
|
}
|