生成日报、周报
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
"""
|
||||
数据源扩展示例
|
||||
演示如何添加新的数据源
|
||||
"""
|
||||
from applications.reporter.base_reporter import DataSource
|
||||
from typing import List, Dict, Any
|
||||
from datetime import datetime
|
||||
from loguru import logger
|
||||
|
||||
|
||||
class ComplaintDataSource(DataSource):
|
||||
"""投诉数据源示例(可根据实际情况实现)"""
|
||||
|
||||
def __init__(self, db_agent, table_name: str = "complaint_data"):
|
||||
"""
|
||||
Args:
|
||||
db_agent: MySQLAgent实例
|
||||
table_name: 数据表名
|
||||
"""
|
||||
self.db_agent = db_agent
|
||||
self.table_name = table_name
|
||||
self.logger = logger.bind(module="ComplaintDataSource")
|
||||
|
||||
def fetch_data(self, start_time: datetime, end_time: datetime) -> List[Dict[str, Any]]:
|
||||
"""从投诉数据表获取数据"""
|
||||
try:
|
||||
sql = f"""
|
||||
SELECT
|
||||
`标题` as title,
|
||||
`链接` as link,
|
||||
`内容` as summary,
|
||||
`发布时间` as publish_time,
|
||||
`来源` as source_url
|
||||
FROM `{self.table_name}`
|
||||
WHERE `发布时间` >= %s AND `发布时间` < %s
|
||||
ORDER BY `发布时间` DESC
|
||||
"""
|
||||
|
||||
params = (
|
||||
start_time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
end_time.strftime('%Y-%m-%d %H:%M:%S')
|
||||
)
|
||||
|
||||
df = self.db_agent.query_to_df(sql, params=params, is_print=False)
|
||||
|
||||
if df.empty:
|
||||
self.logger.info(f"时间范围 {start_time} 到 {end_time} 内没有投诉数据")
|
||||
return []
|
||||
|
||||
data_list = df.to_dict('records')
|
||||
self.logger.info(f"获取到 {len(data_list)} 条投诉数据")
|
||||
return data_list
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"获取投诉数据失败: {str(e)}", exc_info=True)
|
||||
return []
|
||||
|
||||
def get_source_name(self) -> str:
|
||||
return "投诉数据"
|
||||
|
||||
|
||||
class CustomAPIDataSource(DataSource):
|
||||
"""外部API数据源示例"""
|
||||
|
||||
def __init__(self, api_url: str, api_key: str = None):
|
||||
"""
|
||||
Args:
|
||||
api_url: API地址
|
||||
api_key: API密钥(如果需要)
|
||||
"""
|
||||
self.api_url = api_url
|
||||
self.api_key = api_key
|
||||
self.logger = logger.bind(module="CustomAPIDataSource")
|
||||
|
||||
def fetch_data(self, start_time: datetime, end_time: datetime) -> List[Dict[str, Any]]:
|
||||
"""从外部API获取数据"""
|
||||
import requests
|
||||
|
||||
try:
|
||||
headers = {}
|
||||
if self.api_key:
|
||||
headers['Authorization'] = f'Bearer {self.api_key}'
|
||||
|
||||
params = {
|
||||
'start_time': start_time.isoformat(),
|
||||
'end_time': end_time.isoformat()
|
||||
}
|
||||
|
||||
response = requests.get(self.api_url, headers=headers, params=params, timeout=30)
|
||||
response.raise_for_status()
|
||||
|
||||
data = response.json()
|
||||
|
||||
# 将API返回的数据转换为标准格式
|
||||
articles = []
|
||||
for item in data.get('articles', []):
|
||||
articles.append({
|
||||
'title': item.get('title', ''),
|
||||
'link': item.get('url', ''),
|
||||
'summary': item.get('description', ''),
|
||||
'publish_time': item.get('published_at', ''),
|
||||
'source_url': self.api_url
|
||||
})
|
||||
|
||||
self.logger.info(f"从API获取到 {len(articles)} 条数据")
|
||||
return articles
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"从API获取数据失败: {str(e)}", exc_info=True)
|
||||
return []
|
||||
|
||||
def get_source_name(self) -> str:
|
||||
return "外部API"
|
||||
|
||||
|
||||
# 使用示例:
|
||||
"""
|
||||
from applications.reporter.daily import DailyReporter
|
||||
from applications.reporter.data_source_example import ComplaintDataSource
|
||||
from utils.mysql_agent import MySQLAgent
|
||||
from config import Config
|
||||
|
||||
# 创建日报生成器
|
||||
reporter = DailyReporter()
|
||||
|
||||
# 添加投诉数据源
|
||||
db_agent = MySQLAgent(Config.MYSQL_CONFIG)
|
||||
complaint_source = ComplaintDataSource(db_agent, table_name="complaint_data")
|
||||
reporter.add_data_source(complaint_source)
|
||||
|
||||
# 生成报告
|
||||
report_path = reporter.generate()
|
||||
print(f"报告已生成: {report_path}")
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user