fix: bug
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
将 AI 提取的结构化数据合并到 SQLite
|
||||
与 panel schema 及 situationData.getSituation 对齐,支持回放
|
||||
与 panel schema 及 situationData.getSituation 对齐,支持回放。
|
||||
|
||||
地图打击数据(与前端攻击动画一致):
|
||||
- map_strike_sources: [{ "id": "israel"|"lincoln"|"ford", "name": "显示名", "lng", "lat" }] 写入 map_strike_source
|
||||
- map_strike_lines: [{ "source_id", "target_lng", "target_lat", "target_name?", "struck_at?" }] 追加到 map_strike_line
|
||||
爬虫/AI 可按此格式输出,落库后 GET /api/situation 的 mapData.strikeSources/strikeLines 会更新,前端直接追加攻击动画。
|
||||
"""
|
||||
import os
|
||||
import sqlite3
|
||||
@@ -67,6 +72,37 @@ def _ensure_tables(conn: sqlite3.Connection) -> None:
|
||||
conn.execute("CREATE TABLE IF NOT EXISTS retaliation_current (id INTEGER PRIMARY KEY CHECK (id = 1), value INTEGER NOT NULL)")
|
||||
conn.execute("CREATE TABLE IF NOT EXISTS retaliation_history (id INTEGER PRIMARY KEY AUTOINCREMENT, time TEXT NOT NULL, value INTEGER NOT NULL)")
|
||||
conn.execute("CREATE TABLE IF NOT EXISTS situation (id INTEGER PRIMARY KEY CHECK (id = 1), data TEXT NOT NULL, updated_at TEXT NOT NULL)")
|
||||
# 地图打击源与打击线(与 server/db.js 一致),供 getSituation mapData 与前端攻击动画使用
|
||||
conn.execute("""
|
||||
CREATE TABLE IF NOT EXISTS map_strike_source (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
lng REAL NOT NULL,
|
||||
lat REAL NOT NULL
|
||||
)
|
||||
""")
|
||||
conn.execute("""
|
||||
CREATE TABLE IF NOT EXISTS map_strike_line (
|
||||
source_id TEXT NOT NULL,
|
||||
target_lng REAL NOT NULL,
|
||||
target_lat REAL NOT NULL,
|
||||
target_name TEXT,
|
||||
struck_at TEXT,
|
||||
FOREIGN KEY (source_id) REFERENCES map_strike_source(id)
|
||||
)
|
||||
""")
|
||||
try:
|
||||
conn.execute("CREATE INDEX IF NOT EXISTS idx_map_strike_line_source ON map_strike_line(source_id)")
|
||||
except sqlite3.OperationalError:
|
||||
pass
|
||||
try:
|
||||
for col in ("struck_at",):
|
||||
cur = conn.execute("PRAGMA table_info(map_strike_line)")
|
||||
cols = [r[1] for r in cur.fetchall()]
|
||||
if col not in cols:
|
||||
conn.execute(f"ALTER TABLE map_strike_line ADD COLUMN {col} TEXT")
|
||||
except sqlite3.OperationalError:
|
||||
pass
|
||||
conn.commit()
|
||||
|
||||
|
||||
@@ -183,6 +219,41 @@ def merge(extracted: Dict[str, Any], db_path: Optional[str] = None) -> bool:
|
||||
updated = True
|
||||
except Exception:
|
||||
pass
|
||||
# map_strike_source:打击源(与前端 mapData.strikeSources 一致),爬虫可补充或覆盖
|
||||
if "map_strike_sources" in extracted:
|
||||
try:
|
||||
for s in extracted["map_strike_sources"]:
|
||||
sid = (s.get("id") or "").strip()
|
||||
name = (s.get("name") or "").strip() or sid
|
||||
lng = float(s.get("lng", 0))
|
||||
lat = float(s.get("lat", 0))
|
||||
if sid:
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO map_strike_source (id, name, lng, lat) VALUES (?, ?, ?, ?)",
|
||||
(sid, name[:200], lng, lat),
|
||||
)
|
||||
if conn.total_changes > 0:
|
||||
updated = True
|
||||
except Exception:
|
||||
pass
|
||||
# map_strike_lines:打击线(与前端 mapData.strikeLines 一致),爬虫可追加新打击,便于前端追加攻击动画
|
||||
if "map_strike_lines" in extracted:
|
||||
try:
|
||||
for line in extracted["map_strike_lines"]:
|
||||
source_id = (line.get("source_id") or "").strip()
|
||||
target_lng = float(line.get("target_lng", 0))
|
||||
target_lat = float(line.get("target_lat", 0))
|
||||
target_name = (line.get("target_name") or "").strip()[:200] or None
|
||||
struck_at = (line.get("struck_at") or "").strip() or None
|
||||
if source_id:
|
||||
conn.execute(
|
||||
"INSERT INTO map_strike_line (source_id, target_lng, target_lat, target_name, struck_at) VALUES (?, ?, ?, ?, ?)",
|
||||
(source_id, target_lng, target_lat, target_name, struck_at),
|
||||
)
|
||||
if conn.total_changes > 0:
|
||||
updated = True
|
||||
except Exception:
|
||||
pass
|
||||
if updated:
|
||||
conn.execute("INSERT OR REPLACE INTO situation (id, data, updated_at) VALUES (1, '{}', ?)", (datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.000Z"),))
|
||||
conn.commit()
|
||||
|
||||
Reference in New Issue
Block a user