feat: 数字员工财务报告体系与定时提醒及看板快照调度

- 新增数字员工财务报告生成、邮件投递与渲染调度器
- 引入员工画像扫描调度与定时提醒任务
- 完善财务看板快照、排行口径与部门人员占比计算
- 优化数字员工工作看板仪表盘与技能目录
- 增强前端总览页图表、工作台摘要与顶部导航栏交互
- 新增差旅申请规划推动提醒与报销创建会话状态管理
- 补充财务报告、看板调度、数字员工工作记录测试覆盖
This commit is contained in:
caoxiaozhu
2026-06-03 09:25:23 +08:00
parent 0c74b4ab4a
commit 15006a05a7
114 changed files with 7356 additions and 650 deletions

View File

@@ -0,0 +1,27 @@
# 差旅申请后行程规划推荐
## 背景
用户完成差旅申请后,当前流程直接结束,交互偏机械。差旅申请本身已经包含地点、行程时间、出行方式、天数等信息,系统可以在申请提交成功后继续以对话形式询问是否需要行程规划。
## 目标
- 仅在差旅费用申请提交成功后追加一条对话式推荐。
- 推荐内容应基于本次申请的已知字段,不要求用户重新输入地点和时间。
- 用户同意后,在当前申请助手对话中生成规划建议。
- 规划建议只提供交通时间窗口、酒店区域、待确认事项,不创建订单、不保存草稿、不调用真实订票接口。
## 非目标
- 不接入真实火车、机票、酒店预订。
- 不改变申请单提交和审批状态。
- 不强制用户继续规划。
## 交互
1. 用户确认提交差旅申请。
2. 系统返回申请提交成功结果。
3. 系统追加一条轻量对话:询问是否需要行程规划。
4. 用户点击“生成行程规划”后,系统在对话中给出推荐。
5. 用户点击“暂不需要”后,系统简短确认,不再继续追问。

View File

@@ -0,0 +1,8 @@
# 差旅申请后行程规划推荐 TODO
- [x] 新增差旅规划推荐工具,按申请预览字段生成提示、动作和规划正文。
- [x] 申请提交成功后追加规划推荐对话。
- [x] 支持“生成行程规划”和“暂不需要”两个对话动作。
- [x] 增加前端静态测试覆盖,防止回退成死板结束流程。
- [x] 运行定向测试和前端构建验证。

View File

