0701提交本本,包含整体所有子页面

This commit is contained in:
Charles
2026-07-01 16:11:39 +08:00
parent 709098e515
commit 5ce8c50db9
12153 changed files with 1691968 additions and 7371 deletions
@@ -0,0 +1,407 @@
# 工作流审批中心开发设计文档
**版本**: 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 + `<avue-crud>`
**核心功能**:
- 列表展示待审批任务
- 筛选:流程类型、紧急程度
- 操作:审批(统一弹窗)、查看
- 右上角 Badge 显示待处理数量
**关键设计决策**:
- 审批/驳回合并为**统一弹窗**,使用单选按钮选择"同意/驳回"
- 原型:两个独立弹窗
- 本实现:合并为一个弹窗,减少用户操作步骤
- 紧急程度列使用自定义 slot + `el-tag` 展示,带颜色区分
- 操作列仅保留"审批"和"查看",移除独立的"驳回"按钮
- **右上角 Badge 计数从列表接口返回的 `total` 字段获取,不再单独调用 `getTodoCount` 接口**
**弹窗交互**:
```
审批处理弹窗
├── 流程名称(只读)
├── 申请人(只读)
├── 处理结果(单选:同意/驳回)*必填
├── 审批意见/驳回原因(文本域)
│ └── 驳回时必须填写
└── 按钮:取消、确定
```
### 3.2 我的已办 (done.vue)
**核心功能**:
- 列表展示已处理记录
- 筛选:流程类型、处理结果
- 操作:查看、流转
- 右上角 Badge 显示已处理数量
**关键设计决策**:
- "流转"按钮打开**流转时间线弹窗**,使用 `el-timeline` 组件
- 原型:简单的 message 提示
- 本实现:完整的时间线弹窗,展示每一步的审批详情
- 处理结果使用自定义 slot + `el-tag` 展示(已同意=绿色,已驳回=红色)
- **右上角 Badge 计数从列表接口返回的 `total` 字段获取**
**流转弹窗设计**:
```
流程流转详情弹窗
├── 流程名称(标题下方)
└── 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<number> | **待办数量(已弃用,前端不再使用)** |
| `approve` | data | Promise | 审批通过 |
| `reject` | data | Promise | 审批驳回 |
| `getDetail` | id | Promise<record> | 流程详情 |
### 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 ← 统计数据
↓
<avue-crud> 渲染
↓
用户操作 → API 调用 → 刷新列表
```
---
## 6. 样式设计
### 6.1 通用样式
所有页面共享以下通用样式(已提取到各组件的 `<style scoped>`):
```scss
.workflow-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding: 0 10px;
}
.workflow-title {
margin: 0;
font-size: 18px;
font-weight: 500;
}
```
### 6.2 统计卡片样式 (process.vue)
```scss
.stat-card {
display: flex;
align-items: center;
cursor: pointer;
transition: transform 0.2s;
&:hover { transform: translateY(-2px); }
}
.stat-icon {
width: 48px; height: 48px;
border-radius: 8px;
display: flex;
align-items: center; justify-content: center;
margin-right: 12px;
}
// 各卡片颜色...
```
### 6.3 流转弹窗样式 (done.vue)
```scss
.transfer-process-name {
font-size: 16px; font-weight: 500;
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid #e4e7ed;
}
.step-header { display: flex; justify-content: space-between; }
.step-remark {
padding: 8px; background: #f5f7fa;
border-radius: 4px; margin-top: 6px;
}
```
---
## 7. 与原型差异说明
### 7.1 技术栈差异
| 维度 | 原型 | 本实现 |
|------|------|--------|
| API 风格 | Composition API (`<script setup>`) | Options API |
| 表格组件 | 原生 `el-table` | Avue `<avue-crud>` |
| 样式方案 | 原生 Element Plus | Avue 主题 + 自定义 SCSS |
| 图标 | Element Plus Icons | Element Plus Icons |
### 7.2 功能差异
| 功能 | 原型 | 本实现 | 说明 |
|------|------|--------|------|
| 审批弹窗 | 两个独立弹窗(审批/驳回) | 统一弹窗 + 单选 | 简化操作 |
| 流转查看 | message 提示 | el-timeline 弹窗 | 更直观 |
| 紧急程度 | 有列但数据字段不同 | 自定义 slot + tag | 保持 Saber3 风格 |
| 我的申请搜索 | 无 | 无 | 一致 |
| 编辑/删除 | 有(条件显示) | 有(条件显示) | 一致 |
| 我的流程 | 流程卡片网格(发起中心) | 流程卡片网格(发起中心) | 一致 |
### 7.3 设计决策理由
1. **统一审批弹窗**:减少弹窗数量,用户在一个弹窗内完成同意/驳回选择,操作路径更短
2. **流转时间线**:将原型的 message 提示升级为可视化时间线,审批历史一目了然
3. **Avue CRUD**:复用 Saber3 现有组件体系,保持项目风格一致性
4. **我的流程页面**:流程发起中心,使用卡片网格展示所有可发起的流程,点击即可发起
5. **待提交状态**:支持草稿功能,用户可以先创建流程暂不提交
---
## 8. 构建与部署
### 8.1 本地开发
```bash
pnpm run dev # 启动开发服务器,端口 2888
```
### 8.2 生产构建
```bash
pnpm run build # 开发构建(esbuild)
pnpm run build:prod # 生产构建(terser,去除 console)
```
### 8.3 菜单初始化
执行 `docs/sql/workflow-menu-init.sql` 在数据库中创建菜单和权限。
---
## 9. 待办事项(TODO)
### 9.1 前端待办
- [ ] 接入真实 API 接口(替换 mock 数据)
- [ ] 流程详情页面(查看按钮跳转)
- [ ] 流程发起表单页面(选择流程类型后进入)
- [ ] 编辑功能(待提交状态的表单编辑)
- [ ] 审批意见附件上传
- [ ] 流程图可视化展示
### 9.2 后端待办
- [ ] 设计并创建流程实例表(blade_flow_instance)
- [ ] 设计并创建审批记录表(blade_flow_approval)
- [ ] 集成 Flowable/Activiti 工作流引擎
- [ ] 实现流程定义管理接口
- [ ] 实现审批/驳回/转办等业务接口
- [ ] 实现消息通知(待办提醒)
---
## 10. 附录
### 10.1 Git 提交记录
```
:sparkles: feat(workflow): 新增工作流审批中心模块
- 我的待办、我的已办、我的申请、我的流程四个页面
- 统一审批弹窗、流转时间线、统计卡片等交互
- mock 数据 + API 接口层
```
### 10.2 参考文档
- [Element Plus 官方文档](https://element-plus.org/)
- [Avue 官方文档](https://avuejs.com/)
- [Vue 3 官方文档](https://vuejs.org/)
- [BladeX 官方文档](https://bladex.cn/)
---
**文档结束**
@@ -0,0 +1,634 @@
# 工作流审批中心需求分析文档
**版本**: v1.0
**日期**: 2026-06-11
**作者**: AI 助手
---
## 1. 需求概述
### 1.1 项目背景
为 BladeX/Saber3 企业级微服务平台增加工作流审批中心模块,提供统一的流程任务管理入口,支持用户查看待办事项、已办事项以及个人发起的申请流程。
### 1.2 需求目标
1. 实现**我的待办**页面:展示当前用户需要审批的流程任务
2. 实现**我的已办**页面:展示当前用户已处理的流程记录
3. 实现**我的申请**页面:展示当前用户发起的所有流程申请
4. 实现**我的流程**页面:统一视图,汇总展示与用户相关的所有流程(待办、已办、申请)
5. 提供统一的查询、筛选、操作入口
### 1.3 适用范围
- 企业内部所有需要审批的业务流程
- 包括但不限于:招采计划、招标申请、合同审批、付款申请、商品录入等
---
## 2. 功能需求
### 2.1 模块总览
| 模块 | 页面标题 | 核心功能 | 数据来源 |
|------|---------|---------|---------|
| 我的待办 | 我的待办 | 展示待审批任务,提供审批/驳回/查看操作 | 当前用户为审批人的待处理流程 |
| 我的已办 | 我的已办 | 展示已处理记录,提供查看/流转操作 | 当前用户已审批的流程记录 |
| 我的申请 | 我的申请 | 展示个人发起的申请,提供查看/发起新流程/编辑/删除 | 当前用户发起的所有流程 |
| 我的流程 | 我的流程 | 统一视图,汇总展示所有相关流程,提供统计卡片和统一查询 | 待办+已办+申请的合并去重数据 |
---
### 2.2 我的待办(My Todo)
#### 2.2.1 页面布局
```
┌─────────────────────────────────────────────────────────────────┐
│ 我的待办 待处理 6 项 │
├─────────────────────────────────────────────────────────────────┤
│ 流程类型 [全部 ▼] 紧急程度 [全部 ▼] [查询] [重置] │
├─────────────────────────────────────────────────────────────────┤
│ 流程名称 │ 流程类型 │ 申请人 │ 申请部门 │ 提交时间 │ 当前节点 │ 操作 │
├──────────┼──────────┼────────┼──────────┼──────────┼──────────┼──────┤
│ ... │ ... │ ... │ ... │ ... │ ... │审批 │
│ │ │ │ │ │ │驳回 │
│ │ │ │ │ │ │查看 │
└─────────────────────────────────────────────────────────────────┘
```
#### 2.2.2 页面元素
| 元素 | 类型 | 说明 |
|------|------|------|
| 页面标题 | 文本 | "我的待办" |
| 待处理计数 | Badge | 右上角显示待处理数量,红色背景 |
| 流程类型筛选 | 下拉选择 | 可选值:全部、年度招采计划申请、预招标申请、非经营性商品录入、合同审批流程、付款申请流程等 |
| 紧急程度筛选 | 下拉选择 | 可选值:全部、普通、紧急、特急 |
| 查询按钮 | 按钮 | 蓝色主按钮,触发列表查询 |
| 重置按钮 | 按钮 | 灰色次按钮,清空筛选条件 |
| 数据表格 | 表格 | 展示待办列表 |
#### 2.2.3 表格字段定义
| 字段名 | 数据类型 | 说明 | 示例 |
|--------|---------|------|------|
| 流程名称 | String | 流程实例标题,可包含业务编号 | 年度招采计划-2026年IT设备采购 |
| 流程类型 | String | 流程定义名称 | 年度招采计划申请 |
| 申请人 | String | 流程发起人姓名 | 张明 |
| 申请部门 | String | 发起人所属部门 | 信息技术部 |
| 提交时间 | DateTime | 流程发起时间 | 2026-05-26 09:15:00 |
| 当前节点 | String | 当前审批环节名称 | 部门经理审批 |
| 操作 | Action | 审批、驳回、查看按钮组 | - |
#### 2.2.4 操作说明
| 操作 | 按钮样式 | 功能描述 |
|------|---------|---------|
| 审批 | 蓝色文字链接 | 打开审批弹窗/页面,同意该流程进入下一节点 |
| 驳回 | 橙色文字链接 | 打开驳回弹窗,填写驳回原因后退回上一节点或发起人 |
| 查看 | 灰色文字链接 | 打开流程详情页,查看流程信息和审批历史 |
#### 2.2.5 业务规则
1. **数据权限**:仅展示当前用户作为审批人的待办任务
2. **排序规则**:默认按提交时间降序排列(最新的在前)
3. **分页规则**:每页默认 10 条,支持分页切换
4. **审批逻辑**:
- 点击"审批"后弹出审批确认框(支持填写审批意见)
- 审批通过后流程自动流转至下一审批节点
- 若当前节点为最后节点,流程状态变更为"已完成"
5. **驳回逻辑**:
- 点击"驳回"后弹出驳回原因输入框(必填)
- 驳回后流程退回至指定节点(默认退回至上一节点或发起人)
- 驳回后流程状态变更为"已驳回"
---
### 2.3 我的已办(My Done)
#### 2.3.1 页面布局
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 我的已办 已处理 7 项 │
├─────────────────────────────────────────────────────────────────────────┤
│ 流程类型 [全部 ▼] 处理结果 [全部 ▼] [查询] [重置] │
├─────────────────────────────────────────────────────────────────────────┤
│ 流程名称 │ 流程类型 │ 申请人 │ 申请部门 │ 提交时间 │ 处理时间 │ 处理结果 │ 操作 │
├──────────┼──────────┼────────┼──────────┼──────────┼──────────┼──────────┼──────┤
│ ... │ ... │ ... │ ... │ ... │ ... │已同意 │查看 │
│ │ │ │ │ │ │ │流转 │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 2.3.2 页面元素
| 元素 | 类型 | 说明 |
|------|------|------|
| 页面标题 | 文本 | "我的已办" |
| 已处理计数 | Badge | 右上角显示已处理数量,绿色背景 |
| 流程类型筛选 | 下拉选择 | 同"我的待办" |
| 处理结果筛选 | 下拉选择 | 可选值:全部、已同意、已驳回 |
| 查询按钮 | 按钮 | 蓝色主按钮 |
| 重置按钮 | 按钮 | 灰色次按钮 |
| 数据表格 | 表格 | 展示已办列表 |
#### 2.3.3 表格字段定义
| 字段名 | 数据类型 | 说明 | 示例 |
|--------|---------|------|------|
| 流程名称 | String | 流程实例标题 | 非经营性商品-办公电脑采购 |
| 流程类型 | String | 流程定义名称 | 非经营性商品录入 |
| 申请人 | String | 流程发起人姓名 | 张明 |
| 申请部门 | String | 发起人所属部门 | 信息技术部 |
| 提交时间 | DateTime | 流程发起时间 | 2026-05-10 14:20:00 |
| 处理时间 | DateTime | 当前用户的审批时间 | 2026-05-11 09:30:00 |
| 处理结果 | Tag | 审批结果标签 | 已同意(绿色)/ 已驳回(红色) |
| 操作 | Action | 查看、流转按钮组 | - |
#### 2.3.4 操作说明
| 操作 | 按钮样式 | 功能描述 |
|------|---------|---------|
| 查看 | 蓝色文字链接 | 打开流程详情页,查看完整流程信息和审批历史 |
| 流转 | 灰色文字链接 | 查看流程当前流转状态和后续审批节点 |
#### 2.3.5 业务规则
1. **数据权限**:仅展示当前用户已审批过的流程记录
2. **排序规则**:默认按处理时间降序排列
3. **分页规则**:每页默认 10 条
4. **处理结果展示**:
- "已同意"使用绿色标签展示
- "已驳回"使用红色标签展示
5. **流转查看**:点击"流转"可查看流程当前所处节点和后续审批路径
---
### 2.4 我的申请(My Applications)
#### 2.4.1 页面布局
```
┌─────────────────────────────────────────────────────────────────┐
│ 我的申请 [发起新流程] │
├─────────────────────────────────────────────────────────────────┤
│ (无搜索条件区域) │
├─────────────────────────────────────────────────────────────────┤
│ 流程名称 │ 流程类型 │ 状态 │ 申请人 │ 申请时间 │ 当前节点 │ 操作 │
├──────────┼──────────┼──────┼────────┼──────────┼──────────┼──────┤
│ 年度招采 │ 年度招采 │审批中│ 管理员 │2026-05-15│部门经理 │ 查看 │
│ 计划-IT │ 计划申请 │ │ │ 10:30:00 │ 审批 │ │
├──────────┼──────────┼──────┼────────┼──────────┼──────────┼──────┤
│ 非经营性 │ 非经营性 │已完成│ 管理员 │2026-05-10│ 已完成 │ 查看 │
│ 商品-电脑│ 商品录入 │ │ │ 14:20:00 │ │ │
└─────────────────────────────────────────────────────────────────┘
```
#### 2.4.2 页面元素
| 元素 | 类型 | 说明 |
|------|------|------|
| 页面标题 | 文本 | "我的申请" |
| 发起新流程按钮 | 按钮 | 蓝色主按钮,跳转到流程发起页面 |
| 搜索条件 | 无 | 我的申请页面不展示搜索条件区域 |
| 数据表格 | 表格 | 展示申请列表 |
#### 2.4.3 表格字段定义
| 字段名 | 数据类型 | 说明 | 示例 |
|--------|---------|------|------|
| 流程名称 | String | 流程实例标题 | 年度招采计划-2026年IT设备采购 |
| 流程类型 | String | 流程定义名称 | 年度招采计划申请 |
| 状态 | Tag | 流程当前状态 | 审批中(黄色)/ 已完成(绿色) |
| 申请人 | String | 流程发起人姓名 | 管理员 |
| 申请时间 | DateTime | 流程发起时间 | 2026-05-15 10:30:00 |
| 当前节点 | String | 当前审批环节名称 | 部门经理审批 / 已完成 |
| 操作 | Action | 查看按钮 | - |
#### 2.4.4 操作说明
| 操作 | 按钮样式 | 功能描述 |
|------|---------|---------|
| 发起新流程 | 蓝色按钮 | 跳转到流程选择/发起页面,开始新的流程申请 |
| 查看 | 蓝色文字链接 | 打开流程详情页,查看申请详情和审批进度 |
#### 2.4.5 业务规则
1. **数据权限**:仅展示当前用户发起的流程申请
2. **排序规则**:默认按申请时间降序排列
3. **分页规则**:每页默认 10 条
4. **状态展示**:
- "待提交"使用灰色标签
- "审批中"使用黄色/橙色标签
- "已完成"使用绿色标签
- "已驳回"使用红色标签
5. **编辑/删除**:仅"待提交"状态显示编辑和删除按钮
6. **发起新流程**:
- 点击后进入流程选择页面(展示所有可发起的流程类型)
- 选择流程类型后进入对应的申请表单页面
- 填写表单并提交后,流程进入审批流
---
### 2.5 我的流程(My Process - 流程发起中心)
#### 2.5.1 页面布局
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 我的流程 共 5 个流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ [绿色图标] │ │ [蓝色图标] │ │ [橙色图标] │ │ [灰色图标] ││
│ │ │ │ │ │ │ │ ││
│ │ 非经营性商品 │ │ 年度招采计划 │ │ 预招标申请 │ │ 采购需求发起 ││
│ │ 商品管理 │ │ 招标管理 │ │ 招标管理 │ │ 订单管理 ││
│ │ [启用] │ │ [启用] │ │ [启用] │ │ [启用] ││
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘│
│ ┌──────────────┐ │
│ │ [红色图标] │ │
│ │ │ │
│ │ 询比价流程 │ │
│ │ 询比价管理 │ │
│ │ [启用] │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
```
#### 2.5.2 页面元素
| 元素 | 类型 | 说明 |
|------|------|------|
| 页面标题 | 文本 | "我的流程" |
| 流程计数 | Tag | 右上角显示流程总数,灰色背景 |
| 流程卡片网格 | Grid | CSS Grid 布局,每行自适应 4-5 个卡片 |
| 流程卡片 | Card | 单个流程的展示卡片 |
#### 2.5.3 卡片内容定义
| 字段名 | 数据类型 | 说明 | 示例 |
|--------|---------|------|------|
| 图标 | Icon | 圆角矩形彩色图标 | Document / OfficeBuilding / ShoppingCart |
| 图标颜色 | String | 图标背景色(CSS 色值) | #67c23a(绿色)、#409eff(蓝色) |
| 顶部横线 | CSS | 卡片顶部彩色渐变横线 | 与图标同色 |
| 流程名称 | String | 流程定义名称 | 非经营性商品录入 |
| 流程分类 | String | 所属业务分类 | 非经营性商品管理 |
| 状态 | Tag | 流程启用状态 | 启用(绿色)/ 停用(灰色) |
| 版本 | String | 流程版本号 | 1.0 |
| 流程编码 | String | 流程唯一编码 | WF2024052001 |
#### 2.5.4 操作说明
| 操作 | 触发方式 | 功能描述 |
|------|---------|---------|
| 发起流程 | 点击卡片 | 打开对应流程的发起表单弹窗/页面 |
#### 2.5.5 业务规则
1. **卡片交互**:
- 鼠标悬停:卡片上浮(translateY(-4px)),边框变色,阴影加深
- 图标悬停:放大 1.1 倍并旋转 5 度
- 点击:打开对应流程的发起表单(当前仅显示提示)
2. **响应式布局**:
- 大屏:每行 4-5 个卡片
- 中屏:每行 3 个卡片
- 小屏:每行 2 个卡片
3. **状态展示**:
- "启用"使用绿色 success 标签
- "停用"使用灰色 info 标签
4. **数据权限**:展示当前用户有权限发起的所有流程类型
5. **流程排序**:按 sort 字段或默认顺序排列
---
## 3. 数据模型
### 3.1 流程实例(Flow Instance)
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 流程实例ID |
| processKey | String | 是 | 流程定义Key |
| processName | String | 是 | 流程名称(如:年度招采计划-2026年IT设备采购) |
| processType | String | 是 | 流程类型(如:年度招采计划申请) |
| applicantId | Long | 是 | 申请人ID |
| applicantName | String | 是 | 申请人姓名 |
| applicantDept | String | 是 | 申请部门 |
| submitTime | DateTime | 是 | 提交时间 |
| status | String | 是 | 流程状态:审批中、已完成、已驳回 |
| currentNode | String | 是 | 当前节点名称 |
| currentAssignee | Long | 否 | 当前审批人ID |
| currentAssigneeName | String | 否 | 当前审批人姓名 |
| emergencyLevel | String | 否 | 紧急程度:普通、紧急、特急 |
| formData | JSON | 否 | 表单数据 |
| createTime | DateTime | 是 | 创建时间 |
| updateTime | DateTime | 是 | 更新时间 |
### 3.2 审批记录(Approval Record)
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 记录ID |
| instanceId | Long | 是 | 流程实例ID |
| taskId | String | 是 | 任务ID |
| nodeName | String | 是 | 审批节点名称 |
| approverId | Long | 是 | 审批人ID |
| approverName | String | 是 | 审批人姓名 |
| action | String | 是 | 操作类型:同意、驳回、转办 |
| comment | String | 否 | 审批意见 |
| handleTime | DateTime | 是 | 处理时间 |
| createTime | DateTime | 是 | 创建时间 |
### 3.3 流转步骤(Track Step)
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| stepName | String | 是 | 步骤名称(如:提交申请、部门经理审批) |
| handler | String | 是 | 处理人姓名 |
| time | DateTime | 是 | 处理时间 |
| result | String | 是 | 处理结果(已提交、已同意、已驳回) |
| resultType | String | 是 | 标签类型(primary/success/danger) |
| type | String | 是 | 时间线节点类型(primary/success/danger) |
| remark | String | 否 | 审批备注/意见 |
### 3.4 流程定义(Process Definition)
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 定义ID |
| processKey | String | 是 | 流程Key |
| processName | String | 是 | 流程名称 |
| category | String | 否 | 流程分类 |
| version | Int | 是 | 版本号 |
| status | String | 是 | 状态:启用、停用 |
| formConfig | JSON | 否 | 表单配置 |
| createTime | DateTime | 是 | 创建时间 |
---
## 4. 接口需求
### 4.1 接口清单
| 序号 | 接口地址 | 请求方式 | 功能说明 |
|------|---------|---------|---------|
| 1 | /api/workflow/todo/list | GET | 查询我的待办列表 |
| 2 | /api/workflow/done/list | GET | 查询我的已办列表 |
| 3 | /api/workflow/my/list | GET | 查询我的申请列表 |
| 4 | /api/workflow/todo/count | GET | 查询待办数量 |
| 5 | /api/workflow/done/count | GET | 查询已办数量 |
| 6 | /api/workflow/approve | POST | 审批通过 |
| 7 | /api/workflow/reject | POST | 审批驳回 |
| 8 | /api/workflow/detail/{id} | GET | 查询流程详情 |
| 9 | /api/workflow/process/types | GET | 查询流程类型列表 |
| 10 | /api/workflow/start | POST | 发起新流程 |
| 11 | /api/workflow/process/list | GET | 查询我的流程统一列表 |
| 12 | /api/workflow/process/stats | GET | 查询流程统计数据 |
### 4.2 关键接口详细说明
#### 4.2.1 查询我的待办列表
```
GET /api/workflow/todo/list
```
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| current | Int | 否 | 当前页码,默认1 |
| size | Int | 否 | 每页条数,默认10 |
| processType | String | 否 | 流程类型 |
| emergencyLevel | String | 否 | 紧急程度 |
**响应数据**:
```json
{
"code": 200,
"data": {
"records": [
{
"id": 1,
"processName": "年度招采计划-2026年IT设备采购",
"processType": "年度招采计划申请",
"applicantName": "张明",
"applicantDept": "信息技术部",
"submitTime": "2026-05-26 09:15:00",
"currentNode": "部门经理审批",
"emergencyLevel": "普通"
}
],
"total": 6,
"current": 1,
"size": 10
}
}
```
#### 4.2.2 审批通过
```
POST /api/workflow/approve
```
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| instanceId | Long | 是 | 流程实例ID |
| taskId | String | 是 | 任务ID |
| comment | String | 否 | 审批意见 |
#### 4.2.3 审批驳回
```
POST /api/workflow/reject
```
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| instanceId | Long | 是 | 流程实例ID |
| taskId | String | 是 | 任务ID |
| comment | String | 是 | 驳回原因 |
| rejectTo | String | 否 | 驳回目标:prev(上一节点)/ start(发起人) |
---
## 5. 页面交互设计
### 5.1 交互流程图
```
┌─────────────────────────────────────────────────────────────┐
│ 工作流审批中心 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 我的待办 │ │ 我的已办 │ │ 我的申请 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 筛选/查询 │ │ 筛选/查询 │ │ 发起新流程 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 审批/驳回 │ │ 查看/流转 │ │ 填写表单 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 审批弹窗 │ │ 流程详情页 │ │ 提交申请 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 5.2 关键交互说明
#### 5.2.1 审批操作
1. 用户点击"审批"按钮
2. 弹出审批确认弹窗,包含:
- 流程基本信息展示(名称、类型、申请人)
- 审批意见输入框(可选填)
- "确认"和"取消"按钮
3. 用户填写意见后点击"确认"
4. 系统调用审批接口
5. 审批成功后:
- 关闭弹窗
- 刷新列表
- 显示成功提示("审批成功")
- 待办数量自动减1
#### 5.2.2 驳回操作
1. 用户点击"驳回"按钮
2. 弹出驳回原因输入弹窗,包含:
- 流程基本信息展示
- 驳回原因输入框(必填)
- 驳回目标选择(上一节点/发起人)
- "确认"和"取消"按钮
3. 用户填写原因后点击"确认"
4. 系统调用驳回接口
5. 驳回成功后:
- 关闭弹窗
- 刷新列表
- 显示成功提示("驳回成功")
- 待办数量自动减1
#### 5.2.3 查看详情
1. 用户点击"查看"按钮
2. 打开流程详情页面/抽屉,展示:
- 流程基本信息(名称、类型、状态、申请人等)
- 表单数据(流程发起时填写的表单内容)
- 审批历史(时间线形式展示各节点的审批记录)
- 当前节点信息
#### 5.2.4 发起新流程
1. 用户点击"发起新流程"按钮
2. 打开流程选择页面/弹窗,展示所有可发起的流程类型
3. 用户选择流程类型后,进入对应的申请表单页面
4. 用户填写表单并提交
5. 提交成功后返回列表页,新申请出现在列表顶部
---
## 6. 非功能性需求
### 6.1 性能需求
| 指标 | 要求 |
|------|------|
| 页面加载时间 | ≤ 2 秒 |
| 列表查询响应时间 | ≤ 1 秒 |
| 审批操作响应时间 | ≤ 500ms |
| 分页切换响应时间 | ≤ 500ms |
### 6.2 兼容性需求
- 支持 Chrome、Firefox、Edge 等主流浏览器最新版本
- 支持 IE11(如需兼容)
### 6.3 安全需求
- 所有接口需进行身份认证(Token验证)
- 用户只能查看和处理自己权限范围内的流程
- 审批和驳回操作需记录操作日志
### 6.4 可用性需求
- 操作按钮需有明确的视觉反馈(hover效果、点击效果)
- 重要操作(审批、驳回)需有二次确认
- 操作成功后需有 toast 提示
- 列表为空时需展示空状态提示
---
## 7. 与现有系统集成
### 7.1 前端集成
基于 Saber3 项目现有架构:
1. **路由配置**:在 `src/router/views/` 或动态路由中添加工作流审批中心路由
2. **页面文件**:
- `src/views/workflow/todo.vue` — 我的待办
- `src/views/workflow/done.vue` — 我的已办
- `src/views/workflow/my.vue` — 我的申请
3. **API 文件**:`src/api/workflow/index.js`
4. **Option 文件**:`src/option/workflow/todo.js`、`done.js`、`my.js`
5. **使用 Avue CRUD 组件**:列表页使用 `<avue-crud>` 组件实现
### 7.2 后端集成
- 对接现有工作流引擎(如 Flowable/Activiti)
- 复用现有用户、部门、权限体系
- 遵循 BladeX 微服务接口规范
---
## 8. 附录
### 8.1 流程类型枚举
| 流程类型 | 说明 |
|---------|------|
| 年度招采计划申请 | 年度采购计划编制与审批 |
| 预招标申请 | 招标前期准备申请 |
| 非经营性商品录入 | 非经营类商品信息录入审批 |
| 合同审批流程 | 采购合同审批 |
| 付款申请流程 | 付款申请审批 |
### 8.2 状态枚举
| 状态 | 说明 | 标签颜色 |
|------|------|---------|
| 待提交 | 流程已创建但未提交 | 灰色 |
| 审批中 | 流程正在审批过程中 | 黄色/橙色 |
| 已完成 | 流程已审批完成 | 绿色 |
| 已驳回 | 流程被驳回 | 红色 |
| 待审批 | 待办任务视角的状态 | 黄色/橙色 |
| 已同意 | 已办任务-审批通过 | 绿色 |
| 已拒绝 | 已办任务-审批拒绝 | 红色 |
### 8.3 处理结果枚举
| 结果 | 说明 | 标签颜色 |
|------|------|---------|
| 已同意 | 审批通过 | 绿色 |
| 已驳回 | 审批未通过 | 红色 |
---
**文档结束**