# 方案计划文档管理系统:项目进展与后续工作计划 > 更新日期:2026-07-30 > 当前契约基线:`DMS_FUNCTION_CONTRACT.md` 1.2、`DMS_API_CONTRACT.md` 1.2 > 当前 OpenAPI 版本:1.2.0 > 文档用途:统一记录当前完成范围、未完成事项、风险、验收条件和建议执行顺序。 ## 1. 当前总体结论 项目已经完成第一阶段核心业务系统的前后端框架、MySQL 持久化、文件存储、认证鉴权、审计、统计、回收站和大部分真实业务闭环。 从代码和自动化测试角度看,第一阶段核心功能已经基本完成;从正式交付角度看,仍有以下关键事项需要关闭: 1. 将正式 `dms` 主库从迁移 `0001_initial_schema` 升级至 `0002_add_restore_audit_action`,验证三类文档恢复; 2. 固化数据库、JWT、文件存储和 UI 字典等部署配置; 3. 建立稳定 Git 提交基线; 4. 如需支持 DOC、DOCX、XLS、XLSX 在线预览,需单独升级契约并实现 Office 转 PDF 预览链路。 因此,当前状态可概括为: - **核心业务开发:基本完成** - **自动化测试:覆盖较完整** - **测试环境真实联调:Q1 已通过独立验收** - **正式数据库升级:未完成** - **可重复部署与正式交付:未完成** - **Office 文档在线预览:未实现** ## 2. 已确认的系统范围 ### 2.1 第一阶段已纳入范围 - 用户登录、退出和登录状态恢复; - 组织机构、人员查询; - 方案分类树查询和管理; - 主案、子方案管理; - 全员共享附件库; - 共享附件与主案的多对多挂载; - 主案权限配置及子方案动态继承; - 文档上传、批量导入、元数据编辑、逻辑删除; - PDF 在线预览和原始文件下载; - 操作日志审计和统计分析; - 回收站查询和单条文档恢复; - MySQL 结构化数据持久化; - 后端指定目录文件持久化; - 统一 UI 中文字典配置。 ### 2.2 当前明确暂缓 - Milvus、文档向量化和语义检索; - 现有 AI 抽取、标注和修复模块改造; - 电子签章; - 审批工作流; - 在线 Office 编辑; - Office 转 PDF; - 国产数据库和国产操作系统适配; - 动态角色与菜单配置平台; - 复杂文档历史版本; - 匿名访问; - 分类、用户和组织恢复; - 批量恢复、物理删除和回收站自动清理; - 子方案独立权限; - 共享附件独立 ACL。 ## 3. 已完成的基础架构 ### 3.1 前端基础 - 已建立统一 HTTP 客户端; - 已统一处理 `/api/v1` 基础路径; - 已实现 Bearer Token 注入; - 已实现统一响应、业务错误和 `requestId` 解析; - 已实现统一 401 登录失效处理; - 已实现 `sessionStorage` 与 `localStorage` 两种登录保持策略; - 已实现 DTO 运行时严格校验; - 已实现加载、空数据、失败、重试和并发请求保护; - 已使用 `AbortController`、防抖和请求版本号避免旧响应覆盖; - 已建立认证、分类、组织人员、文档、附件、挂载、权限、审计、统计、回收站和字典等功能模块。 ### 3.2 后端基础 - 已建立 Flask `/api/v1` 业务接口框架; - 已建立统一成功响应、错误响应和 `X-Request-Id`; - 已实现 JWT 认证和 `auth_version` 旧 Token 失效机制; - 已采用 Argon2id 保存密码哈希; - 已实现角色、状态、密级、可见范围和 ACL 集中授权; - 已实现统一审计服务; - 已建立 OpenAPI 3.0.3 机器可读契约; - 已建立 Alembic 数据库迁移机制; - 已实现显式、幂等的开发数据初始化命令; - 已保留现有 AI 模块,不与 DMS 持久化改造耦合。 ### 3.3 持久化和文件存储 - 结构化数据库使用 MySQL 8; - 采用 7 张核心业务表的最小化设计; - 核心数据采用逻辑删除; - 业务表包含新增、更新和删除时间; - 使用适量冗余字段降低列表和统计查询复杂度; - 文件保存在后端存储根目录,数据库只保存安全相对路径; - 正式默认目录为 `backend/dms-storage/`; - 测试环境使用独立的 `backend/dms-test-storage/`; - 临时上传文件和正式原文件分目录管理; - 文件名使用 UUID,保留原始文件名元数据; - 已实现文件大小、SHA-256、扩展名、文件头和 Office 容器校验; - 已实现路径穿越、ZIP 炸弹、异常容器和越界符号链接防护; - 已实现文件操作与数据库事务之间的失败补偿。 ## 4. 已完成的业务功能 ### 4.1 认证和角色入口 已实现: - 登录; - 当前用户查询; - 登录状态恢复; - 退出登录; - 注销后旧 Token 失效; - 用户禁用、删除和认证版本检查; - 登录成功、登录失败和退出审计; - 后端返回 `allowedModules`,前端据此展示导航。 当前角色边界: | 角色 | 当前入口和能力 | |---|---| | `ADMIN` | 文档浏览、后台管理;管理分类、方案、附件、挂载和权限 | | `AUDITOR` | 日志审计和审计统计;默认不能管理文档 | | `USER` | 浏览有权访问的已发布方案;查看、下载共享附件 | ### 4.2 组织机构和人员 已实现: - 组织树查询; - 组织名称和编码搜索; - 命中节点保留祖先; - 人员关键词、组织、状态和分页查询; - 包含下级组织查询; - 管理员权限配置界面使用真实组织和人员数据。 当前系统只提供组织和人员只读查询,用户、组织的完整增删改管理不在第一阶段范围内。 ### 4.3 方案分类 已实现: - 分类树查询; - 分类名称和编码搜索; - 新增顶级分类和子分类; - 编辑名称、类型和排序; - 移动分类; - 逻辑删除; - 分类占用冲突检查; - `rowVersion` 乐观锁; - 分类路径递归更新; - 关联方案分类冗余同步; - 分类管理审计。 前端已实现分类层级下拉展示: - 父分类在子分类之前; - 子级相对父级缩进; - 每级使用两个全角空格; - 使用字符串 ID; - 只向后端提交 `categoryId`,不提交路径和中文标签。 ### 4.4 主案和子方案 已实现: - 主案列表、全部方案和最近更新; - 关键词、分类、状态、密级、时间、排序和分页查询; - 文档详情; - 主案直属子方案查询; - 主案和子方案上传; - 批量导入; - 元数据编辑; - 逻辑删除; - 主案存在子方案时阻止删除; - 子方案动态继承主案可见范围和 ACL; - 独立状态和密级授权判断; - 查看次数和下载次数统计; - 查看和下载审计。 ### 4.5 共享附件库 已实现: - 独立共享附件列表; - 附件详情; - 关键词、类型、扩展名、更新时间、排序和分页; - 单文件上传和批量导入; - 元数据编辑; - 逻辑删除; - 已挂载附件删除冲突; - 附件反向查询已挂载主案; - 所有正常登录用户查看和下载共享附件。 共享附件当前固定规则: - `documentType = ATTACHMENT` - `securityLevel = PUBLIC` - `visibilityType = ALL_AUTHENTICATED` - 不进入方案分类; - 不配置独立 ACL; - 文件和元数据只保存一份。 ### 4.6 附件挂载 已实现: - 主案挂载一个或多个共享附件; - 请求内去重; - 已有挂载幂等处理; - 稳定挂载排序; - 解除挂载; - 解除后重新挂载创建新关系; - 主案附件计数重算; - 主案版本控制; - 正向和反向挂载查询同步; - 挂载、解绑审计; - 并发冲突和关系不存在错误处理。 挂载只建立引用,不复制文件;解除挂载也不会删除附件或影响其他主案。 ### 4.7 文档权限 已实现: - 主案权限读取和全集保存; - 子方案动态继承主案权限; - 共享附件不配置 ACL; - `ALL_AUTHENTICATED`、`ORGANIZATION`、`CUSTOM` 三种可见范围; - 组织、人员和混合主体; - `VIEW`、`DOWNLOAD`、`EDIT`、`DELETE`、`CONFIG_PERMISSION` 五类动作; - 主体有效性检查; - 权限名称快照; - 权限全集差异保存; - `rowVersion` 乐观锁; - 权限修改审计; - 文档列表、详情和下载共用集中授权逻辑。 当前为固定三角色加文档 ACL 的最小权限模型,不是完整动态 RBAC 平台。 ### 4.8 文件上传、预览和下载 已实现: - PDF、DOC、DOCX、XLS、XLSX 上传; - 单文件上传; - 多文件批量导入; - 文件逐项成功或失败结果; - PDF 浏览器内在线预览; - DOC、DOCX、XLS、XLSX 返回 `415 PREVIEW_UNAVAILABLE`; - 所有支持类型的原始文件下载; - `Content-Disposition filename*` 中文文件名; - CORS 暴露 `Content-Disposition` 和 `X-Request-Id`; - 下载计数和下载审计; - Blob URL 和临时下载节点清理。 当前出现“当前文件类型暂不支持在线预览”是已定义行为,不是接口故障。若要在线预览 Office 文件,需要新增服务端 Office 转 PDF 能力。 ### 4.9 审计日志和统计 已实现: - 审计日志分页查询; - 关键词、用户、组织、目标、动作、结果、目标类型和 UTC 时间筛选; - 文档数量统计; - 今日查看人数; - 日、周、月操作趋势; - 动作分布; - 活跃用户; - 数据库聚合和稳定排序; - 查询审计日志本身不再产生审计; - 审计页面按角色隔离。 ### 4.10 回收站和恢复 已实现: - 管理员回收站入口; - 已删除文档筛选、排序和分页; - 主案、子方案和共享附件单条恢复; - 严格文件完整性复检; - 主案 ACL 和挂载关系按删除批次及契约规则恢复; - 子方案父主案和分类有效性校验; - 共享附件恢复后保持固定共享属性; - 关系冲突检测; - 恢复计数重算; - `RESTORE_DOCUMENT` 审计; - `rowVersion` 乐观锁; - 废止旧恢复路径。 对应数据库迁移为: ```text 0002_add_restore_audit_action ``` 该迁移扩展恢复审计动作约束,并增加回收站查询索引。 ### 4.11 统一 UI 中文字典 后端 Q1-B 已完成: - 统一 UI 字典 JSON 配置; - 14 组正式字典; - 启动时严格校验; - 外部 UTF-8 JSON 覆盖; - 加载后使用只读内存结构; - `GET /api/v1/config/ui-dictionaries`; - 字典接口不产生业务查询或审计; - 契约升级至 1.2; - OpenAPI 升级至 1.2.0。 前端 Q1-F 已完成: - 登录恢复后统一加载字典; - 严格响应 DTO 校验; - 并发请求去重; - 登出和 401 时清理; - 字典加载失败时阻止关键表单提交; - 密级、状态、可见范围、文档类型、附件类型、审计枚举等统一显示中文; - 请求仍提交正式英文 code; - 分类选择项按层级缩进。 Q1-R1 已恢复三个标准测试账号密码,Q1-F-R1 已使用真实账号完成登录、刷新恢复、退出、旧 Token 失效、字典加载、分类层级和英文 code 提交验证。Q1-V 独立验收结论为通过,未使用人工签发 JWT。 ## 5. 当前接口和契约状态 正式 OpenAPI 当前共定义 31 条 `/api/v1` 路径,覆盖: - 健康检查; - 认证; - 当前用户; - 组织和人员; - UI 字典; - 分类; - 文档和附件; - 预览和下载; - 子方案; - 挂载; - 权限; - 审计和统计; - 回收站和恢复。 契约优先级为: 1. 用户在统领会话中最新确认的规则; 2. `DMS_FUNCTION_CONTRACT.md`; 3. `DMS_API_CONTRACT.md`; 4. `FUNCTION_AND_API_SPECIFICATION.md`; 5. `CODEX_BACKEND_PERSISTENCE_GUIDE.md`; 6. 当前代码、模拟数据和历史对话。 后续功能如果改变正式业务语义,应先升级契约,再修改 OpenAPI 和代码。 ## 6. 测试和质量状态 各阶段已经持续执行: - 后端 DMS 自动化测试; - 既有 AI 回归测试; - 前端单元测试; - 前端类型检查; - 前端生产构建; - Python 编译检查; - OpenAPI 解析和外部引用检查; - Flask 路由与 OpenAPI 一致性检查; - MySQL 真实接口测试; - Edge 浏览器真实页面测试; - 文件路径、大小和 SHA-256 检查; - 逻辑删除、版本冲突、权限和审计验证。 最近阶段报告结果: | 验证项 | 最近报告结果 | |---|---:| | Q1-B 后端完整回归 | 337 passed | | Q1-B 无测试环境变量 | 79 passed, 258 skipped | | Q1-F 前端测试 | 40 个测试文件,226 项通过 | | Q1-F 类型检查 | 通过 | | Q1-F 构建 | 通过 | | Python compileall | 通过 | 注意: - 上述数字来自各执行会话的阶段报告; - 最终交付前仍应由集成验证会话基于固定 Git 基线再执行一次全量回归; - 前端仍有单块体积过大的构建警告; - 当前工作区存在大量未提交和未跟踪文件,尚未形成稳定交付版本。 ## 7. 当前运行和访问状态 Q1 验收时使用的前端 `9346` 和后端 `8755` 均已完成真实浏览器验证。2026-07-30 工程整理时未发现上述端口仍有监听进程,后续点测应按部署或开发启动说明重新启动服务。 不得把当前临时启动参数直接作为生产部署配置。 ## 8. 后续必须完成的工作 ### 8.1 已完成:恢复测试账号并完成 Q1 真实登录验收 执行顺序: 1. 会话3仅在 `dms_test` 中恢复已存在的 `admin`、`auditor`、`user` 测试密码; 2. 禁止新建用户、重建测试库或清理其他业务数据; 3. 使用正式登录接口确认三类账号均可登录; 4. 会话2禁止手工签发 JWT,使用真实密码完成 Q1-F 浏览器补验; 5. 验证每个会话只加载一次 UI 字典; 6. 验证分类缩进、中文标签和英文 code 提交; 7. 由集成验证会话复核结果。 完成标准: - 三类账号通过真实登录页面登录; - 登录、字典加载、刷新恢复和退出形成闭环; - 不再使用临时或人工签发 JWT 作为验收依据; - Q1-F 报告不存在环境阻塞。 完成结果:Q1-R1-A、Q1-F-R1 和 Q1-V 均已通过,本项不再阻塞后续工作。 ### 8.2 P0:升级正式主库至 0002 集成审查已经发现 `dms` 主库仍为 `0001_initial_schema`。这会导致正式主库不能写入 `RESTORE_DOCUMENT` 审计,并缺少回收站索引。 执行要求: 1. 备份正式主库; 2. 核对当前数据库确实为 `dms`; 3. 执行 Alembic 升级至 `0002_add_restore_audit_action`; 4. 检查审计 CHECK 已包含 `RESTORE_DOCUMENT`; 5. 检查回收站索引存在; 6. 分别对 MAIN、SUB_PLAN、ATTACHMENT 执行一次正式恢复冒烟; 7. 验证文档、关系、计数和审计同一事务提交; 8. 验证失败恢复不会留下部分数据。 该工作涉及正式主库写操作,必须在备份和明确授权后执行。 ### 8.3 P0:固化安全运行配置 需要形成可重复部署配置,至少包括: - `DMS_DATABASE_URL` - `DMS_JWT_SECRET` - `DMS_STORAGE_ROOT` - `DMS_UI_DICTIONARY_CONFIG_PATH` - `DMS_MAX_FILE_SIZE` - `DMS_MAX_UPLOAD_SIZE` - `DMS_BATCH_MAX_FILES` - `DMS_BUSINESS_TIMEZONE` - 前端 `VITE_API_BASE_URL` 要求: - 使用独立 MySQL 应用账号,不使用 root 作为生产账号; - JWT 使用足够长度的随机密钥; - 密钥和数据库密码不提交 Git; - 存储目录具有明确读写权限和备份策略; - UI 字典配置修改后通过重启生效; - 区分开发、测试和生产环境; - 编写启动、迁移、回滚、备份和健康检查说明。 ### 8.4 P0:建立稳定 Git 交付基线 当前前后端、契约、迁移和测试存在大量未提交或未跟踪文件。 需要: 1. 核对所有工作区差异; 2. 排除密码、Token、测试临时文件和本地存储文件; 3. 确认 `.gitignore`; 4. 运行最终全量测试; 5. 按契约、后端、前端和部署文档合理拆分或形成一个明确基线提交; 6. 为该版本打标签或记录发布版本; 7. 后续功能基于稳定分支继续开发。 ## 9. 建议后续完善的工作 ### 9.1 P1:Office 文档在线预览 当前只有 PDF 可以在线预览。DOC、DOCX、XLS、XLSX 返回 415 是正式契约规定的当前行为。 如需要在线预览,建议采用: ```text 原始 Office 文件 → 服务端转换服务 → 生成受控 PDF 派生文件 → 浏览器使用现有 PDF 预览器展示 ``` 建议要求: - 优先使用无界面的服务端转换组件; - WPS 或 LibreOffice 作为可替换转换适配器; - 不依赖人工打开桌面 WPS; - 原始文件保持唯一事实来源; - 转换产物保存到独立派生目录; - 使用源文件 SHA-256、转换器版本和参数生成缓存键; - 转换失败不得影响原始文件下载; - 转换进程设置超时、并发、隔离目录和资源限制; - 对宏、外链、嵌入对象和畸形文档进行安全限制; - 保持权限检查、审计和 `requestId`; - Windows/WPS 和后续国产化环境通过适配层隔离。 该功能会改变正式预览语义,建议: - 功能契约升级至 1.3; - API 契约升级至 1.3; - OpenAPI 升级至 1.3.0; - 先由后端会话完成契约设计和转换接口; - 再由前端会话接入加载、转换中、失败、重试和 PDF 预览状态; - 最后由集成验证会话测试 DOC、DOCX、XLS、XLSX 和 PDF。 ### 9.2 P1:外部用户和权限系统对接准备 当前系统的固定三角色和文档 ACL 可以支持现阶段业务,但不是最终统一身份权限平台。 建议在接入外部系统前明确: - 外部用户唯一标识; - 外部组织唯一标识; - 用户、组织的同步或实时查询模式; - Token 由本系统签发还是外部身份系统签发; - 用户停用、组织调整和 Token 失效机制; - 外部角色与 `ADMIN`、`AUDITOR`、`USER` 的映射; - `allowedModules` 的来源; - 主案 ACL 主体 ID 的稳定性; - 外部系统不可用时的容错策略; - 审计日志保留外部主体标识和操作时快照; - 管理员是否继续拥有全部管理能力; - 审计员是否严格限制为只读审计。 建议保留当前英文 code 作为稳定协议值,中文仅作为展示字典。这样可以降低外部系统接入和项目迁移成本。 ### 9.3 P1:独立全量集成验收 完成 P0 项后,由会话4执行一次固定基线验收: - 全量后端测试; - AI 回归; - 全量前端测试; - 类型检查和构建; - Flask 与 OpenAPI 一致性; - 三类真实账号; - 31 条路径的认证和角色边界抽检; - 上传、编辑、挂载、权限、下载、删除和恢复闭环; - 主库 0002 恢复冒烟; - 文件存在性、大小和 SHA-256; - 审计和冗余计数; - 浏览器控制台和 Network; - 废止路径; - 配置和敏感信息检查。 ### 9.4 P2:前端遗留代码和构建优化 当前 `App.tsx` 仍有较多历史模拟数据和旧页面实现,构建存在大包警告。 建议在核心验收稳定后: - 删除不可达模拟页面和重复映射; - 将大型页面拆分为业务组件; - 按路由或模块进行懒加载; - 拆分文档、管理、审计、回收站等代码块; - 检查重复依赖; - 保持 DTO、状态和 UI 组件边界; - 重新执行回归和包体分析。 ### 9.5 P2:部署和运维能力 工业部门实际使用前建议补充: - 应用进程托管; - 反向代理和 HTTPS; - MySQL 定期备份与恢复演练; - 文件存储备份和数据库一致性校验; - 日志轮转; - 容量、错误率和健康监控; - 审计留存周期; - 文件防病毒或恶意内容扫描; - 上传并发和磁盘容量告警; - 密钥轮换; - 安全基线和漏洞扫描; - 部署升级、数据库迁移和回滚手册。 ### 9.6 P2:补充真实文件样本 建议在固定测试环境补充: - PDF 在线预览样本; - DOC、DOCX、XLS、XLSX 下载样本; - 中文名、长文件名和特殊字符样本; - 损坏文件和伪造扩展名样本; - 大文件和批量文件样本; - Office 转 PDF 实施后的版式对比样本。 ## 10. 推荐执行顺序 | 顺序 | 工作 | 建议负责会话 | 是否阻塞正式交付 | |---:|---|---|---| | 1 | 备份并升级 `dms` 主库至 0002 | 会话3,统领授权 | 是 | | 2 | 三类文档正式恢复冒烟 | 会话3 + 会话4 | 是 | | 3 | 固化安全运行配置和部署说明 | 会话3 | 是 | | 4 | 建立 Git 稳定基线 | 统领会话协调 | 是 | | 5 | Office 预览契约 1.3 设计 | 统领 + 会话3 | 否,当前暂缓 | | 6 | Office 预览前端接入 | 会话2 | 否,当前暂缓 | | 7 | 清理模拟代码和前端分包 | 会话2 | 否 | | 8 | 外部身份权限系统对接设计 | 统领会话 | 否,需外部条件 | | 9 | 国产化适配验证 | 专项阶段 | 否,当前暂缓 | ## 11. 第一阶段最终验收条件 只有同时满足以下条件,才建议宣布第一阶段正式交付: - [x] 两份正式契约、OpenAPI 和实现一致; - [x] 三类标准账号通过真实密码登录; - [x] Q1 字典和分类层级通过真实浏览器补验; - [x] `dms_test` 全量测试通过; - [ ] `dms` 正式主库升级至 0002; - [ ] 主案、子方案、共享附件在正式主库恢复成功; - [ ] 恢复失败具备事务原子性; - [x] 31 条正式路径不存在实质契约偏差; - [x] 前端测试、类型检查和构建通过; - [x] 后端测试、AI 回归和编译检查通过; - [ ] 文件路径、大小和 SHA-256 一致; - [ ] 权限、计数和审计一致; - [ ] 生产运行配置已固化; - [ ] 敏感配置未进入源码和 Git; - [ ] 工作区形成可追溯 Git 基线; - [ ] 部署、迁移、备份和恢复步骤可重复执行; - [ ] 集成验证会话给出最终通过结论。 Office 文档在线预览、Milvus、审批、电子签章和国产化适配不属于当前第一阶段最终验收的必选条件,除非统领会话后续正式调整范围。 ## 12. 当前阶段判断 综合判断: - 业务需求主干已覆盖; - 前后端核心闭环已实现; - 数据库、文件、权限、审计和恢复设计已落地; - 自动化测试基础较完整; - 尚未达到可直接正式部署和交付的状态; - 剩余阻塞主要集中在环境基线、正式数据库迁移、安全部署配置和 Git 交付基线,而不是大规模业务功能开发。 建议先关闭第 8 节的 P0 工作,再决定是否立即进入 Office 在线预览或外部统一身份权限系统对接。