mirror of
https://github.com/patdelphi/suanming.git
synced 2026-02-28 05:33:11 +08:00
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:
136
fix-string-id-records.cjs
Normal file
136
fix-string-id-records.cjs
Normal 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 };
|
||||
Reference in New Issue
Block a user