# 公司财务报销系统部署记录

## 2026-06-09 01:09:53 +0800：审批发起人/模板实时读取部署

### 部署目标

将本地最新报销审批闭环改动部署到云端正式 `company-finance` 服务：

- 审批发起人改为“当前和机器人对话并确认提交的飞书用户”；
- `公司统一报销申请（测试）` 模板继续作为联调模板，流程走通后作为正式模板维护；
- 云端正式提交前必须能实时读取飞书审批模板，不依赖本地映射兜底；
- webhook 回调解析、状态归一化、回写路径补充测试覆盖。

### 云端路径

- 公网入口：`https://wwyl.yipeng.online/finance-reimbursement/`
- systemd：`company-finance`
- 后端路径：`/srv/company-finance/current`
- 文档路径：`/srv/company-finance/docs`
- 内部端口：`127.0.0.1:8102`
- 数据库：`company_finance`

### 本次同步文件

- `backend/src/services/reimbursement-approval-service.js`
- `backend/src/services/feishu-approval-service.js`
- `backend/src/services/feishu-callback-service.js`
- `backend/test/approval-submission-service.test.js`
- `backend/test/feishu-callback-service.test.js`
- `backend/package.json`
- `docs/feishu_reimbursement_approval_backend_flow.md`

### 云端环境修正

已补入：

- `FEISHU_APP_ID`
- `FEISHU_APP_SECRET`
- `FEISHU_REIMBURSEMENT_APPROVAL_CODE=04E7B2B1-DCD7-44E1-84DA-7590CDD3DFE1`

仍待补：

- `FEISHU_CALLBACK_VERIFICATION_TOKEN`：当前云端 health 显示未配置。真实 webhook 回写前，需要从飞书开放平台事件订阅/回调配置复制 verification token 到 `/etc/company-finance/company-finance.env`，重启服务后再验证。

### 部署前备份

云端已在 `/srv/company-finance/backups/` 创建部署前备份：

- `company-finance-current-before-approval-user-context-20260609_010200.tar.gz`

环境变量文件也已按修改时间点创建 `.bak.*` 备份，位于 `/etc/company-finance/`。

### 验证结果

云端执行：

- `npm ci --omit=dev`：通过；
- `npm run check`：通过；
- `npm run test:unit`：15 个测试全部通过；
- `npm run db:migrate`：通过，数据库 `company_finance`，表数 17；
- `systemctl restart company-finance`：成功，服务 active；
- 内部 `/health`：`local_trial_only=false`，数据库模式 `postgresql`；
- 公网 `/finance-reimbursement/health`：200，数据库模式 `postgresql`；
- 云端 `POST /api/reimbursements/approval/prepare`：通过，且：
  - `template_source=feishu_openapi`；
  - `submit_ready=true`；
  - `missing_count=0`；
  - `applicant_source=request_context`；
  - `request_context_user_configured=true`。

验证用草稿已删除，最终正式库计数：

- `intake_draft_count=0`
- `reimbursement_order_count=0`

### 后续待办

1. 配置 `FEISHU_CALLBACK_VERIFICATION_TOKEN` 并重启 `company-finance`；
2. 用真实飞书会话用户 ID/open_id 走一次 submit，但必须先给用户发送审批预览并取得明确确认；
3. 等待飞书 webhook 回调，确认状态能从 `APPROVAL_PENDING` 更新为 `APPROVED` / `REJECTED`；
4. 确认审批通过后的“待打款/已打款”状态切换边界。
