feat(old-items): complete reuse workflow and refine miniapp home

This commit is contained in:
2026-08-15 16:38:30 +08:00
parent 65d23eab4a
commit f3737c80be
94 changed files with 7880 additions and 215 deletions
+4 -2
View File
@@ -73,8 +73,8 @@
### 服务
- 服务分类
- 服务申请
- 我的申请
- 帮扶服务(原“服务申请”的公众端名称)
- 我的帮扶服务
- 服务进度
- 我的反馈
- 联系乐活
@@ -106,6 +106,8 @@
## 4. 服务申请
> 公众端统一使用“帮扶服务/帮扶需求”文案;本节“服务申请”是内部业务模型名称,不修改既有 API、状态机和数据口径。
### 4.1 申请类型
- OLD_AGE:老年关爱/为老服务
+34
View File
@@ -485,3 +485,37 @@ Phase 7 不建立可人工修改的统计快照;九项 V1 指标直接从申
- created_by / updated_by / timestamps
`financial_disclosure_status_history` 只追加保存创建、发布和归档事实,请求 UUID 全局唯一。已发布文档禁止覆盖编辑,只能归档;草稿编辑使用 revision 乐观锁。
---
## 24. 旧物善用 Phase 1
- `old_item_donations`:随机 `public_id`、非连续公益编号、捐赠人、幂等键、品类、新旧程度、数量、方式、状态、revision、定向需求、投递点、人工分配人员和真实帮扶人数。
- `old_item_donation_status_history`:只追加保存初始提交和每次状态变化,`request_id` 全局唯一。
- `old_item_donation_files`:关联最多六张已确认的 `OLD_ITEM_DONATION_IMAGE` 私有文件。
- `old_item_needs`:随机公开 ID、品类、区域、受助群体、需求量、已满足量、优先级、排序、发布状态和 revision。
- `old_item_need_status_history`:只追加保存需求发布与下架事实。
- `old_item_drop_off_points`:后台维护的公开投递名称、区域、地址、开放时间、启停和排序。
联系人、手机号、上门取件地址、物品描述、驳回原因和内部轨迹备注加密保存;手机号另存域隔离 HMAC。列表不公开敏感明文,管理端详情读取写审计。全部外键使用 `RESTRICT`,公开资源不暴露自增主键。
---
## 25. 旧物善用 Phase 2 物资台账
- `old_item_inventory_imports`:记录随机公开 ID、创建人幂等键、请求指纹、加密原文件名和导入行数;不保存原 Excel 文件。
- `old_item_inventory_items`:随机公开 ID、非连续台账编号、可选来源捐赠/导入批次、品类、名称、数量、单位、仓位、状态、定向需求、可选受助对象、帮扶区域、加密备注、落地时间和 revision。每个来源捐赠最多绑定一个物资批次,避免重复入库。
- `old_item_inventory_events`:只追加保存入库、分拣、消毒、出库、落地节点,请求 UUID 全局唯一,记录前后状态、时间、位置、加密备注和操作人。
台账状态严格为 `IN_STOCK → SORTED → DISINFECTED → OUTBOUND → DELIVERED`,不允许跳级、回退或覆盖事件。Excel 批量入库在一个事务中创建导入批次、所有物资行、入库事件和审计,任一行无效时整批回滚。受助对象只保存既有内部外键;小程序仅返回流转状态、时间和出库/落地的粗粒度地区。
---
## 26. 旧物善用 Phase 3 荣誉证书与积分
- `old_item_reward_configs`:不可变规则版本,保存证书标题/正文/颁发方/法律声明、四类物资每件积分、单笔积分上限和当前激活标识;新版本不覆盖历史版本。
- `old_item_certificates`:随机公开 ID、非连续证书编号、来源捐赠、规则版本、加密收件人称呼、完整模板快照、签发/撤销幂等指纹、签发与撤销操作者及时间。每笔捐赠最多一张当前有效证书,补发会撤销旧证书但不删除历史。
- `old_item_point_accounts`:每个用户一个荣誉积分账户,保存余额和 revision;余额不得小于零。
- `old_item_point_entries`:只追加积分流水,记录获得/人工校正、变更值、变更后余额、来源捐赠/规则版本、幂等指纹、加密原因和操作人;来源捐赠唯一,防止重复计分。
捐赠完成、证书签发、积分账户更新、积分流水和审计在同一事务提交。积分没有货币价值,不建立兑换订单、商品、转让、提现、到期或排行榜数据结构。
+70
View File
@@ -306,3 +306,73 @@ Phase 0 提供:
- `POST /api/v1/admin/financial-disclosures/:publicId/transition`
创建、发布和归档使用客户端 UUID 幂等;编辑只允许草稿且要求 expectedRevision。状态为 `DRAFT → PUBLISHED → ARCHIVED`,状态变化与历史、审计事务一致。DOCX 在管理端浏览器转换为富文本,API 只接受并白名单清洗富文本,不执行 Office 文件。
---
## 13. 旧物善用 Phase 1 API
公众只读接口:
- `GET /api/v1/old-items/stats`
- `GET /api/v1/old-items/needs`、`GET /api/v1/old-items/needs/:publicId`
- `GET /api/v1/old-items/drop-off-points`
微信会话接口:
- `POST /api/v1/old-items/media/upload-intents`、`POST /api/v1/old-items/media/:publicId/confirm`
- `GET /api/v1/old-items/me/media/:publicId/download`(本人私有图片短期 URL)
- `POST /api/v1/old-items/donations`
- `GET /api/v1/old-items/me/donations`、`GET /api/v1/old-items/me/donations/:publicId`
管理端接口:
- `GET /api/v1/admin/old-items/donations`、`GET /api/v1/admin/old-items/donations/:publicId`
- `GET /api/v1/admin/old-items/assignees`
- `GET /api/v1/admin/old-items/media/:publicId/download`(授权管理人员短期 URL)
- `POST /api/v1/admin/old-items/donations/:publicId/transition`
- `GET/POST /api/v1/admin/old-items/needs`、`GET/PATCH /api/v1/admin/old-items/needs/:publicId`
- `POST /api/v1/admin/old-items/needs/:publicId/transition`
- `POST /api/v1/admin/old-items/drop-off-points`
捐赠创建、需求创建及全部状态变化使用客户端 UUID 幂等。状态变化要求 `expectedRevision`,通过条件更新、只追加历史和审计在一个数据库事务中提交。本人接口按 donor user 强制隔离;管理端敏感详情查看单独审计。图片最多六张,使用私有对象前缀、短期预签名上传和对象元数据确认,不返回永久公开地址。
捐赠主流程为 `SUBMITTED → WAITING_PICKUP/WAITING_DROP_OFF → RECEIVED → PROCESSING → COMPLETED`;审核可进入 `REJECTED`,接收前可进入 `CANCELLED`。完成定向捐赠时在同一事务增加需求已满足数量。统计直接从已接收或已完成捐赠事实计算,不提供人工覆盖接口。
---
## 14. 旧物善用 Phase 2 台账 API
管理端接口:
- `GET/POST /api/v1/admin/old-items/inventory`
- `GET /api/v1/admin/old-items/inventory/:publicId`
- `POST /api/v1/admin/old-items/inventory/import`
- `POST /api/v1/admin/old-items/inventory/:publicId/transition`
- `GET /api/v1/admin/old-items/inventory-export/file`
权限拆分为 `old_item_inventory:read/manage/import/export`。手工入库和批量导入都创建 `IN_STOCK` 主记录与 `INBOUND` 事件;批量导入最多 500 行、全有或全无。状态只允许 `IN_STOCK → SORTED → DISINFECTED → OUTBOUND → DELIVERED`。出库必须绑定定向需求、有效受助对象或帮扶区域之一,落地必须填写实际帮扶人数。所有创建/导入/状态变更使用客户端 UUID、请求指纹、revision、条件更新、只追加事件和事务审计。
导出最多 5000 条,返回用于浏览器生成 `.xlsx` 的最小化结构化行,不包含联系人、手机号、详细地址、受助对象姓名和内部备注,并记录导出审计。小程序既有捐赠详情响应增加 `inventoryTrace`,仅包含状态、时间以及出库/落地的粗粒度地区。
---
## 15. 旧物善用 Phase 3 荣誉 API
微信会话接口:
- `GET /api/v1/old-items/me/rewards`
- `GET /api/v1/old-items/me/certificates/:publicId`
管理端接口:
- `GET /api/v1/admin/old-items/reward-config`
- `POST /api/v1/admin/old-items/reward-config/activate`
- `GET /api/v1/admin/old-items/reward-accounts`
- `POST /api/v1/admin/old-items/reward-accounts/:userPublicId/adjust`
- `GET /api/v1/admin/old-items/certificates`
- `POST /api/v1/admin/old-items/donations/:publicId/certificate`
- `POST /api/v1/admin/old-items/certificates/:publicId/revoke`
管理端权限拆分为 `old_item_rewards:read/manage`。规则激活、补发、撤销和积分调整使用客户端 UUID、请求指纹及事务审计;积分调整还要求账户 `expectedRevision`,不允许调整为负余额。证书模板仅允许固定纯文本占位符,由服务端渲染并作为快照保存,不接受 HTML。本人接口按用户资源归属隔离;不存在公众证书查询接口。
捐赠直接完成或关联物资台账落地时,证书与积分随 `COMPLETED` 状态在同一事务生成。证书补发不会重复计分;规则变更不追溯修改既有证书和流水。
+14
View File
@@ -290,3 +290,17 @@
- 管理端导入和预览先经 DOMPurify 清洗,API 保存前再次使用独立白名单清洗;禁止脚本、事件属性、iframe、非 HTTPS 链接和非 HTTPS 图片。
- 只有管理员与超级管理员默认获得财务公开查看、编辑和发布权限;公众只能访问已发布文档。
- 已发布文档禁止原地覆盖编辑,归档后不可公开;发布和归档写入不可变历史与审计。
## 旧物善用隐私与文件安全(2026-08-15)
- 联系人、手机号、上门取件地址、物品描述、驳回原因和内部轨迹备注加密保存;手机号查询索引使用独立域 HMAC。
- 捐赠图片存入私有对象前缀,上传前校验 MIME、扩展名、大小,确认时校验对象元数据;不返回永久公开 URL。
- 本人捐赠与图片下载执行资源归属校验;管理端详情和图片 URL 获取要求独立权限并写审计。列表只显示脱敏手机号,不记录地址或描述到日志/审计 metadata。
- 公益编号含随机片段,所有外部资源使用随机 UUID,不暴露数据库自增 ID。
- 物资台账的内部备注继续加密;关联受助对象只返回随机公开 ID,不在导出、打印或小程序溯源中返回姓名、手机号、地址或服务描述。
- Excel 只在管理端浏览器解析和生成,API 不执行宏、不保存原工作簿;公式单元格拒绝导入。固定模板最多 500 行,服务端再次执行白名单、类型和状态校验,整批事务失败回滚。
- 台账导出使用独立权限并写审计,最多 5000 条且默认最小化;小程序不公开内部仓位和操作人,仅公开出库/落地地区。
- 电子证书收件人称呼、撤销原因和积分人工校正原因加密保存;管理端证书列表统一显示“爱心用户”,本人登录后才可查看自己的证书正文。
- 证书公开标识和证书编号均不可预测,且不提供无需登录的证书核验接口;本人证书详情执行资源归属校验,防止 IDOR/BOLA。
- 证书模板是服务端校验并转义展示的纯文本,仅允许批准占位符,不执行 HTML;每张证书保存不可变快照,避免模板修改篡改历史凭证。
- 规则激活、自动签发、补发、撤销、积分获得和人工校正均审计;积分账户使用行锁/revision,流水只追加,余额不得为负。
+15
View File
@@ -175,3 +175,18 @@ P2:5. 公益项目 6. 公益活动 7. 我要做公益
- 管理端新增独立“财务公开”导航,支持空白新建、10MB 以内 DOCX 导入、标题/摘要、基础标题与段落、加粗、下划线、列表、对齐、撤销/重做和接近小程序宽度的预览。
- Word 的复杂浮动对象、页眉页脚、分页和高级样式允许在导入时简化,发布前必须人工预览确认;首版重点保障段落、标题、列表和表格。
- 小程序“公益 → 了解乐活”新增财务公开入口;列表展示置顶、标题、摘要和发布时间,详情使用 rich-text 展示,宽表可横向滚动,加载失败可重试。
---
## 14. 首页帮扶服务入口调整(2026-08-15)
- 首页取消关爱老人、困境儿童、妇女帮扶和残障救助四个群体快捷按钮,避免与帮扶服务中的六类真实服务分类重复。
- 功能区改为一个高权重“帮扶服务”横向主入口,下方四列展示志愿服务、公益项目、公益动态和旧物善用;主入口包含用途说明,保持适老化点击区域和清晰层级。
- 小程序公众文案将“服务申请”统一改为“帮扶服务”,将提交动作描述为“提交帮扶需求”;内部数据库、API、权限及状态机仍保留 `ServiceApplication` 语义,不做破坏性改名。
- 帮扶服务分类页六个类别均使用本地品牌场景图。新增图片中的人物和场景均为 AI 生成的虚构视觉素材,仅作类别识别,不作为真实服务对象、服务过程或项目成果证据。
## 15. 首页主功能区与便捷入口调整(2026-08-15)
- “帮扶服务”下方主功能区使用 3×2 六宫格,依次提供志愿服务、公益项目、公益动态、旧物善用、财务公开和服务进度,单项保持清晰文字标签及适老化点击区域。
- 财务公开直接进入已发布文档列表,服务进度直接进入本人帮扶服务列表;两项均复用现有真实页面和权限边界,不新增空白占位页面。
- 服务进度从便捷入口上移至主功能区,避免同页重复;便捷入口取消旧物善用,仅保留公益活动,以及有权限用户可见的协作任务。
+32
View File
@@ -165,3 +165,35 @@ UAT 不只让开发人员自测。
- 未登录或无权限人员不能访问管理接口;草稿和归档文档不能从公众接口获取。
- 草稿可编辑并使用 revision 防并发覆盖;已发布文档不能覆盖编辑,只能归档。
- 创建、发布和归档幂等,状态历史和审计完整;小程序列表、详情、空状态和失败状态可用。
---
## 9. 旧物善用 Phase 1 验收
- 首页和个人中心入口均可到达模块主页;模块主页统计只显示真实业务事实。
- 上门取件必须填写联系人、合法手机号、地址、未来预约时间并由后台选择工作人员;定点投递必须选择已启用点位。
- 最多六张图片通过私有对象存储预签名上传并确认元数据;只有捐赠本人和具备旧物查看权限的后台人员可获取五分钟短期下载 URL,访问需审计。
- 捐赠创建幂等,其他用户不能读取猜测的公开 ID;审核、接收、分拣和完成严格校验 revision 与状态机,每次变化都有不可变历史和审计。
- 需求仅在发布后公开;定向捐赠完成时原子增加已满足数量;统计从接收/完成事实计算,不允许后台人工覆盖。
- 管理端可处理订单、人工分配、发布/下架需求和新增投递点;Phase 2 台账、Excel、证书和积分不得以空按钮冒充完成。
---
## 10. 旧物善用 Phase 2 验收
- 手工入库和标准 Excel 批量入库都生成不可预测台账编号、在库主记录、入库事件和审计;同一请求安全重放,不同内容复用请求 ID 被拒绝。
- Excel 模板具有固定表头、品类下拉、整数数量、日期格式、冻结表头与合理列宽;公式、错误表头、非法品类、非正整数数量、重复来源捐赠和超过 500 行必须拒绝,任一行失败时整批不落库。
- 状态只能按在库、分拣、消毒、出库、落地推进,跳级/回退和过期 revision 被拒绝;出库缺少需求/对象/区域或落地缺少实际帮扶人数时拒绝。
- 详情包含完整只追加事件;导出和打印不包含手机号、地址、受助对象姓名或内部备注,导出有独立权限和审计。
- 关联捐赠的小程序详情只展示脱敏节点、时间和粗粒度帮扶地区,不展示内部仓位、操作人或受助对象个人信息。
---
## 11. 旧物善用 Phase 3 验收
- 捐赠完成时证书、积分账户、积分流水和审计与业务状态同事务提交;同一捐赠不能重复计分或同时存在多张有效证书。
- 规则按不可变版本激活,非法占位符必须拒绝;新规则只影响未来签发,既有证书保留当时标题、正文、颁发方和法律声明快照。
- 证书只能由捐赠本人查看,其他微信用户读取相同随机公开 ID 返回不存在;管理端读取/管理要求独立权限。
- 补发会撤销旧证书并保留历史,显式撤销必须填写原因;重复请求安全重放,竞态状态变化被拒绝。
- 自动积分受品类规则和单笔上限约束;人工调整必须填写原因、校验 revision、生成只追加流水且不能产生负余额。
- 小程序明确展示积分仅为公益荣誉、不可兑换/购买/转让/提现,证书明确不是捐赠收据、税务凭证或财产权利证明。
+73 -3
View File
@@ -4,6 +4,76 @@
## 当前阶段
2026-08-15
任务:小程序首页主功能区与便捷入口调整。
完成:在首页“帮扶服务”下方将次级功能区调整为 3×2 六宫格,保留志愿服务、公益项目、公益动态和旧物善用,新增财务公开与服务进度;财务公开连接既有公开文档列表,服务进度连接本人帮扶服务列表。服务进度从便捷入口上移以避免重复,便捷入口取消旧物善用,当前仅保留公益活动及按权限显示的协作任务。未删除旧物善用模块或其首页主功能入口。
范围:仅调整小程序首页入口信息架构、WXML/WXSS 与既有页面导航;未新增空白占位页面、API、数据库、权限、状态机或 migration。财务公开、服务进度和旧物善用继续沿用既有真实业务与访问控制。
验证:全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过;测试库 12 个 migration 无待执行项。小程序页面完整性门禁通过 28 个页面,运行时 workspace 导入门禁通过。新增 D-023。
遗留:需要用户在微信开发者工具清缓存重新编译,并真机确认 3×2 六宫格在常见屏幕宽度下的间距、文字与点击效果。真实微信、HTTPS 域名和生产环境联调仍按生产就绪计划后期提供。
---
2026-08-15
任务:小程序首页栏目收敛与“帮扶服务”公众端改名。
完成:首页移除关爱老人、困境儿童、妇女帮扶和残障救助四个重复分类按钮,将栏目重排为一个带说明的高权重“帮扶服务”主入口与志愿服务、公益项目、公益动态、旧物善用四个次级入口;首页 Hero、帮扶表单、提交成功、我的帮扶服务、详情、服务聚合页和个人中心公众文案完成统一。服务聚合页分类代码修正为六个共享契约真实值,避免妇女、儿童和生活困难入口无法预选。为困境妇女、儿童关爱、生活困难和其他服务分别生成并压缩四张 900×675 本地 JPG 场景图,申请选择页按六个分类逐一显示图片,不再出现文字占位图。
范围:仅调整小程序公众信息架构、文案、样式和本地视觉素材。内部 `ServiceApplication` API、数据库、状态机、权限和管理端业务名称保持不变;AI 生成人物和场景仅作分类识别,不作为真实服务对象、服务过程或公益成果证据。未新增接口、migration 或业务范围。
验证:全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过;测试库 12 个 migration 无待执行项。小程序页面完整性门禁通过 28 个页面,运行时 workspace 导入门禁通过;四张新增图片均压缩至约 61–74 kB。新增 D-022。
遗留:需要用户在微信开发者工具清缓存重新编译,并真机确认首页新栏目在常见屏幕宽度下的视觉层级、四张分类图裁切和公众文案。真实微信、HTTPS 域名和生产环境联调仍按生产就绪计划后期提供。
---
2026-08-15
任务:旧物善用独立模块 Phase 3 电子荣誉证书与公益荣誉积分。
完成:新增不可变证书/积分规则版本、电子证书快照、积分账户和只追加积分流水;捐赠直接完成或关联台账落地时,在同一事务自动生成证书、按品类和单笔上限计分并写审计。默认每件 1 分、单笔最多 500 分。管理端新增规则激活与证书预览、完成捐赠补发、证书历史/撤销、积分账户和有理由人工校正;规则变更不改历史证书,补发撤销但保留旧证书,校正使用 revision 且不允许负余额。小程序新增证书与荣誉积分总览、只追加流水和本人证书详情,并从模块主页与捐赠详情接入。
范围:积分仅为公益荣誉记录,不具有现金价值,不支持兑换、购买、转让、提现、到期或排行;证书不是捐赠收据、税务凭证或财产权利证明。不新增现金捐赠、支付、自动扣款或第三方物流。既有已完成捐赠不自动批量回填,避免未经核实改写历史;授权人员可依据真实完成记录补发证书,积分补录只能通过有理由审计流水。
验证:Phase 3 migration 已部署到专用 `lehuo_test`,共 12 个 migration,重复 deploy 无待执行项;全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过。新增集成覆盖规则激活幂等、品类计分和单笔上限、完成时自动发证计分、本人资源隔离、他人证书读取拒绝、积分校正幂等、负余额拒绝、证书补发/撤销和审计;小程序页面完整性门禁通过 28 个页面,运行时 workspace 导入门禁通过。npm 官方 Low 级别依赖审计无已知漏洞。新增 D-021。
遗留:仍需在微信开发者工具和真机验收证书排版、长文本及不同屏幕尺寸;正式证书法律文案、机构签章/品牌素材如需替换,后续通过新规则版本发布。真实微信 AppID/AppSecret、合法 HTTPS 域名、生产对象存储和真实环境联调仍按生产就绪计划后期提供。
---
2026-08-15
任务:旧物善用独立模块 Phase 2 物资全流程台账。
完成:新增独立物资导入批次、物资台账和只追加流转事件模型,完成手工入库、最多 500 行原子批量入库、在库/分拣/消毒/出库/帮扶落地严格状态机、物资需求/受助对象/帮扶区域绑定、完整详情、revision 乐观锁、幂等重放、加密备注、事务审计和需求/捐赠完成同步。管理端新增台账页、固定格式 `.xlsx` 模板下载、本地解析与强校验、Excel 导出、打印专用版式和详情推进;小程序捐赠详情新增脱敏物资溯源。新增四项独立权限,导出不含个人字段或内部备注。
范围:仅完成 D-019 已批准的 Phase 2。未实现证书、积分、现金捐赠、支付、自动扣款或第三方物流。原始 Excel 不上传或持久化;异常修正不允许覆盖历史,法务数据保留期限和正式修正流程继续列为生产人工确认项。
验证:Phase 2 migration 已部署到专用 `lehuo_test`,共 11 个 migration,最终重复 deploy 无待执行项;全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过。新增用例覆盖手工入库幂等、禁止跳级、完整五节点状态机、原子批量导入重放、最小化导出和审计;小程序页面完整性门禁通过 26 个页面,运行时 workspace 导入门禁通过。ExcelJS 改为按需加载,管理端首屏 JS 为 241.79 kB;npm 官方 Low 级别依赖审计最终无已知漏洞。
遗留:仍需用微信开发者工具/真机和实际机构 Excel 样本做视觉及兼容验收;真实微信、HTTPS 域名、生产对象存储和法务数据保留期限仍按生产就绪计划后期提供。Phase 3 证书积分等待下一步明确指令。
---
2026-08-15
任务:旧物善用独立模块 Phase 1 核心捐赠闭环。
完成:依据用户四项明确批准新增 D-019 与独立旧物善用域,不包含现金捐赠或任何支付。小程序首页及个人中心增加入口,完成模块主页、真实统计、物资需求、定向捐赠、最多六图、上门取件/定点投递、我的记录、详情溯源和规范指南;公益动态复用既有审核发布内容。管理端新增一级入口及订单审核、人工取件人员选择、状态处理、私有图片短期预览、需求草稿/发布/下架、投递点维护和后续阶段预留说明。后端新增三项权限、随机公开 ID/非连续公益编号、敏感字段加密、域隔离手机号 HMAC、私有对象存储、本人资源隔离、管理端敏感读取审计、创建/状态幂等、revision 乐观锁、事务状态历史和真实事实统计。
范围:本次只完成已批准的第一阶段。物资入库/分拣/消毒/出库全流程台账与 Excel 导入导出打印留到 Phase 2;证书和积分留到 Phase 3;不接第三方物流,取件由后台人工分配。未加入现金捐赠、微信/支付宝/银行卡支付或自动扣款,也未用模拟数据冒充业务事实。
验证:新增 migration 已部署到专用 `lehuo_test`,共 10 个 migration,重复 deploy 无待执行项;Lint、全仓类型检查、28 个单元测试、37 个真实 MySQL 集成测试、格式检查和全仓生产构建通过。新增旧物闭环集成测试覆盖需求发布、定向捐赠幂等、人工分配、接收、分拣、完成、需求数量更新、事实统计、不可变历史和审计。npm 官方高危依赖审计无已知漏洞。
遗留:真实微信 AppID/AppSecret、合法 HTTPS 域名、生产私有对象存储 Bucket/CORS 和微信开发者工具真机视觉/上传验收仍按既有计划后期提供。Phase 2/3 必须等待下一步指令,不得提前实施。
---
2026-08-13
任务:财务公开文档发布模块。
@@ -140,7 +210,7 @@
## 当前正在处理
Phase 6 及 Phase 7 可自动化开发与本地生产工程验证均已完成。Phase 7 的 staging、UAT 和 production deployment 仍需真实环境、微信配置、合规材料及人工审批,保持未完成;当前不得宣称已生产上线。
小程序首页主功能区与便捷入口调整已完成代码和自动化验证;当前等待用户执行微信开发者工具/真机视觉验收。原 Phase 7 的 staging、UAT 和 production deployment 仍需真实环境、微信配置、合规材料及人工审批,保持未完成;当前不得宣称已生产上线。
---
@@ -286,10 +356,10 @@ YYYY-MM-DD
## 已知问题
无已知 Phase 5 代码问题。生产阻断项和人工配置见 `17_PRODUCTION_READINESS_PLAN.md`。
无已知本次首页入口调整代码问题。首页 3×2 六宫格、四张帮扶分类图片的缩略裁切及公众文案仍需微信开发者工具和真机做最终视觉验收;生产阻断项和人工配置见 `17_PRODUCTION_READINESS_PLAN.md`。
---
## 下一步
等待用户提供或确认外部生产资源后,依次执行 staging 全闭环、非开发人员 UAT、真实微信联调和 production deployment;不得跳过发布清单或审批。
等待用户在微信开发者工具清缓存重新编译并真机验收首页 3×2 六宫格、财务公开与服务进度入口、便捷入口精简、帮扶服务六分类图片及相关公众文案。生产发布仍需依次执行 staging 全闭环、非开发人员 UAT、真实微信联调和 production deployment,不得跳过发布清单或审批。
+62
View File
@@ -223,6 +223,68 @@ DOCX 仅在管理端浏览器转换,API 保存前对富文本执行服务端
---
## D-019 旧物善用采用独立域并分三阶段交付
状态:ACCEPTED
决定:用户于 2026-08-15 明确批准在 D-017 原延期边界之外新增“旧物善用”独立模块,但继续排除现金捐赠、微信/支付宝/银行卡支付和自动扣款。模块沿用现有账号、登录态和安全基线,新增独立路由、后台菜单、权限、API 和数据表,不修改既有服务申请与公益项目状态机。
交付分三阶段:第一阶段实现真实旧物捐赠提交、最多六张私有图片、上门取件或定点投递、后台人工审核与人员分配边界、状态溯源、物资需求发布与定向捐赠、真实事实统计;第二阶段实现入库/分拣/消毒/出库/帮扶落地台账及 Excel 导入导出打印;第三阶段实现电子证书和公益积分。第一阶段不接第三方物流,取件人员由后台人工安排;未实施能力只保留模块边界,不显示可操作伪入口。
捐赠状态为 `SUBMITTED → WAITING_PICKUP/WAITING_DROP_OFF → RECEIVED → PROCESSING → COMPLETED`,并允许审核驳回与接收前取消。需求状态为 `DRAFT → PUBLISHED → FULFILLED/CLOSED`。所有创建和状态变更使用客户端 UUID 幂等、revision 乐观锁、不可变历史和事务审计。联系人、手机号、取件地址、物品描述、驳回原因加密保存;手机号另存域隔离 HMAC;公开资源使用随机 UUID 和非连续公益编号。统计只从已接收/已完成事实计算,不允许人工覆盖。
原因:满足用户新增的实物公益闭环,同时把物流、仓储台账、证书积分与支付等风险不同的能力拆开交付,避免以空页面、模拟数据或未审计状态冒充完成。
---
## D-020 旧物台账采用原子批量入库与只追加流转事件
状态:ACCEPTED
决定:旧物善用 Phase 2 使用一条物资批次主记录配合只追加流转事件,状态固定为 `IN_STOCK → SORTED → DISINFECTED → OUTBOUND → DELIVERED`,禁止跳级、回退和覆盖历史。来源捐赠最多绑定一个物资批次;关联台账在分拣和落地时同步捐赠处理/完成事实,定向需求满足数量只在落地事务中增加。
Excel 在管理端浏览器本地读取和生成,API 只接收固定结构、最多 500 行的已解析数据,不保存或执行原始工作簿。导入批次、全部物资行、入库事件和审计全有或全无;导出使用独立权限、最多 5000 条且排除个人字段和内部备注。小程序只公开状态、时间及出库/落地的粗粒度地区。
原因:防止部分导入、重复入库、越级完成、覆盖审计事实和表格携带宏/公式进入服务端,同时使物资去向可追溯但不扩大受助对象隐私暴露面。
---
## D-021 旧物善用积分仅作为公益荣誉记录
状态:ACCEPTED
决定:Phase 3 的积分只记录旧物捐赠参与,不具有现金价值,不支持兑换、购买、转让、提现、到期或排行。默认每件物资 1 分、单笔最多 500 分;管理端可激活不可变规则版本,按四类物资配置未来计分,但不得覆盖既有流水。自动计分只发生在捐赠真实进入 `COMPLETED` 时,并与证书、状态历史和审计在同一事务提交;证书补发不得重复计分。人工校正必须填写原因、校验 revision、写只追加流水且不得产生负余额。
证书使用纯文本模板和固定占位符,每次签发保存完整快照。新模板只影响未来证书;补发会撤销但不删除旧证书。证书收件人称呼加密保存,仅本人会话可查看,不提供匿名公开核验。法律声明固定明确证书仅记录公益参与,不是捐赠收据、税务凭证或财产权利证明。既有已完成捐赠不自动批量回填,必要时由授权人员依据真实记录补发并审计。
原因:在满足公益激励与纪念需求的同时,避免积分被误解为支付、资产或消费体系,防止规则变更重写历史,并保证完成事实、荣誉凭证和积分账目一致可追溯。
---
## D-022 公众端使用“帮扶服务”名称并收敛首页入口
状态:ACCEPTED
决定:按用户 2026-08-15 的明确要求,小程序公众端将“服务申请”统一展示为“帮扶服务”,提交内容称为“帮扶需求”;首页移除关爱老人、困境儿童、妇女帮扶和残障救助四个重复分类快捷按钮,改为一个高权重帮扶服务主入口与志愿服务、公益项目、公益动态、旧物善用四个次级入口。六类具体服务仍在帮扶服务选择页完整保留。
本次仅调整公众信息架构、视觉资源和用户文案。为保持已上线契约兼容,内部 `ServiceApplication` 数据模型、API 路径、共享枚举、后台业务名称和状态机不改名。新增四张虚构 AI 场景图只用于分类识别,不构成真实公益服务或成果证明。
原因:首页分类入口与下级选择重复且同级入口过多;“帮扶服务”更直接表达群众可以获得的服务,同时避免因纯展示改名引入数据库/API 迁移风险。
---
## D-023 首页主功能区补充财务公开与服务进度
状态:ACCEPTED
决定:按用户 2026-08-15 的明确要求,小程序首页“帮扶服务”下方主功能区由四项调整为 3×2 六宫格,保留志愿服务、公益项目、公益动态和旧物善用,并加入财务公开与服务进度。财务公开进入既有公开文档列表,服务进度进入本人帮扶服务列表,不新增占位页或新业务接口。
服务进度从下方便捷入口上移,避免同页重复;便捷入口取消旧物善用,仅保留公益活动,以及具备授权时显示的协作任务。旧物善用模块本身及首页主功能入口继续保留,不删除既有业务能力。
原因:提高财务透明内容和个人服务跟进的首页可达性,同时减少便捷入口重复和冗余;3×2 布局可保持适老化点击面积与清晰文字标签。
---
## 待确认建议
Codex 若有会改变已批准架构的建议,只能写在这里,不得直接实施:
+13 -12
View File
@@ -379,32 +379,33 @@ CTA 不超过 1 个。
---
## 6.6 服务分类
## 6.6 首页功能栏目
四个核心:
一个高权重主入口:
```text
关爱老人
困境妇女
儿童关爱
残障帮扶
帮扶服务
```
补充:
六个次级入口,使用 3×2 布局:
```text
志愿服务
公益项目
爱心活动
更多服务
公益动态
旧物善用
财务公开
服务进度
```
每项:
具体服务类别进入帮扶服务后选择,不在首页重复展示。每项:
- 图标;
- 文字;
- 点击区域 >= 48px。
“服务进度”在主功能区提供入口后,不在下方便捷入口重复展示;便捷入口不展示“旧物善用”。
---
## 6.7 服务进度
@@ -446,7 +447,7 @@ CTA 不超过 1 个。
---
# 七、服务申请页面
# 七、帮扶服务页面(内部模型:服务申请)
## 7.1 页面原则
@@ -802,7 +803,7 @@ V1 中证书/荣誉可先预留,不强做。
V1 建议优先:
```text
我的服务申请
我的帮扶服务
我的活动
我的志愿服务
我的消息
+32
View File
@@ -0,0 +1,32 @@
# 18 旧物善用分阶段实施计划
## 已批准边界
2026-08-15 用户批准新增独立“旧物善用”模块;不包含现金捐赠、微信/支付宝/银行卡支付或自动扣款。沿用现有登录、权限、安全、对象存储和审计架构。
## Phase 1:核心捐赠闭环(已完成)
- 小程序首页与个人中心入口、模块主页、真实统计、需求公示、指南和公益动态复用。
- 捐赠提交:四类物品、新旧程度、数量、描述、最多六图、上门取件或定点投递、定向需求。
- 我的记录:状态筛选、公益编号、详情与不可变时间线。
- 管理端:订单列表/详情、审核通过/驳回、人工取件边界、接收、分拣、完成帮扶;需求草稿、发布和下架。
- 安全:资源归属、独立权限、敏感字段加密、幂等、乐观锁、事务状态历史和审计。
## Phase 2:物资全流程台账(已完成)
已实现手工入库、标准 Excel 模板下载与最多 500 行原子批量入库、分拣、消毒、出库、绑定物资需求/受助对象/帮扶区域、帮扶落地、完整流转详情、最小化 Excel 导出和打印。小程序捐赠详情展示脱敏后的物资流转节点,不展示内部仓位、操作人员、受助对象姓名或联系方式。
台账模板采用固定中文表头,品类带下拉校验,数量为整数、日期使用真实日期单元格并冻结表头;浏览器本地读取 `.xlsx` 后将结构化数据提交 API,API 不持久化原始 Excel。导入批次、每条入库记录和所有状态变化均幂等、事务化并审计;任何一行失败时整批回滚,不产生部分成功数据。已落地节点不允许覆盖或回退,法务数据保留期限和异常修正流程仍作为生产人工确认项保留,不以删除历史或直接改库替代。
## Phase 3:证书与公益荣誉积分(已完成)
- 捐赠进入 `COMPLETED` 时,在同一数据库事务生成电子荣誉证书、积分账户及只追加积分流水;失败则捐赠完成状态一并回滚。
- 管理端支持激活不可变版本的证书模板与按品类积分规则、证书补发/撤销、积分有理由人工校正;新模板只作用于未来证书,旧证书保存完整快照。
- 小程序支持本人查看积分余额、只追加流水、证书列表与证书详情;其他用户不能读取猜测到的证书公开 ID。
- 默认规则为每件 1 分、单笔最多 500 分;积分仅记录公益荣誉,不可兑换、购买、转让、提现或参与排行,不设现金价值。
- 证书明确声明仅记录公益参与,不是捐赠收据、税务凭证或财产权利证明;收件人称呼加密保存,管理端列表不展示明文。
- 既有已完成捐赠不自动批量回填;管理人员可按真实完成事实补发证书,历史积分如需补录只能通过有理由、可审计的校正流水处理。
## 外部配置
真实微信 AppID/AppSecret、合法 HTTPS 域名、小程序隐私声明、对象存储生产 Bucket/CORS 和真机联调仍按生产就绪计划后期提供。本阶段不使用测试配置冒充外部联调完成。