feat: 新增产品处理流程监控功能
- 新增处理会话表(process_sessions)和步骤表(process_steps) - 支持实时查看每个产品的处理步骤进度 - 支持暂停/继续/停止正在进行的处理 - 处理步骤包括:搜索内容库、搜索互联网、抓取网页、提取数据、填充字段、提交审核 - 新增处理监控页面 /process - 每个步骤记录详细数据、耗时、状态 - 历史记录可查看每个步骤的执行详情
This commit is contained in:
@@ -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()
|
||||
Reference in New Issue
Block a user