2026-01-12
优化 meta_node_add 接口的冗余检测和处理逻辑,改进疑似重复元数据的处理流程。
旧逻辑:
force_create=true 强制创建新逻辑:
app/api/meta_data/routes.py - meta_node_add 函数# 旧代码:检测到疑似重复时直接返回失败
if redundancy_result["review_created"]:
return jsonify(failed("发现疑似重复元数据,已创建审核记录..."))
# 新代码:检测到疑似重复时标记状态,继续创建节点
if redundancy_result["has_candidates"]:
has_suspicious_duplicates = True
suspicious_candidates = redundancy_result["candidates"]
# 节点创建成功后
if has_suspicious_duplicates and suspicious_candidates:
# 构建新元数据快照(包含新创建的节点ID)
new_meta_snapshot = {
"id": node_data["id"], # 新创建的节点ID
"name_zh": node_name_zh,
"name_en": node_name_en or "",
"data_type": node_type,
"tag_ids": tag_ids,
}
# 写入审核记录
write_redundancy_review_record_with_new_id(
new_meta=new_meta_snapshot,
candidates=suspicious_candidates,
source="api",
)
# 返回成功,但提示疑似重复
return jsonify(success(node_data, message="元数据创建成功,但发现疑似重复..."))
app/core/meta_data/redundancy_check.pycheck_redundancy_for_add 函数review_created 字段# 旧代码
write_redundancy_review_record(new_meta, candidates, source="api")
return {
"has_exact_match": False,
"exact_match_id": None,
"has_candidates": True,
"candidates": candidates,
"review_created": True, # 已创建审核记录
}
# 新代码
return {
"has_exact_match": False,
"exact_match_id": None,
"has_candidates": True,
"candidates": candidates, # 只返回候选列表,不创建审核记录
}
write_redundancy_review_record_with_new_id 函数def write_redundancy_review_record_with_new_id(
new_meta: Dict[str, Any], # 包含已创建的节点ID
candidates: List[Dict[str, Any]],
source: str = "api",
) -> None:
"""
写入疑似冗余审核记录到 PostgreSQL(新元数据已创建,包含ID)
"""
# 实现逻辑与 write_redundancy_review_record 相同
# 区别在于 new_meta 中包含 id 字段
用户提交新增请求
↓
冗余检测
↓
发现疑似重复
↓
创建审核记录(不包含新节点ID)
↓
返回失败,提示使用 force_create=true
↓
用户需要再次提交请求(force_create=true)
↓
创建节点
用户提交新增请求
↓
冗余检测
↓
发现疑似重复
↓
创建新元数据节点
↓
创建审核记录(包含新节点ID + 疑似重复候选)
↓
返回成功,提示前往审核页面
↓
用户可以立即使用新节点,同时在审核页面处理重复问题
审核人员可以根据实际情况选择:
force_create=true 跳过冗余检测app/api/meta_data/routes.py - API 路由层app/core/meta_data/redundancy_check.py - 冗余检测核心逻辑app/models/metadata_review.py - 审核记录数据模型