You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.5 KiB

计划支出模板设置 - 画布中分组的来源说明

页面路径

http://localhost:3000/#/settings/planned-expenditure-template-settings?categoryId=2

分组来源

画布中显示的分组来自"事前流程模版设置"页面/settings/pre-approval-template-settings)。

数据流程

1. 分组创建和管理

  • 位置: http://localhost:3000/#/settings/pre-approval-template-settings
  • 页面组件: czemc-budget-execution-frontend/src/views/settings/PreApprovalTemplateSettings.vue
  • 功能:
    • 创建分组(分组名称、分组编码、描述、排序、状态)
    • 管理分组中的元素(添加、删除、排序)
    • 分组数据存储在 budget_pre_approval_template_groups

2. 分组加载到画布

  • 位置: czemc-budget-execution-frontend/src/views/settings/CanvasSettings.vue
  • 函数: loadDefaultTemplateFromGroups() (第826-897行)
  • 调用时机:
    1. 当分类没有保存的模板配置时
    2. 当加载模板配置失败时
    3. 作为默认配置来源

3. 加载流程详解

// 步骤1: 获取所有启用的分组
const groupsResponse = await preApprovalTemplateGroupAPI.getList({ 
  is_active: 1,  // 只获取启用的分组
  all: true      // 获取所有数据,不分页
})

// 步骤2: 按排序顺序处理分组
const sortedGroups = groups.sort((a, b) => (a.sort_order || 0) - (b.sort_order || 0))

// 步骤3: 遍历每个分组,获取分组中的元素
for (const group of sortedGroups) {
  // 获取分组元素
  const elementsResponse = await preApprovalTemplateGroupAPI.getElements(group.id)
  
  // 步骤4: 将元素转换为字段配置
  const fields = elements.map(element => {
    return {
      key: `element_${element.element_id}`,
      label: element.element_name,
      element_type: element.element_type,
      required: false,
      visible: true,
      element_id: element.element_id
    }
  })
  
  // 步骤5: 使用分组编码或ID作为配置的key分组名称作为title
  const sectionKey = group.code || `group_${group.id}`
  config[sectionKey] = {
    title: group.name,      // 分组名称作为画布区域的标题
    fields: fields,         // 分组中的元素作为字段
    group_id: group.id,      // 保存分组ID
    group_code: group.code  // 保存分组编码
  }
}

数据结构

分组数据结构(来自事前流程模版设置)

{
  id: 1,
  name: "上会记录",           // 分组名称
  code: "GROUP_MJ8EE28T_JV", // 分组编码
  description: "描述信息",
  sort_order: 0,             // 排序顺序
  is_active: 1               // 是否启用
}

画布配置结构(转换后)

{
  "GROUP_MJ8EE28T_JV": {     // 使用分组编码作为key
    "title": "上会记录",      // 分组名称
    "fields": [               // 分组中的元素
      {
        "key": "element_1",
        "label": "项目名称",
        "element_type": "text",
        "required": false,
        "visible": true,
        "element_id": 1
      },
      // ... 更多元素
    ],
    "group_id": 1,            // 分组ID
    "group_code": "GROUP_MJ8EE28T_JV"  // 分组编码
  }
  // ... 更多分组
}

关键API接口

1. 获取分组列表

  • API: GET /budget/pre-approval-template-groups
  • 参数: { is_active: 1, all: true }
  • 返回: 所有启用的分组列表

2. 获取分组元素

  • API: GET /budget/pre-approval-template-groups/{groupId}/elements
  • 返回: 分组中的元素列表(包含元素名称、类型、排序等)

数据库表关系

budget_pre_approval_template_groups (分组表)
  ├── id
  ├── name (分组名称)
  ├── code (分组编码)
  ├── sort_order (排序)
  └── is_active (是否启用)

budget_pre_approval_template_group_elements (分组元素关联表)
  ├── group_id (关联分组)
  ├── element_id (关联元素)
  ├── sort_order (元素在分组中的排序)
  └── is_active (元素是否启用)

budget_template_elements (元素表)
  ├── id
  ├── name (元素名称)
  ├── type (元素类型)
  ├── category (元素分类)
  └── ...

注意事项

  1. 分组必须启用: 只有 is_active = 1 的分组才会被加载到画布中

  2. 分组排序: 分组按照 sort_order 字段排序,数值越小越靠前

  3. 分组编码:

    • 优先使用分组的 code 字段作为画布配置的 key
    • 如果 code 为空,则使用 group_{id} 作为 key
  4. 元素来源: 分组中的元素来自"非直接支付模版元素设置"页面(/settings/template-element-settings

  5. 默认配置: 当分类没有保存的模板配置时,会自动从"事前流程模版设置"获取分组作为默认配置

  6. 配置保存: 画布中的配置可以保存到 budget_planned_expenditure_templates 表,保存后下次加载会优先使用保存的配置,而不是从分组获取

相关文件

  • 画布设置页面: czemc-budget-execution-frontend/src/views/settings/CanvasSettings.vue
  • 事前流程模版设置页面: czemc-budget-execution-frontend/src/views/settings/PreApprovalTemplateSettings.vue
  • API定义: czemc-budget-execution-frontend/src/utils/api.js (preApprovalTemplateGroupAPI)
  • 后端控制器: backend/Modules/Budget/app/Http/Controllers/Api/PreApprovalTemplateGroupController.php
  • 后端模型: backend/Modules/Budget/app/Models/PreApprovalTemplateGroup.php