From 5b73fc0eaef82d2eff43244960e6e74264fe0b3d Mon Sep 17 00:00:00 2001 From: mac Date: Fri, 24 Jul 2026 16:23:07 +0800 Subject: [PATCH] =?UTF-8?q?v2.0.1=20=E2=80=94=20=E4=BF=AE=E5=A4=8D=20datab?= =?UTF-8?q?ase.py=20=E7=BC=BA=E5=B0=91=E8=81=9A=E5=90=88=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/database.py b/database.py index 774b20d..6e71b64 100644 --- a/database.py +++ b/database.py @@ -224,3 +224,90 @@ def reorder_wishes(order_list): conn.execute('UPDATE wishes SET sort_order = ? WHERE id = ?', (idx, wid)) conn.commit() conn.close() + + +def get_weeks_list(): + """返回所有已有打卡记录的周号列表""" + conn = get_conn() + rows = conn.execute('SELECT DISTINCT date FROM checkins ORDER BY date').fetchall() + conn.close() + return [r['date'] for r in rows] + + +def get_daily_backup(week_str): + """获取某周的原始日记录(从备份表)""" + from datetime import datetime as _dt, timedelta + if '-W' not in week_str: + return [] + year_part, week_part = week_str.split('-W') + try: + year = int(year_part) + week = int(week_part) + except (ValueError, IndexError): + return [] + jan1 = _dt(year, 1, 1) + delta = timedelta(days=(week - 1) * 7 - jan1.weekday()) + monday = jan1 + delta + dates = [monday.strftime('%Y-%m-%d')] + for i in range(1, 7): + dates.append((monday + timedelta(days=i)).strftime('%Y-%m-%d')) + conn = get_conn() + placeholders = ','.join('?' for _ in dates) + exists = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='checkins_daily_backup'").fetchone() + if not exists: + conn.close() + return [] + rows = conn.execute( + f"SELECT date, data FROM checkins_daily_backup WHERE date IN ({placeholders}) ORDER BY date", + dates + ).fetchall() + conn.close() + results = [] + for row in rows: + results.append({'date': row['date'], 'data': json.loads(row['data'])}) + return results + + +def _aggregate_daily_to_weekly(conn): + """将 checkins_daily_backup 的日数据聚合为周数据,写入 checkins""" + from datetime import datetime as _dt + rows = conn.execute('SELECT date, data FROM checkins_daily_backup ORDER BY date').fetchall() + weekly = {} + for row in rows: + try: + d = _dt.strptime(row['date'], '%Y-%m-%d') + except ValueError: + continue + iso_year, iso_week, _ = d.isocalendar() + week_key = f"{iso_year}-W{iso_week:02d}" + if week_key not in weekly: + weekly[week_key] = {'morning': [], 'evening': [], 'study': []} + data = json.loads(row['data']) + for mi in data.get('morning', []): + text = mi if isinstance(mi, str) else mi.get('text', '') + if text: + existing_texts = {x if isinstance(x, str) else x.get('text', '') for x in weekly[week_key]['morning']} + if text not in existing_texts: + weekly[week_key]['morning'].append(mi) + for ei in data.get('evening', []): + mst = ei.get('mistake', '') if isinstance(ei, dict) else '' + if mst: + existing = {x.get('mistake', '') if isinstance(x, dict) else x for x in weekly[week_key]['evening']} + if mst not in existing: + weekly[week_key]['evening'].append(ei if isinstance(ei, dict) else {'mistake': ei, 'improvement': ''}) + existing_names = {} + for si in weekly[week_key]['study']: + nm = si.get('name', '') if isinstance(si, dict) else str(si) + if nm: + existing_names[nm] = si + for si in data.get('study', []): + nm = si.get('name', '') if isinstance(si, dict) else str(si) + if nm and nm not in existing_names: + weekly[week_key]['study'].append(si) + existing_names[nm] = si + now = _dt.now().isoformat() + for week_key in sorted(weekly.keys()): + conn.execute( + 'INSERT INTO checkins (date, data, created_at, updated_at) VALUES (?, ?, ?, ?)', + (week_key, json.dumps(weekly[week_key], ensure_ascii=False), now, now) + )