feat: 新增产品处理流程监控功能

- 新增处理会话表(process_sessions)和步骤表(process_steps)
- 支持实时查看每个产品的处理步骤进度
- 支持暂停/继续/停止正在进行的处理
- 处理步骤包括:搜索内容库、搜索互联网、抓取网页、提取数据、填充字段、提交审核
- 新增处理监控页面 /process
- 每个步骤记录详细数据、耗时、状态
- 历史记录可查看每个步骤的执行详情
This commit is contained in:
2026-07-14 12:23:49 +08:00
parent 3f9848c635
commit 8f0efe28b6
7 changed files with 1592 additions and 0 deletions
+232
View File
@@ -161,6 +161,53 @@ class Database:
)
''')
# 处理步骤表
cursor.execute('''
CREATE TABLE IF NOT EXISTS process_steps (
id INTEGER PRIMARY KEY AUTOINCREMENT,
process_id TEXT NOT NULL,
product_name TEXT NOT NULL,
step_number INTEGER NOT NULL,
step_name TEXT NOT NULL,
step_status TEXT DEFAULT 'pending',
step_data TEXT,
started_at DATETIME,
finished_at DATETIME,
duration_ms INTEGER,
error_message TEXT,
requires_intervention INTEGER DEFAULT 0,
intervention_type TEXT,
intervention_status TEXT,
intervention_data TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
''')
# 处理会话表(用于跟踪整个处理过程)
cursor.execute('''
CREATE TABLE IF NOT EXISTS process_sessions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL UNIQUE,
product_name TEXT NOT NULL,
category TEXT,
subcategory TEXT,
status TEXT DEFAULT 'pending',
current_step INTEGER DEFAULT 0,
total_steps INTEGER DEFAULT 6,
paused INTEGER DEFAULT 0,
pause_reason TEXT,
result TEXT,
review_id TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
started_at DATETIME,
finished_at DATETIME
)
''')
# 创建索引
cursor.execute('CREATE INDEX IF NOT EXISTS idx_process_steps_session ON process_steps(process_id)')
cursor.execute('CREATE INDEX IF NOT EXISTS idx_process_sessions_status ON process_sessions(status)')
conn.commit()
# ========== 内容库操作 ==========
@@ -598,5 +645,190 @@ class Database:
conn.commit()
return cursor.rowcount
# ========== 处理会话操作 ==========
def create_process_session(self, session_id, product_name, category=None, subcategory=None):
"""创建处理会话"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
INSERT INTO process_sessions (session_id, product_name, category, subcategory, status)
VALUES (?, ?, ?, ?, 'pending')
''', (session_id, product_name, category, subcategory))
conn.commit()
return session_id
def get_process_session(self, session_id):
"""获取处理会话"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM process_sessions WHERE session_id = ?', (session_id,))
row = cursor.fetchone()
return dict(row) if row else None
def update_session_status(self, session_id, status, **kwargs):
"""更新会话状态"""
with self.get_connection() as conn:
cursor = conn.cursor()
updates = ['status = ?']
values = [status]
if status == 'running' and 'started_at' not in kwargs:
updates.append('started_at = CURRENT_TIMESTAMP')
elif status in ('completed', 'failed', 'stopped'):
updates.append('finished_at = CURRENT_TIMESTAMP')
for key in ['current_step', 'result', 'review_id', 'paused', 'pause_reason']:
if key in kwargs:
updates.append(f'{key} = ?')
values.append(kwargs[key])
values.append(session_id)
cursor.execute(
f'UPDATE process_sessions SET {" , ".join(updates)} WHERE session_id = ?',
values
)
conn.commit()
return cursor.rowcount > 0
def pause_session(self, session_id, reason=None):
"""暂停会话"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
UPDATE process_sessions
SET paused = 1, pause_reason = ?, status = 'paused'
WHERE session_id = ?
''', (reason, session_id))
conn.commit()
return cursor.rowcount > 0
def resume_session(self, session_id):
"""继续会话"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
UPDATE process_sessions
SET paused = 0, pause_reason = NULL, status = 'running'
WHERE session_id = ?
''', (session_id,))
conn.commit()
return cursor.rowcount > 0
def get_active_sessions(self):
"""获取活动的会话"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
SELECT * FROM process_sessions
WHERE status IN ('pending', 'running', 'paused')
ORDER BY created_at DESC
''')
return [dict(row) for row in cursor.fetchall()]
def get_recent_sessions(self, limit=20):
"""获取最近的会话"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
SELECT * FROM process_sessions
ORDER BY created_at DESC
LIMIT ?
''', (limit,))
return [dict(row) for row in cursor.fetchall()]
# ========== 处理步骤操作 ==========
def add_process_step(self, process_id, product_name, step_number, step_name, step_data=None):
"""添加处理步骤"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
INSERT INTO process_steps
(process_id, product_name, step_number, step_name, step_status, step_data, started_at)
VALUES (?, ?, ?, ?, 'running', ?, CURRENT_TIMESTAMP)
''', (process_id, product_name, step_number, step_name,
json.dumps(step_data, ensure_ascii=False) if step_data else None))
conn.commit()
return cursor.lastrowid
def update_step_status(self, process_id, step_number, status, **kwargs):
"""更新步骤状态"""
with self.get_connection() as conn:
cursor = conn.cursor()
updates = ['step_status = ?']
values = [status]
if status in ('completed', 'failed', 'skipped'):
updates.append('finished_at = CURRENT_TIMESTAMP')
for key in ['step_data', 'error_message', 'duration_ms', 'requires_intervention',
'intervention_type', 'intervention_status', 'intervention_data']:
if key in kwargs:
if key in ('step_data', 'intervention_data') and kwargs[key]:
updates.append(f'{key} = ?')
values.append(json.dumps(kwargs[key], ensure_ascii=False))
else:
updates.append(f'{key} = ?')
values.append(kwargs[key])
values.extend([process_id, step_number])
cursor.execute(
f'UPDATE process_steps SET {" , ".join(updates)} WHERE process_id = ? AND step_number = ?',
values
)
conn.commit()
return cursor.rowcount > 0
def get_process_steps(self, process_id):
"""获取处理步骤列表"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
SELECT * FROM process_steps
WHERE process_id = ?
ORDER BY step_number ASC
''', (process_id,))
return [dict(row) for row in cursor.fetchall()]
def get_step_detail(self, process_id, step_number):
"""获取步骤详情"""
with self.get_connection() as conn:
cursor = conn.cursor()
cursor.execute('''
SELECT * FROM process_steps
WHERE process_id = ? AND step_number = ?
''', (process_id, step_number))
row = cursor.fetchone()
if row:
result = dict(row)
if result.get('step_data'):
result['step_data'] = json.loads(result['step_data'])
if result.get('intervention_data'):
result['intervention_data'] = json.loads(result['intervention_data'])
return result
return None
def set_step_intervention(self, process_id, step_number, intervention_type, intervention_data=None):
"""设置步骤需要干预"""
return self.update_step_status(
process_id, step_number, 'paused',
requires_intervention=1,
intervention_type=intervention_type,
intervention_status='pending',
intervention_data=intervention_data
)
def complete_intervention(self, process_id, step_number, intervention_data=None):
"""完成干预"""
return self.update_step_status(
process_id, step_number, 'completed',
requires_intervention=0,
intervention_status='completed',
intervention_data=intervention_data
)
# 全局数据库实例
db = Database()