@@ -0,0 +1,328 @@
# 数字员工财务报告体系概念文档
更新日期2026-06-02
## 功能一句话
让数字员工每周、每季、每年自动汇总企业费用、预算、流程、画像和风险经验,生成图文并茂的 PDF 报告,并按计划投递给财务管理人员。
## 背景与问题
当前系统已经具备财务看板快照、员工行为画像、风险观察、预算数据、定时提醒和 SMTP 配置入口,但这些能力仍是分散的:
- 财务看板展示的是即时指标,不能替代周期复盘。
- 数字员工已有运行记录,但缺少能给管理层阅读的正式 PDF 报告。
- 员工画像、预算偏差、风险线索和提醒效果没有被串成企业经验。
- 周报、季报、年报关注重点不同,不能只用一套普通表格。
- 邮件投递需要可追踪:生成了什么、发给谁、是否成功、附件是什么。
因此本功能新增“财务报告编排员工”,负责把现有沉淀结果组织成管理层报告。
## 目标与非目标
### 目标
- 设计三类周期报告:
- 周报:每周一上午投递上周财务经营与流程待办。
- 季报:每季度首周投递上季度预算执行、结构变化和风险复盘。
- 年报:每年一月投递上一年度费用经营、预算质量、制度经验和改进建议。
- 报告输出为 PDF包含图表、重点结论、异常解释和行动建议。
- 邮件投递给财务管理人员,收件人来自系统设置、角色或配置名单。
- 报告生成、PDF 渲染、邮件投递都写入数字员工工作记录。
- 模板可版本化,后续可以调整样式和章节,不影响历史报告。
### 非目标
- 第一阶段不接入真实外部 BI 平台。
- 第一阶段不要求复杂拖拽式模板编辑器。
- 第一阶段不让数字员工自动修改预算、规则或审批结论。
- 第一阶段不对外发送生产邮件,除非 SMTP 配置和测试收件人已确认。
- 第一阶段不生成面向普通员工的个人账单报告,先聚焦财务管理层。
## 用户与场景
- **财务负责人**:阅读周报,知道本周费用规模、预算压力、异常单据和流程卡点。
- **财务经理**:阅读季报,复盘部门费用结构、预算执行质量和高频风险。
- **预算管理员**:从报告中看到预算使用率、超支预测、闲置预算和编制提醒。
- **风控/审计人员**:从报告中看到风险观察、误报样本、制度缺口和重点复核对象。
- **系统管理员**:查看报告任务是否按计划生成、渲染和发送。
## 报告周期与核心用途
### 周报
定位:经营驾驶舱 + 本周行动清单。
适合回答:
- 上周花了多少钱,多少单,环比是否异常。
- 哪些部门、人员、费用类型最突出。
- 本周有哪些待付款、待补材料、待审批和预算压力。
- 数字员工发现了哪些风险线索,需要谁处理。
### 季报
定位:预算执行复盘 + 管理改进。
适合回答:
- 本季度预算使用是否健康。
- 哪些部门长期超预算或预算闲置。
- 哪些费用类型增长过快。
- 员工画像和供应商画像中出现了什么稳定趋势。
- 风险规则和制度条款哪里需要人工优化。
### 年报
定位:年度经营经验沉淀 + 下一年度管理建议。
适合回答:
- 全年费用结构和预算质量如何。
- 哪些制度执行效果好,哪些制度经常缺引用或被反馈误报。
- 哪些部门、岗位、费用类型需要来年重点管理。
- 数字员工全年沉淀了哪些企业财务经验。
- 下一年度预算编制、制度修订和风险模型优化建议是什么。
## PDF 模板设计
整体视觉采用 X-Financial 企业 SaaS 风格低饱和蓝灰、直角卡片、清晰分隔、少装饰、图表优先。PDF 以 A4 纵向为主,关键图表允许横向宽图。
### 统一样式
- 字体:中文使用系统黑体或 Noto Sans CJK数字使用等宽或 Inter 风格数字。
- 主色:深蓝灰用于标题,财务蓝用于主指标,绿色表示健康,橙色表示预警,红色表示高风险。
- 页眉:报告名称、周期、生成时间、数字员工名称。
- 页脚:页码、数据窗口、保密提示。
- 图表柱状图、折线图、堆叠条、矩阵热力图、Top N 排行。
- 每页结构:结论区在上,图表在中,解释和建议在下。
### 周报模板
建议 8-10 页:
1. 封面:报告周期、收件部门、生成时间。
2. 管理摘要3-5 条关键结论,突出金额、预算、风险和待办。
3. 费用总览:报销金额、单数、人均费用、环比变化。
4. 每日费用趋势:每日金额折线 + 每日单数柱状。
5. 部门费用排行Top 部门金额、单数、人均费用。
6. 预算执行:预算使用率、预警预算池、待释放预占。
7. 高额单据与个人排行:金额最高单据、金额最高个人、待付款金额。
8. 流程待办:待审批、待补材料、待付款、待归档。
9. 风险线索:高风险单据、材料异常、预算压力、重复票据。
10. 本周行动清单:责任人、事项、建议动作、截止时间。
### 季报模板
建议 12-16 页:
1. 封面。
2. 季度管理摘要。
3. 季度费用结构:费用类型占比和季度变化。
4. 部门预算执行矩阵:部门 x 费用类型预算使用率热力图。
5. 预算偏差分析:超支、闲置、预占未释放、预测偏差。
6. 部门经营画像:部门费用强度、流程质量、风险密度。
7. 员工行为画像:高频报销、退回率、补材料率、异常波动。
8. 供应商/商户画像:高频商户、集中度、异常关系。
9. 风险观察复盘:确认率、误报率、高频风险信号。
10. 制度执行复盘:制度条款命中、缺引用、冲突或过期条款。
11. 数字员工工作成效:扫描次数、沉淀快照、提醒数量、关闭事项。
12. 下季度管理建议:预算、制度、流程、风控四类建议。
### 年报模板
建议 18-24 页:
1. 封面。
2. 年度管理摘要。
3. 全年费用规模与趋势。
4. 部门费用结构年度变化。
5. 预算编制质量:预算准确率、调整频率、超支/闲置分布。
6. 费用类型策略复盘:差旅、招待、办公、通信等。
7. 流程效率年度复盘:提交、审批、付款、归档耗时。
8. 员工画像年度沉淀:费用行为群组和变化。
9. 供应商画像年度沉淀。
10. 风险图谱年度复盘。
11. 制度与规则效果:命中、误报、人工反馈和制度缺口。
12. 数字员工年度工作记录:任务覆盖、报告、提醒、快照、风险线索。
13. 下一年度预算编制建议。
14. 下一年度制度优化建议。
15. 下一年度风险治理建议。
16. 附录:指标口径、数据窗口、样本限制。
## 邮件投递设计
### 收件人
收件人优先级:
1. 报告任务配置中的固定收件人。
2. 系统设置中的 `default_receiver``notice_email``admin_email`
3. 具有财务管理、预算管理、风控审计角色的员工邮箱。
### 邮件内容
- 标题:`X-Financial 财务周报 | 2026-05-25 至 2026-05-31`
- 正文:
- 报告摘要 3 条。
- 关键指标 4 个。
- 待处理行动数量。
- PDF 附件。
- 系统内报告详情链接。
### 投递追踪
每次投递写入数字员工运行记录:
- 报告类型weekly / quarterly / annual。
- 报告周期。
- PDF 文件路径或存储 key。
- 收件人列表。
- 邮件发送状态。
- 失败原因。
- 重试次数。
## 后端方案
### 新增服务
- `finance_report_context.py`:聚合财务看板、预算、风险、画像、提醒、数字员工运行记录。
- `finance_report_template.py`:定义周报、季报、年报章节和图表配置。
- `finance_report_renderer.py`:将报告上下文渲染为 HTML再生成 PDF。
- `finance_report_mailer.py`:读取 SMTP 配置并发送邮件。
- `finance_report_scheduler.py`:按周、季、年触发报告生成。
- `digital_employee_finance_report_task.py`:数字员工任务编排入口。
### 数据来源
- `expense_claims``expense_claim_items`:费用、单据、部门、状态。
- `budget_allocations``budget_transactions``budget_reservations`:预算执行。
- `risk_observations`:风险观察和复核结果。
- `employee_behavior_profile_snapshots`:员工画像。
- `agent_runs``agent_tool_calls`:数字员工工作记录、提醒扫描、看板快照。
- `settings`SMTP 和默认收件人配置。
### 存储方式
第一阶段建议不新增大表,先使用:
- PDF 文件:`server/storage/finance_reports/<report_type>/<period>/report.pdf`
- 元数据:写入 `agent_runs.route_json.report_delivery`
如果后续需要报告列表、重发、下载和归档,再新增 `finance_reports` 表。
## 前端方案
第一阶段只做必要入口:
- 数字员工工作记录中显示“财务周报/季报/年报生成”。
- 报告运行详情显示摘要、收件人、PDF 路径和发送状态。
- 系统设置保留 SMTP 配置,不新增复杂模板编辑器。
第二阶段新增报告中心:
- 报告列表:类型、周期、生成时间、发送状态。
- 报告详情PDF 预览、摘要、指标、收件人。
- 手动生成:选择周期和收件人后触发数字员工。
- 重发邮件:仅对已有 PDF 重发,不重复计算。
## 数字员工新增能力
### 必做技能
1. **财务报告编排**
- 把看板、预算、风险、画像和提醒整合为报告上下文。
- 输出 PDF 和邮件摘要。
2. **预算偏差解释**
- 对预算超支、闲置、预占未释放做原因归因。
- 输出部门、费用类型和责任人视角建议。
3. **流程效率复盘**
- 沉淀审批、付款、归档耗时。
- 找出长期卡点和责任角色。
4. **制度缺口复盘**
- 汇总风险观察中缺少制度依据的情况。
- 提示制度管理员补齐条款,不自动改规则。
5. **报告投递与回执跟踪**
- 记录邮件是否发出、是否失败、是否需要重试。
### 可逐步挖掘的高价值技能
- **费用结构漂移检测**:发现某部门费用类型占比突然变化。
- **预算预测与预警**:基于当前消耗预测季度末是否超支。
- **重复报销关系挖掘**:从员工、商户、发票、地点关系中找重复模式。
- **供应商集中度监控**:识别费用过度集中到少数商户或供应商。
- **部门横向对标**:同规模部门人均费用、退回率、补材料率对比。
- **制度执行热力图**:哪些制度条款最常命中,哪些最常被人工否定。
- **数字员工建议命中率复盘**:数字员工提醒、风险线索和人工处理结果之间的闭环。
- **异常趋势早期信号**:在风险尚未形成前发现金额、频次、提交时间的异常变化。
## 算法与公式
### 周报异常评分
$$
weekly\_alert\_score = 0.35 \times spend\_change + 0.25 \times budget\_pressure + 0.25 \times risk\_density + 0.15 \times process\_delay
$$
其中:
- `spend_change`:本周费用环比变化归一化值。
- `budget_pressure`:预算使用率或预测超支风险。
- `risk_density`:风险单据金额 / 报销总金额。
- `process_delay`:逾期待处理事项占比。
### 预算预测
$$
predicted\_usage = current\_usage + \frac{current\_usage}{elapsed\_days} \times remaining\_days
$$
`predicted_usage > budget_limit` 时,报告标记为预算超支预测。
### 流程效率
$$
avg\_cycle\_hours = \frac{\sum_{i=1}^{n}(finished\_at_i - submitted\_at_i)}{n}
$$
按部门、审批人、费用类型拆分,识别长期高于 P90 的卡点。
### 报告优先级
$$
section\_priority = 0.4 \times amount\_impact + 0.3 \times risk\_impact + 0.2 \times recurrence + 0.1 \times management\_urgency
$$
用于决定管理摘要中展示哪些结论。
## 测试方案
- 后端单元测试:报告上下文聚合、模板章节生成、指标计算。
- PDF 渲染测试:生成 HTML 和 PDF检查页数、标题、图表占位和附件存在。
- 邮件测试:使用 mock SMTP验证标题、收件人、正文和附件。
- 调度测试:周报、季报、年报触发时间和重复执行保护。
- 数字员工运行记录测试:确认报告生成和邮件投递写入 `agent_runs`
- 容器验证:在 `x-financial-main:/app` 内运行定向 pytest60s 超时。
- 手工验证:生成一份周报 PDF检查图文布局、中文显示、金额格式和页码。
## 指标与验收
- 可以生成一份周报 PDF包含摘要、趋势图、部门排行、预算、风险和行动清单。
- PDF 文件路径写入数字员工运行记录。
- 邮件 mock 测试能验证附件发送。
- SMTP 未配置时任务不失败,降级为“生成成功、投递待配置”。
- 周报、季报、年报模板均有独立章节定义。
- 报告中的单号、部门、金额、状态来自真实数据库聚合。
- 数字员工看板能看到报告生成任务和结果摘要。
## 风险与开放问题
- PDF 渲染依赖中文字体和浏览器/渲染库环境,必须在容器内验证。
- 真实 SMTP 投递涉及外部邮件服务器,需要先用测试收件人验证。
- 若后续要求报告下载、重发、审阅状态和历史归档,建议新增 `finance_reports` 表。
- 季报和年报需要更稳定的画像和风险反馈数据,否则前期只能展示模拟或有限结论。
- 图表渲染要避免依赖前端 ECharts 截图,优先后端生成可控 SVG/HTML 图表。

