feat(finance): add financial disclosure publishing
This commit is contained in:
@@ -452,3 +452,11 @@ V1:
|
||||
- 志愿服务时长
|
||||
|
||||
不得用手工填写数字覆盖真实统计结果。
|
||||
|
||||
---
|
||||
|
||||
## 17. 财务公开文档
|
||||
|
||||
经用户批准,财务公开采用文档发布方式,不建设财务核算或在线募捐系统。工作人员在本地完成文档后,可在管理后台导入 `.docx`、继续编辑基础富文本排版、预览并发布;公众在小程序“公益”页查看已发布文档列表和详情。
|
||||
|
||||
最小字段为标题、可选摘要、富文本正文、草稿/已发布/已归档状态、置顶、排序、revision、发布时间和创建/更新人员。首版不包含支付、捐赠订单、银行流水同步、结构化收支录入、金额统计或复杂审批。
|
||||
|
||||
@@ -470,3 +470,18 @@ Phase 7 不建立可人工修改的统计快照;九项 V1 指标直接从申
|
||||
6. 所有枚举在 contracts 中有单一事实来源。
|
||||
7. migration 不允许 destructive change 直接上线。
|
||||
8. 删除列采用“停用 → 迁移 → 验证 → 后续版本删除”。
|
||||
|
||||
---
|
||||
|
||||
## 23. financial_disclosures
|
||||
|
||||
- id / public_id(随机 UUID)
|
||||
- client_request_id / request_fingerprint(创建幂等)
|
||||
- title / summary nullable
|
||||
- rich_text(后端白名单清洗后的富文本)
|
||||
- status:DRAFT / PUBLISHED / ARCHIVED
|
||||
- is_pinned / sort_order / revision
|
||||
- published_at nullable
|
||||
- created_by / updated_by / timestamps
|
||||
|
||||
`financial_disclosure_status_history` 只追加保存创建、发布和归档事实,请求 UUID 全局唯一。已发布文档禁止覆盖编辑,只能归档;草稿编辑使用 revision 乐观锁。
|
||||
|
||||
@@ -287,3 +287,22 @@ Phase 0 提供:
|
||||
```
|
||||
|
||||
健康检查不得返回配置值、数据库连接串、密钥或其他敏感信息。业务 API 仍统一使用 `/api/v1` 前缀;基础设施健康检查不属于业务 API。
|
||||
|
||||
---
|
||||
|
||||
## 12. 财务公开文档 API
|
||||
|
||||
公众接口:
|
||||
|
||||
- `GET /api/v1/financial-disclosures`
|
||||
- `GET /api/v1/financial-disclosures/:publicId`
|
||||
|
||||
只返回 `PUBLISHED` 文档,草稿和归档文档按不存在处理。
|
||||
|
||||
管理端接口:
|
||||
|
||||
- `GET/POST /api/v1/admin/financial-disclosures`
|
||||
- `GET/PATCH /api/v1/admin/financial-disclosures/:publicId`
|
||||
- `POST /api/v1/admin/financial-disclosures/:publicId/transition`
|
||||
|
||||
创建、发布和归档使用客户端 UUID 幂等;编辑只允许草稿且要求 expectedRevision。状态为 `DRAFT → PUBLISHED → ARCHIVED`,状态变化与历史、审计事务一致。DOCX 在管理端浏览器转换为富文本,API 只接受并白名单清洗富文本,不执行 Office 文件。
|
||||
|
||||
@@ -283,3 +283,10 @@
|
||||
- 只有 `APPROVED` 志愿者可报名;活动行锁、有效报名计数和数据库唯一约束共同防止并发超额与重复报名。
|
||||
- 报名审核、取消、签到、缺席和服务分钟均写不可变历史与审计。服务分钟只允许对已通过、已签到且活动已完成的记录核定,且不得超过活动持续时间。
|
||||
- 公益项目和活动公开接口只返回公开状态内容,不返回志愿者名单或服务对象资料。封面未配置对象存储时不生成假地址或假成功。
|
||||
|
||||
## 财务公开富文本安全(2026-08-13)
|
||||
|
||||
- DOCX 仅在管理端浏览器转换,不由 API 执行或解析 Office 宏;首版不持久化原 Word 文件。
|
||||
- 管理端导入和预览先经 DOMPurify 清洗,API 保存前再次使用独立白名单清洗;禁止脚本、事件属性、iframe、非 HTTPS 链接和非 HTTPS 图片。
|
||||
- 只有管理员与超级管理员默认获得财务公开查看、编辑和发布权限;公众只能访问已发布文档。
|
||||
- 已发布文档禁止原地覆盖编辑,归档后不可公开;发布和归档写入不可变历史与审计。
|
||||
|
||||
@@ -167,3 +167,11 @@ P2:5. 公益项目 6. 公益活动 7. 我要做公益
|
||||
- 生成的人物图片均为虚构品牌场景素材,仅作服务类别与项目视觉,不作为真实服务对象、服务现场或项目成果证据;素材已压缩进入小程序本地包。
|
||||
- 捐赠支付、自动捐赠、捐赠记录/金额、物资订单、志愿者培训/证书/团队不展示入口;代码只保留禁用的集中能力登记和组件/导航扩展边界。
|
||||
- 图片中的金额、满意度、捐赠人数等示例值不得复制;所有运行时数字必须来自已批准接口,缺少事实时使用明确空状态。
|
||||
|
||||
---
|
||||
|
||||
## 13. 财务公开文档体验(2026-08-13)
|
||||
|
||||
- 管理端新增独立“财务公开”导航,支持空白新建、10MB 以内 DOCX 导入、标题/摘要、基础标题与段落、加粗、下划线、列表、对齐、撤销/重做和接近小程序宽度的预览。
|
||||
- Word 的复杂浮动对象、页眉页脚、分页和高级样式允许在导入时简化,发布前必须人工预览确认;首版重点保障段落、标题、列表和表格。
|
||||
- 小程序“公益 → 了解乐活”新增财务公开入口;列表展示置顶、标题、摘要和发布时间,详情使用 rich-text 展示,宽表可横向滚动,加载失败可重试。
|
||||
|
||||
@@ -155,3 +155,13 @@ UAT 不只让开发人员自测。
|
||||
- 微信小程序审核所需材料就绪;
|
||||
- 监控和告警正常;
|
||||
- 可回滚上一版本。
|
||||
|
||||
---
|
||||
|
||||
## 8. 财务公开验收
|
||||
|
||||
- DOCX 可在管理端本地导入,基础标题、段落、列表和表格可继续编辑并预览。
|
||||
- 危险 HTML、脚本、事件属性、iframe 和非 HTTPS 外链不能进入公开正文。
|
||||
- 未登录或无权限人员不能访问管理接口;草稿和归档文档不能从公众接口获取。
|
||||
- 草稿可编辑并使用 revision 防并发覆盖;已发布文档不能覆盖编辑,只能归档。
|
||||
- 创建、发布和归档幂等,状态历史和审计完整;小程序列表、详情、空状态和失败状态可用。
|
||||
|
||||
@@ -6,6 +6,20 @@
|
||||
|
||||
2026-08-13
|
||||
|
||||
任务:财务公开文档发布模块。
|
||||
|
||||
完成:按用户确认的简化范围新增独立财务公开模块。管理后台支持新建空白文档、导入 10MB 内 `.docx`、编辑标题/摘要/置顶/排序、基础富文本排版、小程序宽度预览、保存草稿、直接发布和归档;小程序“公益”页增加财务公开入口,完成公开列表、详情、宽表横向阅读、空状态和错误状态。新增共享契约、`financial_disclosures` 与只追加状态历史、三项独立权限、随机公开 ID、创建/状态幂等、revision 乐观锁、发布/归档事务审计,以及管理端 DOMPurify + API sanitize-html 双层富文本白名单清洗。已发布内容禁止原地覆盖编辑。
|
||||
|
||||
范围:这是用户明确批准的新增模块,但不改变 D-017 对支付和公开募捐的排除。首版不保存原 DOCX、不提供结构化收支字段、财务核算、复杂审批、支付、捐赠订单、银行流水同步或金额统计。Word 复杂浮动对象、页眉页脚和高级分页样式可能简化,发布前必须人工预览。
|
||||
|
||||
验证:格式化、Lint、全仓类型检查和 28 个单元测试通过;新增 migration 已部署到专用 `lehuo_test`,共 9 个 migration;36 个真实 MySQL 集成测试全部通过,覆盖草稿隔离、危险富文本清洗、发布可见、发布后禁止覆盖、归档隐藏、状态历史和审计;小程序页面门禁通过 20 个页面,运行时 workspace 导入门禁通过;全仓生产构建通过。新增 D-018。
|
||||
|
||||
遗留:仍需在微信开发者工具清缓存重新编译并进行真机财务公开列表/详情视觉验收;需用机构实际 DOCX 样本确认复杂表格和排版还原度。真实微信 AppID/AppSecret、合法 HTTPS 域名和生产环境配置仍按既有计划后期提供。
|
||||
|
||||
---
|
||||
|
||||
2026-08-13
|
||||
|
||||
任务:微信真机二级页面白屏修复。
|
||||
|
||||
根因:服务申请和协作任务详情/服务记录页面在运行时从 workspace 包 `@lehuo/contracts` 导入业务常量。现有小程序工程没有生成 `miniprogram_npm`,常规 TypeScript 检查会擦除类型导入并通过,但真机无法解析运行时 workspace 模块,导致页面脚本在 `Page()` 注册前终止并显示空白。另发现内容详情使用非小程序原生 `article` 标签、项目详情使用 `strong` 标签,以及详情页缺少路由参数时可能持续处于加载状态。
|
||||
|
||||
@@ -209,6 +209,20 @@ V1 统计直接从业务事实表计算,不建立可人工覆盖的统计表
|
||||
|
||||
---
|
||||
|
||||
## D-018 财务公开采用受限富文本文档发布
|
||||
|
||||
状态:ACCEPTED
|
||||
|
||||
决定:
|
||||
财务公开作为独立文档发布模块,由管理人员在本地完成文档后导入管理后台、调整基础富文本排版、预览并直接发布,小程序只读查看。状态采用 `DRAFT → PUBLISHED → ARCHIVED`;已发布正文禁止覆盖编辑,创建、发布和归档必须幂等并写不可变状态历史及审计。
|
||||
|
||||
DOCX 仅在管理端浏览器转换,API 保存前对富文本执行服务端白名单清洗。首版不保存原 Word 文件,不建设结构化财务核算、复杂审核、在线募捐、支付、捐赠订单、银行流水同步或金额统计。
|
||||
|
||||
原因:
|
||||
满足机构以现有本地文档进行公开的真实工作方式,降低录入成本,并通过双层富文本清洗、后端权限和发布状态隔离保证公众展示安全;同时避免把轻量公开需求扩大成财务或支付系统。
|
||||
|
||||
---
|
||||
|
||||
## 待确认建议
|
||||
|
||||
Codex 若有会改变已批准架构的建议,只能写在这里,不得直接实施:
|
||||
|
||||
Reference in New Issue
Block a user