feat: 增强风险规则生成引擎与预算中心页面

后端拆分风险规则生成为解释器、语义分析、本体对齐等子模块,
优化模板执行和流程图生成,完善员工种子数据和导入逻辑,增强
报销单权限策略和草稿持久化,前端新增预算中心视图和趋势图
组件,重构审计页面和风险规则测试对话框交互,完善文档中心
和报销创建页面细节,补充单元测试覆盖。
This commit is contained in:
caoxiaozhu
2026-05-26 09:15:14 +08:00
parent d0e946cf47
commit 0e861d8fa6
150 changed files with 14953 additions and 4099 deletions

View File

@@ -88,7 +88,7 @@
<div class="detail-grid">
<section class="detail-left">
<article class="detail-card panel">
<article v-if="!isApplicationDocument" class="detail-card panel">
<div class="detail-card-head">
<div>
<h3>附加说明</h3>
@@ -133,11 +133,14 @@
<article class="detail-card panel">
<div class="detail-card-head">
<div>
<h3>{{ isApplicationDocument ? '申请预算' : '费用明细' }}</h3>
<h3 class="detail-card-title-with-icon">
<i v-if="isApplicationDocument" class="mdi mdi-file-document-outline"></i>
<span>{{ isApplicationDocument ? '申请详情' : '费用明细' }}</span>
</h3>
<p>
{{
isApplicationDocument
? '展示本次费用申请的预计金额,提交后纳入预算管理口径。'
? '展示本次申请的事实信息、职级规则测算和用户预估费用。'
: isTravelRequest
? '按出行时间逐笔核对票据与差旅规则。'
: '按业务发生时间逐笔核对票据、用途说明与 AI 识别结果。'
@@ -162,13 +165,42 @@
</div>
</div>
<div v-if="isApplicationDocument" class="detail-note readonly">
<p>
预计总费用{{ request.amountDisplay }}该金额用于领导审批和预算管理无需补充任何报销票据
</p>
<div v-if="isApplicationDocument" class="application-detail-facts">
<div
v-for="item in applicationDetailFactItems"
:key="item.key"
class="application-detail-fact"
:class="{ highlight: item.highlight, emphasis: item.emphasis }"
>
<span>{{ item.label }}</span>
<strong>{{ item.value }}</strong>
</div>
</div>
<div v-else class="detail-expense-table">
<div v-if="showApplicationLeaderOpinion" class="application-leader-opinion">
<div class="application-leader-opinion-head">
<span><i class="mdi mdi-account-tie-outline"></i>领导意见</span>
<strong v-if="leaderApprovalReadonlyMeta">{{ leaderApprovalReadonlyMeta }}</strong>
</div>
<div v-if="showApplicationLeaderOpinionInput" class="leader-approval-card inline-leader-opinion">
<textarea
v-model="leaderOpinion"
maxlength="500"
:required="requiresApprovalOpinion"
:placeholder="approvalOpinionPlaceholder"
:aria-label="approvalOpinionTitle"
></textarea>
<div class="leader-opinion-meta">
<span>{{ approvalOpinionHint }}</span>
<strong>{{ leaderOpinion.length }}/500</strong>
</div>
</div>
<div v-else class="detail-note readonly application-leader-opinion-display">
<p>{{ leaderApprovalReadonlyText }}</p>
</div>
</div>
<div v-if="!isApplicationDocument" class="detail-expense-table">
<table>
<thead>
<tr>
@@ -452,6 +484,7 @@
<textarea
v-model="leaderOpinion"
maxlength="500"
:required="requiresApprovalOpinion"
:placeholder="approvalOpinionPlaceholder"
:aria-label="approvalOpinionTitle"
></textarea>
@@ -479,7 +512,7 @@
{{ submitBusy ? '提交中' : '提交审批' }}
</button>
</div>
<div v-else-if="canReturnRequest || canApproveRequest || canManageCurrentClaim" class="approval-action-group" aria-label="单据管理操作">
<div v-else-if="canReturnRequest || canApproveRequest || canDeleteRequest" class="approval-action-group" aria-label="单据管理操作">
<button
v-if="canReturnRequest"
class="return-action"
@@ -498,10 +531,10 @@
@click="handleApproveRequest"
>
<i class="mdi mdi-check-circle-outline"></i>
{{ approveBusy ? '通过中' : '审批通过' }}
{{ approveBusy ? approveBusyLabel : approveActionLabel }}
</button>
<button
v-if="canManageCurrentClaim"
v-if="canDeleteRequest"
class="reject-action"
type="button"
:disabled="actionBusy"
@@ -750,11 +783,11 @@
:open="approveConfirmDialogOpen"
:badge="approvalConfirmBadge"
badge-tone="info"
:title="`确认通过 ${request.id} 吗?`"
:title="approveConfirmTitle"
:description="approvalConfirmDescription"
cancel-text="返回核对"
confirm-text="确认通过"
busy-text="通过中..."
:confirm-text="approveConfirmText"
:busy-text="approveBusyText"
confirm-tone="primary"
confirm-icon="mdi mdi-check-circle-outline"
:busy="approveBusy"
@@ -771,7 +804,7 @@
<strong>{{ request.node }}</strong>
</div>
<div class="submit-confirm-row">
<span>下一节点</span>
<span>{{ approvalConfirmSummaryLabel }}</span>
<strong>{{ approvalNextStage }}</strong>
</div>
<div class="submit-confirm-row">
@@ -784,7 +817,7 @@
<ReturnReasonDialog
:open="returnDialogOpen"
:title="`确认退回 ${request.id} 吗?`"
description="退回后该单据会回到待提交状态,申请人需要调整后重新提交并再次经过 AI 预审。"
:description="returnDialogDescription"
:busy="returnBusy"
@close="closeReturnDialog"
@confirm="confirmReturnRequest"