主题
公文管理 · 详细设计
文档版本:1.00 | 最近核对日期:2026-09-14 所属模块:公文管理 | 后端接口前缀
/business/documentMatter| 后端DocumentMatterController覆盖:开投下发公文、对外联系单、内部协同、会议通知。
本版本针对原有“4 个类型页面 × 4 个关系/归档 Tab”的过度拆分进行收敛:菜单只保留一个公文台账入口和一个公文待办入口,台账页内部以四个事项类型 Tab 切换,每个类型只有一张统一列表;“我发起的 / 我收到的”改为列表内的范围筛选;归档不再作为产品功能、页面、接口或业务状态。
1. 入口与功能定位
1.1 菜单结构
动态菜单结构如下,菜单数据由 SYS_MENU 提供,前端不再把待办注册为固定路由:
| 菜单 | 前端地址 | 组件 | 说明 |
|---|---|---|---|
| 公文管理 | - | 菜单目录 | 现有父菜单 |
| 公文台账 | /business/document/matter | business/documentMatter/documentMatter | 公文管理唯一主入口,内部四个类型 Tab |
| 公文待办 | /business/document/todo | business/documentMatter/documentTodo | 公文管理下的跨类型待办入口 |
原四个类型地址 /business/document/officialDocument、externalContact、internalCollaboration、meetingNotice 保留为隐藏兼容地址,组件统一转入公文台账并定位到对应类型,供历史书签和旧消息链接过渡使用。
1.2 功能边界
本模块使用统一事项底座管理四类非项目绑定文书:
- 开投下发公文:登记、发送、签收、办理回复;
- 对外联系单:发送、回复跟踪、催办;
- 内部协同:跨部门办理与文件传递;
- 会议通知:发送、参会回执。
四类事项均不绑定项目,不关联进度、质量、安全或 BIM 数据,也不接入审批工作流。事项完成后以“已完成”作为终态,不再出现“待归档、已归档、发文归档、收文归档”等产品概念。数据库中的历史归档列只作为兼容遗留字段保留,当前代码不读取、不写入。
2. 页面结构
2.1 公文台账
台账页由“查询条件卡片 + 列表卡片”组成,类型 Tab 放在列表卡片头部:
- 类型 Tab 固定为“开投下发公文、对外联系单、内部协同、会议通知”;
- 每个类型 Tab 只渲染一张列表,不再嵌套“我发起的 / 我收到的 / 发文归档 / 收文归档”;
- 查询范围提供“全部事项、我发起的、我收到的”,默认“全部事项”;
- “全部事项”由后端按当前用户是发起人或收件人合并查询,分页在数据库侧完成;
- 行内根据当前用户关系显示查看、签收、回复、编辑草稿、催办和复制等操作;
- 列表不显示归档状态,不提供归档筛选、归档按钮或归档列。
2.2 查询条件卡片规范
四类事项共用同一个列表组件,因此四个类型 Tab 的查询卡片保持一致:
- 查询卡片标题固定为“筛选条件”,首行可显示
DOCUMENT FILTERS作为辅助标识; - 查询卡片只承载“范围、关键词、状态”三个查询条件;
- “查询、重置”放在查询卡片右上角或表单操作区;
- 新增、导出等业务操作放在列表卡片工具栏,不放入查询条件卡片;
- 表单项使用统一间距和控件宽度,小屏幕自动换行;
- 查询条件不以卡片高度变化、隐式 Tab 或归档状态影响列表可见性。
2.3 公文待办
/business/document/todo 是菜单下的独立页面,聚合当前用户四类事项的收件记录,保留“待我处理 / 已处理”两个轻量状态 Tab。页面按用户拥有的类型权限查询,行内支持直接签收和回复;签收后如果需要办理,自动进入回复编辑。待办页面不包含归档筛选。
2.4 新建、编辑与详情
- 新建/编辑以对话框承载,先多选部门,再从已选部门中多选人员;
- 回显格式固定为“部门 / 姓名”,每个收件人独立保存“办理 / 阅知”;
- “办理要求”全局开关只作为新选择人员的默认值,并提供“应用到全部”;
- 详情展示正文、类型扩展字段、附件、收件人处理进度、回复/回执、催办记录和操作轨迹;
- 发起人可以查看该事项完整历史,收件人仅返回与本人相关的历史记录;
- 发送确认在表单底部展开,不再叠加第二层确认弹窗;系统提醒始终发送,邮件提醒按需勾选。
2.5 类型字段与列表重点列
| 类型 | 新建字段 | 列表重点列 | 收件人操作 |
|---|---|---|---|
| 开投下发公文 | 文号、文种、标题、发文日期、紧急程度、密级、正文、附件、办理/阅知 | 文号、标题、文种、发文日期、签收/回复进度、关系、状态、发送时间 | 签收、办理回复和附件 |
| 对外联系单 | 编号、联系单类型、标题、发送日期、回复期限、内容、附件 | 编号、标题、联系单类型、回复期限、签收/回复进度、逾期人数、关系、状态 | 签收、回复 |
| 内部协同 | 协同编号、主题、协同类型、办理期限、内容、附件 | 编号、主题、协同类型、发起人、办理期限、办理进度、关系、状态 | 签收、办理回复 |
| 会议通知 | 会议编号、主题、会议类型、时间、地点、正文、附件、回执截止时间 | 编号、主题、会议时间、地点、发起人、回执统计、关系、状态 | 签收、确认参会/请假 |
编号均为“下拉可选 + 可输入”,候选取发起人本人同类型已有人工编号,系统自动生成的长数字编号不进入候选;留空时发送自动生成,发送时仍校验同类型唯一。开投下发公文的文种下拉提供 15 类标准文种,并允许自定义输入兼容历史数据。
3. 核心设计
3.1 数据模型
| 表 | 职责 |
|---|---|
document_matter | 事项主表:类型、编号、标题、正文、发起人、发送时间、办理期限、完成状态、附件和类型扩展字段 |
document_matter_recipient | 收件人表:一人一条,保存发送时部门/人员快照、是否需回复、签收和处理状态 |
document_matter_response | 回复、回执、办理说明和附件,保留提交人与时间 |
document_matter_reminder | 催办内容、催办对象、操作者和时间 |
document_matter_log | 创建、编辑、发送、签收、回复、催办等只追加操作轨迹 |
matter_type 取值为 official_document、external_contact、internal_collaboration、meeting_notice。仅属于单个类型且无需检索的轻量字段可放入扩展 JSON;用于查询、排序或规则判断的字段必须使用独立列。
3.1.1 持久化字段
字段快照、历史兼容列和核验日期见数据库设计。
3.2 收件人选择与去重
- 部门只用于限定人员筛选范围,不会自动展开人员,也不会自动通知部门负责人;
- 发送对象必须为具体人员,收件记录保存“部门 ID/名称快照 + 人员 ID/名称快照”;
- 同一事项的同一人员只生成一条收件记录,防止重复发送和重复统计;
- 同一人员从多个部门入口被选择时,以最后一次明确选择的部门作为发送部门快照;
- 详情、选择回显和进度统计均显示“部门 / 姓名”;
- 每人独立保存“办理 / 阅知”(
NEED_RESPONSE一人一条),全局开关仅提供默认值。
3.3 状态与关系范围
事项主状态统一为:
text
草稿 draft
-> 待签收 pending_sign
-> 办理中 processing / 部分完成 partially_completed
-> 已完成 completed仅阅知人员签收后即完成;需办理人员提交回复或会议回执后完成。所有必需办理人完成后,事项主状态直接变为 completed。历史数据中的 ready_to_archive、archived 在 API 返回和导出时统一映射为“已完成”,不再向用户暴露旧概念。
3.3.1 2026-09-14 DM8 开发库验证补充
本批次通过项目 dcp-dm8-dev MCP 回读并修正开发库事项状态检查约束:实际约束为 CK_DOCUMENT_MATTER_STATUS_V2,允许 draft、pending_sign、processing、partially_completed、completed、ready_to_archive、archived。开投下发公文事项 2099032320113221633 已真实完成发送、收件人签收和办理回复,主状态为 completed;历史归档状态仍只作兼容读取,不恢复归档产品概念,也未删除测试数据。
台账 scope 取值:
| 值 | 语义 |
|---|---|
all | 当前用户作为发起人或收件人的事项 |
created | 当前用户发起的事项 |
received | 当前用户收到的事项 |
后端按当前登录用户计算关系范围,前端传入的 scope 只决定查询分支,不作为越权依据。事项原文在发送后不可编辑;需要再次发起时使用“复制”生成新的草稿。
3.4 发送通知
- 四类事项发送均必须发起 SSE 实时推送,系统提醒始终生效,后端不接收“关闭 SSE”参数;
- 发送确认融合在表单底部,显示收件人数、发送后正文不可修改提示和可选的邮件提醒;
- 发送、收件人快照和操作日志在同一事务完成,事务提交后再持久化消息并推送;
- 消息
source/category固定为document,消息链接统一为/business/document/matter?matterType=<type>&matterId=<id>; - SSE 只包含类型、编号/标题、发起人、发送时间、办理期限和统一台账入口,正文与附件不直接放入载荷;
- 邮件保留类型重点字段和附件预签名地址,单个消息或邮件失败只记录告警,不回滚已发送事项。
4. 权限与接口
4.1 权限
- 权限码固定为三段式
business:<资源>:<动作>; - 四类事项分别使用独立资源名:
official_document→business:officialDocumentexternal_contact→business:externalContactinternal_collaboration→business:internalCollaborationmeeting_notice→business:meetingNotice
- 后端控制器逐类型校验权限和事项类型,服务层再次按当前用户校验数据范围;
- 台账
mine查询允许具备该类型list或query权限的用户访问;签收、回复、催办等动作仍按原有动作权限和当前用户身份校验。
4.2 接口
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /business/documentMatter/{type}/list | 兼容接口:查询当前用户发起的分页列表 |
| GET | /business/documentMatter/{type}/mine | 台账统一列表,支持 scope=all|created|received |
| GET | /business/documentMatter/{type}/my-received | 兼容接口:查询当前用户收到的分页列表,待办继续使用 |
| GET | /business/homepage/todo-summary | 登录级首页聚合:当前用户公文待签收/待回复计数与按发送时间倒序封顶 5 条的明细,并组装规划会商待填意见计数与明细(口径见规划详细设计 2.6);不挂菜单权限,公文口径与公文待办页行内判定一致 |
| GET | /business/documentMatter/{type}/{matterId} | 查询详情,后端按发起人或收件人过滤历史 |
| POST | /business/documentMatter/{type}/draft | 保存新草稿 |
| PUT | /business/documentMatter/{type}/draft/{matterId} | 编辑草稿 |
| POST | /business/documentMatter/{type}/send | 发送事项并写入收件人快照 |
| POST | /business/documentMatter/{type}/{matterId}/sign | 当前收件人签收 |
| POST | /business/documentMatter/{type}/{matterId}/reply | 当前收件人提交回复/回执 |
| POST | /business/documentMatter/{type}/{matterId}/remind | 发起人催办未完成收件人 |
| POST | /business/documentMatter/{type}/export | 按台账当前范围导出元数据 |
接口中不再提供归档动作、归档字段或归档状态筛选。旧数据库列和旧状态只在兼容读取时处理,不形成新的业务契约。
5. 操作说明
操作路径和步骤见操作手册。
6. 验收要点
- 菜单从“公文管理”下进入“公文台账”和“公文待办”,待办不再依赖前端固定路由;
- 公文台账只有四个类型 Tab,每个 Tab 只有一张统一列表;范围筛选能正确切换全部、我发起和我收到;
- 四类事项共用的查询条件卡片只显示范围、关键词、状态,查询/重置位置稳定;新增和导出只出现在列表工具栏;
- 四类事项均能完成创建、先选部门后选人员、发送、签收、办理/回执、进度查看、催办和复制;
- 状态按草稿、待签收、办理中/部分完成、已完成展示,不出现归档列、归档筛选、归档按钮或归档 Tab;
- 收件人逐人办理/阅知开关生效:阅知人员签收即完成、不计入待回复与催办对象;
- 发起人与收件人的数据权限隔离正确,不能读取他人事项或他人回复历史;
- 公文待办的待处理/已处理分组、行内签收与回复、本人期限超期提示正确;
- 邮件提醒按需发送,公文消息可从历史消息进入统一台账并自动切换类型、打开对应详情;
- 历史数据库归档列未执行删除性 DDL,历史旧状态返回页面时显示为“已完成”。