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)
这个提交包含在:
+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` |
|
||||
|
||||
---
|
||||
|
||||
在新工单中引用
屏蔽一个用户