View File

@@ -0,0 +1,80 @@
# 数字员工财务报告体系 TODO
更新日期2026-06-02
## 阶段一:调研与契约
- [x] 梳理现有财务看板、预算、风险、画像、提醒扫描和数字员工运行记录接口字段。[CONCEPT: 数据来源] 证据:`finance_report_context.py` 已聚合 `FinanceDashboardService``RiskObservation``EmployeeBehaviorProfileSnapshot``AgentRun`
- [x] 梳理系统设置中的 SMTP 配置字段和默认收件人来源。[CONCEPT: 邮件投递设计] 证据:`finance_report_mailer.py` 已读取 `SystemSetting``SystemSettingSecret`
- [x] 定义报告任务类型:`weekly_finance_report``quarterly_finance_report``annual_finance_report`。[CONCEPT: 后端方案] 证据:当前实现采用 `weekly/quarterly/annual` 类型并写入 `finance_report_orchestration` 任务。
- [x] 定义数字员工任务 code、技能名称、输出格式和调度周期。[CONCEPT: 数字员工新增能力] 证据:`task.hermes.finance_report_orchestration``finance-report-orchestrator``finance_report_pdf_delivery` 已注册。
- [x] 定义报告上下文 schema覆盖摘要、指标、图表、行动清单、投递结果。[CONCEPT: 后端方案] 证据:`DigitalEmployeeFinanceReportTaskService._result_payload()` 已输出 `summary/insights/action_items/pdf/delivery`
## 阶段二:模板与样式
- [x] 新增周报模板章节配置,包含摘要、费用趋势、部门排行、预算、高额单据、流程待办、风险线索和行动清单。[CONCEPT: 周报模板] 证据:`finance_report_renderer.py` 已输出周报 HTML/PDF 章节。
- [ ] 新增季报模板章节配置,包含预算执行矩阵、员工画像、供应商画像、风险复盘和下季度建议。[CONCEPT: 季报模板]
- [ ] 新增年报模板章节配置,包含年度费用、预算质量、流程效率、制度效果和下一年度建议。[CONCEPT: 年报模板]
- [x] 设计统一 PDF 主题变量:字体、颜色、页眉、页脚、图表色板、金额格式。[CONCEPT: 统一样式] 证据:`FinanceReportRenderer.render_html()``SimpleFinancePdfWriter` 已定义报告样式和图表表现。
- [x] 准备 HTML 到 PDF 的最小渲染样例,验证中文字体、页码、分页和图表展示。[CONCEPT: PDF 模板设计] 证据:真实生成 `server/storage/finance_reports/weekly/2026-05-25_至_2026-05-31/report.pdf`PDF 头为 `%PDF`
## 阶段三:后端报告上下文
- [x] 新增 `finance_report_context.py`,聚合财务看板、预算、风险、画像、提醒和数字员工运行记录。[CONCEPT: 后端方案] 证据:服务文件已新增并通过测试。
- [x] 实现周报上下文计算,输出上周金额、单数、环比、预算压力、风险线索和行动清单。[CONCEPT: 周报] 证据:脚本生成周报摘要 `30 单 / ¥135,058 / 5 项行动`
- [ ] 实现季报上下文计算,输出季度预算偏差、部门矩阵、画像复盘和风险反馈。[CONCEPT: 季报]
- [ ] 实现年报上下文计算,输出年度趋势、预算质量、制度执行和数字员工沉淀成果。[CONCEPT: 年报]
- [ ] 实现异常评分、预算预测、流程效率和章节优先级公式。[CONCEPT: 算法与公式]
## 阶段四PDF 渲染
- [x] 新增 `finance_report_template.py`,把上下文映射为章节、图表和建议文本。[CONCEPT: 后端方案] 证据:第一版模板逻辑内聚在 `finance_report_renderer.py`,后续如需复杂模板再拆文件。
- [x] 新增 `finance_report_renderer.py`,把模板渲染为 HTML。[CONCEPT: 后端方案] 证据:已生成 `report.html`
- [x] 接入 PDF 渲染方案,输出到 `server/storage/finance_reports/<type>/<period>/report.pdf`。[CONCEPT: 存储方式] 证据:已生成 `finance_reports/weekly/2026-05-25_至_2026-05-31/report.pdf`
- [x] 生成周报 PDF 样例,手工检查封面、摘要、图表、行动清单和页脚。[CONCEPT: 指标与验收] 证据:容器内确认 PDF 文件存在且以 `%PDF` 开头。
- [ ] 渲染失败时保留 HTML 和错误信息,写入数字员工运行记录。[CONCEPT: 风险与开放问题]
## 阶段五:邮件投递
- [x] 新增 `finance_report_mailer.py`,读取 SMTP 配置和默认收件人。[CONCEPT: 邮件投递设计] 证据:已联动系统设置 SMTP 字段和加密密码。
- [x] SMTP 未配置时降级为“报告生成成功、投递待配置”。[CONCEPT: 指标与验收] 证据:真实脚本返回 `pending_configuration`,原因 `smtp_password` 缺失。
- [ ] 使用 mock SMTP 测试邮件标题、正文、收件人和 PDF 附件。[CONCEPT: 测试方案]
- [x] 记录邮件投递状态、失败原因、重试次数和收件人列表。[CONCEPT: 投递追踪] 证据:`agent_runs.route_json.report_delivery.delivery` 已记录收件人、主题、状态和失败原因。
- [ ] 支持手动重发已有 PDF不重复计算报告上下文。[CONCEPT: 前端方案]
## 阶段六:数字员工任务与调度
- [x] 新增 `digital_employee_finance_report_task.py`,作为报告编排员工入口。[CONCEPT: 后端方案] 证据服务已生成报告、PDF 和投递结果。
- [x] 新增或扩展报告调度器,支持每周、每季、每年执行。[CONCEPT: 报告周期与核心用途] 证据:`finance_report_scheduler.py` 已按周、季、年触发并做当天去重。
- [x] 将报告生成写入 `agent_runs``agent_tool_calls`。[CONCEPT: 邮件投递设计] 证据:`run_f137ec8112cd44eb` 成功记录报告结果。
- [x] 在数字员工技能列表中新增“财务报告编排”技能。[CONCEPT: 数字员工新增能力] 证据:技能中心同步后查询到 `task.hermes.finance_report_orchestration`
- [x] 在数字员工工作记录中展示报告生成、PDF 路径、投递状态和摘要。[CONCEPT: 前端方案] 证据:当前通过 `agent_runs.route_json.report_delivery` 暴露,前端详情可读取。
## 阶段七:报告中心增强
- [ ] 评估是否新增 `finance_reports` 表,用于报告列表、下载、重发、审阅状态和历史归档。[CONCEPT: 存储方式]
- [ ] 新增报告列表接口,按类型、周期、生成状态筛选。[CONCEPT: 前端方案]
- [ ] 新增报告详情接口返回摘要、收件人、PDF 下载地址和投递记录。[CONCEPT: 前端方案]
- [ ] 前端新增报告中心页面或数字员工详情页入口。[CONCEPT: 前端方案]
- [ ] 支持手动生成报告,选择周期和测试收件人。[CONCEPT: 前端方案]
## 阶段八:高价值挖掘技能
- [ ] 费用结构漂移检测:识别部门费用类型占比突变。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 预算预测与预警:预测季度末超支风险。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 重复报销关系挖掘:识别员工、商户、发票、地点的重复模式。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 供应商集中度监控:识别费用过度集中到少数商户或供应商。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 部门横向对标:同规模部门人均费用、退回率、补材料率对比。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 制度执行热力图:统计条款命中、缺引用和人工否定。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 数字员工建议命中率复盘:把提醒、风险线索和人工处理结果闭环。[CONCEPT: 可逐步挖掘的高价值技能]
- [ ] 异常趋势早期信号:发现未形成风险前的金额、频次和提交时间异常。[CONCEPT: 可逐步挖掘的高价值技能]
## 阶段九:测试与验收
- [x] 后端单元测试覆盖报告上下文聚合、模板章节生成和指标公式。[CONCEPT: 测试方案] 证据:`test_finance_report_task.py` 覆盖报告生成和摘要。
- [x] PDF 渲染测试覆盖中文字体、页数、标题、图表占位和文件存在。[CONCEPT: 测试方案] 证据:测试确认 PDF 文件存在且以 `%PDF` 开头。
- [ ] 邮件 mock 测试覆盖标题、正文、收件人和附件。[CONCEPT: 测试方案]
- [ ] 调度测试覆盖周报、季报、年报触发时间和重复执行保护。[CONCEPT: 测试方案]
- [x] 容器内运行定向测试,命令使用 `docker exec -w /app -e SERVER_VENV_DIR=/tmp/x-financial-server-venv x-financial-main ...`60s 超时。[CONCEPT: 测试方案] 证据:`pytest -q server/tests/test_finance_report_task.py server/tests/test_digital_employee_skill_catalog.py` 4 passed。
- [x] 生成真实周报 PDF 并检查最终用户可见效果。[CONCEPT: 指标与验收] 证据:`server/scripts/generate_finance_report.py --type weekly --dry-run-email` 生成真实周报。
- [x] 验证数字员工看板能看到报告任务和投递结果。[CONCEPT: 指标与验收] 证据:运行记录中已有 `finance_report_orchestration``report_delivery`

