# 元数据审核处理接口 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 ``` ### 3. 审核详情页面示例 ```vue ``` --- ## 注意事项 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 关系重建 |