"""fin_transaction 成交流水仓储:按客户查历史流水(规则引擎聚合规则用)。""" from __future__ import annotations from datetime import datetime from sqlalchemy import func, select from model.fin_transaction import FinTransaction from repositories.base import BaseRepository class FinTransactionRepo(BaseRepository): model = FinTransaction async def list_since( self, customer_id: int, since: datetime ) -> list[FinTransaction]: """查该客户 since 之后的所有成交流水,按成交时间升序。 供规则引擎聚合规则(R005~R013 等)在内存中做窗口统计。 """ stmt = ( select(FinTransaction) .where( FinTransaction.customer_id == customer_id, FinTransaction.create_time >= since, ) .order_by(FinTransaction.create_time, FinTransaction.id) ) return list((await self.db.scalars(stmt)).all()) async def get_last_transaction_time(self, customer_id: int) -> datetime | None: """该客户最近一笔成交时间(R016 休眠账户激活判定用)。""" return await self.db.scalar( select(func.max(FinTransaction.create_time)).where( FinTransaction.customer_id == customer_id ) ) async def list_recent(self, customer_id: int, *, limit: int = 20) -> list[FinTransaction]: """按客户读取最近成交记录,供投顾上下文摘要使用。""" stmt = ( select(FinTransaction) .where(FinTransaction.customer_id == customer_id) .order_by(FinTransaction.create_time.desc(), FinTransaction.id.desc()) .limit(max(1, min(limit, 100))) ) return list((await self.db.scalars(stmt)).all())