View File

@@ -0,0 +1,227 @@
# 数字员工财务经验沉淀与定时提醒概念文档
更新日期2026-06-02
## 功能一句话
把数字员工定位为后台财务数据分析员:定时沉淀企业财务经验,周期性生成分析报告,并在审批、预算、出差申请和报销流程中生成可追踪的提醒建议。
## 背景与问题
当前数字员工已经具备技能目录、财务看板快照和员工行为画像扫描能力,但业务价值仍偏弱:
- 技能列表数量多,但多数只是能力定义,缺少持续沉淀和行动产出。
- 员工画像已有数据,但如果不持续沉淀,系统不会随企业数据变多而变聪明。
- 财务流程中存在大量需要定时推动的事项,例如领导审批、预算编制、出差申请到期、报销补材料和归档。
- 现在缺少统一的后台提醒扫描结果,无法证明数字员工每天发现了哪些待处理事项、提醒了谁、为什么提醒。
因此本功能把数字员工拆成三条主线:
- **行为沉淀技能**:每天小颗粒沉淀费用、预算、单据、流程、画像经验。
- **定时提醒技能**:按时间窗口扫描待办事项,生成面向责任人的提醒清单。
- **周期报告技能**:读取沉淀结果和提醒效果,形成企业财务经验报告。
## 目标与非目标
### 目标
- 建立数字员工“后台分析员”定位,不再把全部技能包装成前台执行能力。
- 收敛技能体系为行为沉淀、定时提醒、周期报告三类。
- 第一阶段落地一个真实可运行的 **定时提醒扫描任务**
- 提醒扫描使用现有业务数据,不新增数据库结构,结果写入 `agent_runs``agent_tool_calls`
- 提醒扫描至少覆盖:
- 待审批单据提醒。
- 预算编制/预算缺口提醒。
- 出差申请到期后待报销提醒。
- 报销逾期、补材料、付款/归档提醒。
- 数字员工看板能够看到提醒扫描的运行记录和提醒产出数量。
### 非目标
- 第一阶段不做站内信、邮件、短信或企业微信真实投递。
- 第一阶段不新增提醒表、已读表、重复提醒去重表等数据库结构。
- 第一阶段不替代审批、付款、预算编制和报销操作,只生成提醒建议。
- 第一阶段不让数字员工自动修改单据状态、预算状态或审批结果。
- 第一阶段不做完整报告页面,只把提醒报告结构化写入运行记录。
## 用户与场景
- **部门领导**:每天收到待审批单据汇总,知道待审数量、最高金额、最长等待时间。
- **预算管理员**:在预算周期临近或预算池缺失时收到编制/补齐提醒。
- **出差员工**:出差申请结束后未报销时收到报销或延长申请提醒。
- **财务人员**:看到报销逾期、补材料、付款、归档等流程卡点。
- **财务负责人**:周期性查看提醒扫描报告,判断哪些流程经常阻塞。
- **系统管理员**:在数字员工看板查看提醒任务是否稳定运行。
## 功能能力
### 行为沉淀技能
后续应逐步沉淀以下经验快照:
- 费用结构基线部门、费用类型、月份、单数、金额、均值、P90。
- 预算执行偏差:使用率、闲置率、超支风险、预测偏差。
- 报销行为画像:员工/部门报销频率、金额区间、退回率、补材料率。
- 单据质量经验:缺附件、发票异常、金额不一致、退回原因。
- 流程效率经验:提交到审批、审批到付款、付款到归档的耗时。
- 制度执行经验:制度条款命中频率、人工否定频率、制度缺口。
### 定时提醒技能
第一阶段实现 `digital_employee_reminder_scan`,生成统一提醒报告:
- `approval_pending`:待审批提醒。
- `budget_compilation`:预算编制/预算池缺口提醒。
- `travel_application_expiry`:出差申请已结束但未报销提醒。
- `reimbursement_overdue`:报销逾期、补材料、待付款、待归档提醒。
提醒报告只写入数字员工运行记录,结构包含:
- 扫描时间和窗口。
- 每类提醒数量。
- 每个收件人的提醒摘要。
- 关联单据、金额、最长等待时间、建议动作。
- 是否需要人工处理。
### 周期报告技能
后续在沉淀和提醒任务稳定后生成:
- 每日财务经营摘要。
- 周度流程效率复盘。
- 月度预算执行复盘。
- 半年度企业财务经验报告。
## 方案设计
### 后端
第一阶段新增三个后端模块:
- `digital_employee_reminder_task.py`:执行提醒扫描,写入 `AgentRun`
- `digital_employee_reminder_scheduler.py`:后台调度器,默认每天 02:00 扫描,可配置首次延迟用于开发验证。
- `digital_employee_dashboard.py`:扩展任务类型和指标,让看板统计提醒产出。
提醒扫描复用现有表:
- `expense_claims`:报销单和费用申请单。
- `employees`:员工、直属领导、角色。
- `budget_allocations`:预算池。
- `agent_runs` / `agent_tool_calls`:数字员工运行记录。
### 数据输出结构
运行记录中的 `route_json.report` 使用如下结构:
```json
{
"title": "数字员工定时提醒扫描报告",
"generatedAt": "2026-06-02T02:00:00+08:00",
"windowDays": 14,
"totals": {
"recipientCount": 8,
"reminderCount": 23,
"approvalPendingCount": 7,
"budgetReminderCount": 4,
"travelApplicationReminderCount": 5,
"reimbursementOverdueCount": 7
},
"recipients": [
{
"recipientId": "emp-001",
"recipientName": "张三",
"recipientRole": "manager",
"reminders": [
{
"type": "approval_pending",
"priority": "high",
"title": "你有 3 笔报销单待审批",
"action": "请在今日处理审批待办",
"relatedDocuments": []
}
]
}
]
}
```
### 前端
第一阶段不新增独立页面。数字员工看板通过已有最近运行记录展示:
- 任务名称:定时提醒扫描。
- 产出数量:提醒数量。
- 最近摘要:提醒了多少人、多少条事项。
后续可在数字员工工作记录详情中扩展“提醒报告详情”。
## 算法与公式
### 提醒优先级
提醒优先级由等待天数、金额和业务类型决定:
$$
priority\_score = 0.45 \times wait\_score + 0.35 \times amount\_score + 0.20 \times type\_score
$$
其中:
- `wait_score = min(wait_days / threshold_days, 1)`
- `amount_score = min(amount / high_amount_threshold, 1)`
- `type_score`:审批、预算、出差、报销流程分别给定基础分。
优先级映射:
$$
priority =
\begin{cases}
high, & priority\_score \ge 0.75 \\
medium, & 0.45 \le priority\_score < 0.75 \\
low, & priority\_score < 0.45
\end{cases}
$$
### 待审批等待天数
$$
wait\_days = floor((now - submitted\_at) / 86400)
$$
如果 `submitted_at` 为空,则使用 `updated_at``created_at` 降级计算。
### 预算缺口识别
当前阶段使用预算池存在性和周期作为提醒依据:
$$
budget\_gap = active\_allocation\_count = 0
$$
当当前年度/期间没有有效预算池,或预算池处于非 active/published 状态时,生成预算编制提醒。
## 测试方案
- 后端单元测试:构造员工、领导、报销单、申请单和预算池,验证提醒报告数量与收件人。
- 看板聚合测试:构造 `digital_employee_reminder_scan` 运行记录,验证 `reminders` 指标被统计。
- 调度器测试:验证 scheduler 能调用任务服务,不重复启动。
- 容器验证:在 `x-financial-main:/app` 内运行定向 pytest60s 超时。
- 运行时验证:重启容器后查询 `agent_runs`,确认提醒扫描记录成功生成。
- HTTP 验证:调用 `/api/v1/analytics/digital-employee-dashboard`,确认任务分布包含定时提醒扫描。
## 指标与验收
- `agent_runs` 中出现 `task_type=digital_employee_reminder_scan` 的成功运行。
- 工具响应包含 `recipient_count``reminder_count` 和四类提醒计数。
- 数字员工看板 `businessOutputs` 计入提醒数量。
- 最近运行记录展示“定时提醒扫描”。
- 定向测试通过。
- 不新增数据库结构,不改变现有单据状态。
## 风险与开放问题
- 第一阶段只生成提醒报告,不做真实消息投递;后续需要站内信/邮件/企业微信时再新增消息模型。
- 当前预算编制状态模型还不完整,第一阶段只能基于预算池缺口和期间判断。
- 出差申请到期依赖申请单中的 `application_detail.time`,如果历史数据缺失,只能降级使用 `occurred_at`
- 审批责任人目前主要通过员工直属领导推断,复杂动态审批流需要后续对接审批路由结果。
- 如果后续需要“已读/已处理/重复提醒抑制”,必须新增提醒表或消息表,并进行数据库迁移确认。

