feat(server): 完成 P3 后端API与回归(D2~D9)

- workflow: 任务详情/转审候选/列表分页字段(D5)
- reimbursements: 列表API + pay凭证字段/幂等增强(D7)
- invoice-pool: 列表/详情API + 上传pending_ocr(D9)
- ocr/audit: mock provider + 回归脚本 + regression-all开关(D2/D3)
- CI: 新增 ci-minimal / ci-regression 工作流(D4)
这个提交包含在:
2026-02-08 23:08:18 +08:00
父节点 17a6ff4ee0
当前提交 65e7b37ebd
共修改 14 个文件,包含 1681 行新增和 41 行删除
+26 -4
查看文件
@@ -117,7 +117,20 @@ cd /home/shunli/Projects/hyb-oa/server
./scripts/regression-all.sh
```
串联 `smoke-test.sh + regression-dedup.sh + regression-workflow-actions.sh`,适用于 CI 或发版前检查。
串联 `smoke-test.sh + regression-dedup.sh + regression-workflow-actions.sh + regression-audit.sh + regression-ocr.sh`,适用于 CI 或发版前检查。
可选关闭审计/OCR:
```bash
cd /home/shunli/Projects/hyb-oa/server
RUN_AUDIT_REGRESSION=0 RUN_OCR_REGRESSION=0 ./scripts/regression-all.sh
```
独立执行:
```bash
cd /home/shunli/Projects/hyb-oa/server
./scripts/regression-audit.sh
OCR_PROVIDER=mock ./scripts/regression-ocr.sh
```
### 4.5 Postman 回归
- Collection: `server/postman/hyb-oa.postman_collection.json`
@@ -173,7 +186,16 @@ npm run dev
- 权限:`system.audit.view`(finance_mgr/admin)
- 支持分页与筛选(actor/action/targetType/date range)。
### 5.5 定时任务(可手动执行)
### 5.5 工作流查询增强(P3)
- `GET /api/workflow/tasks`:支持 `status/page/pageSize`,返回 `page/pageSize/total/items`。
- `GET /api/workflow/tasks/:taskId`:任务详情(实例、报销摘要、可执行动作、处理历史)。
- `GET /api/workflow/approvers`:转审候选人列表(active + 具备 `expense.approve`)。
### 5.6 列表查询接口(P3)
- `GET /api/reimbursements`:支持 `page/pageSize/status/scope`。
- `GET /api/invoice-pool`:支持 `page/pageSize/status/ownerScope`。
### 5.7 定时任务(可手动执行)
```bash
cd /home/shunli/Projects/hyb-oa/server
npm run job:revoke-expired-delegations
@@ -190,7 +212,7 @@ npm run job:ocr-once
- `SIGNED_URL_TTL_SECONDS`: 默认 `600`
- `MAX_UPLOAD_SIZE_BYTES`: 默认 `10485760`(10MB)
- `DELEGATION_REVOKE_CRON`: 委派自动回收定时表达式(默认 `0 * * * *`)
- `OCR_PROVIDER`: `off` 或 `tencent`(默认 `off`)
- `OCR_PROVIDER`: `off` / `mock` / `tencent`(默认 `off`)
- `OCR_BATCH_SIZE`: 每轮 OCR 认领数量(默认 `10`)
- `OCR_LOCK_TTL_SECONDS`: OCR 锁超时秒数(默认 `300`)
- `OCR_POLL_CRON`: OCR 轮询 cron(默认 `* * * * *`)
@@ -211,7 +233,7 @@ npm run job:ocr-once
| signed-url 接口返回 403 | `JWT_SECRET` 不一致、token 过期、访问人无权限 | 统一服务密钥、确认 URL 在 TTL 内、检查账号角色 |
| 上传返回 `file_too_large` | 文件超 `MAX_UPLOAD_SIZE_BYTES` | 调整环境变量或使用更小文件 |
| 上传失败且报目录/权限错误 | `STORAGE_DIR` 不存在或不可写 | 创建目录并修正权限;Docker 需确认 volume 挂载 |
| OCR 长期停留 `pending_ocr` | `OCR_PROVIDER=off` 或密钥无效 | 检查 OCR 环境变量,手动执行 `npm run job:ocr-once` 验证 |
| OCR 长期停留 `pending_ocr` | `OCR_PROVIDER=off`、mock未开启或腾讯密钥无效 | 检查 OCR 环境变量,优先用 `OCR_PROVIDER=mock npm run job:ocr-once` 验证链路 |
| 委派过期后仍可操作 | 自动回收任务未运行 | 检查 `DELEGATION_REVOKE_CRON`,手动执行 `npm run job:revoke-expired-delegations` |
---