8.6 KiB
财务后台定位与主导航减法:设计
1. 设计结论
本任务只有一个可交付阶段:定位固化 + 三个固定 feature flag 的受控关闭。project_domain_v1 原为唯一条件目标,但 2026-08-11 本地真实浏览器回归证明关闭后会让报销项目关联控件产生误导性降级,因此已从生产目标剔除。任务不引入导航层级,不修改产品代码,不部署候选。合同、采购、资产的“二级入口”是延后事项,不是本轮第二个实现阶段。
首次生产尝试前的“零代码”定义为:client/src、server/src、scripts、migration、依赖和部署配置零 diff;只允许 task、事实源、治理 spec 和必要的当前计划纠偏。生产变化由已部署功能管理页调用既有 batch API 完成。首次尝试因观察缺陷安全恢复后,用户另行批准一个最小本地例外:只可新增/修改 scripts/qa 纯状态机和对应单元测试,产品运行代码、API、schema、依赖与部署配置继续零 diff。
2. 产品边界模型
| 域 | 定位 | 当前动作 |
|---|---|---|
| 报销、票据/OCR、审批、付款、AP | OA 主办且要求真实使用 | 保持开启;真实摩擦出现后才开小产品 task |
| 合同、采购、资产 | OA 低频台账 | 保持可用与冻结;暂留一级入口 |
| 认证、权限、审计、备份恢复、离职撤权 | 治理底线 | 不按使用频率削减 |
| 通讯录、请假、考勤、员工日常协作 | 企微主办、OA 留存/接管 | 不与企微争夺日常入口 |
| 公告、普通待办、周报 | 当前无使用证据、非核心 | 三个 flag force_off,代码与数据保留 |
| 项目 | 当前无使用证据,但报销等保留域会查询项目 | 本地跨域回归未通过,维持现状 |
| 绩效、薪资、ERP/集成、预算、Cutover | 超出当前规模的候选 | 只登记退役审查,不执行退役 |
3. 现有运行路径
管理员 /system/feature-flags
-> GET /api/system/feature-flags(读取现场 version/effective)
-> 选择恰好三项 + force_off + 统一 note
-> POST /api/system/feature-flags/batch(一次)
-> 一个 Prisma transaction
-> 每项 expectedVersion 校验
-> 每项 updateMany version+1
-> 每项 FEATURE_FLAG_UPDATED audit
-> GET flags/navigation/changelog(只读验证)
batch 端点保留每项既有 rolloutType 和 departmentIds,任一 version conflict 会回滚整个事务。它比三次单项 PUT 更适合作为“严格一次”的配置写入。
4. 影响合同
| Flag | 导航消失 | 后端/聚合副作用 | 保留边界 |
|---|---|---|---|
announcements_v1 |
公告 | 公告 API(含写接口)disabled;Portal/搜索不再聚合公告 | 通知记录和通知中心不在此 flag 范围;这是关闭而非仅隐藏,临时发公告前须先重新开启 |
todo_board_v1 |
普通待办 | todos API disabled;Portal/搜索不再聚合普通事项 | 待我处理 审批任务不是普通待办,必须保留 |
weekly_report_v1 |
周报 | weekly-reports API disabled;Portal/搜索不再聚合周报 | 历史表保留 |
project_domain_v1(已排除) |
项目 | /api/projects* disabled;Portal/搜索和其他页面的项目候选为空/失败 |
本地证明未关联控件无关闭说明、已关联控件丢失当前项目并回落到“不关联项目”,不得进入生产 target |
三个最终目标的直接路由 disabled 是预期结果,因此这不是“仅 CSS 隐藏”。计划仍称为导航减法,是因为用户可见目标是收缩入口;技术实现同时冻结了三个无数据模块的后端入口,且完全可逆。项目 flag 明确保留开启,不属于本轮生产变化。
5. 执行门禁
5.1 本地门禁
- 只修改文档/spec/task,不运行产品构建或发布。
- 校正
docs/产品口径.md中 OA 主办域及 P0-10,避免“项目仍是活跃 OA 主办主线”与新定位冲突。 - 替换 governance 中的 A/B 未决门为双轴结论:范围收缩、核心流程采用。
- 搜索当前非归档任务中的 R63–R66 前向引用,只纠正会驱动未来扩建的说明;不改历史归档材料。
5.2 项目 flag 本地准入
- 使用本地服务、真实路由和浏览器,不修改产品代码。
- 准备或复用两张本地报销:一张
projectId=null,一张关联现有项目;记录原始显示。 - 只在本地将
project_domain_v1临时设为force_off,验证两张详情:页面加载只是基础条件;还必须检查项目控件的可见/禁用/错误状态,以及已关联项目名称、编号和关联事实是否仍正确。 - 网络证据确认
/api/projects的 disabled 响应如何被 UI 消费,不能只看 DOM 终态。 - 恢复本地 flag snapshot。任一可见错误、误导性空列表、已关联项目丢失或恢复失败,生产方案固定为三项。
5.3 生产 PRE(另批)
- 确认唯一 trialrun、运行 SHA 与已知已部署候选一致、migration 无 pending;本地文档领先不得误判为产品漂移。
- 复用已审查的只读普查能力现场确认三个最终目标模块仍为零数据/零真人活动;有效只读查询严格一次、零 retry。
- GET flags 保存三个最终目标的完整 snapshot 与审计基线;断言 target 恰好存在、effective on、无并发 version 变化。
- GET impact 断言返回的导航和后端影响与本设计一致。
- 审计粒度以实际 batch 路由为准:每个 target 各写一条
FEATURE_FLAG_UPDATED,没有独立 batch 审计;三个目标的预期全局增量是 3,不是 4。
5.4 生产 APPLY(再次明确批准)
- 使用既有管理员凭据现场登录;凭据不得进入 argv、env、历史、日志或证据。
- 在现有功能管理页选择恰好三个最终目标,批量“强制关闭”,填写统一说明;网络证据必须显示
POST /api/system/feature-flags/batch恰好一次。 - 禁止单项保存、刷新后重试、workspace PATCH、其他配置或业务页面 mutation。
5.5 POST
- 三个最终 target 全部 effective off、reason
flag_force_off、version 各 +1、audit 各 +1。 - 管理员
/api/system/navigation的所有 section 均不含公告、普通待办、周报;项目及其他保留导航仍存在。 - GET 三个最终 target 的直达模块得到 409/disabled,不得 401、5xx 或意外业务数据。
- 只读打开 Portal、报销、合同、采购、资产;项目 flag 保持开启,报销等保留域的项目选项不得因本轮变化而降级;不允许页面整体失败或产生业务 mutation。
6. APPLY_UNCERTAIN 与回滚
- POST 通道中断、输出缺失、响应不可解析或本地观察器与响应矛盾:进入
APPLY_UNCERTAIN。在任何重试、回滚或补偿写入之前,第一动作必须只读 GET 三项当前 version、overrideMode 和 effective 状态,再用审计/changelog 交叉验证;未定性前所有配置 mutation 都被禁止。 - 最终 target 均 version +1 且 off:定性为已落地,继续 POST 检查,禁止重试。
- 最终 target 均保持 PRE snapshot:定性为未落地,停止并重新申请,不在现场重试。
- 出现部分更新:违反事务合同,记录为产品/运行发现并停止;不得用手工单项修补掩盖。
- 若生产批准明确包含回滚,且前向结果已经只读定性为已落地、随后保留域页面或项目关联显示合同真实失败,才可用一次 batch 将最终 target 恢复为 PRE 的 overrideMode;预授权不允许跳过写入定性。rollout/departments 本来未变,rollback note 明确原因。否则停下请求批准。
6.1 下一次前向写入的本地准入
- 修正执行器的观察范围:
page.on("request")只统计页面发出的请求,不能用于判断context.request.fetch/APIRequestContext的 batch 次数;要么让 batch 由页面真实发出,要么直接围绕调用函数、响应和服务端 readback 计数。 - 增加本地回归:batch 实际成功、response
count=3、页面观察为 0 时,执行器必须进入只读定性;GET 为 POST 状态则继续验证,rollback 次数必须为 0。 - 同时覆盖响应缺失但 GET 为 POST、响应缺失但 GET 为 PRE、GET 失败、部分状态四条分支。该准入通过前不得申请新的生产前向写入。
7. 延后设计
合同、采购、资产二级入口需要改变扁平导航模型,是产品代码与部署工作。当前只有极低真人使用证据,引入层级的维护成本高于收益,因此不设计 schema、不建子 task、不列为本轮 AC。触发条件是:核心财务链有多名真人持续使用,并出现“一级导航过载”的明确反馈。