Files
Toolbox/dev_test_scripts/debug/debug_calendar_succulent.js
yangxiangyuan db7648eb4d feat(mp, web, calendar): 新增微信收藏夹与日历批量生成功能
- 新增微信小程序版个人收藏夹全套功能,包含聚合首页、收藏列表、编辑、详情页面与配套后端API
- 新增web版时光助手门户与个人收藏夹工具,支持与小程序共享后端数据
- 优化日历提醒工具:替换本地bootstrap资源为公共CDN版本,新增批量生成循环提醒的前端界面与后端逻辑,新增数据库batch_id字段,更新鉴权配置文件
- 补充项目配置、站点地图、调试诊断脚本等配套文件
- 完善各模块的页面配置与样式文件
2026-09-02 22:20:37 +08:00

73 lines
3.8 KiB
JavaScript
Raw Permalink 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.
// 调试:查询 calendar_reminder 数据库中"多肉"相关的批量插入记录统计
const path = require('path');
const fs = require('fs');
const Database = require('better-sqlite3');
const DB_PATH = path.join(process.cwd(), 'data', 'calendar_reminder.db');
console.log('DB exists:', fs.existsSync(DB_PATH), DB_PATH);
if (!fs.existsSync(DB_PATH)) { process.exit(1); }
const db = new Database(DB_PATH, { readonly: true });
db.pragma('journal_mode = WAL');
console.log('\n=== 表结构 ===');
db.prepare("PRAGMA table_info(events)").all().forEach(c => {
console.log(` ${c.name} (${c.type})`);
});
const total = db.prepare('SELECT COUNT(1) AS c FROM events').get().c;
console.log(`\n总记录数 events: ${total}`);
const byDel = db.prepare('SELECT deleted, COUNT(1) AS c FROM events GROUP BY deleted').all();
console.log('\n按 deleted 分组:');
byDel.forEach(r => console.log(` deleted=${r.deleted} -> ${r.c}`));
// 查询"多肉"相关(title / content 包含"多肉")
const kw = '%多肉%';
const succuAll = db.prepare("SELECT COUNT(1) AS c FROM events WHERE title LIKE ? OR content LIKE ?").get(kw, kw).c;
console.log(`\n含「多肉」的事件(title/content): ${succuAll}`);
if (succuAll > 0) {
const rows = db.prepare("SELECT id, title, substr(content,1,80) AS content, start, end, remindAt, recurrence, createdAt, updatedAt, deleted, completed FROM events WHERE title LIKE ? OR content LIKE ? ORDER BY createdAt DESC LIMIT 50").all(kw, kw);
console.log(`\n多肉记录抽样(最近 50 条):`);
rows.forEach(r => {
const tag = [
r.deleted ? '🗑删' : null,
r.completed ? '✅完' : null,
r.recurrence ? '🔁' + r.recurrence : null,
r.remindAt ? '⏰' : null
].filter(Boolean).join('');
console.log(` [${r.createdAt ? r.createdAt.slice(0,16) : '?'}] ${r.id.slice(0,8)} | ${r.title || '(无题)'} ${tag} | start=${r.start ? r.start.slice(0,16) : '?'} | content=${r.content || ''}`);
});
// 按 title 分组统计(看批量插入的规律)
const byTitle = db.prepare("SELECT title, COUNT(1) AS c, MIN(start) AS firstStart, MAX(start) AS lastStart FROM events WHERE title LIKE ? OR content LIKE ? GROUP BY title ORDER BY c DESC LIMIT 30").all(kw, kw);
console.log('\n按 title 聚合(多肉相关)TOP30:');
byTitle.forEach(r => console.log(` x${String(r.c).padStart(4,' ')} | ${r.firstStart ? r.firstStart.slice(0,10) : ''}~${r.lastStart ? r.lastStart.slice(0,10) : ''} | ${r.title || '(空)'}`));
// 按创建日期分组,看是否有批量插入特征
const byDay = db.prepare(`SELECT substr(createdAt,1,10) AS d, COUNT(1) AS c, COUNT(DISTINCT title) AS titles
FROM events WHERE title LIKE ? OR content LIKE ?
GROUP BY substr(createdAt,1,10) ORDER BY d DESC LIMIT 30`).all(kw, kw);
console.log('\n按 createdAt 日期聚合(多肉相关)TOP30:');
byDay.forEach(r => console.log(` ${r.d} x${String(r.c).padStart(4,' ')} distinct_titles=${r.titles}`));
// 按 recurrence 分组
const byRecur = db.prepare("SELECT recurrence, COUNT(1) AS c FROM events WHERE (title LIKE ? OR content LIKE ?) GROUP BY recurrence ORDER BY c DESC").all(kw, kw);
console.log('\n按 recurrence 分组:');
byRecur.forEach(r => console.log(` [${r.recurrence || '(无)'}] x${r.c}`));
// 删除 / 未删除 / 已完成比例
const stat = db.prepare(`SELECT
COUNT(1) AS total,
SUM(CASE WHEN deleted=1 THEN 1 ELSE 0 END) AS del,
SUM(CASE WHEN deleted=0 THEN 1 ELSE 0 END) AS alive,
SUM(CASE WHEN deleted=0 AND completed=1 THEN 1 ELSE 0 END) AS aliveDone,
SUM(CASE WHEN deleted=0 AND completed=0 THEN 1 ELSE 0 END) AS aliveTodo
FROM events WHERE title LIKE ? OR content LIKE ?`).get(kw, kw);
console.log('\n多肉记录状态:');
console.log(` 总数=${stat.total} 删除=${stat.del} 存活=${stat.alive} 存活中已完成=${stat.aliveDone} 存活中待办=${stat.aliveTodo}`);
}
db.close();