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); // 复用相同的原生数据显示逻辑