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
+180
View File
@@ -0,0 +1,180 @@
"""
处理监控 API 路由
"""
from flask import Blueprint, jsonify, request
from services.process_monitor import process_monitor, PROCESS_STEPS
from models.database import db
import logging
logger = logging.getLogger('process_monitor_api')
bp = Blueprint('process_monitor', __name__, url_prefix='/api/process')
@bp.route('/steps', methods=['GET'])
def get_step_definitions():
"""获取处理步骤定义"""
return jsonify({
'success': True,
'steps': PROCESS_STEPS
})
@bp.route('/start', methods=['POST'])
def start_process():
"""
启动产品处理流程
请求体:
{
"product_name": "产品名称",
"category": "分类",
"subcategory": "子分类"
}
"""
try:
data = request.get_json()
product_name = data.get('product_name')
if not product_name:
return jsonify({'success': False, 'error': '缺少产品名称'}), 400
category = data.get('category')
subcategory = data.get('subcategory')
# 启动处理流程
session_id = process_monitor.start_process(product_name, category, subcategory)
return jsonify({
'success': True,
'session_id': session_id,
'message': f'处理流程已启动: {product_name}'
})
except Exception as e:
logger.error(f"启动处理流程失败: {e}")
return jsonify({'success': False, 'error': str(e)}), 500
@bp.route('/<session_id>/status', methods=['GET'])
def get_process_status(session_id):
"""获取处理状态"""
status = process_monitor.get_session_status(session_id)
if not status:
return jsonify({'success': False, 'error': '会话不存在'}), 404
return jsonify({
'success': True,
'data': status
})
@bp.route('/<session_id>/pause', methods=['POST'])
def pause_process(session_id):
"""暂停处理"""
if process_monitor.pause_session(session_id):
return jsonify({
'success': True,
'message': '处理已暂停'
})
else:
return jsonify({'success': False, 'error': '无法暂停'}), 400
@bp.route('/<session_id>/resume', methods=['POST'])
def resume_process(session_id):
"""继续处理"""
if process_monitor.resume_session(session_id):
return jsonify({
'success': True,
'message': '处理已继续'
})
else:
return jsonify({'success': False, 'error': '无法继续'}), 400
@bp.route('/<session_id>/stop', methods=['POST'])
def stop_process(session_id):
"""停止处理"""
if process_monitor.stop_session(session_id):
return jsonify({
'success': True,
'message': '处理已停止'
})
else:
return jsonify({'success': False, 'error': '无法停止'}), 400
@bp.route('/active', methods=['GET'])
def get_active_processes():
"""获取活动的处理会话"""
sessions = db.get_active_sessions()
# 获取每个会话的步骤信息
result = []
for session in sessions:
steps = db.get_process_steps(session['session_id'])
result.append({
'session': session,
'steps': steps
})
return jsonify({
'success': True,
'sessions': result,
'count': len(result)
})
@bp.route('/recent', methods=['GET'])
def get_recent_processes():
"""获取最近的处理会话"""
limit = request.args.get('limit', 20, type=int)
sessions = db.get_recent_sessions(limit)
return jsonify({
'success': True,
'sessions': sessions,
'count': len(sessions)
})
@bp.route('/<session_id>/steps', methods=['GET'])
def get_process_steps(session_id):
"""获取处理步骤详情"""
steps = db.get_process_steps(session_id)
# 解析JSON字段
for step in steps:
if step.get('step_data'):
import json
try:
step['step_data'] = json.loads(step['step_data'])
except:
pass
if step.get('intervention_data'):
import json
try:
step['intervention_data'] = json.loads(step['intervention_data'])
except:
pass
return jsonify({
'success': True,
'steps': steps
})
@bp.route('/<session_id>/step/<int:step_num>', methods=['GET'])
def get_step_detail(session_id, step_num):
"""获取单个步骤详情"""
step = db.get_step_detail(session_id, step_num)
if not step:
return jsonify({'success': False, 'error': '步骤不存在'}), 404
return jsonify({
'success': True,
'step': step
})