Files
X-Financial/web/src/views/scripts/auditViewRiskRuleModel.js

167 lines
5.3 KiB
JavaScript
Raw Normal View History

export const RISK_RULE_CREATE_DOMAIN_OPTIONS = [
{ value: 'expense', label: '报销' },
{ value: 'ar', label: '应收' },
{ value: 'ap', label: '应付' }
]
export const RISK_RULE_LEVEL_OPTIONS = [
{ value: 'medium', label: '中风险' },
{ value: 'high', label: '高风险' },
{ value: 'low', label: '低风险' }
]
const RISK_LEVEL_LABELS = {
low: '低风险',
medium: '中风险',
high: '高风险'
}
export function createDefaultRiskRuleForm() {
return {
business_domain: 'expense',
risk_level: 'medium',
natural_language: ''
}
}
export function normalizeRiskRuleText(value) {
return String(value || '').trim()
}
export function formatRiskRuleFieldDisplay(field) {
const key = normalizeRiskRuleText(field?.key)
const label = normalizeRiskRuleText(field?.label || key)
if (label && key && label !== key) {
return `${label}[${key}]`
}
return label || key
}
export function resolveRiskRuleSeverity(payload) {
const outcomes = payload && typeof payload === 'object' ? payload.outcomes || {} : {}
const fail = outcomes && typeof outcomes.fail === 'object' ? outcomes.fail : {}
const severity = normalizeRiskRuleText(fail.severity || payload?.severity).toLowerCase()
return ['low', 'medium', 'high'].includes(severity) ? severity : 'medium'
}
export function resolveRiskRuleSeverityLabel(payload) {
return RISK_LEVEL_LABELS[resolveRiskRuleSeverity(payload)] || '中风险'
}
export function resolveRiskRuleFields(payload) {
const inputs = payload && typeof payload === 'object' ? payload.inputs || {} : {}
const fieldRows = Array.isArray(inputs.fields) ? inputs.fields : []
if (fieldRows.length) {
return fieldRows
.map((item) => ({
key: normalizeRiskRuleText(item?.key),
label: normalizeRiskRuleText(item?.label || item?.key),
display: formatRiskRuleFieldDisplay(item),
source: normalizeRiskRuleText(item?.source),
type: normalizeRiskRuleText(item?.type)
}))
.filter((item) => item.key || item.label)
}
return Object.entries(inputs)
.map(([label, key]) => ({
key: normalizeRiskRuleText(key),
label: normalizeRiskRuleText(label),
display: formatRiskRuleFieldDisplay({ key, label }),
source: '',
type: ''
}))
.filter((item) => item.key || item.label)
}
export function buildRiskRuleFieldSummary(fields) {
const labels = fields.map(formatRiskRuleFieldDisplay).filter(Boolean)
if (!labels.length) {
return '未识别字段'
}
if (labels.length <= 4) {
return labels.join('、')
}
return `${labels.slice(0, 4).join('、')}${labels.length}`
}
export function resolveRiskRuleCreatedAt(payload, fallback) {
const metadata = payload && typeof payload === 'object' ? payload.metadata || {} : {}
return normalizeRiskRuleText(metadata.created_at || fallback)
}
export function formatRiskRuleAge(value) {
const date = new Date(value)
if (Number.isNaN(date.getTime())) {
return '未记录'
}
const diffMs = Date.now() - date.getTime()
if (diffMs < 0) {
return '刚刚创建'
}
const minutes = Math.floor(diffMs / 60000)
if (minutes < 1) {
return '刚刚创建'
}
if (minutes < 60) {
return `${minutes} 分钟`
}
const hours = Math.floor(minutes / 60)
if (hours < 24) {
return `${hours} 小时`
}
const days = Math.floor(hours / 24)
if (days < 30) {
return `${days}`
}
const months = Math.floor(days / 30)
if (months < 12) {
return `${months} 个月`
}
return `${Math.floor(months / 12)}`
}
export function resolveRiskRuleBusinessDescription(payload, fallback) {
const metadata = payload && typeof payload === 'object' ? payload.metadata || {} : {}
return (
normalizeRiskRuleText(metadata.business_explanation) ||
normalizeRiskRuleText(payload?.description) ||
normalizeRiskRuleText(fallback)
)
}
export function resolveRiskRuleFlowDiagramSvg(payload) {
const metadata = payload && typeof payload === 'object' ? payload.metadata || {} : {}
return (
normalizeRiskRuleText(payload?.flow_diagram_svg) ||
normalizeRiskRuleText(metadata.flow_diagram_svg)
)
}
export function resolveRiskRuleConditionSummary(payload) {
const metadata = payload && typeof payload === 'object' ? payload.metadata || {} : {}
const params = payload && typeof payload === 'object' ? payload.params || {} : {}
return (
normalizeRiskRuleText(metadata.condition_summary) ||
normalizeRiskRuleText(params.condition_summary) ||
'根据规则字段判断是否命中风险'
)
}
export function resolveRiskRuleFlow(payload, fields) {
const metadata = payload && typeof payload === 'object' ? payload.metadata || {} : {}
const flow = metadata && typeof metadata.flow === 'object' ? metadata.flow : {}
const fieldSummary = buildRiskRuleFieldSummary(fields)
const conditionSummary = resolveRiskRuleConditionSummary(payload)
const severityLabel = resolveRiskRuleSeverityLabel(payload)
return {
start: normalizeRiskRuleText(flow.start) || '业务单据提交',
evidence: normalizeRiskRuleText(flow.evidence) || `读取 ${fieldSummary}`,
decision: normalizeRiskRuleText(flow.decision) || conditionSummary,
basis: conditionSummary,
pass: normalizeRiskRuleText(flow.pass) || '未命中风险,继续流转',
fail: normalizeRiskRuleText(flow.fail) || `命中${severityLabel},进入人工复核`
}
}