api_review_create_guide.md 14 KB

元数据审核记录创建接口 - 前端开发指南

接口概述

该接口用于创建元数据审核记录,支持前端页面发起两个元数据的对比审核请求(如疑似重复、变动审核、合并请求等场景)。

基本信息

项目 说明
接口路径 /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 处理审核记录

注意事项

  1. 元数据 IDmeta1.idmeta2.id 应为有效的 Neo4j 节点 ID
  2. 状态值status 为布尔值,true 表示启用,false 表示禁用
  3. record_type:必须是三个枚举值之一,否则会返回错误
  4. 幂等性:该接口不具备幂等性,重复调用会创建多条审核记录
  5. 后续处理:创建成功后,需要前往数据审核页面(/api/meta_data/review/list)查看并处理审核记录

更新日志

日期 版本 说明
2024-01-15 v1.0 初始版本