mirror of
https://github.com/patdelphi/suanming.git
synced 2026-02-28 05:33:11 +08:00
- 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
136 lines
4.9 KiB
JavaScript
136 lines
4.9 KiB
JavaScript
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 }; |