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

@@ -0,0 +1,60 @@
# 预算中心 MASTER TODO
## 总目标
把预算从首页静态展示升级为真实费控底座,让费用申请和报销都必须经过预算口径校验。
## 状态图
```text
预算额度
-> 申请提交: 预占
-> 申请退回/撤回/驳回: 释放
-> 申请通过: 保持预占
-> 报销提交: 校验申请与预算
-> 报销审批通过: 核销
-> 报销退回/撤回: 释放或回滚
```
## 总 TODO
- [ ] 新增预算中心开发文档并纳入每日核对。
- [ ] 定义预算维度:部门、成本中心、项目、费用科目、期间。
- [ ] 定义预算模型:预算额度、预算交易、预算占用。
- [ ] 定义预算状态:正常、预警、超预算、冻结。
- [ ] 定义预算交易类型:初始化、调整、预占、释放、核销、回滚。
- [ ] 新增预算列表接口。
- [ ] 新增预算详情接口。
- [ ] 新增预算台账接口。
- [ ] 新增预算占用接口或内部服务。
- [ ] 新增预算释放接口或内部服务。
- [ ] 新增预算核销接口或内部服务。
- [ ] 费用申请提交时写入预算预占。
- [ ] 费用申请驳回、撤回、取消时释放预算。
- [ ] 费用申请转报销时保留预算来源。
- [ ] 报销提交时校验预算归属和可用余额。
- [ ] 报销审批通过时核销预算。
- [ ] 报销退回时回滚预算状态。
- [ ] 报销详情展示预算占用和核销信息。
- [ ] 申请详情展示预算占用和剩余额度。
- [ ] 预算中心页面展示执行率、已占用、已核销、可用余额。
- [ ] 预算台账展示每笔来源单据和交易类型。
- [ ] 首页预算执行率改为后端真实数据。
- [ ] 本体识别支持预算维度字段。
- [ ] AI对话能解释预算不足、预算归属缺失、超预算原因。
- [ ] 添加后端单元测试。
- [ ] 添加前端预算视图测试。
- [ ] 添加申请到报销的端到端预算验收场景。
## 验收场景
- [ ] 有预算时,费用申请提交成功并预占预算。
- [ ] 预算不足时,申请提交被阻断或进入超预算复核。
- [ ] 申请驳回后,预算预占被释放。
- [ ] 申请审批通过后,预算仍保持预占。
- [ ] 申请转报销后,报销单继承预算来源。
- [ ] 报销审批通过后,预算从预占转为核销。
- [ ] 报销退回后,预算核销回滚。
- [ ] 预算中心能看到完整交易台账。
- [ ] 首页预算执行率与预算中心汇总一致。

View File

@@ -0,0 +1,58 @@
# 预算中心开发总览
## 目标
预算中心先作为费控平台的前置底座建设,优先打通:
```text
预算编制 -> 预算可用额度 -> 费用申请预占 -> 报销核销 -> 释放/调整 -> 预算看板
```
第一版不追求完整预算编制系统,而是先让申请、报销、审批、付款、归档都有真实预算口径。
## 当前项目基础
- 员工和组织已有 `cost_center` 成本中心字段,可作为预算归属维度。
- 报销单已有部门、项目、费用类型、金额、状态等字段,可接入预算核销。
- 首页已有静态预算执行率展示,但还不是后端真实预算数据。
- 费用申请已有前端意图识别和申请草稿痕迹,但预算占用还没有真实台账。
## 第一版预算中心范围
必须做:
- 预算主体:部门、成本中心、项目、费用科目。
- 预算期间:月度、季度、年度。
- 预算额度:总额、已占用、已核销、已释放、可用余额。
- 预算台账:每一次占用、核销、释放、调整都落账。
- 申请联动:费用申请提交时预占预算,驳回/撤回时释放。
- 报销联动:报销提交或审批通过时核销预算。
- 风险拦截:预算不足、超预算、缺预算归属时阻断或进入复核。
- 预算中心页面:列表、详情、台账、执行率、异常预算。
暂缓:
- 完整预算编制审批流。
- 多版本预算测算。
- 外部 ERP 预算接口。
- 真正多币种预算。
- 复杂滚动预算和预测模型。
## 关键原则
- 预算中心是独立业务域,不塞进报销 Service。
- 所有预算变化必须通过预算交易台账记录。
- 不直接改写已用金额,必须由交易汇总得到。
- 申请、报销、付款只是预算事件来源。
- 预算不足的判断必须来自后端,不依赖前端显示。
## 7天开发路径
- Day 1预算模型、状态机、接口契约。
- Day 2预算中心页面、列表、详情、台账视图。
- Day 3预算占用/释放/核销服务。
- Day 4费用申请与报销联动预算。
- Day 5审批、付款、归档中的预算状态传递。
- Day 6预算看板、本体识别、AI提示。
- Day 7端到端验收、演示数据、测试补齐。

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,105 @@
# Day 1 - 预算模型与接口契约
## 目标
先把预算中心的数据边界和接口边界定稳,避免后续把预算逻辑散落在申请、报销、审批和付款模块里。
## 开发任务
- [ ] 新增预算模型设计。
- [ ] 新增预算交易台账设计。
- [ ] 新增预算服务边界设计。
- [ ] 新增预算接口契约。
- [ ] 新增预算状态与交易类型常量。
- [ ] 明确申请、报销、付款对预算服务的调用点。
## 建议模型
预算额度:
```text
BudgetAllocation
- id
- budget_no
- fiscal_year
- period_type
- period_key
- department_id
- department_name
- cost_center
- project_code
- subject_code
- subject_name
- original_amount
- adjusted_amount
- status
- warning_threshold
- created_at
- updated_at
```
预算交易:
```text
BudgetTransaction
- id
- transaction_no
- allocation_id
- source_type
- source_id
- source_no
- transaction_type
- amount
- before_available_amount
- after_available_amount
- operator
- reason
- created_at
```
交易类型:
```text
init 初始化
adjust 调整
reserve 预占
release 释放
consume 核销
rollback 回滚
freeze 冻结
unfreeze 解冻
```
预算汇总字段由交易汇总得到:
```text
total_amount = original_amount + adjusted_amount
reserved_amount = reserve - release
consumed_amount = consume - rollback
available_amount = total_amount - reserved_amount - consumed_amount
```
## 接口契约
```text
GET /api/v1/budgets/allocations
POST /api/v1/budgets/allocations
GET /api/v1/budgets/allocations/{id}
GET /api/v1/budgets/allocations/{id}/transactions
POST /api/v1/budgets/allocations/{id}/adjust
POST /api/v1/budgets/check
POST /api/v1/budgets/reserve
POST /api/v1/budgets/release
POST /api/v1/budgets/consume
POST /api/v1/budgets/rollback
GET /api/v1/budgets/summary
```
## 验收
- [ ] 能创建一条部门月度预算。
- [ ] 能查询预算列表和详情。
- [ ] 能查询预算台账。
- [ ] 能根据部门、成本中心、项目、费用科目定位预算。
- [ ] 预算不足时 `check` 接口能返回明确原因。

