# 元数据审核处理接口 API 前端开发指南
本文档面向前端开发人员,用于开发"元数据审核处理"功能。
## 接口基本信息
| 属性 | 值 |
| --- | --- |
| 接口路径 | `POST /api/meta/review/resolve` |
| 完整URL | `http://{host}:{port}/api/meta/review/resolve` |
| Content-Type | `application/json` |
| 请求方式 | POST |
## 统一返回格式
### 成功响应
```json
{
"code": 200,
"message": "操作成功",
"data": {
"id": 123,
"record_type": "redundancy",
"status": "resolved",
"resolution_action": "alias",
"resolution_payload": {
"primary_meta_id": 100,
"alias_meta_id": 200
},
"resolved_by": "admin",
"resolved_at": "2025-01-09T10:30:00.000000",
"notes": "合并重复元数据"
}
}
```
### 失败响应
```json
{
"code": 500,
"message": "错误原因",
"data": null,
"error": "详细错误信息(可选)"
}
```
## 请求参数
### 公共参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| id | int | 是 | 审核记录ID |
| action | string | 是 | 处理动作,可选值见下方说明 |
| payload | object | 否 | 动作参数,根据action不同而变化 |
| resolved_by | string | 否 | 处理人标识(建议传登录用户名/工号) |
| notes | string | 否 | 处理备注 |
### action 可选值
| action 值 | 用途 | 适用场景 |
| --- | --- | --- |
| `alias` | 设置元数据别名关系 | redundancy(疑似冗余) |
| `create_new` | 创建新元数据 | redundancy(疑似冗余) |
| `accept_change` | 接受元数据变动 | change(疑似变动) |
| `reject_change` | 拒绝元数据变动 | change(疑似变动) |
| `ignore` | 忽略该记录 | 任意类型 |
---
## action=alias(设置元数据别名关系)
### 功能说明
在 Neo4j 的 DataMeta 节点之间建立 ALIAS 关系,用于合并重复/相似的元数据。
**核心行为**:
- 创建 `(alias_meta)-[:ALIAS]->(primary_meta)` 关系
- 将所有原先指向 `alias_meta` 的 ALIAS 关系转移到 `primary_meta`
- `primary_meta` 已有的 ALIAS 关系保持不变
- BusinessDomain 的 INCLUDES 关系不受影响
```
操作前:
[other_alias_1] --ALIAS--> [alias_meta]
[other_alias_2] --ALIAS--> [alias_meta]
[existing_alias] --ALIAS--> [primary_meta]
操作后:
[other_alias_1] --ALIAS--> [primary_meta]
[other_alias_2] --ALIAS--> [primary_meta]
[alias_meta] --ALIAS--> [primary_meta]
[existing_alias] --ALIAS--> [primary_meta]
```
### payload 参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| primary_meta_id | int | 是 | 主元数据 Neo4j ID(作为别名目标) |
| alias_meta_id | int | 是 | 别名元数据 Neo4j ID(将成为别名) |
### 请求示例
```json
{
"id": 1001,
"action": "alias",
"payload": {
"primary_meta_id": 100,
"alias_meta_id": 200
},
"resolved_by": "admin",
"notes": "将重复元数据合并为别名"
}
```
### 响应示例
```json
{
"code": 200,
"message": "操作成功",
"data": {
"id": 1001,
"record_type": "redundancy",
"business_domain_id": 345,
"new_meta": {
"name_zh": "科室名称",
"name_en": "DEPT_NAME",
"data_type": "varchar(50)"
},
"candidates": [...],
"status": "resolved",
"resolution_action": "alias",
"resolution_payload": {
"primary_meta_id": 100,
"alias_meta_id": 200
},
"resolved_by": "admin",
"resolved_at": "2025-01-09T10:30:00.000000",
"notes": "将重复元数据合并为别名",
"created_at": "2025-01-08T09:00:00.000000",
"updated_at": "2025-01-09T10:30:00.000000"
}
}
```
### 错误信息
| 错误信息 | 原因 |
| --- | --- |
| `payload.primary_meta_id 不能为空` | 未提供 primary_meta_id |
| `payload.alias_meta_id 不能为空` | 未提供 alias_meta_id |
| `primary_meta_id 和 alias_meta_id 不能相同` | 两个ID相同 |
---
## action=create_new(创建新元数据)
### payload 参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| new_name_zh | string | 是 | 新元数据中文名(需与现有区分) |
### 请求示例
```json
{
"id": 1002,
"action": "create_new",
"payload": {
"new_name_zh": "HIS科室名称(新)"
},
"resolved_by": "admin"
}
```
### 错误信息
| 错误信息 | 原因 |
| --- | --- |
| `记录缺少 business_domain_id,无法执行 create_new` | 审核记录无业务领域关联 |
| `payload.new_name_zh 不能为空` | 未提供中文名 |
| `创建新元数据失败` | Neo4j 创建节点失败 |
---
## action=accept_change(接受变动)
### payload 参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| meta_id | int | 否 | 目标元数据ID,不传时使用 old_meta.meta_id |
### 请求示例
```json
{
"id": 2001,
"action": "accept_change",
"payload": {
"meta_id": 789
},
"resolved_by": "admin",
"notes": "接受字段长度调整"
}
```
### 错误信息
| 错误信息 | 原因 |
| --- | --- |
| `无法确定需要更新的 meta_id` | 未提供且记录中无 old_meta.meta_id |
---
## action=reject_change(拒绝变动)
### 请求示例
```json
{
"id": 2002,
"action": "reject_change",
"resolved_by": "admin",
"notes": "变动不合规,暂不更新"
}
```
---
## action=ignore(忽略)
### 请求示例
```json
{
"id": 3001,
"action": "ignore",
"resolved_by": "admin"
}
```
---
## 公共错误信息
| 错误信息 | 原因 |
| --- | --- |
| `请求数据格式错误,应为 JSON 对象` | 请求体不是有效的 JSON 对象 |
| `id 不能为空` | 未提供审核记录ID |
| `action 不能为空` | 未提供处理动作 |
| `记录不存在` | 审核记录ID不存在 |
| `记录已处理,无法重复处理` | 审核记录状态非 pending |
| `不支持的action: xxx` | action 值不在允许列表中 |
| `处理审核记录失败` | 服务器内部错误 |
---
## Vue 示例代码
### 1. API 封装
```javascript
// api/metaReview.js
import axios from 'axios'
const API_BASE = '/api/meta'
/**
* 处理审核记录
* @param {Object} params - 请求参数
* @param {number} params.id - 审核记录ID
* @param {string} params.action - 处理动作
* @param {Object} params.payload - 动作参数
* @param {string} params.resolved_by - 处理人
* @param {string} params.notes - 备注
* @returns {Promise}
*/
export function resolveReviewRecord(params) {
return axios.post(`${API_BASE}/review/resolve`, params)
}
/**
* 设置元数据别名关系
* @param {number} recordId - 审核记录ID
* @param {number} primaryMetaId - 主元数据ID
* @param {number} aliasMetaId - 别名元数据ID
* @param {string} resolvedBy - 处理人
* @param {string} notes - 备注
* @returns {Promise}
*/
export function setMetaAlias(recordId, primaryMetaId, aliasMetaId, resolvedBy, notes = '') {
return resolveReviewRecord({
id: recordId,
action: 'alias',
payload: {
primary_meta_id: primaryMetaId,
alias_meta_id: aliasMetaId
},
resolved_by: resolvedBy,
notes
})
}
/**
* 创建新元数据
* @param {number} recordId - 审核记录ID
* @param {string} newNameZh - 新元数据中文名
* @param {string} resolvedBy - 处理人
* @returns {Promise}
*/
export function createNewMeta(recordId, newNameZh, resolvedBy) {
return resolveReviewRecord({
id: recordId,
action: 'create_new',
payload: {
new_name_zh: newNameZh
},
resolved_by: resolvedBy
})
}
/**
* 接受元数据变动
* @param {number} recordId - 审核记录ID
* @param {number} metaId - 目标元数据ID(可选)
* @param {string} resolvedBy - 处理人
* @param {string} notes - 备注
* @returns {Promise}
*/
export function acceptChange(recordId, metaId, resolvedBy, notes = '') {
const payload = metaId ? { meta_id: metaId } : {}
return resolveReviewRecord({
id: recordId,
action: 'accept_change',
payload,
resolved_by: resolvedBy,
notes
})
}
/**
* 拒绝元数据变动
* @param {number} recordId - 审核记录ID
* @param {string} resolvedBy - 处理人
* @param {string} notes - 备注
* @returns {Promise}
*/
export function rejectChange(recordId, resolvedBy, notes = '') {
return resolveReviewRecord({
id: recordId,
action: 'reject_change',
resolved_by: resolvedBy,
notes
})
}
/**
* 忽略审核记录
* @param {number} recordId - 审核记录ID
* @param {string} resolvedBy - 处理人
* @returns {Promise}
*/
export function ignoreRecord(recordId, resolvedBy) {
return resolveReviewRecord({
id: recordId,
action: 'ignore',
resolved_by: resolvedBy
})
}
```
### 2. 设置别名组件
```vue
选择作为主元数据的节点,其他节点将成为它的别名
选择要降级为别名的元数据节点
操作提示
执行此操作后:
- 别名元数据将指向主元数据
- 原先指向别名元数据的所有 ALIAS 关系将转移到主元数据
- 业务领域的 INCLUDES 关系不受影响
取消
确定
```
### 3. 审核详情页面示例
```vue
{{ record.record_type === 'redundancy' ? '疑似冗余' : '疑似变动' }}
{{ record.business_domain_id }}
{{ record.created_at }}
{{ record.updated_at }}
新解析元数据
{{ record.new_meta?.name_zh }}
{{ record.new_meta?.name_en }}
{{ record.new_meta?.data_type }}
候选元数据列表
{{ field }}
设为别名
创建新元数据
接受变动
拒绝变动
忽略
```
---
## 注意事项
1. **状态限制**:只有 `status=pending` 的记录才能处理,已处理记录会返回错误。
2. **参数验证**:前端应在提交前验证必填参数,避免无效请求。
3. **别名操作不可逆**:alias 操作会修改 Neo4j 中的关系结构,请确保用户确认后再执行。
4. **ID 类型**:所有 ID 参数(record_id、primary_meta_id、alias_meta_id、meta_id)应为整数。
5. **错误处理**:建议统一封装 axios 拦截器处理错误响应,对 `code !== 200` 的情况进行统一提示。
---
## 更新日志
| 日期 | 版本 | 更新内容 |
| --- | --- | --- |
| 2025-01-09 | v2.0 | `action=alias` 参数变更:使用 `primary_meta_id` 和 `alias_meta_id` 替代原 `candidate_meta_id`,支持 ALIAS 关系重建 |