feat: 增强风险规则生成引擎与预算中心页面
后端拆分风险规则生成为解释器、语义分析、本体对齐等子模块, 优化模板执行和流程图生成,完善员工种子数据和导入逻辑,增强 报销单权限策略和草稿持久化,前端新增预算中心视图和趋势图 组件,重构审计页面和风险规则测试对话框交互,完善文档中心 和报销创建页面细节,补充单元测试覆盖。
This commit is contained in:
60
document/development/budget-center/MASTER_TODO.md
Normal file
60
document/development/budget-center/MASTER_TODO.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# 预算中心 MASTER TODO
|
||||
|
||||
## 总目标
|
||||
|
||||
把预算从首页静态展示升级为真实费控底座,让费用申请和报销都必须经过预算口径校验。
|
||||
|
||||
## 状态图
|
||||
|
||||
```text
|
||||
预算额度
|
||||
-> 申请提交: 预占
|
||||
-> 申请退回/撤回/驳回: 释放
|
||||
-> 申请通过: 保持预占
|
||||
-> 报销提交: 校验申请与预算
|
||||
-> 报销审批通过: 核销
|
||||
-> 报销退回/撤回: 释放或回滚
|
||||
```
|
||||
|
||||
## 总 TODO
|
||||
|
||||
- [ ] 新增预算中心开发文档并纳入每日核对。
|
||||
- [ ] 定义预算维度:部门、成本中心、项目、费用科目、期间。
|
||||
- [ ] 定义预算模型:预算额度、预算交易、预算占用。
|
||||
- [ ] 定义预算状态:正常、预警、超预算、冻结。
|
||||
- [ ] 定义预算交易类型:初始化、调整、预占、释放、核销、回滚。
|
||||
- [ ] 新增预算列表接口。
|
||||
- [ ] 新增预算详情接口。
|
||||
- [ ] 新增预算台账接口。
|
||||
- [ ] 新增预算占用接口或内部服务。
|
||||
- [ ] 新增预算释放接口或内部服务。
|
||||
- [ ] 新增预算核销接口或内部服务。
|
||||
- [ ] 费用申请提交时写入预算预占。
|
||||
- [ ] 费用申请驳回、撤回、取消时释放预算。
|
||||
- [ ] 费用申请转报销时保留预算来源。
|
||||
- [ ] 报销提交时校验预算归属和可用余额。
|
||||
- [ ] 报销审批通过时核销预算。
|
||||
- [ ] 报销退回时回滚预算状态。
|
||||
- [ ] 报销详情展示预算占用和核销信息。
|
||||
- [ ] 申请详情展示预算占用和剩余额度。
|
||||
- [ ] 预算中心页面展示执行率、已占用、已核销、可用余额。
|
||||
- [ ] 预算台账展示每笔来源单据和交易类型。
|
||||
- [ ] 首页预算执行率改为后端真实数据。
|
||||
- [ ] 本体识别支持预算维度字段。
|
||||
- [ ] AI对话能解释预算不足、预算归属缺失、超预算原因。
|
||||
- [ ] 添加后端单元测试。
|
||||
- [ ] 添加前端预算视图测试。
|
||||
- [ ] 添加申请到报销的端到端预算验收场景。
|
||||
|
||||
## 验收场景
|
||||
|
||||
- [ ] 有预算时,费用申请提交成功并预占预算。
|
||||
- [ ] 预算不足时,申请提交被阻断或进入超预算复核。
|
||||
- [ ] 申请驳回后,预算预占被释放。
|
||||
- [ ] 申请审批通过后,预算仍保持预占。
|
||||
- [ ] 申请转报销后,报销单继承预算来源。
|
||||
- [ ] 报销审批通过后,预算从预占转为核销。
|
||||
- [ ] 报销退回后,预算核销回滚。
|
||||
- [ ] 预算中心能看到完整交易台账。
|
||||
- [ ] 首页预算执行率与预算中心汇总一致。
|
||||
|
||||
58
document/development/budget-center/README.md
Normal file
58
document/development/budget-center/README.md
Normal 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:端到端验收、演示数据、测试补齐。
|
||||
|
||||
1179
document/development/budget-center/budget-center-ui-prototype.html
Normal file
1179
document/development/budget-center/budget-center-ui-prototype.html
Normal file
File diff suppressed because it is too large
Load Diff
105
document/development/budget-center/day_1_budget_foundation.md
Normal file
105
document/development/budget-center/day_1_budget_foundation.md
Normal 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` 接口能返回明确原因。
|
||||
|
||||
82
document/development/budget-center/day_2_budget_center_ui.md
Normal file
82
document/development/budget-center/day_2_budget_center_ui.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# Day 2 - 预算中心页面
|
||||
|
||||
## 目标
|
||||
|
||||
新增预算中心作为独立主菜单,让预算不再只是首页指标,而是可操作、可追踪、可解释的费控入口。
|
||||
|
||||
## 页面入口
|
||||
|
||||
主菜单建议:
|
||||
|
||||
```text
|
||||
费用申请
|
||||
报销中心
|
||||
审批中心
|
||||
预算中心
|
||||
付款中心
|
||||
归档中心
|
||||
经营分析
|
||||
```
|
||||
|
||||
## 页面结构
|
||||
|
||||
顶部指标:
|
||||
|
||||
- 预算总额
|
||||
- 已预占
|
||||
- 已核销
|
||||
- 可用余额
|
||||
- 超预算事项
|
||||
- 预警预算数
|
||||
|
||||
列表字段:
|
||||
|
||||
- 预算编号
|
||||
- 预算期间
|
||||
- 部门
|
||||
- 成本中心
|
||||
- 项目
|
||||
- 费用科目
|
||||
- 预算总额
|
||||
- 已预占
|
||||
- 已核销
|
||||
- 可用余额
|
||||
- 执行率
|
||||
- 状态
|
||||
|
||||
筛选条件:
|
||||
|
||||
- 年度
|
||||
- 月份/季度
|
||||
- 部门
|
||||
- 成本中心
|
||||
- 项目
|
||||
- 费用科目
|
||||
- 状态
|
||||
|
||||
详情页:
|
||||
|
||||
- 基本信息
|
||||
- 执行概览
|
||||
- 来源单据
|
||||
- 交易台账
|
||||
- 风险提示
|
||||
- 调整记录
|
||||
|
||||
## 操作
|
||||
|
||||
- 新增预算
|
||||
- 调整预算
|
||||
- 冻结预算
|
||||
- 查看台账
|
||||
- 查看关联申请
|
||||
- 查看关联报销
|
||||
|
||||
## 验收
|
||||
|
||||
- [ ] 预算中心能从主菜单进入。
|
||||
- [ ] 列表能展示后端预算数据。
|
||||
- [ ] 点击预算能进入详情。
|
||||
- [ ] 详情能展示交易台账。
|
||||
- [ ] 首页预算执行率能跳转到预算中心。
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# Day 3 - 预算占用、释放、核销服务
|
||||
|
||||
## 目标
|
||||
|
||||
把预算变化统一收敛到预算服务,申请、报销、付款都只能通过预算服务改变预算状态。
|
||||
|
||||
## 服务能力
|
||||
|
||||
预算检查:
|
||||
|
||||
- 校验预算归属是否存在。
|
||||
- 校验预算是否被冻结。
|
||||
- 校验可用余额是否充足。
|
||||
- 返回超预算金额和处理建议。
|
||||
|
||||
预算预占:
|
||||
|
||||
- 用于费用申请提交。
|
||||
- 写入 `reserve` 交易。
|
||||
- 记录来源单据。
|
||||
|
||||
预算释放:
|
||||
|
||||
- 用于申请撤回、退回、驳回、取消。
|
||||
- 写入 `release` 交易。
|
||||
- 必须找到原始预占来源。
|
||||
|
||||
预算核销:
|
||||
|
||||
- 用于报销审批通过。
|
||||
- 写入 `consume` 交易。
|
||||
- 如果来源申请已有预占,应先释放预占或转换为核销,不能重复占用。
|
||||
|
||||
预算回滚:
|
||||
|
||||
- 用于报销退回或撤销审批。
|
||||
- 写入 `rollback` 交易。
|
||||
|
||||
## 关键防错
|
||||
|
||||
- 同一来源单据不能重复预占。
|
||||
- 同一报销单不能重复核销。
|
||||
- 释放金额不能超过原预占金额。
|
||||
- 核销金额不能超过可用余额加当前来源预占余额。
|
||||
- 所有预算交易必须有来源单据和操作人。
|
||||
|
||||
## 验收
|
||||
|
||||
- [ ] 预算预占后可用余额减少。
|
||||
- [ ] 预算释放后可用余额恢复。
|
||||
- [ ] 预算核销后已核销金额增加。
|
||||
- [ ] 重复预占会被阻断。
|
||||
- [ ] 重复核销会被阻断。
|
||||
- [ ] 台账能解释每一次余额变化。
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
# Day 4 - 费用申请与报销联动预算
|
||||
|
||||
## 目标
|
||||
|
||||
让预算成为申请和报销之间的硬约束,先申请、再占用、再报销、再核销。
|
||||
|
||||
## 费用申请联动
|
||||
|
||||
提交申请时:
|
||||
|
||||
- 根据申请人部门、成本中心、项目、费用科目定位预算。
|
||||
- 预算充足则预占。
|
||||
- 预算不足则阻断或进入超预算复核。
|
||||
- 申请详情展示预算占用结果。
|
||||
|
||||
申请退回/驳回/撤回时:
|
||||
|
||||
- 释放对应预算预占。
|
||||
- 记录释放原因。
|
||||
|
||||
申请审批通过时:
|
||||
|
||||
- 保持预算预占。
|
||||
- 允许转报销。
|
||||
|
||||
申请转报销时:
|
||||
|
||||
- 报销单继承申请预算来源。
|
||||
- 报销金额默认不超过申请金额。
|
||||
- 超过申请金额时进入风险提示或复核。
|
||||
|
||||
## 报销联动
|
||||
|
||||
报销提交时:
|
||||
|
||||
- 校验是否需要事前申请。
|
||||
- 校验是否有关联已通过申请。
|
||||
- 校验预算来源是否存在。
|
||||
|
||||
报销审批通过时:
|
||||
|
||||
- 将预算预占转为核销。
|
||||
- 记录核销台账。
|
||||
|
||||
报销退回时:
|
||||
|
||||
- 回滚核销。
|
||||
- 视状态保留或释放预占。
|
||||
|
||||
## 验收
|
||||
|
||||
- [ ] 有预算的申请提交后形成预占。
|
||||
- [ ] 预算不足的申请不能直接提交。
|
||||
- [ ] 驳回申请释放预算。
|
||||
- [ ] 已通过申请能转报销。
|
||||
- [ ] 报销审批通过后预算转核销。
|
||||
- [ ] 未关联预算的报销不能绕过预算校验。
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# Day 5 - 审批、付款、归档中的预算口径
|
||||
|
||||
## 目标
|
||||
|
||||
预算信息不能只停留在申请和报销页面,还要贯穿审批、付款和归档。
|
||||
|
||||
## 审批中心
|
||||
|
||||
审批列表增加预算提示:
|
||||
|
||||
- 是否预算内
|
||||
- 是否超预算
|
||||
- 已预占金额
|
||||
- 可用余额
|
||||
- 预算归属
|
||||
|
||||
审批详情增加预算区块:
|
||||
|
||||
- 当前单据金额
|
||||
- 对应预算额度
|
||||
- 已预占
|
||||
- 已核销
|
||||
- 剩余额度
|
||||
- 超预算原因
|
||||
|
||||
## 付款中心预留
|
||||
|
||||
第一版付款中心可以暂缓实现完整页面,但预算中心需要为付款预留:
|
||||
|
||||
- 付款来源单据
|
||||
- 付款金额
|
||||
- 付款状态
|
||||
- 是否已核销预算
|
||||
- 是否存在预算异常
|
||||
|
||||
## 归档中心
|
||||
|
||||
归档包需要包含预算信息:
|
||||
|
||||
- 预算归属
|
||||
- 预算交易流水
|
||||
- 申请预占记录
|
||||
- 报销核销记录
|
||||
- 超预算审批意见
|
||||
|
||||
## 验收
|
||||
|
||||
- [ ] 审批人能看到预算是否充足。
|
||||
- [ ] 超预算审批能看到超额金额。
|
||||
- [ ] 归档详情能看到预算台账摘要。
|
||||
- [ ] 预算异常不会在付款/归档阶段丢失。
|
||||
|
||||
@@ -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回答的金额一致。
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
# Day 7 - 联调、测试与演示验收
|
||||
|
||||
## 目标
|
||||
|
||||
冻结新增需求,只修预算闭环缺口,确保演示链路稳定。
|
||||
|
||||
## 端到端验收链路
|
||||
|
||||
链路一:预算内申请到报销
|
||||
|
||||
```text
|
||||
创建预算 -> 发起费用申请 -> 预占预算 -> 审批通过
|
||||
-> 转报销 -> 报销审批通过 -> 核销预算 -> 归档
|
||||
```
|
||||
|
||||
链路二:预算不足
|
||||
|
||||
```text
|
||||
创建低额度预算 -> 发起高金额申请 -> 预算不足
|
||||
-> 阻断提交或进入超预算复核 -> 审批意见留痕
|
||||
```
|
||||
|
||||
链路三:申请驳回释放预算
|
||||
|
||||
```text
|
||||
申请提交 -> 预算预占 -> 审批驳回 -> 预算释放 -> 台账可追溯
|
||||
```
|
||||
|
||||
链路四:重复操作防护
|
||||
|
||||
```text
|
||||
重复提交 / 重复审批 / 重复核销 -> 后端阻断 -> 台账不重复
|
||||
```
|
||||
|
||||
## 测试要求
|
||||
|
||||
- [ ] 后端预算服务单元测试。
|
||||
- [ ] 申请预算预占测试。
|
||||
- [ ] 报销预算核销测试。
|
||||
- [ ] 预算不足阻断测试。
|
||||
- [ ] 前端预算中心列表测试。
|
||||
- [ ] 前端预算详情台账测试。
|
||||
- [ ] 首页预算汇总测试。
|
||||
|
||||
## 演示数据
|
||||
|
||||
至少准备:
|
||||
|
||||
- 一个预算充足的部门预算。
|
||||
- 一个预算不足的部门预算。
|
||||
- 一个项目预算。
|
||||
- 一个会议培训大额预算。
|
||||
- 一个已经预占的申请。
|
||||
- 一个已经核销的报销。
|
||||
- 一个超预算待审批事项。
|
||||
|
||||
## 最终验收
|
||||
|
||||
- [ ] 预算中心能解释每一分钱从哪里来、到哪里去。
|
||||
- [ ] 费用申请不能绕过预算。
|
||||
- [ ] 报销审批不能绕过预算。
|
||||
- [ ] 审批、归档、看板显示同一套预算数据。
|
||||
- [ ] 演示链路可连续跑通。
|
||||
|
||||
Reference in New Issue
Block a user