|
|
|
|
|
# 事前流程模版设置页面功能说明
|
|
|
|
|
|
|
|
|
|
|
|
## 页面信息
|
|
|
|
|
|
|
|
|
|
|
|
- **页面路径**: `http://localhost:3000/#/settings/pre-approval-template-settings`
|
|
|
|
|
|
- **路由路径**: `/settings/pre-approval-template-settings`
|
|
|
|
|
|
- **组件位置**: `czemc-budget-execution-frontend/src/views/settings/PreApprovalTemplateSettings.vue`
|
|
|
|
|
|
- **后端控制器**: `backend/Modules/Budget/app/Http/Controllers/Api/PreApprovalTemplateGroupController.php`
|
|
|
|
|
|
- **数据表**: `budget_pre_approval_template_groups`、`budget_pre_approval_template_group_elements`
|
|
|
|
|
|
|
|
|
|
|
|
## 页面概述
|
|
|
|
|
|
|
|
|
|
|
|
事前流程模版设置页面用于管理分组和元素,这些分组和元素在设置事前流程模版时会作为默认数据被拉取。分组是固定的,用于组织和管理各种类型的模板元素。
|
|
|
|
|
|
|
|
|
|
|
|
## 核心功能
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 分组管理
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.1 分组列表展示
|
|
|
|
|
|
- **位置**: 页面主表格区域(第19-62行)
|
|
|
|
|
|
- **功能**: 展示所有事前流程模版分组
|
|
|
|
|
|
- **显示字段**:
|
|
|
|
|
|
- 序号(自动编号)
|
|
|
|
|
|
- 分组名称
|
|
|
|
|
|
- 分组编码(唯一标识)
|
|
|
|
|
|
- 描述
|
|
|
|
|
|
- 已使用元素(以标签形式展示元素名称列表)
|
|
|
|
|
|
- 排序(数字,用于控制显示顺序)
|
|
|
|
|
|
- 状态(启用/禁用,通过开关切换)
|
|
|
|
|
|
- 操作按钮(管理元素、编辑、删除)
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.2 添加分组
|
|
|
|
|
|
- **触发方式**: 点击"添加分组"按钮(第12-15行)
|
|
|
|
|
|
- **对话框**: 添加/编辑分组对话框(第66-117行)
|
|
|
|
|
|
- **表单字段**:
|
|
|
|
|
|
- **分组名称**(必填): 最大长度200字符
|
|
|
|
|
|
- **分组编码**(必填): 最大长度100字符,必须唯一
|
|
|
|
|
|
- 新建时自动生成(基于时间戳和随机数)
|
|
|
|
|
|
- 可手动输入或点击刷新按钮重新生成
|
|
|
|
|
|
- 编辑时不可修改
|
|
|
|
|
|
- **描述**(可选): 文本域,最多3行
|
|
|
|
|
|
- **排序**(可选): 数字输入,最小值0,默认0
|
|
|
|
|
|
- **状态**(可选): 开关,默认启用(1)
|
|
|
|
|
|
- **验证规则**:
|
|
|
|
|
|
- 分组名称:必填
|
|
|
|
|
|
- 分组编码:必填,且必须唯一
|
|
|
|
|
|
- **API接口**: `POST /budget/pre-approval-template-groups`
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.3 编辑分组
|
|
|
|
|
|
- **触发方式**: 点击分组列表中的"编辑"按钮(第55行)
|
|
|
|
|
|
- **功能**: 修改分组的基本信息
|
|
|
|
|
|
- **限制**: 分组编码不可修改
|
|
|
|
|
|
- **表单字段**: 与添加分组相同(编码字段禁用)
|
|
|
|
|
|
- **API接口**: `PUT /budget/pre-approval-template-groups/{id}`
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.4 删除分组
|
|
|
|
|
|
- **触发方式**: 点击分组列表中的"删除"按钮(第56行)
|
|
|
|
|
|
- **确认机制**: 删除前弹出确认对话框
|
|
|
|
|
|
- **API接口**: `DELETE /budget/pre-approval-template-groups/{id}`
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.5 状态切换
|
|
|
|
|
|
- **触发方式**: 直接点击分组列表中的状态开关(第42-47行)
|
|
|
|
|
|
- **功能**: 快速启用或禁用分组
|
|
|
|
|
|
- **值映射**:
|
|
|
|
|
|
- 启用 = 1
|
|
|
|
|
|
- 禁用 = 0
|
|
|
|
|
|
- **API接口**: `PUT /budget/pre-approval-template-groups/{id}`
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 分组元素管理
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.1 管理元素入口
|
|
|
|
|
|
- **触发方式**: 点击分组列表中的"管理元素"按钮(第52-54行)
|
|
|
|
|
|
- **对话框**: 管理分组元素对话框(第120-181行)
|
|
|
|
|
|
- **功能**: 打开元素管理界面,显示当前分组的所有元素
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.2 元素列表展示
|
|
|
|
|
|
- **位置**: 管理元素对话框中的表格(第134-174行)
|
|
|
|
|
|
- **显示字段**:
|
|
|
|
|
|
- 序号(自动编号)
|
|
|
|
|
|
- 元素名称
|
|
|
|
|
|
- 元素类型(以标签形式展示)
|
|
|
|
|
|
- 排序(数字)
|
|
|
|
|
|
- 操作按钮(上移、下移、删除)
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.3 元素类型
|
|
|
|
|
|
支持以下元素类型(第333-351行):
|
|
|
|
|
|
- **常规表单字段**:
|
|
|
|
|
|
- 文本(text)
|
|
|
|
|
|
- 数字(number)
|
|
|
|
|
|
- 日期(date)
|
|
|
|
|
|
- 文本域(textarea)
|
|
|
|
|
|
- 复选框(checkbox)
|
|
|
|
|
|
- 单选框(radio)
|
|
|
|
|
|
- 下拉选择(select)
|
|
|
|
|
|
- 文件上传(file)
|
|
|
|
|
|
- **事前流程**(oa_custom_model): 来自OA系统的自定义流程模型
|
|
|
|
|
|
- **勾选清单**(checklist): 用于创建勾选清单类型的元素
|
|
|
|
|
|
- **会议纪要**(meeting_minutes): 会议纪要相关元素
|
|
|
|
|
|
- **明细表格**(detail_table): 明细表格类型元素
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.4 添加元素到分组
|
|
|
|
|
|
- **触发方式**: 在管理元素对话框中点击"添加元素"按钮(第128-131行)
|
|
|
|
|
|
- **对话框**: 添加元素对话框(第184-267行)
|
|
|
|
|
|
- **元素选择**:
|
|
|
|
|
|
- 下拉选择框,支持搜索过滤
|
|
|
|
|
|
- 按元素类型分组显示:
|
|
|
|
|
|
- 常规表单字段
|
|
|
|
|
|
- 事前流程
|
|
|
|
|
|
- 历史类型(将清理)- 已移除,不再显示
|
|
|
|
|
|
- 勾选清单
|
|
|
|
|
|
- 会议纪要
|
|
|
|
|
|
- 明细表格
|
|
|
|
|
|
- 只显示未被使用的元素(跨所有分组检查)
|
|
|
|
|
|
- **表单字段**:
|
|
|
|
|
|
- **选择元素**(必填): 从可用元素列表中选择
|
|
|
|
|
|
- **排序**(可选): 数字输入,最小值0,默认0
|
|
|
|
|
|
- **验证规则**: 元素ID必填
|
|
|
|
|
|
- **API接口**: `POST /budget/pre-approval-template-groups/{groupId}/elements`
|
|
|
|
|
|
- **限制**:
|
|
|
|
|
|
- 同一元素不能在同一分组中重复添加
|
|
|
|
|
|
- 同一元素不能跨分组使用(已被其他分组使用的元素不可选)
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.5 删除元素
|
|
|
|
|
|
- **触发方式**: 点击元素列表中的"删除"按钮(第164-171行)
|
|
|
|
|
|
- **确认机制**: 删除前弹出确认对话框
|
|
|
|
|
|
- **功能**: 从分组中移除元素
|
|
|
|
|
|
- **API接口**: `DELETE /budget/pre-approval-template-groups/{groupId}/elements/{elementId}`
|
|
|
|
|
|
- **后续操作**:
|
|
|
|
|
|
- 删除成功后,元素重新变为可用(可被其他分组使用)
|
|
|
|
|
|
- 自动刷新元素列表和分组列表
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.6 元素排序
|
|
|
|
|
|
- **上移**: 点击上移按钮(第145-153行)
|
|
|
|
|
|
- 将元素向上移动一位
|
|
|
|
|
|
- 第一个元素不可上移
|
|
|
|
|
|
- **下移**: 点击下移按钮(第154-163行)
|
|
|
|
|
|
- 将元素向下移动一位
|
|
|
|
|
|
- 最后一个元素不可下移
|
|
|
|
|
|
- **排序更新**: 使用索引作为排序值,批量更新排序
|
|
|
|
|
|
- **API接口**: `POST /budget/pre-approval-template-groups/{groupId}/elements/sort`
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 数据加载逻辑
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.1 分组列表加载
|
|
|
|
|
|
- **函数**: `loadGroups()`(第354-382行)
|
|
|
|
|
|
- **API接口**: `GET /budget/pre-approval-template-groups?all=true`
|
|
|
|
|
|
- **数据处理**:
|
|
|
|
|
|
- 支持分页和全量加载(使用`all=true`参数)
|
|
|
|
|
|
- 自动关联加载分组下的元素
|
|
|
|
|
|
- 将boolean类型的`is_active`转换为数字1/0,以匹配Element Plus的开关组件
|
|
|
|
|
|
- 为每个分组添加`element_names`数组(元素名称列表)
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.2 可用元素列表加载
|
|
|
|
|
|
- **函数**: `loadAvailableElements()`(第385-472行)
|
|
|
|
|
|
- **功能**: 加载所有可用的元素(未被任何分组使用的元素)
|
|
|
|
|
|
- **加载流程**:
|
|
|
|
|
|
1. 获取所有已使用的元素ID列表(跨所有分组)
|
|
|
|
|
|
- API: `GET /budget/pre-approval-template-groups/used-element-ids`
|
|
|
|
|
|
2. 分别加载各类元素:
|
|
|
|
|
|
- 常规表单字段: `GET /budget/template-elements?category=form_field&is_active=1&all=true`
|
|
|
|
|
|
- 事前流程: `GET /budget/template-elements?is_active=1&all=true`(然后筛选)
|
|
|
|
|
|
- 勾选清单: `GET /budget/template-elements?category=checklist&is_active=1&all=true`
|
|
|
|
|
|
- 会议纪要: `GET /budget/template-elements?category=meeting_minutes&is_active=1&all=true`
|
|
|
|
|
|
- 明细表格: `GET /budget/template-elements?category=detail_table&is_active=1&all=true`
|
|
|
|
|
|
3. 过滤掉已使用的元素
|
|
|
|
|
|
- **事前流程元素筛选逻辑**(第415-419行):
|
|
|
|
|
|
- `category === 'pre_approval_flow`
|
|
|
|
|
|
- 或 `category`为空但有`model_id`
|
|
|
|
|
|
- 或 `category === 'oa_model'`(兼容旧值)
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.3 分组元素加载
|
|
|
|
|
|
- **函数**: `loadGroupElements()`(第475-485行)
|
|
|
|
|
|
- **API接口**: `GET /budget/pre-approval-template-groups/{groupId}/elements`
|
|
|
|
|
|
- **功能**: 加载指定分组下的所有元素
|
|
|
|
|
|
- **排序**: 按`sort_order`和`id`排序
|
|
|
|
|
|
|
|
|
|
|
|
### 4. 页面初始化
|
|
|
|
|
|
|
|
|
|
|
|
- **生命周期**: `onMounted()`(第768-771行)
|
|
|
|
|
|
- **初始化操作**:
|
|
|
|
|
|
1. 加载分组列表
|
|
|
|
|
|
2. 加载可用元素列表(预加载,提升用户体验)
|
|
|
|
|
|
|
|
|
|
|
|
## 后端API接口
|
|
|
|
|
|
|
|
|
|
|
|
### 分组管理接口
|
|
|
|
|
|
|
|
|
|
|
|
| 方法 | 路径 | 功能 | 控制器方法 |
|
|
|
|
|
|
|------|------|------|-----------|
|
|
|
|
|
|
| GET | `/budget/pre-approval-template-groups` | 获取分组列表 | `index()` |
|
|
|
|
|
|
| GET | `/budget/pre-approval-template-groups/{id}` | 获取分组详情 | `show()` |
|
|
|
|
|
|
| POST | `/budget/pre-approval-template-groups` | 创建分组 | `store()` |
|
|
|
|
|
|
| PUT | `/budget/pre-approval-template-groups/{id}` | 更新分组 | `update()` |
|
|
|
|
|
|
| DELETE | `/budget/pre-approval-template-groups/{id}` | 删除分组 | `destroy()` |
|
|
|
|
|
|
|
|
|
|
|
|
### 分组元素管理接口
|
|
|
|
|
|
|
|
|
|
|
|
| 方法 | 路径 | 功能 | 控制器方法 |
|
|
|
|
|
|
|------|------|------|-----------|
|
|
|
|
|
|
| GET | `/budget/pre-approval-template-groups/{groupId}/elements` | 获取分组元素列表 | `getElements()` |
|
|
|
|
|
|
| POST | `/budget/pre-approval-template-groups/{groupId}/elements` | 添加元素到分组 | `addElement()` |
|
|
|
|
|
|
| DELETE | `/budget/pre-approval-template-groups/{groupId}/elements/{elementId}` | 从分组移除元素 | `removeElement()` |
|
|
|
|
|
|
| PUT | `/budget/pre-approval-template-groups/{groupId}/elements/{elementId}` | 更新分组元素 | `updateElement()` |
|
|
|
|
|
|
| POST | `/budget/pre-approval-template-groups/{groupId}/elements/sort` | 更新元素排序 | `updateElementSort()` |
|
|
|
|
|
|
| GET | `/budget/pre-approval-template-groups/used-element-ids` | 获取所有已使用的元素ID | `getUsedElementIds()` |
|
|
|
|
|
|
|
|
|
|
|
|
## 数据模型
|
|
|
|
|
|
|
|
|
|
|
|
### 分组模型(PreApprovalTemplateGroup)
|
|
|
|
|
|
|
|
|
|
|
|
- `id`: 主键
|
|
|
|
|
|
- `name`: 分组名称(必填,最大200字符)
|
|
|
|
|
|
- `code`: 分组编码(必填,最大100字符,唯一)
|
|
|
|
|
|
- `description`: 描述(可选)
|
|
|
|
|
|
- `sort_order`: 排序值(整数,默认0)
|
|
|
|
|
|
- `is_active`: 是否启用(布尔值,默认true)
|
|
|
|
|
|
- `created_by`: 创建人ID
|
|
|
|
|
|
- `updated_by`: 更新人ID
|
|
|
|
|
|
- `created_at`: 创建时间
|
|
|
|
|
|
- `updated_at`: 更新时间
|
|
|
|
|
|
|
|
|
|
|
|
### 分组元素关联表(budget_pre_approval_template_group_elements)
|
|
|
|
|
|
|
|
|
|
|
|
- `id`: 主键
|
|
|
|
|
|
- `group_id`: 分组ID(外键)
|
|
|
|
|
|
- `element_id`: 元素ID(外键,关联`budget_template_elements`表)
|
|
|
|
|
|
- `sort_order`: 排序值(整数)
|
|
|
|
|
|
- `is_active`: 是否启用(布尔值)
|
|
|
|
|
|
|
|
|
|
|
|
## 业务规则
|
|
|
|
|
|
|
|
|
|
|
|
1. **分组编码唯一性**: 每个分组的编码必须在系统中唯一
|
|
|
|
|
|
2. **元素唯一性**: 同一个元素不能跨分组使用(一个元素只能属于一个分组)
|
|
|
|
|
|
3. **分组固定性**: 分组是固定的,用于组织模板元素
|
|
|
|
|
|
4. **元素类型多样性**: 支持多种类型的元素(表单字段、事前流程、勾选清单、会议纪要、明细表格等)
|
|
|
|
|
|
5. **排序控制**: 分组和元素都支持排序,用于控制显示顺序
|
|
|
|
|
|
6. **状态管理**: 分组支持启用/禁用状态,用于控制是否在模板设置时可用
|
|
|
|
|
|
|
|
|
|
|
|
## 与其他页面的关系
|
|
|
|
|
|
|
|
|
|
|
|
### 与计划支出模板设置页面的关系
|
|
|
|
|
|
|
|
|
|
|
|
- **页面路径**: `/settings/planned-expenditure-template-settings`
|
|
|
|
|
|
- **关系**: 计划支出模板设置页面在设置事前流程区域时,会从本页面加载启用的分组作为默认模板
|
|
|
|
|
|
- **数据流程**:
|
|
|
|
|
|
1. 计划支出模板设置页面加载时,如果没有保存的模板配置
|
|
|
|
|
|
2. 会调用本页面的分组数据(只加载`is_active=1`的分组)
|
|
|
|
|
|
3. 按`sort_order`排序后,将分组及其元素加载到画布中
|
|
|
|
|
|
4. 作为默认的事前流程模板配置
|
|
|
|
|
|
|
|
|
|
|
|
## 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
1. **编码生成**: 新建分组时,编码会自动生成,格式为`GROUP_{时间戳}_{随机数}`,也可以手动输入
|
|
|
|
|
|
2. **编码不可修改**: 编辑分组时,编码字段被禁用,不可修改
|
|
|
|
|
|
3. **元素过滤**: 添加元素时,只显示未被使用的元素,已使用的元素不会出现在选择列表中
|
|
|
|
|
|
4. **跨分组检查**: 系统会检查元素是否已被其他分组使用,确保元素唯一性
|
|
|
|
|
|
5. **状态转换**: 分组状态切换时,会立即调用API更新,如果失败会自动恢复原状态
|
|
|
|
|
|
6. **数据刷新**: 添加或删除元素后,会自动刷新分组列表和可用元素列表,确保数据一致性
|
|
|
|
|
|
|
|
|
|
|
|
## 技术实现
|
|
|
|
|
|
|
|
|
|
|
|
- **前端框架**: Vue 3(Composition API)
|
|
|
|
|
|
- **UI组件库**: Element Plus
|
|
|
|
|
|
- **状态管理**: 使用`ref`和`reactive`进行响应式数据管理
|
|
|
|
|
|
- **API调用**: 通过`@/utils/api`中的`preApprovalTemplateGroupAPI`和`templateElementAPI`进行接口调用
|
|
|
|
|
|
- **表单验证**: 使用Element Plus的表单验证规则
|
|
|
|
|
|
- **错误处理**: 统一的错误提示和异常处理机制
|
|
|
|
|
|
|