feat: 财务看板口径重构与半年模拟数据及报销状态注册表
- 重构 finance_dashboard 口径计算,新增模拟公司画像数据生成与筛选 - 引入 expense_claim_status_registry 统一报销状态流转 - 完善报销草稿流程、Item Sync 与本体解析器 - 优化总览页趋势图、分页组件与请求进度步骤 - 增强报销申请快速预览、本体工具与详情展示 - 新增半年报销模拟数据种子脚本与状态审计工具 - 补充财务看板、报销状态注册与模拟数据测试覆盖
This commit is contained in:
@@ -83,13 +83,38 @@ function normalizeApplicationDateText(value) {
|
||||
}
|
||||
|
||||
function normalizeApplicationBusinessTime(claim) {
|
||||
const start = normalizeApplicationDateText(claim?.start_date || claim?.startDate || claim?.begin_date || claim?.beginDate)
|
||||
const end = normalizeApplicationDateText(claim?.end_date || claim?.endDate || claim?.finish_date || claim?.finishDate)
|
||||
const detail = resolveApplicationDetailPayload(claim)
|
||||
const start = normalizeApplicationDateText(
|
||||
detail.start_date
|
||||
|| detail.startDate
|
||||
|| detail.departure_date
|
||||
|| detail.departureDate
|
||||
|| claim?.start_date
|
||||
|| claim?.startDate
|
||||
|| claim?.begin_date
|
||||
|| claim?.beginDate
|
||||
)
|
||||
const end = normalizeApplicationDateText(
|
||||
detail.end_date
|
||||
|| detail.endDate
|
||||
|| detail.return_date
|
||||
|| detail.returnDate
|
||||
|| claim?.end_date
|
||||
|| claim?.endDate
|
||||
|| claim?.finish_date
|
||||
|| claim?.finishDate
|
||||
)
|
||||
if (start && end && start !== end) {
|
||||
return `${start} 至 ${end}`
|
||||
}
|
||||
return normalizeApplicationDateText(
|
||||
start
|
||||
|| detail.application_business_time
|
||||
|| detail.applicationBusinessTime
|
||||
|| detail.business_time
|
||||
|| detail.businessTime
|
||||
|| detail.time_range
|
||||
|| detail.timeRange
|
||||
|| claim?.business_time
|
||||
|| claim?.businessTime
|
||||
|| claim?.time_range
|
||||
@@ -101,6 +126,21 @@ function normalizeApplicationBusinessTime(claim) {
|
||||
)
|
||||
}
|
||||
|
||||
function resolveApplicationDetailPayload(claim) {
|
||||
const flags = Array.isArray(claim?.risk_flags_json)
|
||||
? claim.risk_flags_json
|
||||
: Array.isArray(claim?.riskFlags)
|
||||
? claim.riskFlags
|
||||
: []
|
||||
const detailFlag = flags.find((flag) => (
|
||||
flag &&
|
||||
typeof flag === 'object' &&
|
||||
normalizeLower(flag.source) === 'application_detail'
|
||||
))
|
||||
const detail = detailFlag?.application_detail || detailFlag?.applicationDetail || {}
|
||||
return detail && typeof detail === 'object' ? detail : {}
|
||||
}
|
||||
|
||||
function toTimestamp(value) {
|
||||
const date = new Date(value)
|
||||
return Number.isNaN(date.getTime()) ? 0 : date.getTime()
|
||||
@@ -231,20 +271,51 @@ export function isUsableRequiredApplicationClaim(claim) {
|
||||
}
|
||||
|
||||
export function normalizeRequiredApplicationCandidate(claim) {
|
||||
const detail = resolveApplicationDetailPayload(claim)
|
||||
const claimNo = normalizeText(claim?.claim_no || claim?.claimNo)
|
||||
const location = normalizeText(claim?.location || claim?.business_location || claim?.businessLocation)
|
||||
const amountText = formatAmount(claim?.amount || claim?.budget_amount || claim?.budgetAmount)
|
||||
const location = normalizeText(
|
||||
detail.location
|
||||
|| detail.application_location
|
||||
|| claim?.location
|
||||
|| claim?.business_location
|
||||
|| claim?.businessLocation
|
||||
)
|
||||
const amount = normalizeText(
|
||||
detail.amount
|
||||
|| detail.application_amount
|
||||
|| claim?.amount
|
||||
|| claim?.budget_amount
|
||||
|| claim?.budgetAmount
|
||||
)
|
||||
const amountText = formatAmount(amount)
|
||||
const status = normalizeApplicationStatus(claim)
|
||||
|
||||
return {
|
||||
id: normalizeText(claim?.id || claim?.claim_id || claim?.claimId),
|
||||
claim_no: claimNo,
|
||||
expense_type: normalizeExpenseType(claim),
|
||||
reason: normalizeText(claim?.reason || claim?.business_reason || claim?.description || claim?.title),
|
||||
reason: normalizeText(detail.reason || detail.application_reason || claim?.reason || claim?.business_reason || claim?.description || claim?.title),
|
||||
location,
|
||||
amount: normalizeText(claim?.amount || claim?.budget_amount || claim?.budgetAmount),
|
||||
amount,
|
||||
amount_label: amountText,
|
||||
business_time: normalizeApplicationBusinessTime(claim),
|
||||
business_time: normalizeText(
|
||||
detail.application_business_time
|
||||
|| detail.applicationBusinessTime
|
||||
|| detail.business_time
|
||||
|| detail.businessTime
|
||||
|| detail.time_range
|
||||
|| detail.timeRange
|
||||
|| detail.time
|
||||
|| detail.application_time
|
||||
) || normalizeApplicationBusinessTime(claim),
|
||||
days: normalizeText(detail.days || detail.application_days),
|
||||
transport_mode: normalizeText(detail.transport_mode || detail.application_transport_mode),
|
||||
lodging_daily_cap: normalizeText(detail.lodging_daily_cap || detail.application_lodging_daily_cap),
|
||||
subsidy_daily_cap: normalizeText(detail.subsidy_daily_cap || detail.application_subsidy_daily_cap),
|
||||
transport_policy: normalizeText(detail.transport_policy || detail.application_transport_policy),
|
||||
policy_estimate: normalizeText(detail.policy_estimate || detail.application_policy_estimate),
|
||||
rule_name: normalizeText(detail.rule_name || detail.application_rule_name),
|
||||
rule_version: normalizeText(detail.rule_version || detail.application_rule_version),
|
||||
status,
|
||||
status_label: STATUS_LABELS[status] || normalizeText(claim?.approval_stage || claim?.approvalStage || status),
|
||||
application_date: normalizeApplicationDate(claim)
|
||||
@@ -296,6 +367,14 @@ export function buildRequiredApplicationActions(applications, actionType) {
|
||||
application_amount: application.amount,
|
||||
application_amount_label: application.amount_label,
|
||||
application_business_time: application.business_time,
|
||||
application_days: application.days,
|
||||
application_transport_mode: application.transport_mode,
|
||||
application_lodging_daily_cap: application.lodging_daily_cap,
|
||||
application_subsidy_daily_cap: application.subsidy_daily_cap,
|
||||
application_transport_policy: application.transport_policy,
|
||||
application_policy_estimate: application.policy_estimate,
|
||||
application_rule_name: application.rule_name,
|
||||
application_rule_version: application.rule_version,
|
||||
application_status: application.status,
|
||||
application_status_label: application.status_label,
|
||||
application_date: application.application_date
|
||||
|
||||
Reference in New Issue
Block a user