View File

@@ -0,0 +1,82 @@
# Day 2 - 预算中心页面
## 目标
新增预算中心作为独立主菜单,让预算不再只是首页指标,而是可操作、可追踪、可解释的费控入口。
## 页面入口
主菜单建议:
```text
费用申请
报销中心
审批中心
预算中心
付款中心
归档中心
经营分析
```
## 页面结构
顶部指标:
- 预算总额
- 已预占
- 已核销
- 可用余额
- 超预算事项
- 预警预算数
列表字段:
- 预算编号
- 预算期间
- 部门
- 成本中心
- 项目
- 费用科目
- 预算总额
- 已预占
- 已核销
- 可用余额
- 执行率
- 状态
筛选条件:
- 年度
- 月份/季度
- 部门
- 成本中心
- 项目
- 费用科目
- 状态
详情页:
- 基本信息
- 执行概览
- 来源单据
- 交易台账
- 风险提示
- 调整记录
## 操作
- 新增预算
- 调整预算
- 冻结预算
- 查看台账
- 查看关联申请
- 查看关联报销
## 验收
- [ ] 预算中心能从主菜单进入。
- [ ] 列表能展示后端预算数据。
- [ ] 点击预算能进入详情。
- [ ] 详情能展示交易台账。
- [ ] 首页预算执行率能跳转到预算中心。

View File

@@ -0,0 +1,55 @@
# Day 3 - 预算占用、释放、核销服务
## 目标
把预算变化统一收敛到预算服务,申请、报销、付款都只能通过预算服务改变预算状态。
## 服务能力
预算检查:
- 校验预算归属是否存在。
- 校验预算是否被冻结。
- 校验可用余额是否充足。
- 返回超预算金额和处理建议。
预算预占:
- 用于费用申请提交。
- 写入 `reserve` 交易。
- 记录来源单据。
预算释放:
- 用于申请撤回、退回、驳回、取消。
- 写入 `release` 交易。
- 必须找到原始预占来源。
预算核销:
- 用于报销审批通过。
- 写入 `consume` 交易。
- 如果来源申请已有预占,应先释放预占或转换为核销,不能重复占用。
预算回滚:
- 用于报销退回或撤销审批。
- 写入 `rollback` 交易。
## 关键防错
- 同一来源单据不能重复预占。
- 同一报销单不能重复核销。
- 释放金额不能超过原预占金额。
- 核销金额不能超过可用余额加当前来源预占余额。
- 所有预算交易必须有来源单据和操作人。
## 验收
- [ ] 预算预占后可用余额减少。
- [ ] 预算释放后可用余额恢复。
- [ ] 预算核销后已核销金额增加。
- [ ] 重复预占会被阻断。
- [ ] 重复核销会被阻断。
- [ ] 台账能解释每一次余额变化。

View File

