81 lines
2.7 KiB
JavaScript
81 lines
2.7 KiB
JavaScript
const { getDb } = require('../db/init');
|
|
|
|
const db = getDb('onion');
|
|
const CATEGORY_KEY = 'basic_info_role';
|
|
|
|
const MERGE_TO_OTHER = ['家长', '父母'];
|
|
const DELETE_ONLY = ['妻子', '女儿', '姐姐', '儿子'];
|
|
|
|
function updateStats(dbConn) {
|
|
const totalUsers = dbConn.prepare('SELECT COUNT(*) AS n FROM users').get().n || 1;
|
|
const stmt = dbConn.prepare(`
|
|
UPDATE tags
|
|
SET
|
|
coverage = (SELECT COUNT(DISTINCT user_id) FROM user_tags WHERE tag_id = tags.id),
|
|
coverage_rate = ROUND((SELECT COUNT(DISTINCT user_id) FROM user_tags WHERE tag_id = tags.id) * 100.0 / ?, 2)
|
|
WHERE id = ?
|
|
`);
|
|
|
|
const tagIds = dbConn.prepare('SELECT id FROM tags').all();
|
|
for (const tag of tagIds) stmt.run(totalUsers, tag.id);
|
|
}
|
|
|
|
function main() {
|
|
try {
|
|
const category = db.prepare('SELECT id FROM tag_categories WHERE key = ?').get(CATEGORY_KEY);
|
|
if (!category) throw new Error(`找不到分类: ${CATEGORY_KEY}`);
|
|
const catId = category.id;
|
|
|
|
const getTag = db.prepare('SELECT id, name FROM tags WHERE category_id = ? AND name = ?');
|
|
const mergeRel = db.prepare(`
|
|
INSERT OR IGNORE INTO user_tags (user_id, tag_id)
|
|
SELECT user_id, ? FROM user_tags WHERE tag_id = ?
|
|
`);
|
|
const deleteRel = db.prepare('DELETE FROM user_tags WHERE tag_id = ?');
|
|
const deleteTag = db.prepare('DELETE FROM tags WHERE id = ?');
|
|
|
|
const other = getTag.get(catId, '其他监护人');
|
|
if (!other) throw new Error('找不到“其他监护人”标签,无法合并');
|
|
|
|
const tx = db.transaction(() => {
|
|
for (const name of MERGE_TO_OTHER) {
|
|
const tag = getTag.get(catId, name);
|
|
if (!tag || tag.id === other.id) continue;
|
|
mergeRel.run(other.id, tag.id);
|
|
deleteRel.run(tag.id);
|
|
deleteTag.run(tag.id);
|
|
console.log(`✅ 合并: ${name} -> 其他监护人`);
|
|
}
|
|
|
|
for (const name of DELETE_ONLY) {
|
|
const tag = getTag.get(catId, name);
|
|
if (!tag) continue;
|
|
deleteRel.run(tag.id);
|
|
deleteTag.run(tag.id);
|
|
console.log(`🗑️ 删除: ${name}`);
|
|
}
|
|
});
|
|
|
|
tx();
|
|
updateStats(db);
|
|
|
|
const stats = db.prepare(`
|
|
SELECT
|
|
(SELECT COUNT(*) FROM tags t JOIN tag_categories c ON c.id=t.category_id WHERE c.key = ?) AS tag_count,
|
|
(SELECT COUNT(*) FROM user_tags) AS rel_count
|
|
`).get(CATEGORY_KEY);
|
|
|
|
console.log('\n✨ 二次收敛完成');
|
|
console.log(` • 家庭角色标签剩余: ${stats.tag_count}`);
|
|
console.log(` • 用户-标签关系总数: ${stats.rel_count}`);
|
|
|
|
db.close();
|
|
} catch (error) {
|
|
console.error('❌ 二次收敛失败:', error);
|
|
try { db.close(); } catch (_) {}
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
main();
|