15 KiB
15 KiB
杨俊报销就绪:执行计划
1. 生产写入前门禁
- 只读复核活动 server 构建标识、Compose 项目、4 个 systemd service 当前
BUILD_SHA、timer enabled/active、最近源端备份与 ARM 新鲜度;输出仅限状态和计数。 - 使用活动部署的显式合同参数重装 automatic backup 的 daily/watchdog/drill-reminder units。
- 使用活动部署的显式合同参数重装 WARCH3 unit。
- 验证以下 4 个 service 的
BUILD_SHA全部等于活动 server,相关 timers 为 enabled/active:hyb-oa-automatic-backup-daily.servicehyb-oa-automatic-backup-watchdog.servicehyb-oa-automatic-backup-drill-reminder.servicehyb-oa-warch3-ops.service
- 手工启动一次 automatic backup daily service;确认源端
Result=success、ExecMainStatus=0。 - 在 ARM 只读验证新批次完成、manifest/文件完整性与新鲜度检查通过;任何失败均停止人员写入。
2. 杨俊单人导入
- 从管理员导出的通讯录以管道/内存方式筛选杨俊一人,不生成持久化子集文件,不输出个人字段。
- 在生产容器运行 dry-run,验收计数:输入 1、active 1、incomplete 0、planned create 1、conflict 0、skip 0、failure 0。
- dry-run 符合预期,无需进入偏差处理分支。
- 经本任务最终实施批准后,使用
docker-compose exec -T -e WECOM_DIRECTORY_EXPORT_APPLY ... --input=- --apply写入唯一目标。 - 只读验证杨俊 OA 员工为 active、企微绑定唯一、初始角色严格为
employee,且其余通讯录成员未进入本轮输入或写入。 - 确认生产企微通讯录写回门禁关闭;本轮同步结果为 skipped,未调用企微成员写接口。
3. 设置真实直属主管
- 写入前记录杨俊原
direct_manager_id的脱敏状态,并确认马建勇为 active、不同员工且具有expense.approve。 - 通过现有
POST /api/users/batch/set-manager仅将杨俊的主管设置为马建勇;不直写数据库、不调整任何人的角色。 - 写后验证主管解析成功,并核对
SYSTEM_USERS_BATCH_SET_MANAGER审计增量;该接口合同不递增目标员工 token version 或撤销会话。 - 主管写入成功,未进入失败或误配回退分支。
4. 聚焦验证
- 运行通讯录导入相关测试,覆盖手机号为空、单目标和 apply 双门禁。
- 运行 users set-manager 路由测试,覆盖 active、自指、审计和权限边界。
- 运行 workflow/reimbursement 聚焦测试,覆盖主管解析、
expense.approve、无差旅申请和绑定票据提交门禁。 - 运行
cd server && npm run prisma:validate;代码未变化时仍将结果作为当前合同基线记录。 - 运行 Trellis task/governance、流程/文档、敏感扫描和
git diff --check。 - 按项目规则对权限、workflow 和生产写入证据做一次只读 review;Codex inline 主代理复核通过,未发现角色扩权、企微反向写入、审批自审或生产测试业务数据。
5. 两个既有企微测试成员的受控验收
- 从管理员通讯录以内存方式仅筛选“测试员工”和“测试主管”,验证二者唯一、active、资料满足导入合同;不输出或持久化原始字段。
- 生产 dry-run 验收输入 2、计划创建 2、冲突/跳过/失败 0;偏差即停止。
- 单独取得生产测试账号/业务写入批准后 apply,并确认两人 active、企微绑定各自唯一、没有导入其他成员。
- 通过现有角色接口将角色收敛为:测试员工=
employee,测试主管=employee + manager;核对 token version、会话撤销及角色审计。 - 通过现有主管接口设置“测试员工 → 测试主管”,确认测试主管 active 且具有
expense.approve。 - 两个测试成员均完成账号密码登录与首次改密,申请人可见报销入口、主管可见审批入口;企微 SSO 因不能冒充企微身份仍待人工确认。
- 测试员工创建唯一一条描述含“系统测试、非真实业务、禁止付款”、总额 0.01 元的测试报销,并上传不含真实资料的安全 PDF。
- 合成 PDF 经生产 mock OCR 自动生成测试字段并标记可用,绑定后成功提交;该结果同时暴露真实使用前必须移除 mock OCR 的门禁。
- 测试主管确认待办可见并执行“退回”,未执行“通过”;报销回到
draft且 workflow instance 终止,无需追加“撤回”。 - 测试员工删除 draft 报销;票据解绑回到
available后已手工归档。 - 管理员停用两个测试 OA 账号并确认会话撤销、企微写回为 skipped;企微侧两个测试成员保持不变。
- 只读收口确认:测试报销 0、pending 待办 0、测试票据唯一且为 manual archived、两个测试 OA 账号为 archived、活动会话 0、企微绑定保留 2;未产生测试付款。
5.1 真实发票路径门禁
- 只读确认生产当前为
OCR_PROVIDER=mock,腾讯 OCR 凭证未配置。 - 用户选定“关闭 mock 并采用财务查看 PDF 原件人工核对”;本轮不改代码、不部署新构建。
- 生产
.env已切换为OCR_PROVIDER=off;现场无独立 worker 且JOBS_ENABLED=true,因此仅强制重建 server。公网/ready正常,构建仍为4886f9b081dd。 - 重新启用两个测试 OA 账号并完成受控 API 闭环:新 PDF 直接
available,八个发票业务字段为空、OCR 尝试为 0,绑定、提交、主管退回均成功。 - 复验后删除测试报销、归档测试票据、停用测试 OA 账号;最终活动会话 0、测试报销 0、pending 待办 0、未归档测试票据 0,企微同步均为 skipped。
- 记录非阻断 schema finding:off 路径未显式写 provider,但
ocr_provider因非空默认值仍存tencent;请求/完成时间和 OCR 结果为空,当前 UI 不展示该字段。
6. 用户真实验收
- 在杨俊提交前通过现有审批规则管理接口把三档规则收敛为唯一
[0,+∞)规则,审批链固定为department_manager → finance;不扩角色、不保留 CEO 重复节点。 - 规则写入前后只读核对 499.99 / 500 / 5000 三个金额,确认解析结果完全相同且 active
finance有唯一实际处理人。 - 请杨俊本人从企业微信进入 OA,确认身份解析成功并能看到报销入口。
- 杨俊使用真实业务数据创建报销,至少添加一条费用明细并上传/绑定状态有效的真实票据后提交。
- 确认马建勇能看到该真实审批待办并按业务事实处理。
- 审批通过后确认单据进入王芝玲负责的财务处理链路;后续付款批次继续遵守既有 maker-checker。
- 用户验收期间不在聊天、截图或任务证据中粘贴票据、金额、银行资料或完整账号。
6.1 审批详情可达性修复
- 保留移动待办列表卡片现有
handleTaskSelection行为,不修改任务列表到审批任务详情的路由。 - 在
MobileApprovalsPage的审批任务详情报销摘要区增加“查看完整报销单”,复用/mobile/reimbursements/:id和现有state.from来源回跳约定。 - 在
WorkflowTaskDetailPage的报销摘要区增加“查看报销单”,复用 PC 报销详情路由。 - 不修改后端、审批状态机、权限矩阵或生产数据;请假、采购、差旅同类入口缺口仅记录,不在本轮扩展。
- 增加聚焦前端回归,验证移动进入/返回及 PC 入口;运行前端 typecheck、build、Trellis task/governance 和
git diff --check。
6.2 审批详情入口生产发布
- 将工作提交
d2841b1推送后,以SYNC_ENV=0按标准发布脚本部署;未覆盖生产.env,未修改审批状态、真实业务数据或付款数据。 - 第一次发布尝试在同步前因附件挂载目标解析不匹配停止,生产未变化;按活动容器的实际挂载目标修正输入后重新执行。
- 发布来源校验、环境合同、远端 Compose 校验、Prisma migration status、
/ready、external deps smoke、runtime smoke 与公网资源扫描均通过,活动构建为d2841b166dc0。 - 使用既有 unit 中的受控合同参数重装 automatic backup 三项 service/timer 与 WARCH3 service/timer;第一次读取活动容器时因未向 Compose 显式传入构建变量而在 unit 写入前失败,补齐目标构建参数后成功。
- 4 个 service 的
BUILD_SHA均与活动构建一致;4 个 timer 均为 enabled/active。 - 手工触发 automatic backup daily,源端
Result=success、ExecMainStatus=0;随后源端 watchdog 同为success/0。daily 只有在 ARM receiver 完成三文件、manifest 与 SHA-256 校验并原子 finalize 后才会成功。 - ARM dead-man timer 保持 enabled/active,最近一次自动运行是
success/0;本次尝试立即手工复跑被已收口的最小权限策略拒绝,未恢复临时 sudo、未改 ARM。不得把该证据写成“独立 dead-man 已对新批次即时复跑”。 - 公网
/ready构建标识匹配,已发布的移动端和 PC 资源分别包含“查看完整报销单”和“查看报销单”;未读取、截图或输出真实报销内容。
7. 完成条件
- PRD 全部验收项有脱敏证据或明确由用户完成的真实业务验收结果。
- 本任务未导入杨俊和两个既有测试成员之外的其他成员、未创建法体、未补银行资料;唯一测试业务数据已按受控生命周期清理/归档。
- 若只完成系统就绪而真实报销尚未提交,任务保持未完成并明确剩余用户操作,不用合成测试替代。
- 完成后归档本任务,返回 R63–R66 产品主线;不从本任务继续长出新的运维加固范围。
8. 已完成的脱敏证据
- timer:4 个 service 构建合同一致,4 个 timer 均 enabled/active。
- 备份:源端真实批次
success/0,ARM 独立 dead-mansuccess/0。 - 通讯录 dry-run:输入 1、active 1、缺手机号 1、incomplete 0、计划创建 1、冲突/跳过/失败 0。
- 通讯录 apply:创建 1、成功 1、冲突/跳过/失败 0;角色严格为
employee,企微绑定唯一。 - 主管接口:状态 200、更新 1、
SYSTEM_USERS_BATCH_SET_MANAGER审计新增 1;企微外部写入 0。 - 主数据:active 费用类型 37,active 报销工作流定义 1。
- 本地回归:5 个测试文件、61 项测试通过;Prisma schema 校验通过。
- 公网检查:
/ready为 ok、构建标识匹配,首页 HTTP 200。 - 只读 review:本轮只写 OA 员工、身份绑定和 OA 主管关系;未修改角色矩阵、workflow 代码、状态机、数据库 schema 或企微成员资料。
- 测试账号受控闭环:dry-run/apply 2/2、最小角色和主管关系通过;普通浏览器双账号登录、首次改密、0.01 元测试报销、合成 PDF 上传、提交、主管退回、草稿删除、票据归档均通过;最终 OA 测试账号 archived 2、活动会话 0、企微同步 skipped 2、测试报销与 pending 待办均为 0。
- finding:生产 OCR 为 mock 且真实腾讯 OCR 未配置,合成 PDF 自动生成 Mock 字段;草稿删除后页面导航前产生已删除详情/precheck 的 404 控制台噪声。前者阻断杨俊真实票据上传,后者不阻断业务。
- OCR off 复验:配置切换后未改构建;三次有业务写入的复验/诊断均按“退回 → 删除 → 归档 → 停用”收口。累计 4 张合成测试票据(含第一轮)均已归档,未归档 0;测试报销与 pending 待办均为 0。
- OCR off 结论:空发票业务字段可以绑定并提交,主管退回成功;真实使用暂由财务查看 PDF 原件并人工核对。文件 SHA-256 查重仍有效,发票号查重暂不可用。
- 真实首跑复核:三名参与人 active 且企微绑定唯一,但企微首登均未发生;费用标准 0、适用预算池 0、active 法体 0,法体不阻断当前报销。历史 mock 票据仅 1 张且为测试账号上传,非测试员工为 0。
- 审批规则 finding:
[0,500)可由马建勇和唯一 finance 王芝玲处理;[500,5000)与[5000,+∞)均以finance_mgr收尾,但 activefinance_mgr=0,达到 500 元会形成无人处理待办。未修正规则前不得笼统通知杨俊可提交。 - 审批规则收口:写入前报销 reviewing/工作流 pending/待办 pending 均为 0;备份 watchdog 与 ARM dead-man 均为 success。正式接口更新 3 次、审计新增 3,生产仅剩 1 条
[0,+∞)active 规则。 - 金额边界验证:实际工作流构造函数对 499.99、500、5000 均输出
department_manager → finance;直属主管解析到马建勇,active finance 唯一且由王芝玲承担。写后仍无报销、实例或待办新增,公网 ready 正常、构建标识未变化。 - 真实报销生产只读核验:杨俊最新真实报销为
reviewing,工作流为pending,当前唯一待办为主管审批且已指派主管;付款批次 0。未输出金额、单号、UUID、附件或原始 payload,未执行生产写入。 - 真实验收 finding:主管能进入审批任务详情,但该页只有报销摘要,没有费用明细、发票、附件或完整报销单入口;因此尚未按业务事实审批。
- 审批详情入口本地实现:移动任务详情新增“查看完整报销单”,复用移动报销详情和
state.from;PC 任务详情新增“查看报销单”。未修改后端、权限矩阵、审批状态机或列表卡片点击行为。 - 首次聚焦 Playwright 运行因本地前端服务未启动,9 个用例均在
/login前以ERR_CONNECTION_REFUSED失败,未执行到功能断言;启动 Vite 后改为只跑本次相关用例。 - 移动聚焦用例首次进入/返回链路通过,随后因固定在 2026-05 的“已处理”测试数据超过页面最近 30 天窗口而失败;已把完成时间改为运行时近期时间,避免日历漂移。
- 最终本地验证:
npm run typecheck通过,npm run build通过;移动审批入口聚焦 Playwright 1/1 通过,PC 审批入口聚焦 Playwright 1/1 通过。 - 交付门禁:当前 task validate、Trellis governance、process contract、敏感扫描和
git diff --check均通过;文档注册审计为 0 error、1 条既有未注册文档汇总 warning。 - 生产发布:
d2841b166dc0已部署,迁移无待执行项,发布脚本的/ready、外部依赖、运行时和公网资源扫描通过;生产.env未同步。 - 发布后运维身份:automatic backup 三项与 WARCH3 共 4 个 service 均匹配活动构建,4 个 timer 均 enabled/active;新 automatic backup daily 和源端 watchdog 均为
success/0。 - ARM 证据边界:新批次已由 receiver 校验并 finalize;ARM dead-man timer enabled/active、最近自动结果
success/0,但本次没有扩大 sudo 权限来即时手工复跑独立 dead-man。 - 公网入口:生产移动资源存在“查看完整报销单”,PC 资源存在“查看报销单”;只验证静态发布资源和构建身份,不读取真实报销数据。