@@ -0,0 +1,58 @@
# Day 4 - 费用申请与报销联动预算
## 目标
让预算成为申请和报销之间的硬约束,先申请、再占用、再报销、再核销。
## 费用申请联动
提交申请时:
- 根据申请人部门、成本中心、项目、费用科目定位预算。
- 预算充足则预占。
- 预算不足则阻断或进入超预算复核。
- 申请详情展示预算占用结果。
申请退回/驳回/撤回时:
- 释放对应预算预占。
- 记录释放原因。
申请审批通过时:
- 保持预算预占。
- 允许转报销。
申请转报销时:
- 报销单继承申请预算来源。
- 报销金额默认不超过申请金额。
- 超过申请金额时进入风险提示或复核。
## 报销联动
报销提交时:
- 校验是否需要事前申请。
- 校验是否有关联已通过申请。
- 校验预算来源是否存在。
报销审批通过时:
- 将预算预占转为核销。
- 记录核销台账。
报销退回时:
- 回滚核销。
- 视状态保留或释放预占。
## 验收
- [ ] 有预算的申请提交后形成预占。
- [ ] 预算不足的申请不能直接提交。
- [ ] 驳回申请释放预算。
- [ ] 已通过申请能转报销。
- [ ] 报销审批通过后预算转核销。
- [ ] 未关联预算的报销不能绕过预算校验。

View File

@@ -0,0 +1,52 @@
# Day 5 - 审批、付款、归档中的预算口径
## 目标
预算信息不能只停留在申请和报销页面,还要贯穿审批、付款和归档。
## 审批中心
审批列表增加预算提示:
- 是否预算内
- 是否超预算
- 已预占金额
- 可用余额
- 预算归属
审批详情增加预算区块:
- 当前单据金额
- 对应预算额度
- 已预占
- 已核销
- 剩余额度
- 超预算原因
## 付款中心预留
第一版付款中心可以暂缓实现完整页面,但预算中心需要为付款预留:
- 付款来源单据
- 付款金额
- 付款状态
- 是否已核销预算
- 是否存在预算异常
## 归档中心
归档包需要包含预算信息:
- 预算归属
- 预算交易流水
- 申请预占记录
- 报销核销记录
- 超预算审批意见
## 验收
- [ ] 审批人能看到预算是否充足。
- [ ] 超预算审批能看到超额金额。
- [ ] 归档详情能看到预算台账摘要。
- [ ] 预算异常不会在付款/归档阶段丢失。

View File

@@ -0,0 +1,51 @@
# Day 6 - 预算看板、本体识别与AI解释
## 目标
让预算中心不只是数据表,还能被 AI 对话、本体识别和经营分析调用。
## 看板指标
- 本月预算总额
- 本月已预占
- 本月已核销
- 本月可用余额
- 部门预算排行
- 费用科目执行率
- 超预算事项数量
- 预算预警事项数量
## 本体字段
新增或强化字段:
```text
cost_center
project_code
budget_subject
budget_period
budget_amount
available_amount
reserved_amount
consumed_amount
over_budget
budget_warning
```
## AI解释能力
需要支持的问题:
- 这个申请为什么预算不足?
- 这个报销占用了哪个预算?
- 本月哪个部门预算快超了?
- 某个项目还剩多少预算?
- 超预算申请需要谁审批?
## 验收
- [ ] 本体能识别预算相关问题。
- [ ] AI能解释预算不足原因。
- [ ] 首页预算看板来自后端真实汇总。
- [ ] 预算中心和AI回答的金额一致。

View File

@@ -0,0 +1,64 @@
# Day 7 - 联调、测试与演示验收
## 目标
冻结新增需求,只修预算闭环缺口,确保演示链路稳定。
## 端到端验收链路
链路一:预算内申请到报销
```text
创建预算 -> 发起费用申请 -> 预占预算 -> 审批通过
-> 转报销 -> 报销审批通过 -> 核销预算 -> 归档
```
链路二:预算不足
```text
创建低额度预算 -> 发起高金额申请 -> 预算不足
-> 阻断提交或进入超预算复核 -> 审批意见留痕
```
链路三:申请驳回释放预算
```text
申请提交 -> 预算预占 -> 审批驳回 -> 预算释放 -> 台账可追溯
```
链路四:重复操作防护
```text
重复提交 / 重复审批 / 重复核销 -> 后端阻断 -> 台账不重复
```
## 测试要求
- [ ] 后端预算服务单元测试。
- [ ] 申请预算预占测试。
- [ ] 报销预算核销测试。
- [ ] 预算不足阻断测试。
- [ ] 前端预算中心列表测试。
- [ ] 前端预算详情台账测试。
- [ ] 首页预算汇总测试。
## 演示数据
至少准备:
- 一个预算充足的部门预算。
- 一个预算不足的部门预算。
- 一个项目预算。
- 一个会议培训大额预算。
- 一个已经预占的申请。
- 一个已经核销的报销。
- 一个超预算待审批事项。
## 最终验收
- [ ] 预算中心能解释每一分钱从哪里来、到哪里去。
- [ ] 费用申请不能绕过预算。
- [ ] 报销审批不能绕过预算。
- [ ] 审批、归档、看板显示同一套预算数据。
- [ ] 演示链路可连续跑通。