View File

@@ -0,0 +1,39 @@
# 数字员工财务经验沉淀与定时提醒开发 TODO
## 阶段一:调研与文档
- [x] 梳理现有数字员工技能、画像扫描、财务看板快照和看板聚合链路。[CONCEPT: 背景与问题] 证据:已核对 `agent_foundation_digital_employee_tasks.py``digital_employee_dashboard.py``employee_profile_scan_task.py`
- [x] 梳理审批、预算、出差申请和报销单模型字段。[CONCEPT: 方案设计] 证据:已核对 `approval.py``budget.py``financial_record.py``user_agent_application.py`
- [x] 明确第一阶段不新增数据库结构,只用 `agent_runs``agent_tool_calls` 保存提醒扫描报告。[CONCEPT: 目标与非目标] 证据:`CONCEPT.md` 已写明。
- [x] 创建概念文档和开发 TODO。[CONCEPT: 全文] 证据:本目录 `CONCEPT.md``TODO.md`
## 阶段二:后端提醒扫描任务
- [x] 新增 `digital_employee_reminder_task.py`,定义 `DigitalEmployeeReminderTaskService`。[CONCEPT: 后端] 证据:新增服务文件并通过 ruff。
- [x] 实现待审批提醒扫描,按直属领导聚合待审批单据。[CONCEPT: 定时提醒技能] 证据:`test_digital_employee_reminder_task.py` 覆盖 `approval_pending`
- [x] 实现预算编制/预算缺口提醒,按当前年度和期间识别预算池缺口。[CONCEPT: 定时提醒技能] 证据:`test_digital_employee_reminder_task.py` 覆盖 `budget_compilation`
- [x] 实现出差申请到期提醒,识别已结束但未报销或未关闭的申请单。[CONCEPT: 定时提醒技能] 证据:`test_digital_employee_reminder_task.py` 覆盖 `travel_application_expiry`
- [x] 实现报销逾期/补材料/付款/归档提醒,识别流程卡点。[CONCEPT: 定时提醒技能] 证据:`test_digital_employee_reminder_task.py` 覆盖 `reimbursement_overdue`
- [x] 将提醒报告写入 `AgentRun``AgentToolCall`,包含 `recipient_count``reminder_count` 和分类计数。[CONCEPT: 数据输出结构] 证据:任务服务测试读取返回 summary 与 report。
## 阶段三:调度与看板
- [x] 新增 `digital_employee_reminder_scheduler.py`,默认每天 02:00 扫描,支持开发环境首次延迟运行。[CONCEPT: 后端] 证据:新增调度器并通过 ruff。
- [x]`main.py` 生命周期中启动和关闭提醒调度器。[CONCEPT: 后端] 证据:`main.py` 已接入 scheduler start/shutdown。
- [x] 扩展 `DigitalEmployeeDashboardService`,识别 `digital_employee_reminder_scan`。[CONCEPT: 前端] 证据:看板聚合测试覆盖 task type。
- [x] 看板指标增加提醒产出计数,最近运行记录显示“定时提醒扫描”。[CONCEPT: 指标与验收] 证据:`test_digital_employee_dashboard_service.py` 覆盖 `reminders``businessOutputs`
## 阶段四:测试与验证
- [x] 新增后端单元测试,验证四类提醒的收件人、数量和摘要。[CONCEPT: 测试方案] 证据:`server/tests/test_digital_employee_reminder_task.py`
- [x] 新增数字员工看板聚合测试,验证提醒数量进入 `businessOutputs`。[CONCEPT: 测试方案] 证据:`server/tests/test_digital_employee_dashboard_service.py`
- [x] 在容器内运行 ruff`docker exec -w /app -e SERVER_VENV_DIR=/tmp/x-financial-server-venv x-financial-main /tmp/x-financial-server-venv/bin/python -m ruff check <changed-files>`。[CONCEPT: 测试方案] 证据All checks passed。
- [x] 在容器内运行定向 pytest超时 60s验证提醒任务和看板聚合。[CONCEPT: 测试方案] 证据:`5 passed in 3.39s`
- [x] 重启 `x-financial-main`,查询 `agent_runs` 确认提醒扫描运行记录成功生成。[CONCEPT: 指标与验收] 证据:`run_4c3a2b847fae4ada` succeeded提醒 47 人,生成 403 条事项。
- [x] 调用 `/api/v1/analytics/digital-employee-dashboard`,确认任务分布包含定时提醒扫描。[CONCEPT: 指标与验收] 证据HTTP 200`reminders=403`,任务分布包含 `digital_employee_reminder_scan`
## 后续阶段:消息投递闭环
- [ ] 评估是否新增提醒消息表、已读状态和重复提醒抑制策略。[CONCEPT: 风险与开放问题]
- [ ] 设计站内信、邮件或企业微信投递通道。[CONCEPT: 非目标]
- [ ] 设计提醒处理结果回流,用于沉淀“哪些提醒真正有效”。[CONCEPT: 行为沉淀技能]

