Files
suanming/fix-string-id-records.cjs
patdelphi d1713be5f5 feat: refactor AI interpretation system and fix recordId issues
- Refactored AI interpretation table to use proper 1-to-1 relationship with reading records
- Fixed recordId parameter passing in AnalysisResultDisplay component
- Updated database schema to use reading_id instead of analysis_id
- Removed complex string ID generation logic
- Fixed TypeScript type definitions for all ID fields
- Added database migration scripts for AI interpretation refactoring
- Improved error handling and debugging capabilities
2025-08-23 23:05:13 +08:00

136 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const { getDB } = require('./server/database/index.cjs');
/**
* 修复字符串ID的AI解读记录尝试关联到对应的历史记录
*/
function fixStringIdRecords() {
try {
// 初始化数据库连接
const { dbManager } = require('./server/database/index.cjs');
dbManager.init();
const db = getDB();
console.log('=== 开始修复字符串ID的AI解读记录 ===\n');
// 1. 获取所有字符串ID的AI解读记录
const stringIdRecords = db.prepare(`
SELECT * FROM ai_interpretations
WHERE analysis_id NOT GLOB '[0-9]*'
ORDER BY created_at DESC
`).all();
console.log(`找到 ${stringIdRecords.length} 条字符串ID记录需要修复`);
let fixedCount = 0;
let skippedCount = 0;
stringIdRecords.forEach((record, index) => {
console.log(`\n处理记录 ${index + 1}/${stringIdRecords.length}:`);
console.log(` AI记录ID: ${record.id}`);
console.log(` analysis_id: ${record.analysis_id}`);
console.log(` analysis_type: ${record.analysis_type}`);
console.log(` created_at: ${record.created_at}`);
// 尝试根据时间戳和类型找到最匹配的历史记录
const possibleHistoryRecords = db.prepare(`
SELECT
id,
name,
reading_type,
created_at,
ABS(strftime('%s', created_at) - strftime('%s', ?)) as time_diff
FROM numerology_readings
WHERE reading_type = ? AND user_id = ?
ORDER BY time_diff ASC
LIMIT 5
`).all(record.created_at, record.analysis_type, record.user_id);
if (possibleHistoryRecords.length > 0) {
const bestMatch = possibleHistoryRecords[0];
const timeDiffHours = bestMatch.time_diff / 3600; // 转换为小时
console.log(` 找到 ${possibleHistoryRecords.length} 个可能的匹配记录:`);
possibleHistoryRecords.forEach((match, i) => {
const diffHours = match.time_diff / 3600;
console.log(` ${i + 1}. ID: ${match.id}, name: ${match.name}, 时间差: ${diffHours.toFixed(2)}小时`);
});
// 如果时间差在24小时内认为是合理的匹配
if (timeDiffHours <= 24) {
console.log(` ✅ 选择最佳匹配: ID ${bestMatch.id} (时间差: ${timeDiffHours.toFixed(2)}小时)`);
// 检查是否已经有AI解读记录关联到这个历史记录
const existingAI = db.prepare(`
SELECT id FROM ai_interpretations
WHERE analysis_id = ? AND user_id = ?
`).get(bestMatch.id.toString(), record.user_id);
if (existingAI) {
console.log(` ⚠️ 历史记录 ${bestMatch.id} 已经有AI解读记录跳过修复`);
skippedCount++;
} else {
// 更新AI解读记录的analysis_id
const updateResult = db.prepare(`
UPDATE ai_interpretations
SET analysis_id = ?
WHERE id = ?
`).run(bestMatch.id.toString(), record.id);
if (updateResult.changes > 0) {
console.log(` ✅ 成功更新: analysis_id ${record.analysis_id}${bestMatch.id}`);
fixedCount++;
} else {
console.log(` ❌ 更新失败`);
}
}
} else {
console.log(` ⚠️ 最佳匹配的时间差过大 (${timeDiffHours.toFixed(2)}小时),跳过修复`);
skippedCount++;
}
} else {
console.log(` ❌ 没有找到匹配的历史记录`);
skippedCount++;
}
});
console.log('\n=== 修复完成 ===');
console.log(`总处理记录: ${stringIdRecords.length}`);
console.log(`成功修复: ${fixedCount}`);
console.log(`跳过修复: ${skippedCount}`);
// 验证修复结果
console.log('\n=== 验证修复结果 ===');
const remainingStringIds = db.prepare(`
SELECT COUNT(*) as count FROM ai_interpretations
WHERE analysis_id NOT GLOB '[0-9]*'
`).get();
console.log(`剩余字符串ID记录: ${remainingStringIds.count}`);
const totalAIRecords = db.prepare(`
SELECT COUNT(*) as count FROM ai_interpretations
`).get();
console.log(`总AI解读记录: ${totalAIRecords.count}`);
// 重新统计匹配情况
const matchedRecords = db.prepare(`
SELECT COUNT(*) as count
FROM ai_interpretations ai
JOIN numerology_readings nr ON ai.analysis_id = nr.id AND ai.user_id = nr.user_id
`).get();
console.log(`成功匹配的记录: ${matchedRecords.count}`);
console.log(`匹配率: ${((matchedRecords.count / totalAIRecords.count) * 100).toFixed(1)}%`);
} catch (error) {
console.error('修复过程中发生错误:', error);
}
}
// 如果直接运行此脚本
if (require.main === module) {
fixStringIdRecords();
}
module.exports = { fixStringIdRecords };