diff --git a/static/js/app.js b/static/js/app.js index 9b7a6b6..aec68ab 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -939,17 +939,28 @@ function displayDifferences() { }); let html = ` - +
-
- - ${Object.entries(fieldStats).map(([field, count]) => ` - - `).join('')} +
+
+
+ + ${Object.entries(fieldStats).map(([field, count]) => ` + + `).join('')} +
+
+
+
+ +
+
@@ -1989,6 +2000,70 @@ function copyRawData() { } } +// 复制差异主键 +function copyDifferenceKeys() { + console.log('copyDifferenceKeys 被调用'); + console.log('filteredDifferenceResults:', filteredDifferenceResults); + + if (!filteredDifferenceResults || filteredDifferenceResults.length === 0) { + showAlert('warning', '无差异数据可复制'); + return; + } + + try { + // 收集所有差异记录的主键 + const differenceKeys = []; + const uniqueKeys = new Set(); + + filteredDifferenceResults.forEach(diff => { + console.log('处理差异记录:', diff); + if (diff.key) { + let keyText = ''; + + if (typeof diff.key === 'object' && !Array.isArray(diff.key)) { + // 复合主键:转换为逗号分隔格式 + keyText = Object.values(diff.key).join(','); + } else { + // 单主键或其他格式 + keyText = String(diff.key); + } + + console.log('提取的主键:', keyText); + + // 避免重复主键 + if (!uniqueKeys.has(keyText)) { + uniqueKeys.add(keyText); + differenceKeys.push(keyText); + } + } + }); + + console.log('收集到的主键列表:', differenceKeys); + + if (differenceKeys.length === 0) { + showAlert('warning', '未找到有效的主键数据'); + return; + } + + // 将主键列表转换为文本格式(每行一个) + const keyText = differenceKeys.join('\n'); + console.log('准备复制的文本:', keyText); + + // 复制到剪贴板 + navigator.clipboard.writeText(keyText).then(() => { + console.log('复制成功'); + showAlert('success', `已复制 ${differenceKeys.length} 个差异主键到剪贴板`); + }).catch(err => { + console.error('复制失败:', err); + showAlert('danger', '复制失败,请手动选择复制'); + }); + + } catch (error) { + console.error('处理差异主键失败:', error); + showAlert('danger', '处理差异主键失败: ' + error.message); + } +} + // 显示差异数据的原生数据 function showDifferenceRawData(keyStr) { showRawData(keyStr); // 复用相同的原生数据显示逻辑