- 新增处理会话表(process_sessions)和步骤表(process_steps) - 支持实时查看每个产品的处理步骤进度 - 支持暂停/继续/停止正在进行的处理 - 处理步骤包括:搜索内容库、搜索互联网、抓取网页、提取数据、填充字段、提交审核 - 新增处理监控页面 /process - 每个步骤记录详细数据、耗时、状态 - 历史记录可查看每个步骤的执行详情
180 lines
4.7 KiB
Python
180 lines
4.7 KiB
Python
"""
|
|
处理监控 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
|
|
}) |