feat: 新增预算后端服务与差旅风险规则库

后端新增预算模型、端点和服务模块,支持预算 CRUD 和余额
查询,清理旧生成规则文件并替换为按严重等级分类的差旅风
险规则库,优化认证权限和报销单访问策略,新增财务规则目
录和演示数据构建脚本,前端预算中心增加对话框交互,完善
审计页面运行时模型和元数据展示,补充单元测试。
This commit is contained in:
caoxiaozhu
2026-05-26 17:29:35 +08:00
parent e1e515ecae
commit e7bef0883d
85 changed files with 6443 additions and 1497 deletions

View File

@@ -70,7 +70,8 @@ import {
import {
createDefaultRiskRuleForm,
RISK_RULE_BUSINESS_STAGE_OPTIONS,
RISK_RULE_EXPENSE_CATEGORY_OPTIONS
RISK_RULE_EXPENSE_CATEGORY_OPTIONS,
RISK_RULE_LEVEL_OPTIONS
} from './auditViewRiskRuleModel.js'
export default {
@@ -99,6 +100,7 @@ export default {
const activeFilterPopover = ref('')
const selectedDomain = ref('')
const selectedOwner = ref('')
const selectedRiskLevel = ref('')
const selectedStatus = ref('')
const selectedRiskScenario = ref('')
const selectedOnlineState = ref('')
@@ -345,20 +347,29 @@ export default {
const ownerOptions = computed(() => {
const uniqueOwners = [...new Set(currentAssets.value.map((item) => item.owner).filter(Boolean))]
return [
{ value: '', label: activeType.value === 'riskRules' ? '全部审核人' : '全部负责人' },
{ value: '', label: '全部负责人' },
...uniqueOwners.map((value) => ({
value,
label: value
}))
]
})
const riskLevelOptions = computed(() => [
{ value: '', label: '全部风险等级' },
...RISK_RULE_LEVEL_OPTIONS
])
const selectedDomainLabel = computed(
() => domainOptions.value.find((item) => item.value === selectedDomain.value)?.label || '业务域'
)
const selectedOwnerLabel = computed(
() =>
ownerOptions.value.find((item) => item.value === selectedOwner.value)?.label ||
(activeType.value === 'riskRules' ? '审核人' : '负责人')
'负责人'
)
const selectedRiskLevelLabel = computed(
() =>
riskLevelOptions.value.find((item) => item.value === selectedRiskLevel.value)?.label ||
'风险等级'
)
const selectedStatusLabel = computed(
() => STATUS_OPTIONS.find((item) => item.value === selectedStatus.value)?.label || '状态'
@@ -366,6 +377,8 @@ export default {
const showRiskScenarioFilter = computed(() =>
['financialRules', 'riskRules'].includes(activeType.value)
)
const showOwnerFilter = computed(() => activeType.value !== 'riskRules')
const showRiskLevelFilter = computed(() => activeType.value === 'riskRules')
const showStatusFilter = computed(() => true)
const showOnlineFilter = computed(() => false)
const showEnabledFilter = computed(() => false)
@@ -402,8 +415,11 @@ export default {
if (showEnabledFilter.value && selectedEnabledState.value) {
tokens.push(`是否启用:${selectedEnabledStateLabel.value}`)
}
if (selectedOwner.value) {
tokens.push(`${activeType.value === 'riskRules' ? '审核人' : '负责人'}${selectedOwner.value}`)
if (showOwnerFilter.value && selectedOwner.value) {
tokens.push(`负责人${selectedOwner.value}`)
}
if (showRiskLevelFilter.value && selectedRiskLevel.value) {
tokens.push(`风险等级:${selectedRiskLevelLabel.value}`)
}
if (keyword.value.trim()) {
tokens.push(`搜索:${keyword.value.trim()}`)
@@ -415,7 +431,8 @@ export default {
const hasFilters = activeFilterTokens.value.length > 0
const supportedFilters = [
'业务域',
activeType.value === 'riskRules' ? '审核人' : '负责人',
...(showOwnerFilter.value ? ['负责人'] : []),
...(showRiskLevelFilter.value ? ['风险等级'] : []),
...(showRiskScenarioFilter.value ? ['使用场景'] : []),
...(showStatusFilter.value ? ['状态'] : []),
...(showOnlineFilter.value ? ['是否上线'] : []),
@@ -480,7 +497,7 @@ export default {
return '当前为页面预览态,暂不执行真实审核和上线。'
}
if (!canManageSelected.value) {
return '仅高级管理人员可执行审核和上线。'
return '仅高级财务人员可执行审核和上线。'
}
if (!isDisplayingWorkingVersion.value) {
return '请先切回当前工作版本,再执行审核或上线。'
@@ -498,6 +515,7 @@ export default {
keyword: keyword.value,
selectedDomain: selectedDomain.value,
selectedOwner: selectedOwner.value,
selectedRiskLevel: selectedRiskLevel.value,
selectedStatus: selectedStatus.value,
selectedRiskScenario: selectedRiskScenario.value,
selectedOnlineState: selectedOnlineState.value,
@@ -548,6 +566,7 @@ export default {
keyword.value = ''
selectedDomain.value = ''
selectedOwner.value = ''
selectedRiskLevel.value = ''
selectedStatus.value = ''
selectedRiskScenario.value = ''
selectedOnlineState.value = ''
@@ -579,6 +598,9 @@ export default {
if (name === 'owner') {
selectedOwner.value = value
}
if (name === 'riskLevel') {
selectedRiskLevel.value = value
}
if (name === 'status') {
selectedStatus.value = value
}
@@ -1832,22 +1854,27 @@ export default {
detailError,
selectedDomain,
selectedOwner,
selectedRiskLevel,
selectedStatus,
selectedRiskScenario,
selectedOnlineState,
selectedEnabledState,
selectedDomainLabel,
selectedOwnerLabel,
selectedRiskLevelLabel,
selectedStatusLabel,
selectedRiskScenarioLabel,
selectedOnlineStateLabel,
selectedEnabledStateLabel,
showRiskScenarioFilter,
showOwnerFilter,
showRiskLevelFilter,
showStatusFilter,
showOnlineFilter,
showEnabledFilter,
domainOptions,
ownerOptions,
riskLevelOptions,
statusOptions: STATUS_OPTIONS,
riskScenarioOptions: RISK_SCENARIO_OPTIONS,
onlineStateOptions: ONLINE_STATE_OPTIONS,