72 lines
2.9 KiB
Python
72 lines
2.9 KiB
Python
from typing import List
|
|
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.mysql import ArchiveMessages
|
|
|
|
|
|
class ArchiveMessagesRepository:
|
|
def __init__(self, session: AsyncSession):
|
|
self.session = session
|
|
|
|
async def get_message_statistics_by_date(self, start_date: str = None, end_date: str = None) -> List[ArchiveMessages]:
|
|
"""
|
|
根据日期范围获取消息记录
|
|
|
|
Args:
|
|
start_date: 开始日期 (格式: YYYY-MM-DD)
|
|
end_date: 结束日期 (格式: YYYY-MM-DD)
|
|
|
|
Returns:
|
|
ArchiveMessages 对象列表
|
|
"""
|
|
base_query = """
|
|
SELECT DATE(FROM_UNIXTIME(msgtime / 1000)) AS created_at, from_user
|
|
FROM archive_messages
|
|
"""
|
|
conditions = []
|
|
params = {}
|
|
|
|
if start_date:
|
|
conditions.append(" and DATE(FROM_UNIXTIME(msgtime / 1000)) >= :start_date")
|
|
params["start_date"] = start_date
|
|
|
|
if end_date:
|
|
conditions.append("DATE(FROM_UNIXTIME(msgtime / 1000)) <= :end_date")
|
|
params["end_date"] = end_date
|
|
base_query += " WHERE 1=1 and roomid='' and msgtype='text' "
|
|
#base_query += " WHERE (from_user='wmI1AkDQAA3h0jxrRpeaHZhMKeHExA4w' )or( from_user='LiHeYi' and to_user='[\"wmI1AkDQAA3h0jxrRpeaHZhMKeHExA4w\"]') and roomid='' and msgtype='text' "
|
|
if conditions:
|
|
base_query += " AND ".join(conditions)+" "
|
|
base_query += " GROUP BY DATE(FROM_UNIXTIME(msgtime / 1000)), from_user ORDER BY created_at DESC, from_user;"
|
|
|
|
query = text(base_query)
|
|
result = await self.session.execute(query, params)
|
|
return [ArchiveMessages(**dict(row)) for row in result.mappings().fetchall()]
|
|
|
|
|
|
async def get_message_statistics_by_date_user(self, day: str = None, from_user: str = None, to_user: str = None) -> List[ArchiveMessages]:
|
|
"""
|
|
根据日期+发送人+接收人查询记录
|
|
Returns:
|
|
ArchiveMessages 对象列表
|
|
"""
|
|
if to_user:
|
|
sql = """
|
|
SELECT * FROM archive_messages
|
|
WHERE DATE(FROM_UNIXTIME(msgtime / 1000)) = :day
|
|
AND from_user = :from_user
|
|
AND to_user = :to_user and msgtype='text'
|
|
ORDER BY created_at DESC
|
|
"""
|
|
result = await self.session.execute(text(sql), {"day": day, "from_user": from_user, "to_user": to_user})
|
|
else :
|
|
sql = """
|
|
SELECT from_user,to_user FROM archive_messages
|
|
WHERE DATE(FROM_UNIXTIME(msgtime / 1000)) = :day
|
|
AND from_user = :from_user and msgtype='text'
|
|
group by to_user
|
|
"""
|
|
result = await self.session.execute(text(sql), {"day": day, "from_user": from_user})
|
|
return [ArchiveMessages(**dict(row)) for row in result.mappings().fetchall()] |