V1: DAG多任务编排 + AI规划WBS + RAG知识库 + 预算告警中心 + 开放API + 飞书/企微/邮件通知
This commit is contained in:
@@ -80,13 +80,81 @@ CREATE TABLE IF NOT EXISTS cost_records (
|
||||
created_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS documents (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project_id INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
content TEXT DEFAULT '',
|
||||
source TEXT DEFAULT 'manual', -- manual/file/url
|
||||
chunk_size INTEGER DEFAULT 0,
|
||||
created_at INTEGER,
|
||||
updated_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS doc_chunks (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
document_id INTEGER NOT NULL,
|
||||
idx INTEGER DEFAULT 0,
|
||||
content TEXT DEFAULT '',
|
||||
tokens INTEGER DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS alerts (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
type TEXT DEFAULT 'system', -- budget/task_failed/worker/limit/notify/plan
|
||||
level TEXT DEFAULT 'info', -- info/warn/critical
|
||||
title TEXT DEFAULT '',
|
||||
detail TEXT DEFAULT '',
|
||||
read INTEGER DEFAULT 0,
|
||||
created_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS api_tokens (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
token TEXT NOT NULL UNIQUE,
|
||||
created_at INTEGER,
|
||||
last_used_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS notify_channels (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
type TEXT NOT NULL, -- feishu/wecom/email
|
||||
webhook TEXT DEFAULT '',
|
||||
email TEXT DEFAULT '',
|
||||
events TEXT DEFAULT '[]', -- JSON: task_review/task_done/task_failed/budget_alert/worker_alert
|
||||
enabled INTEGER DEFAULT 1,
|
||||
created_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS settings (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT DEFAULT ''
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_logs_task ON task_logs(task_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_cost_task ON cost_records(task_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_cost_project ON cost_records(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_docs_project ON documents(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_chunks_doc ON doc_chunks(document_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_alerts_read ON alerts(read);
|
||||
"""
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 迁移:给旧表补列(V1)
|
||||
# ---------------------------------------------------------------------------
|
||||
def _migrate():
|
||||
conn = get_conn()
|
||||
cols = {r['name'] for r in conn.execute('PRAGMA table_info(tasks)')}
|
||||
if 'depends_on' not in cols:
|
||||
conn.execute("ALTER TABLE tasks ADD COLUMN depends_on TEXT DEFAULT '[]'")
|
||||
conn.execute('CREATE INDEX IF NOT EXISTS idx_tasks_depends ON tasks(depends_on)')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
def get_conn():
|
||||
conn = sqlite3.connect(DB_PATH, timeout=30)
|
||||
@@ -101,6 +169,7 @@ def init_db():
|
||||
conn.executescript(SCHEMA)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
_migrate()
|
||||
|
||||
|
||||
def q(sql, args=(), one=False):
|
||||
@@ -154,4 +223,23 @@ def task_worker_cost(worker_id):
|
||||
def serialize_task(t):
|
||||
t = dict(t)
|
||||
t['review_required'] = bool(t['review_required'])
|
||||
try:
|
||||
t['depends_on'] = json.loads(t.get('depends_on') or '[]')
|
||||
except Exception:
|
||||
t['depends_on'] = []
|
||||
return t
|
||||
|
||||
|
||||
def get_setting(key, default=''):
|
||||
r = q('SELECT value FROM settings WHERE key=?', (key,), one=True)
|
||||
return r['value'] if r else default
|
||||
|
||||
|
||||
def set_setting(key, value):
|
||||
conn = get_conn()
|
||||
try:
|
||||
conn.execute('INSERT INTO settings (key, value) VALUES (?,?) '
|
||||
'ON CONFLICT(key) DO UPDATE SET value=excluded.value', (key, str(value)))
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user