# 工作流审批中心开发设计文档 **版本**: v1.0 **日期**: 2026-06-11 **作者**: AI 助手 --- ## 1. 项目概述 ### 1.1 项目背景 为 BladeX/Saber3 企业级微服务平台增加工作流审批中心模块,提供统一的流程任务管理入口。模块包含四个子页面:我的待办、我的已办、我的申请、我的流程(统一视图)。 ### 1.2 技术栈 - **前端框架**: Vue 3 + Element Plus + Avue CRUD - **构建工具**: Vite - **语言**: JavaScript(无 TypeScript) - **包管理**: pnpm - **样式**: SCSS + Element Plus 主题变量 ### 1.3 参考原型 原型项目位于 `prototype/` 目录(已从 `src/frontend` 移出),包含三个参考页面: - `MyTodo.vue` — 我的待办 - `MyDone.vue` — 我的已办 - `MyApplication.vue` — 我的申请 --- ## 2. 模块结构 ### 2.1 文件目录 ``` src/ ├── api/ │ └── workflow/ │ └── index.js # API 接口层(mock 数据) ├── views/ │ └── workflow/ │ ├── todo.vue # 我的待办 │ ├── done.vue # 我的已办 │ ├── my.vue # 我的申请 │ └── process.vue # 我的流程(统一视图) ├── components/ # 复用全局组件 └── router/ # 动态路由由后端菜单 JSON 生成 docs/ ├── 需求分析-工作流审批中心.md # 需求文档 ├── 开发设计-工作流审批中心.md # 本文档 └── sql/ └── workflow-menu-init.sql # 菜单初始化 SQL ``` ### 2.2 菜单结构 ``` 业务流程 (parent_id=0, id=10001) ├── 我的待办 (parent_id=10001, id=10002) → /workflow/todo ├── 我的已办 (parent_id=10001, id=10003) → /workflow/done ├── 我的申请 (parent_id=10001, id=10004) → /workflow/my └── 我的流程 (parent_id=10001, id=10005) → /workflow/process ``` --- ## 3. 页面设计 ### 3.1 我的待办 (todo.vue) **风格**: Options API + `` **核心功能**: - 列表展示待审批任务 - 筛选:流程类型、紧急程度 - 操作:审批(统一弹窗)、查看 - 右上角 Badge 显示待处理数量 **关键设计决策**: - 审批/驳回合并为**统一弹窗**,使用单选按钮选择"同意/驳回" - 原型:两个独立弹窗 - 本实现:合并为一个弹窗,减少用户操作步骤 - 紧急程度列使用自定义 slot + `el-tag` 展示,带颜色区分 - 操作列仅保留"审批"和"查看",移除独立的"驳回"按钮 **弹窗交互**: ``` 审批处理弹窗 ├── 流程名称(只读) ├── 申请人(只读) ├── 处理结果(单选:同意/驳回)*必填 ├── 审批意见/驳回原因(文本域) │ └── 驳回时必须填写 └── 按钮:取消、确定 ``` ### 3.2 我的已办 (done.vue) **核心功能**: - 列表展示已处理记录 - 筛选:流程类型、处理结果 - 操作:查看、流转 - 右上角 Badge 显示已处理数量 **关键设计决策**: - "流转"按钮打开**流转时间线弹窗**,使用 `el-timeline` 组件 - 原型:简单的 message 提示 - 本实现:完整的时间线弹窗,展示每一步的审批详情 - 处理结果使用自定义 slot + `el-tag` 展示(已同意=绿色,已驳回=红色) **流转弹窗设计**: ``` 流程流转详情弹窗 ├── 流程名称(标题下方) └── el-timeline ├── el-timeline-item (type=primary) │ └── el-card │ ├── 步骤名称 + 结果标签 │ ├── 处理人 + 时间 │ └── 备注(如有) ├── el-timeline-item (type=success) │ └── ... └── ... ``` ### 3.3 我的申请 (my.vue) **核心功能**: - 列表展示个人发起的申请 - **无搜索条件区域**(searchShow: false) - 操作:查看、编辑(仅待提交)、删除(仅待提交) - 发起新流程按钮 + 流程选择弹窗 **关键设计决策**: - 搜索条件隐藏,保持页面简洁 - 新增"待提交"状态(灰色标签) - 编辑/删除按钮**条件渲染**:仅当 `status === '待提交'` 时显示 - 删除操作使用 `this.$confirm` 二次确认 **状态标签映射**: | 状态 | Element Tag type | effect | |------|-----------------|--------| | 待提交 | info | plain | | 审批中 | warning | light | | 已完成 | success | light | | 已驳回 | danger | light | ### 3.4 我的流程 (process.vue) **核心功能**: - 流程发起中心,展示所有可发起的流程类型 - CSS Grid 卡片网格布局 - 每个卡片包含:彩色图标、流程名称、分类、状态标签 - 点击卡片发起对应流程 **关键设计决策**: - 使用 CSS Grid (`grid-template-columns: repeat(auto-fill, minmax(220px, 1fr))`) 实现自适应卡片布局 - 卡片顶部使用 CSS 伪元素 `::before` 实现彩色渐变横线 - 图标使用 Element Plus Icons,背景色与横线颜色一致 - 悬停效果:卡片上浮 + 阴影 + 图标放大旋转 - 数据使用静态 mock 数组,后续可替换为 API 接口 **页面布局**: ``` ┌────────────────────────────────────────┐ │ 我的流程 共 5 个流程 │ ├────────────────────────────────────────┤ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ │图标│ │图标│ │图标│ │图标│ │ │ │名称│ │名称│ │名称│ │名称│ │ │ │分类│ │分类│ │分类│ │分类│ │ │ │启用│ │启用│ │启用│ │启用│ │ │ └────┘ └────┘ └────┘ └────┘ │ │ ┌────┐ │ │ │图标│ │ │ │名称│ │ │ │分类│ │ │ │启用│ │ │ └────┘ │ └────────────────────────────────────────┘ ``` --- ## 4. API 设计 ### 4.1 接口清单 | 函数名 | 参数 | 返回值 | 说明 | |--------|------|--------|------| | `getTodoList` | current, size, params | Promise<{records, total}> | 待办列表 | | `getDoneList` | current, size, params | Promise<{records, total}> | 已办列表 | | `getMyList` | current, size, params | Promise<{records, total}> | 申请列表 | | `getProcessList` | current, size, params | Promise<{records, total}> | 统一流程列表 | | `getProcessStats` | - | Promise<{todoCount, doneCount, myCount, pendingCount, draftCount, rejectedCount}> | 统计数据 | | `getTodoCount` | - | Promise | 待办数量 | | `approve` | data | Promise | 审批通过 | | `reject` | data | Promise | 审批驳回 | | `getDetail` | id | Promise | 流程详情 | ### 4.2 Mock 数据说明 当前使用 `Promise.resolve(mockData)` 方式模拟 API 响应,便于后续替换为真实接口。 **数据量**: - 待办:6 条 - 已办:7 条(含流转步骤 trackSteps) - 申请:6 条(含 2 条待提交) **trackSteps 结构**: ```javascript { stepName: '部门经理审批', handler: '李主管', time: '2026-05-10 16:45:00', result: '已同意', resultType: 'success', type: 'success', remark: '符合部门需求,同意采购' } ``` --- ## 5. 状态管理 ### 5.1 组件内部状态 各页面使用 Vue Options API 的 `data()` 管理状态,无需 Vuex/Pinia。 ### 5.2 数据流 ``` API (mock) ↓ 组件 onLoad() ↓ data.records ← 列表数据 page.total ← 总条数 stats ← 统计数据 ↓ 渲染 ↓ 用户操作 → API 调用 → 刷新列表 ``` --- ## 6. 样式设计 ### 6.1 通用样式 所有页面共享以下通用样式(已提取到各组件的 `