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
This commit is contained in:
patdelphi
2025-08-23 23:05:13 +08:00
parent 529ae3b8aa
commit d1713be5f5
25 changed files with 1580 additions and 264 deletions

136
fix-string-id-records.cjs Normal file
View File

@@ -0,0 +1,136 @@
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 };