# 业务领域组合创建接口 - 前端开发指南 > 本文档为前端开发人员提供业务领域组合创建 (`/compose`) 接口的详细使用说明。 ## 目录 - [接口概述](#接口概述) - [接口规格](#接口规格) - [请求参数详解](#请求参数详解) - [响应格式](#响应格式) - [前端实现示例](#前端实现示例) - [典型使用场景](#典型使用场景) - [错误处理](#错误处理) - [最佳实践](#最佳实践) --- ## 接口概述 ### 功能说明 该接口用于从已有的元数据中**组合创建新的业务领域**。用户可以从不同的业务领域中选择需要的元数据(DataMeta),将它们组合到一个新的业务领域中。 ### 业务流程 ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 用户选择 │ │ 提交创建 │ │ 返回结果 │ │ 元数据列表 │ ──► │ 请求 │ ──► │ 新业务领域 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` ### 核心特性 - ✅ 支持选择多个元数据 - ✅ 自动翻译中文名称为英文(若未提供) - ✅ 支持关联标签和数据源 - ✅ 自动创建业务领域与元数据的 `INCLUDES` 关系 --- ## 接口规格 ### 基本信息 | 项目 | 说明 | |------|------| | **请求URL** | `POST /api/bd/compose` | | **Content-Type** | `application/json` | | **请求方法** | POST | ### 请求头 ```http Content-Type: application/json ``` --- ## 请求参数详解 ### 参数列表 | 参数名 | 类型 | 必填 | 默认值 | 说明 | |--------|------|------|--------|------| | name_zh | string | ✅ 是 | - | 业务领域中文名称 | | name_en | string | 否 | 自动翻译 | 业务领域英文名称 | | id_list | array | ✅ 是 | - | 选中的元数据ID列表 | | describe | string | 否 | - | 业务领域描述 | | type | string | 否 | - | 业务领域类型 | | category | string | 否 | - | 业务领域分类 | | tag | array/integer | 否 | - | 标签ID或标签对象数组 | | data_source | integer | 否 | - | 数据源ID | ### id_list 参数格式 `id_list` 支持两种格式,前端可根据实际情况选择: #### 格式一:纯ID数组(推荐) 最简洁的格式,直接传递元数据的 ID 列表: ```json { "name_zh": "销售分析域", "id_list": [123, 456, 789] } ``` #### 格式二:对象数组 兼容旧格式,传递包含 `id` 字段的对象数组: ```json { "name_zh": "销售分析域", "id_list": [ { "id": 123 }, { "id": 456 }, { "id": 789 } ] } ``` ### tag 参数格式 `tag` 参数支持多种格式: ```javascript // 格式1:单个标签ID { "tag": 100 } // 格式2:标签ID数组 { "tag": [100, 101, 102] } // 格式3:标签对象数组 { "tag": [{ "id": 100 }, { "id": 101 }] } // 格式4:完整标签对象 { "tag": [{ "id": 100, "name_zh": "核心业务", "name_en": "core" }] } ``` ### 可选字段说明 以下字段均为可选,根据业务需求选择性传递: | 字段名 | 类型 | 说明 | |--------|------|------| | leader | string | 负责人 | | organization | string | 所属组织 | | status | string | 状态 | | keywords | string | 关键词 | | data_sensitivity | string | 数据敏感性 | | frequency | string | 更新频率 | | url | string | 相关URL | | storage_location | string | 存储位置 | --- ## 响应格式 ### 成功响应 ```json { "code": 200, "message": "操作成功", "data": { "business_domain": { "id": 12350, "name_zh": "销售分析域", "name_en": "sales_analysis_domain", "describe": "整合订单和客户数据的销售分析业务领域", "type": "analysis", "category": "业务分析", "create_time": "2025-01-09 10:30:00", "update_time": "2025-01-09 10:30:00", "tag": [ { "id": 100, "name_zh": "核心业务", "name_en": "core_business" } ] } } } ``` ### 响应字段说明 | 字段路径 | 类型 | 说明 | |----------|------|------| | code | integer | 状态码,200 表示成功 | | message | string | 操作结果消息 | | data.business_domain | object | 创建的业务领域详情 | | data.business_domain.id | integer | 新创建的业务领域节点ID | | data.business_domain.name_zh | string | 中文名称 | | data.business_domain.name_en | string | 英文名称 | | data.business_domain.tag | array | 关联的标签列表 | ### 失败响应 ```json { "code": 500, "message": "组合创建业务领域失败", "data": null, "error": "具体错误信息" } ``` --- ## 前端实现示例 ### 使用 Axios ```javascript import axios from 'axios'; /** * 组合创建业务领域 * @param {Object} params - 创建参数 * @param {string} params.name_zh - 中文名称(必填) * @param {string} [params.name_en] - 英文名称(可选,自动翻译) * @param {number[]} params.id_list - 元数据ID列表(必填) * @param {string} [params.describe] - 描述 * @param {string} [params.type] - 类型 * @param {string} [params.category] - 分类 * @param {number|number[]} [params.tag] - 标签ID * @param {number} [params.data_source] - 数据源ID * @returns {Promise} 创建结果 */ async function composeBusinessDomain(params) { try { const response = await axios.post('/api/bd/compose', params); if (response.data.code === 200) { return { success: true, data: response.data.data.business_domain }; } else { return { success: false, message: response.data.message, error: response.data.error }; } } catch (error) { console.error('组合创建业务领域失败:', error); throw error; } } // 使用示例 const result = await composeBusinessDomain({ name_zh: '客户订单分析域', describe: '整合客户信息和订单数据的分析业务领域', id_list: [101, 102, 103, 201, 202], // 选中的元数据ID tag: [100], // 标签ID category: '业务分析' }); if (result.success) { console.log('创建成功,新业务领域ID:', result.data.id); } else { console.error('创建失败:', result.message); } ``` ### 使用 Fetch API ```javascript /** * 组合创建业务领域 */ async function composeBusinessDomain(params) { const response = await fetch('/api/bd/compose', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params) }); const data = await response.json(); if (data.code !== 200) { throw new Error(data.message || '创建失败'); } return data.data.business_domain; } // 使用示例 try { const newDomain = await composeBusinessDomain({ name_zh: '销售报表域', id_list: [301, 302, 303] }); console.log('创建成功:', newDomain); } catch (error) { console.error('创建失败:', error.message); } ``` ### Vue 3 组件示例 ```vue ``` ### React 组件示例 ```jsx import React, { useState } from 'react'; import axios from 'axios'; function ComposeBusinessDomain({ selectedMetaIds, onSuccess }) { const [form, setForm] = useState({ name_zh: '', name_en: '', describe: '' }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const handleChange = (e) => { const { name, value } = e.target; setForm(prev => ({ ...prev, [name]: value })); }; const handleSubmit = async (e) => { e.preventDefault(); if (!form.name_zh.trim()) { setError('请输入中文名称'); return; } if (!selectedMetaIds || selectedMetaIds.length === 0) { setError('请至少选择一个元数据'); return; } setLoading(true); setError(null); try { const response = await axios.post('/api/bd/compose', { name_zh: form.name_zh, name_en: form.name_en || undefined, describe: form.describe || undefined, id_list: selectedMetaIds }); if (response.data.code === 200) { onSuccess?.(response.data.data.business_domain); } else { setError(response.data.message || '创建失败'); } } catch (err) { setError(err.response?.data?.message || err.message); } finally { setLoading(false); } }; return (