feat(server): 委派回收并发防重 + 最小门禁闸门

- delegationRevokeJob 改用 FOR UPDATE SKIP LOCKED + UPDATE RETURNING 原子认领
- regression-workflow-actions 新增 RUN_DELEGATION_CONCURRENCY_CHECK 并发校验开关
- README 补充最小门禁与并发语义说明
这个提交包含在:
2026-02-08 11:38:58 +08:00
父节点 4c7018ca4a
当前提交 0cd44a3d6a
共修改 4 个文件,包含 166 行新增和 53 行删除
+18
查看文件
@@ -43,6 +43,16 @@ cd /home/shunli/Projects/hyb-oa/server
./scripts/smoke-test.sh
```
### 2.6 本地最小门禁(P1-b)
```bash
cd /home/shunli/Projects/hyb-oa
./scripts/check-minimal.sh
```
说明:
- 该脚本只做静态/构建级门禁,不启动服务与数据库。
- 全量回归仍通过 `server/scripts/regression-all.sh` 执行。
## 3. 1 分钟快速验证
```bash
cd /home/shunli/Projects/hyb-oa/server
@@ -72,6 +82,12 @@ cd /home/shunli/Projects/hyb-oa/server
./scripts/regression-workflow-actions.sh
```
可选并发校验:
```bash
cd /home/shunli/Projects/hyb-oa/server
RUN_DELEGATION_CONCURRENCY_CHECK=1 ./scripts/regression-workflow-actions.sh
```
覆盖场景:
- `reject`:实例=`rejected`,报销=`rejected`
- `return`:实例=`terminated`,报销=`draft`
@@ -93,6 +109,7 @@ cd /home/shunli/Projects/hyb-oa/server
- `pay` 幂等冲突:已付款后提交冲突凭证字段返回 `409 VALID_001`(`already_paid_conflict`)
- `delegation`:有效期内可代办并在 history 写入 delegation 证据
- `delegation` 过期:代理人返回 `PERM_002`,自动回收任务可撤销过期委派
- `delegation` 并发回收(可选):`RUN_DELEGATION_CONCURRENCY_CHECK=1` 时双并发只回收一次并仅写一条自动回收审计
### 4.4 一键全量回归
```bash
@@ -145,6 +162,7 @@ npm run dev
- `GET /api/delegations/mine`:查看我发起/我接收的委派
- `POST /api/delegations/:id/revoke`:撤销委派
- 委派仅作用于 `assignee_id` 任务,不改写 `assignee_role` 语义。
- 自动回收实现采用 `FOR UPDATE SKIP LOCKED + UPDATE ... RETURNING`,多实例并发下确保同一委派仅回收一次。
### 5.3 OCR 异步状态查询
- 上传发票在 OCR 开启且 `ocr_type=vat` 时会进入 `pending_ocr`。