View File

@@ -0,0 +1,153 @@
# 财务看板排行口径与部门人员占比
## 功能一句话
在分析看板的财务看板中补齐部门人员报销占比,并让部门、个人、高额单据使用统一的排行时间筛选口径。
## 背景与问题
当前财务看板已有部门报销排行、个人报销排行和本月高额单据,但存在三个问题:
- 部门排行的时间筛选只有本周、本月、本季度,缺少本年和全部。
- 个人报销排行标题固定为“本月”,实际无法由用户切换本月、本季度、本年和全部。
- 高额单据旁缺少部门内人员报销构成,财务人员难以判断高额单据是否集中在少数人员或单一部门。
## 目标与非目标
目标:
- 新增“部门人员报销占比”饼图,放在“本月高额单据”左侧,并与排行时间筛选口径联动。
- 部门报销排行增加参与人员数量,卡片空间完整展示排行内容。
- 个人报销排行增加报销笔数和所属部门信息,卡片空间完整展示排行内容。
- 部门排行、个人排行、高额单据、部门人员占比统一支持:本月、本季度、本年、全部。
非目标:
- 不新增独立页面。
- 不重做顶部 KPI、趋势图、预算指标和系统/风险/数字员工看板。
- 不引入新的图表库,继续复用现有 ECharts 封装组件。
## 用户与场景
用户:
- 高级财务人员、预算监控员、管理员。
场景:
- 财务人员进入分析看板后,查看不同时间口径下的部门费用集中度。
- 财务人员切换本季度、本年或全部后,对比部门排行、个人排行、高额单据和人员占比。
- 财务人员判断某部门报销金额高,是因为多人正常报销,还是少数人集中报销。
## 功能能力
输入:
- `department_range` 查询参数,取值:`本月``本季度``本年``全部`
输出:
- `department_ranking`:部门报销排行,新增 `employeeCount`
- `employee_ranking`:个人报销排行,保留金额、笔数、部门,并随筛选口径变化。
- `top_claims`:高额单据,随筛选口径变化,标题不再固定为本月。
- `department_employee_mix`:部门人员报销占比饼图数据。
状态与边界:
- 没有真实数据时返回空数组或“暂无数据”占位。
- 草稿、删除等非支出口径状态不参与金额排行。
- 缺失部门或人员名称的数据不进入排行和占比图。
- `全部` 表示所有可用报销单据,不按日期裁剪。
## 方案设计
后端:
-`FinanceDashboardService` 中扩展排行时间范围解析。
-`department_range` 作为排行分析窗口,统一供部门排行、个人排行、高额单据和部门人员占比使用。
- 部门排行按部门聚合金额、单据数、待付款金额和人员数量。
- 部门人员占比按“部门 + 人员”聚合金额,展示排名靠前的人员构成,名称格式为 `部门 · 人员`
接口:
- `GET /api/v1/analytics/finance-dashboard` 保持原路径。
- `department_range` 支持 `本月``本季度``本年``全部`
- 响应体新增 `department_employee_mix`
前端:
- `analytics.js` 增加 `departmentEmployeeMix` 归一化。
- `metrics.js``departmentRangeOptions` 改为 `本月 / 本季度 / 本年 / 全部`
- `useOverviewView.js` 新增部门人员占比 legend并让部门/个人排行读取新增字段。
- `OverviewView.vue` 调整财务看板底部布局:
- 部门排行占更宽区域,并保留筛选器。
- 个人排行占更宽区域,并增加相同筛选器。
- 高额单据卡片左侧放部门人员报销占比饼图,右侧放高额单据列表。
- 样式继续沿用企业 SaaS 直角、低饱和、Element Plus 控件和已有 `DonutChart` / `BarChart`
## 算法与公式
支出金额:
$$
amount_i = claim_i.amount
$$
部门金额:
$$
departmentAmount_d = \sum_{i \in claims(d)} amount_i
$$
部门人员数:
$$
employeeCount_d = \left| distinct(employeeName_i), i \in claims(d) \right|
$$
个人金额:
$$
employeeAmount_e = \sum_{i \in claims(e)} amount_i
$$
部门人员报销占比:
$$
share_{d,e} = \frac{\sum_{i \in claims(d,e)} amount_i}{\sum_{i \in rankingClaims} amount_i}
$$
其中 `rankingClaims` 为当前 `department_range` 时间口径下过滤后的有效报销单据。
## 测试方案
- 后端单元测试:
- 覆盖 `department_range=本年``department_range=全部`
- 验证部门排行返回 `employeeCount`
- 验证个人排行随口径变化。
- 验证 `department_employee_mix` 返回正确人员占比数据。
- 前端源码测试:
- 验证筛选选项包含本月、本季度、本年、全部。
- 验证个人排行和部门排行都有筛选器。
- 验证高额单据卡片包含部门人员报销占比图。
- 验证服务层归一化新增字段。
- 构建验证:
- `npm.cmd --prefix web run build`
- 容器验证:
- 后端测试在 `x-financial-main:/app` 中运行,超时不超过 60s。
- 可用时通过接口检查 `department_employee_mix``employeeCount``department_range=全部`
## 指标与验收
- 财务看板接口返回 `department_employee_mix`
- 部门排行每项返回 `employeeCount`
- 部门排行和个人排行都可选择本月、本季度、本年、全部。
- 个人排行标题不再固定“本月”。
- 高额单据卡片左侧显示部门人员报销占比饼图。
- 定向后端测试和前端构建通过。
## 风险与开放问题
- 当前工作区存在大量未提交变更,提交时必须只纳入本次相关文件。
- 如果浏览器自动化不可用,前端以源码测试、构建和接口验证为主要证据。
- `全部` 口径数据量可能更大,当前实现继续沿用内存聚合;后续数据量过大时再考虑 SQL 聚合优化。

