Files
X-Financial/web/src/utils/expenseApplicationDetail.js

107 lines
3.2 KiB
JavaScript
Raw Normal View History

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))
}