元数据审核记录创建接口 - 前端开发指南
接口概述
该接口用于创建元数据审核记录,支持前端页面发起两个元数据的对比审核请求(如疑似重复、变动审核、合并请求等场景)。
基本信息
| 项目 |
说明 |
| 接口路径 |
/api/meta_data/review/create |
| 请求方法 |
POST |
| Content-Type |
application/json |
| 认证方式 |
无(如需认证请参考项目认证配置) |
请求参数
请求体 (Request Body)
| 参数名 |
类型 |
必填 |
说明 |
record_type |
string |
✅ 是 |
审核记录类型,可选值:redundancy(疑似重复)、change(疑似变动)、merge(合并请求) |
source |
string |
否 |
触发来源,默认值:"manual" |
meta1 |
object |
✅ 是 |
第一个元数据信息(主元数据) |
meta2 |
object |
✅ 是 |
第二个元数据信息(候选/对比元数据) |
notes |
string |
否 |
备注信息 |
元数据对象结构 (meta1 / meta2)
| 字段名 |
类型 |
必填 |
说明 |
id |
number |
✅ 是 |
元数据节点 ID(Neo4j 节点 ID) |
name_zh |
string |
✅ 是 |
元数据中文名称 |
name_en |
string |
✅ 是 |
元数据英文名称 |
data_type |
string |
✅ 是 |
数据类型(如 varchar(255)、integer 等) |
status |
boolean |
✅ 是 |
元数据状态(true:启用,false:禁用) |
请求示例
{
"record_type": "redundancy",
"source": "manual",
"meta1": {
"id": 1001,
"name_zh": "仓库名称",
"name_en": "warehouse_name",
"data_type": "varchar(255)",
"status": true
},
"meta2": {
"id": 1002,
"name_zh": "仓库名",
"name_en": "wh_name",
"data_type": "varchar(100)",
"status": true
},
"notes": "疑似重复元数据,需要人工审核确认"
}
响应格式
成功响应
{
"code": 200,
"message": "操作成功",
"data": {
"record": {
"id": 1,
"record_type": "redundancy",
"source": "manual",
"business_domain_id": null,
"new_meta": {
"id": 1001,
"name_zh": "仓库名称",
"name_en": "warehouse_name",
"data_type": "varchar(255)",
"status": true
},
"candidates": [
{
"id": 1002,
"name_zh": "仓库名",
"name_en": "wh_name",
"data_type": "varchar(100)",
"status": true
}
],
"old_meta": null,
"status": "pending",
"resolution_action": null,
"resolution_payload": null,
"notes": "疑似重复元数据,需要人工审核确认",
"created_at": "2024-01-15T10:30:00",
"updated_at": "2024-01-15T10:30:00",
"resolved_at": null,
"resolved_by": null
},
"message": "审核记录创建成功,请前往数据审核页面进行处理"
}
}
失败响应
{
"code": 500,
"message": "错误描述信息",
"data": null,
"error": "详细错误信息(可选)"
}
返回码说明
| code |
message |
说明 |
| 200 |
操作成功 |
审核记录创建成功 |
| 500 |
record_type 不能为空 |
缺少必填参数 record_type |
| 500 |
record_type 必须是 redundancy、change 或 merge 之一 |
record_type 值不合法 |
| 500 |
meta1 不能为空且必须是对象 |
meta1 参数缺失或格式错误 |
| 500 |
meta2 不能为空且必须是对象 |
meta2 参数缺失或格式错误 |
| 500 |
meta1 缺少必要字段: {field} |
meta1 缺少必填字段 |
| 500 |
meta2 缺少必要字段: {field} |
meta2 缺少必填字段 |
| 500 |
请求数据格式错误,应为 JSON 对象 |
请求体不是有效的 JSON |
| 500 |
创建审核记录失败 |
服务器内部错误 |
record_type 枚举说明
| 值 |
含义 |
使用场景 |
redundancy |
疑似重复 |
两个元数据名称相似,可能是重复定义 |
change |
疑似变动 |
元数据定义发生变化,需要审核确认 |
merge |
合并请求 |
请求将两个元数据合并为一个 |
Vue 3 接入示例
1. API 请求封装
// src/api/metaReview.ts
import request from '@/utils/request'
// 元数据对象类型定义
export interface MetaInfo {
id: number
name_zh: string
name_en: string
data_type: string
status: boolean
}
// 创建审核记录请求参数
export interface CreateReviewParams {
record_type: 'redundancy' | 'change' | 'merge'
source?: string
meta1: MetaInfo
meta2: MetaInfo
notes?: string
}
// 审核记录响应数据
export interface ReviewRecord {
id: number
record_type: string
source: string
business_domain_id: number | null
new_meta: MetaInfo
candidates: MetaInfo[]
old_meta: MetaInfo | null
status: string
resolution_action: string | null
resolution_payload: Record<string, any> | null
notes: string | null
created_at: string
updated_at: string
resolved_at: string | null
resolved_by: string | null
}
// API 响应类型
export interface ApiResponse<T> {
code: number
message: string
data: T
error?: string
}
// 创建审核记录
export function createMetaReview(params: CreateReviewParams) {
return request.post<ApiResponse<{
record: ReviewRecord
message: string
}>>('/api/meta_data/review/create', params)
}
2. 组件中使用
<!-- src/views/meta/ReviewCreate.vue -->
<template>
<div class="review-create">
<el-card>
<template #header>
<span>创建元数据审核记录</span>
</template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
>
<!-- 审核类型 -->
<el-form-item label="审核类型" prop="record_type">
<el-select v-model="formData.record_type" placeholder="请选择审核类型">
<el-option label="疑似重复" value="redundancy" />
<el-option label="疑似变动" value="change" />
<el-option label="合并请求" value="merge" />
</el-select>
</el-form-item>
<!-- 元数据1 -->
<el-divider content-position="left">主元数据信息</el-divider>
<el-form-item label="节点ID" prop="meta1.id">
<el-input-number v-model="formData.meta1.id" :min="1" />
</el-form-item>
<el-form-item label="中文名" prop="meta1.name_zh">
<el-input v-model="formData.meta1.name_zh" />
</el-form-item>
<el-form-item label="英文名" prop="meta1.name_en">
<el-input v-model="formData.meta1.name_en" />
</el-form-item>
<el-form-item label="数据类型" prop="meta1.data_type">
<el-input v-model="formData.meta1.data_type" placeholder="如 varchar(255)" />
</el-form-item>
<el-form-item label="状态" prop="meta1.status">
<el-switch v-model="formData.meta1.status" />
</el-form-item>
<!-- 元数据2 -->
<el-divider content-position="left">对比元数据信息</el-divider>
<el-form-item label="节点ID" prop="meta2.id">
<el-input-number v-model="formData.meta2.id" :min="1" />
</el-form-item>
<el-form-item label="中文名" prop="meta2.name_zh">
<el-input v-model="formData.meta2.name_zh" />
</el-form-item>
<el-form-item label="英文名" prop="meta2.name_en">
<el-input v-model="formData.meta2.name_en" />
</el-form-item>
<el-form-item label="数据类型" prop="meta2.data_type">
<el-input v-model="formData.meta2.data_type" placeholder="如 varchar(255)" />
</el-form-item>
<el-form-item label="状态" prop="meta2.status">
<el-switch v-model="formData.meta2.status" />
</el-form-item>
<!-- 备注 -->
<el-divider />
<el-form-item label="备注" prop="notes">
<el-input
v-model="formData.notes"
type="textarea"
:rows="3"
placeholder="请输入备注信息(可选)"
/>
</el-form-item>
<!-- 提交按钮 -->
<el-form-item>
<el-button type="primary" :loading="loading" @click="handleSubmit">
提交审核
</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { createMetaReview, type CreateReviewParams, type MetaInfo } from '@/api/metaReview'
const formRef = ref<FormInstance>()
const loading = ref(false)
// 表单数据
const formData = reactive<CreateReviewParams>({
record_type: 'redundancy',
source: 'manual',
meta1: {
id: 0,
name_zh: '',
name_en: '',
data_type: 'varchar(255)',
status: true,
},
meta2: {
id: 0,
name_zh: '',
name_en: '',
data_type: 'varchar(255)',
status: true,
},
notes: '',
})
// 表单校验规则
const formRules: FormRules = {
record_type: [
{ required: true, message: '请选择审核类型', trigger: 'change' },
],
'meta1.id': [
{ required: true, message: '请输入元数据1节点ID', trigger: 'blur' },
],
'meta1.name_zh': [
{ required: true, message: '请输入元数据1中文名', trigger: 'blur' },
],
'meta1.name_en': [
{ required: true, message: '请输入元数据1英文名', trigger: 'blur' },
],
'meta1.data_type': [
{ required: true, message: '请输入元数据1数据类型', trigger: 'blur' },
],
'meta2.id': [
{ required: true, message: '请输入元数据2节点ID', trigger: 'blur' },
],
'meta2.name_zh': [
{ required: true, message: '请输入元数据2中文名', trigger: 'blur' },
],
'meta2.name_en': [
{ required: true, message: '请输入元数据2英文名', trigger: 'blur' },
],
'meta2.data_type': [
{ required: true, message: '请输入元数据2数据类型', trigger: 'blur' },
],
}
// 提交表单
const handleSubmit = async () => {
if (!formRef.value) return
await formRef.value.validate(async (valid) => {
if (!valid) return
loading.value = true
try {
const res = await createMetaReview(formData)
if (res.data.code === 200) {
ElMessageBox.confirm(
res.data.data.message,
'创建成功',
{
confirmButtonText: '前往审核页面',
cancelButtonText: '继续创建',
type: 'success',
}
).then(() => {
// 跳转到审核页面
// router.push('/meta/review/list')
}).catch(() => {
// 重置表单继续创建
handleReset()
})
} else {
ElMessage.error(res.data.message || '创建失败')
}
} catch (error: any) {
ElMessage.error(error.message || '请求失败')
} finally {
loading.value = false
}
})
}
// 重置表单
const handleReset = () => {
formRef.value?.resetFields()
}
</script>
<style scoped>
.review-create {
padding: 20px;
}
</style>
3. Axios 请求封装参考
// src/utils/request.ts
import axios from 'axios'
import { ElMessage } from 'element-plus'
const request = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL || '',
timeout: 30000,
headers: {
'Content-Type': 'application/json',
},
})
// 响应拦截器
request.interceptors.response.use(
(response) => {
return response
},
(error) => {
const message = error.response?.data?.message || error.message || '请求失败'
ElMessage.error(message)
return Promise.reject(error)
}
)
export default request
快速调用示例
使用 fetch
async function createReviewRecord() {
const response = await fetch('/api/meta_data/review/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
record_type: 'redundancy',
meta1: {
id: 1001,
name_zh: '仓库名称',
name_en: 'warehouse_name',
data_type: 'varchar(255)',
status: true
},
meta2: {
id: 1002,
name_zh: '仓库名',
name_en: 'wh_name',
data_type: 'varchar(100)',
status: true
},
notes: '疑似重复'
})
})
const result = await response.json()
if (result.code === 200) {
console.log('创建成功:', result.data.record)
alert(result.data.message)
} else {
console.error('创建失败:', result.message)
}
}
使用 axios
import axios from 'axios'
axios.post('/api/meta_data/review/create', {
record_type: 'merge',
meta1: {
id: 1001,
name_zh: '仓库名称',
name_en: 'warehouse_name',
data_type: 'varchar(255)',
status: true
},
meta2: {
id: 1002,
name_zh: '仓库名',
name_en: 'wh_name',
data_type: 'varchar(100)',
status: true
}
}).then(res => {
if (res.data.code === 200) {
console.log('审核记录ID:', res.data.data.record.id)
}
}).catch(err => {
console.error('请求失败:', err)
})
相关接口
| 接口 |
方法 |
说明 |
/api/meta_data/review/list |
POST |
查询审核记录列表 |
/api/meta_data/review/detail |
GET |
获取审核记录详情 |
/api/meta_data/review/resolve |
POST |
处理审核记录 |
注意事项
- 元数据 ID:
meta1.id 和 meta2.id 应为有效的 Neo4j 节点 ID
- 状态值:
status 为布尔值,true 表示启用,false 表示禁用
- record_type:必须是三个枚举值之一,否则会返回错误
- 幂等性:该接口不具备幂等性,重复调用会创建多条审核记录
- 后续处理:创建成功后,需要前往数据审核页面(
/api/meta_data/review/list)查看并处理审核记录
更新日志
| 日期 |
版本 |
说明 |
| 2024-01-15 |
v1.0 |
初始版本 |