feat(server): P5 基础能力补齐(组织/报销/代办/认证安全)
- 组织/人员/委派对齐:费用类型、部门、员工别名、配置只读与回归脚本(F2/F3/F26/F27/F29/F31/F40) - 报销单 PATCH/DELETE 与 items CRUD(事务内重算 total_amount)(F4/F5) - 行政代提交/代上传后端校验与审计(F7/F8) - 认证安全基线:首次登录改密、失败锁定、弱密码拦截与回归脚本(F36/F37/F39/F41)
这个提交包含在:
+37
-3
@@ -56,6 +56,17 @@ npm run seed:trialrun
|
||||
- `TRIALRUN_ADMIN_PASSWORD` 为空时会生成并打印一次性口令(请立刻保存)。
|
||||
- 若管理员已存在,脚本只确保其为 active 且具备 `admin+employee` 角色,不会改动密码。
|
||||
|
||||
### 2.3.1 认证安全说明(P5)
|
||||
- `POST /api/auth/login` 成功响应包含 `mustChangePassword`:
|
||||
- `true`:表示该账号处于“首次登录/管理员重置密码后”状态;前端应强制引导改密后再进入业务页。
|
||||
- 改密接口:`POST /api/auth/change-password`(需要 `authorization: Bearer <token>` + `x-device-fingerprint`)。
|
||||
- 登录失败锁定(默认):
|
||||
- 15 分钟内失败 5 次会锁定 30 分钟,返回 `423 AUTH_002`(含 `lockedUntil`)。
|
||||
- 解锁:`POST /api/users/:id/unlock`(权限:`system.users`)。
|
||||
- 弱密码拦截:
|
||||
- 采用 `zxcvbn` 评分,默认 `score < 2` 拒绝(返回 `VALID_001.details.password`)。
|
||||
- 可通过 `WEAK_PASSWORD_CHECK_ENABLED=false` 关闭(不建议生产关闭)。
|
||||
|
||||
### 2.4 启动服务
|
||||
```bash
|
||||
cd /home/shunli/Projects/hyb-oa/server
|
||||
@@ -160,11 +171,25 @@ cd /home/shunli/Projects/hyb-oa/server
|
||||
RUN_AUDIT_REGRESSION=0 RUN_OCR_REGRESSION=0 ./scripts/regression-all.sh
|
||||
```
|
||||
|
||||
可选打开组织/配置回归(org + settings):
|
||||
```bash
|
||||
cd /home/shunli/Projects/hyb-oa/server
|
||||
RUN_ORG_SETTINGS_REGRESSION=1 ./scripts/regression-all.sh
|
||||
```
|
||||
|
||||
可选打开认证安全回归(auth security):
|
||||
```bash
|
||||
cd /home/shunli/Projects/hyb-oa/server
|
||||
RUN_AUTH_SECURITY_REGRESSION=1 ./scripts/regression-all.sh
|
||||
```
|
||||
|
||||
独立执行:
|
||||
```bash
|
||||
cd /home/shunli/Projects/hyb-oa/server
|
||||
./scripts/regression-audit.sh
|
||||
OCR_PROVIDER=mock ./scripts/regression-ocr.sh
|
||||
./scripts/regression-org-settings.sh
|
||||
./scripts/regression-auth-security.sh
|
||||
```
|
||||
|
||||
### 4.5 Postman 回归
|
||||
@@ -258,18 +283,27 @@ cd /home/shunli/Projects/hyb-oa
|
||||
- `GET /api/workflow/tasks/:taskId`:任务详情(实例、报销摘要、可执行动作、处理历史)。
|
||||
- `GET /api/workflow/approvers`:转审候选人列表(active + 具备 `expense.approve`)。
|
||||
|
||||
### 5.6 列表查询接口(P3)
|
||||
### 5.6 部门管理(P5 蓝图 F26)
|
||||
- `GET /api/departments`:部门列表 + 树(登录即可;默认不含归档部门)
|
||||
- 可选:`GET /api/departments?includeArchived=1`(包含归档部门)
|
||||
- `POST /api/departments`:创建部门(`system.users`)
|
||||
- `PATCH /api/departments/:id`:更新部门(`system.users`;已归档禁止修改;禁止形成父子环)
|
||||
- `POST /api/departments/:id/archive`:归档部门(`system.users`)
|
||||
- 归档约束:有子部门/有在职员工则禁止归档
|
||||
- 幂等:已归档重复调用返回 `outcome=already_archived`
|
||||
|
||||
### 5.7 列表查询接口(P3)
|
||||
- `GET /api/reimbursements`:支持 `page/pageSize/status/scope`。
|
||||
- `GET /api/invoice-pool`:支持 `page/pageSize/status/ownerScope`。
|
||||
|
||||
### 5.7 定时任务(可手动执行)
|
||||
### 5.8 定时任务(可手动执行)
|
||||
```bash
|
||||
cd /home/shunli/Projects/hyb-oa/server
|
||||
npm run job:revoke-expired-delegations
|
||||
npm run job:ocr-once
|
||||
```
|
||||
|
||||
### 5.8 账号与角色管理(E17,试运行运营)
|
||||
### 5.9 账号与角色管理(E17,试运行运营)
|
||||
- `GET /api/users`:员工列表(分页/搜索)
|
||||
- `POST /api/users`:创建员工(含初始密码)
|
||||
- `POST /api/users/:id/disable`:禁用员工(tokenVersion+1 + 撤销 refresh)
|
||||
|
||||
在新工单中引用
屏蔽一个用户