feat: 新增预算费控模型与报销审批流引擎
后端新增预算费控服务和报销单审批流模块,引入申请人费用画像 算法,优化知识库 RAG 运行时和同步逻辑,完善报销单工作流常 量和明细同步,更新差旅报销规则电子表格,前端新增预算分析 组件和数字员工模型,完善审批对话框和洞察面板交互,优化侧 边栏和顶栏样式,补充单元测试。
This commit is contained in:
@@ -34,6 +34,13 @@ import {
|
||||
resolveRiskRuleSeverity,
|
||||
resolveRiskRuleSeverityLabel
|
||||
} from './auditViewRiskRuleModel.js'
|
||||
import {
|
||||
buildDigitalEmployeeContentRows,
|
||||
buildDigitalEmployeeDetailMeta,
|
||||
buildDigitalEmployeeListMeta,
|
||||
isDigitalEmployeeAsset,
|
||||
sanitizeDigitalEmployeeText
|
||||
} from './auditViewDigitalEmployeeModel.js'
|
||||
|
||||
const EXPENSE_TYPE_SCENARIO_LABELS = {
|
||||
travel: '差旅费',
|
||||
@@ -335,6 +342,9 @@ export function resolveTabId(source, typeKey) {
|
||||
if (typeKey === 'rules') {
|
||||
return resolveRuleTabId(source)
|
||||
}
|
||||
if (typeKey === 'digitalWorkers') {
|
||||
return isDigitalEmployeeAsset(source) ? 'digitalWorkers' : ''
|
||||
}
|
||||
return typeKey
|
||||
}
|
||||
|
||||
@@ -895,6 +905,9 @@ export function resolveTypeKey(assetType) {
|
||||
if (assetType === 'mcp') {
|
||||
return 'mcp'
|
||||
}
|
||||
if (assetType === 'task') {
|
||||
return 'digitalWorkers'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
@@ -958,6 +971,9 @@ export function buildRowRuntime(asset, typeKey) {
|
||||
if (typeKey === 'mcp') {
|
||||
return normalizeText(asset.config_json?.endpoint) || '未配置地址'
|
||||
}
|
||||
if (typeKey === 'digitalWorkers') {
|
||||
return buildDigitalEmployeeListMeta(asset).executionMode
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
@@ -971,6 +987,9 @@ export function buildRowMetric(asset, typeKey) {
|
||||
if (typeKey === 'mcp') {
|
||||
return asset.config_json?.timeout_ms ? `${asset.config_json.timeout_ms} ms` : '未配置超时'
|
||||
}
|
||||
if (typeKey === 'digitalWorkers') {
|
||||
return buildDigitalEmployeeListMeta(asset).executionMode
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
@@ -1042,6 +1061,19 @@ export function buildListItem(asset) {
|
||||
? resolveRiskRuleScoreLabel(asset.config_json, asset.config_json) || resolveRiskRuleSeverityLabel(asset.config_json)
|
||||
: resolveRiskRuleSeverityLabel(asset.config_json)
|
||||
: ''
|
||||
const digitalMeta = typeKey === 'digitalWorkers' ? buildDigitalEmployeeListMeta(asset) : null
|
||||
const displayName = digitalMeta?.name || asset.name
|
||||
const displayCode = digitalMeta?.code || asset.code
|
||||
const displaySummary = digitalMeta?.summary || listSubtitle
|
||||
const displayOwner = digitalMeta?.owner || (isRiskRule ? creator : asset.owner)
|
||||
const displayReviewer = digitalMeta?.reviewer || reviewer
|
||||
const displayCategory = digitalMeta?.category || resolveDomainLabel(asset.domain)
|
||||
const displayScope =
|
||||
digitalMeta?.scope ||
|
||||
(typeKey === 'rules' ? ruleScenarioCategory || '閫氱敤' : formatScenarioList(asset.scenario_json))
|
||||
const displayEnabledValue = digitalMeta ? digitalMeta.enabled : isEnabledValue
|
||||
const displayEnabledLabel = digitalMeta?.enabledLabel || (isEnabledValue ? '鏄? : '鍚?)
|
||||
const displayEnabledTone = digitalMeta?.enabledTone || (isEnabledValue ? 'success' : 'disabled')
|
||||
|
||||
return {
|
||||
id: asset.id,
|
||||
@@ -1052,15 +1084,17 @@ export function buildListItem(asset) {
|
||||
usesJsonRiskRule,
|
||||
ruleDocument,
|
||||
typeLabel: tabMeta.typeLabel,
|
||||
short: makeShort(asset.name),
|
||||
name: asset.name,
|
||||
code: asset.code,
|
||||
summary: listSubtitle,
|
||||
listSubtitle,
|
||||
category: resolveDomainLabel(asset.domain),
|
||||
owner: isRiskRule ? creator : asset.owner,
|
||||
reviewer,
|
||||
short: makeShort(displayName),
|
||||
name: displayName,
|
||||
code: displayCode,
|
||||
rawCode: asset.code,
|
||||
summary: displaySummary,
|
||||
listSubtitle: displaySummary,
|
||||
category: displayCategory,
|
||||
owner: displayOwner,
|
||||
reviewer: displayReviewer,
|
||||
scope: typeKey === 'rules' ? ruleScenarioCategory || '通用' : formatScenarioList(asset.scenario_json),
|
||||
scope: displayScope,
|
||||
riskCategory: ruleScenarioCategory,
|
||||
scenarioList: ruleScenarioList,
|
||||
businessStageValue: businessStage.value,
|
||||
@@ -1086,6 +1120,9 @@ export function buildListItem(asset) {
|
||||
isEnabledValue,
|
||||
isEnabledLabel: isEnabledValue ? '是' : '否',
|
||||
isEnabledTone: isEnabledValue ? 'success' : 'disabled',
|
||||
isEnabledValue: displayEnabledValue,
|
||||
isEnabledLabel: displayEnabledLabel,
|
||||
isEnabledTone: displayEnabledTone,
|
||||
modifiedBy,
|
||||
changeCount,
|
||||
updatedAt: isRiskRule ? riskRuleCreatedAt : formatDateTime(asset.updated_at),
|
||||
@@ -1417,6 +1454,25 @@ export function buildDetailViewModel(detail, runs) {
|
||||
const initialRiskRuleScore = resolveRiskRuleScore(configJson, configJson)
|
||||
const initialRiskRuleScoreLevel = resolveRiskRuleScoreLevel(configJson, configJson)
|
||||
const initialRiskRuleSeverity = initialRiskRuleScoreLevel || resolveRiskRuleSeverity(configJson)
|
||||
const digitalMeta = typeKey === 'digitalWorkers'
|
||||
? buildDigitalEmployeeDetailMeta({
|
||||
...detail,
|
||||
updated_at: formatDateTime(detail.updated_at)
|
||||
})
|
||||
: null
|
||||
const detailName = digitalMeta?.name || detail.name
|
||||
const detailCode = digitalMeta?.code || detail.code
|
||||
const detailSummary = digitalMeta?.description ||
|
||||
(usesJsonRiskRule ? buildRiskListSubtitle(detail.description) : detail.description)
|
||||
const detailOwner = digitalMeta?.owner || detail.owner
|
||||
const detailReviewer = digitalMeta?.reviewer || detail.reviewer || detail.latest_review?.reviewer || '寰呭垎閰?
|
||||
const detailCategory = digitalMeta?.category || resolveDomainLabel(detail.domain)
|
||||
const detailScope =
|
||||
digitalMeta?.scope ||
|
||||
(typeKey === 'rules' ? ruleScenarioCategory || '閫氱敤' : formatScenarioList(detail.scenario_json))
|
||||
const detailEnabledValue = digitalMeta ? digitalMeta.enabled : isEnabledValue
|
||||
const detailEnabledLabel = digitalMeta?.enabledLabel || (isEnabledValue ? '鏄? : '鍚?)
|
||||
const detailEnabledTone = digitalMeta?.enabledTone || (isEnabledValue ? 'success' : 'disabled')
|
||||
|
||||
return {
|
||||
id: detail.id,
|
||||
|
||||
Reference in New Issue
Block a user