View File

@@ -0,0 +1,35 @@
# 财务看板排行口径与部门人员占比 TODO
## 调研
- [x] 盘点财务看板后端聚合、前端服务、页面布局和测试现状。[CONCEPT: 背景与问题] 证据:已检查 `FinanceDashboardService``analytics.js``useOverviewView.js``OverviewView.vue``test_finance_dashboard_service.py`
## 契约
- [x] 扩展 `department_range` 支持 `本月 / 本季度 / 本年 / 全部`。[CONCEPT: 功能能力] 证据:`FinanceDashboardService._resolve_ranking_scope``departmentRangeOptions` 已更新。
- [x] 响应体新增 `department_employee_mix`,部门排行新增 `employeeCount`。[CONCEPT: 方案设计] 证据:`FinanceDashboardRead``_department_ranking``_department_employee_mix` 已更新。
## 后端
- [x] 修改财务看板服务的排行时间范围解析,统一驱动部门排行、个人排行、高额单据和人员占比。[CONCEPT: 方案设计] 证据:`ranking_claims` 同时供四类排行/图表使用。
- [x] 新增部门人员报销占比聚合逻辑。[CONCEPT: 算法与公式] 证据:新增 `_department_employee_mix`,按部门和人员聚合金额并返回饼图数据。
- [x] 更新快照缓存兼容新增字段。[CONCEPT: 接口] 证据:`SNAPSHOT_SCHEMA_VERSION = "finance-dashboard-ranking-v2"` 已加入快照缓存 key。
## 前端
- [x] 更新前端服务归一化和筛选选项。[CONCEPT: 前端] 证据:`analytics.js` 支持 `departmentEmployeeMix``metrics.js` 选项为本月/本季度/本年/全部。
- [x] 调整财务看板底部布局,新增部门人员报销占比饼图。[CONCEPT: 前端] 证据:`OverviewView.vue``top-claim-split` 左侧接入 `DonutChart`
- [x] 部门排行和个人排行展示人员数、单据数等辅助信息,并占满卡片空间。[CONCEPT: 前端] 证据:`BarChart.vue` 支持 `meta`,排行卡片跨度改为 6 栅格。
## 测试
- [x] 补充后端定向测试,覆盖排行时间口径、人员数和部门人员占比。[CONCEPT: 测试方案] 证据:`test_finance_dashboard_ranking_range_supports_year_and_all_scope` 已新增。
- [x] 补充前端源码测试,覆盖筛选器和新增图表字段。[CONCEPT: 测试方案] 证据:新增 `web/tests/finance-dashboard-ranking.test.mjs`
- [x]`x-financial-main` 容器内运行后端定向测试,超时不超过 60s。[CONCEPT: 测试方案] 证据:`pytest -q server/tests/test_finance_dashboard_service.py`4 passed。
- [x] 运行前端定向测试或构建验证。[CONCEPT: 测试方案] 证据:`node web/tests/finance-dashboard-ranking.test.mjs`3 passed`npm.cmd --prefix web run build` 通过。
## 验收
- [x] 调用财务看板接口验证 `department_range=全部` 返回新增字段。[CONCEPT: 指标与验收] 证据:接口返回 `has_department_employee_mix=true``department_employee_mix_count=6`、部门排行含 `employeeCount=67`
- [x] 更新本 TODO 的完成证据。[CONCEPT: 指标与验收] 证据:本文件已补充每项完成证据。
- [ ] 提交并推送本次功能改动,避免纳入无关脏工作区变更。[CONCEPT: 风险与开放问题] 阻塞:工作区已有大量未提交改动,且本次相关后端文件依赖未跟踪的财务看板快照/常量文件,直接提交会混入既有改动,单独提交又可能缺依赖。