Commit c8ead117 c8ead11724e1dcb9ff13128f1f23342792405a17 by 沈秋雨

feat(import): 支持同曲不同词样本的新歌入库逻辑

1 parent 527d6149
......@@ -1565,7 +1565,7 @@
els.importReviewedBtn.textContent = '入库中...';
try {
const payload = await reviewPostJSON('/api/import-reviewed');
alert(`提交完成:不重复入库 ${payload.inserted_count} 条,重复样本 ${payload.duplicate_count || 0} 条,其中作者有增量 ${payload.author_merged_count || 0} 条。结果文件:${payload.review_csv}`);
alert(`提交完成:不重复入库 ${payload.inserted_count} (含同曲不同词 ${payload.diff_lyric_count || 0} 条),重复样本 ${payload.duplicate_count || 0} 条,其中作者有增量 ${payload.author_merged_count || 0} 条。结果文件:${payload.review_csv}`);
// 刷新统计和加载列表并行
await Promise.all([reloadSummary(), loadGroups()]);
renderAll();
......
......@@ -806,7 +806,7 @@ def _import_approved_staging(source_ids: list[str] | None = None) -> dict[str, o
cursor.execute(
f"""
SELECT s.staging_id, s.id AS incoming_id, s.source_song_id, s.source_table_name, s.name,
s.lyricist, s.composer, s.biz_review_status, s.matched_song_id
s.lyricist, s.composer, s.biz_review_status, s.matched_song_id, s.merge_diff_type
FROM {TARGET_TABLE_NAME_TMP} s
INNER JOIN (
SELECT source_song_id, MAX(staging_id) AS max_staging_id
......@@ -828,9 +828,17 @@ def _import_approved_staging(source_ids: list[str] | None = None) -> dict[str, o
conn.rollback()
raise ValueError("没有可提交的已审核样本")
approved_rows = [row for row in reviewed_rows if row["biz_review_status"] == "approved_import"]
duplicate_rows = [row for row in reviewed_rows if row["biz_review_status"] == "rejected_duplicate"]
staging_ids = [row["staging_id"] for row in approved_rows]
approved_source_ids = [str(row["source_song_id"]) for row in approved_rows]
# 同曲不同词:歌词不同,需作为新歌入库
diff_lyric_rows = [row for row in reviewed_rows
if row["biz_review_status"] == "rejected_duplicate"
and row.get("merge_diff_type") == "diff_lyric_same_melody"]
# 纯重复 / 同词不同曲:不入库,仅合并作者
duplicate_rows = [row for row in reviewed_rows
if row["biz_review_status"] == "rejected_duplicate"
and row.get("merge_diff_type") != "diff_lyric_same_melody"]
import_rows = approved_rows + diff_lyric_rows
staging_ids = [row["staging_id"] for row in import_rows]
all_import_source_ids = [str(row["source_song_id"]) for row in import_rows]
duplicate_targets: dict[object, int] = {}
unresolved_duplicates = []
for row in duplicate_rows:
......@@ -858,7 +866,7 @@ def _import_approved_staging(source_ids: list[str] | None = None) -> dict[str, o
inserted_count = 0
id_map: dict[str, object] = {}
if approved_rows:
if import_rows:
staging_placeholders = ",".join(["%s"] * len(staging_ids))
conflicts = _find_import_conflicts(cursor, staging_ids)
if conflicts:
......@@ -893,13 +901,13 @@ def _import_approved_staging(source_ids: list[str] | None = None) -> dict[str, o
FROM {TARGET_TABLE_NAME}
WHERE source_song_id IN ({source_placeholders})
""",
approved_source_ids,
all_import_source_ids,
)
id_map = {str(row["source_song_id"]): row["target_id"] for row in cursor.fetchall()}
imported_updated = 0
for approved_row in approved_rows:
sid = str(approved_row["source_song_id"])
for import_row in import_rows:
sid = str(import_row["source_song_id"])
target_id = id_map.get(sid)
if target_id is None:
raise RuntimeError(f"入库后未找到目标记录: source_song_id={sid}")
......@@ -910,7 +918,7 @@ def _import_approved_staging(source_ids: list[str] | None = None) -> dict[str, o
review_version = review_version + 1
WHERE staging_id = %s AND staging_status = 'staged'
""",
(target_id, approved_row["staging_id"]),
(target_id, import_row["staging_id"]),
)
imported_updated += cursor.rowcount
......@@ -958,12 +966,14 @@ def _import_approved_staging(source_ids: list[str] | None = None) -> dict[str, o
conn.commit()
return {
"approved_count": len(approved_rows),
"diff_lyric_count": len(diff_lyric_rows),
"inserted_count": inserted_count,
"imported_song_ids_updated": imported_updated,
"duplicate_count": len(duplicate_rows),
"duplicate_staging_updated": duplicate_updated,
"author_merged_count": author_merged,
"source_ids": approved_source_ids,
"source_ids": [str(row["source_song_id"]) for row in approved_rows],
"diff_lyric_source_ids": [str(row["source_song_id"]) for row in diff_lyric_rows],
"duplicate_source_ids": [str(row["source_song_id"]) for row in duplicate_rows],
}
......