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
+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` 状态在同一事务生成。证书补发不会重复计分;规则变更不追溯修改既有证书和流水。