|
|
# -*- coding: utf-8 -*-
|
|
|
"""
|
|
|
===================================
|
|
|
股票分析命令
|
|
|
===================================
|
|
|
|
|
|
分析指定股票,调用 AI 生成分析报告。
|
|
|
"""
|
|
|
|
|
|
import re
|
|
|
import logging
|
|
|
from typing import List, Optional
|
|
|
|
|
|
from bot.commands.base import BotCommand
|
|
|
from bot.models import BotMessage, BotResponse
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
class AnalyzeCommand(BotCommand):
|
|
|
"""
|
|
|
股票分析命令
|
|
|
|
|
|
分析指定股票代码,生成 AI 分析报告并推送。
|
|
|
|
|
|
用法:
|
|
|
/analyze 600519 - 分析贵州茅台(精简报告)
|
|
|
/analyze 600519 full - 分析并生成完整报告
|
|
|
"""
|
|
|
|
|
|
@property
|
|
|
def name(self) -> str:
|
|
|
return "analyze"
|
|
|
|
|
|
@property
|
|
|
def aliases(self) -> List[str]:
|
|
|
return ["a", "分析", "查"]
|
|
|
|
|
|
@property
|
|
|
def description(self) -> str:
|
|
|
return "分析指定股票"
|
|
|
|
|
|
@property
|
|
|
def usage(self) -> str:
|
|
|
return "/analyze <股票代码> [full]"
|
|
|
|
|
|
def validate_args(self, args: List[str]) -> Optional[str]:
|
|
|
"""验证参数"""
|
|
|
if not args:
|
|
|
return "请输入股票代码"
|
|
|
|
|
|
code = args[0].upper()
|
|
|
|
|
|
# 验证股票代码格式
|
|
|
# A股:6位数字
|
|
|
# 港股:HK+5位数字
|
|
|
# 美股:1-5个大写字母+.+2个后缀字母
|
|
|
is_a_stock = re.match(r'^\d{6}$', code)
|
|
|
is_hk_stock = re.match(r'^HK\d{5}$', code)
|
|
|
is_us_stock = re.match(r'^[A-Z]{1,5}(\.[A-Z]{1,2})?$', code)
|
|
|
|
|
|
if not (is_a_stock or is_hk_stock or is_us_stock):
|
|
|
return f"无效的股票代码: {code}(A股6位数字 / 港股HK+5位数字 / 美股1-5个字母)"
|
|
|
|
|
|
return None
|
|
|
|
|
|
def execute(self, message: BotMessage, args: List[str]) -> BotResponse:
|
|
|
"""执行分析命令"""
|
|
|
code = args[0].lower()
|
|
|
|
|
|
# 检查是否需要完整报告(默认精简,传 full/完整/详细 切换)
|
|
|
report_type = "simple"
|
|
|
if len(args) > 1 and args[1].lower() in ["full", "完整", "详细"]:
|
|
|
report_type = "full"
|
|
|
logger.info(f"[AnalyzeCommand] 分析股票: {code}, 报告类型: {report_type}")
|
|
|
|
|
|
try:
|
|
|
# 调用分析服务
|
|
|
from src.services.task_service import get_task_service
|
|
|
from src.enums import ReportType
|
|
|
|
|
|
service = get_task_service()
|
|
|
|
|
|
# 提交异步分析任务
|
|
|
result = service.submit_analysis(
|
|
|
code=code,
|
|
|
report_type=ReportType.from_str(report_type),
|
|
|
source_message=message
|
|
|
)
|
|
|
|
|
|
if result.get("success"):
|
|
|
task_id = result.get("task_id", "")
|
|
|
return BotResponse.markdown_response(
|
|
|
f"✅ **分析任务已提交**\n\n"
|
|
|
f"• 股票代码: `{code}`\n"
|
|
|
f"• 报告类型: {ReportType.from_str(report_type).display_name}\n"
|
|
|
f"• 任务 ID: `{task_id[:20]}...`\n\n"
|
|
|
f"分析完成后将自动推送结果。"
|
|
|
)
|
|
|
else:
|
|
|
error = result.get("error", "未知错误")
|
|
|
return BotResponse.error_response(f"提交分析任务失败: {error}")
|
|
|
|
|
|
except Exception as e:
|
|
|
logger.error(f"[AnalyzeCommand] 执行失败: {e}")
|
|
|
return BotResponse.error_response(f"分析失败: {str(e)[:100]}")
|