rebuild(stage-9): deliver deterministic intelligent screening

This commit is contained in:
leefer
2026-07-30 05:15:17 +08:00
parent 6cb52e864a
commit 158257ebb8
46 changed files with 7322 additions and 34 deletions
+12 -1
View File
@@ -1,3 +1,4 @@
import asyncio
import logging
from contextlib import asynccontextmanager
@@ -10,6 +11,7 @@ from backend.database.migrations import MIGRATIONS, MigrationRunner
from backend.http.errors import install_error_handlers
from backend.http.request_context import install_request_context
from backend.http.router import api_router
from backend.jobs.screener import run_screener_scheduler
logger = logging.getLogger(__name__)
@@ -34,7 +36,16 @@ def create_application(settings: Settings | None = None) -> FastAPI:
},
},
)
yield
stop = asyncio.Event()
task = None
if runtime.environment != "test":
task = asyncio.create_task(run_screener_scheduler(container.screener, stop))
try:
yield
finally:
if task:
stop.set()
await task
application = FastAPI(
title="小白复盘",
+10 -5
View File
@@ -19,6 +19,8 @@ from backend.features.accounts.service import (
from backend.features.market import MarketService
from backend.features.market.insights import MarketInsightService
from backend.features.market.sync import MarketSnapshotService
from backend.features.screener.repository import ScreenerRepository
from backend.features.screener.service import ScreenerService
from backend.security import PasswordHasher, load_or_create_cipher
@@ -32,6 +34,7 @@ class ApplicationContainer:
system_credentials: SystemCredentialService
model_pool: ModelPoolService
market: MarketService
screener: ScreenerService
def build_container(settings: Settings) -> ApplicationContainer:
@@ -56,6 +59,11 @@ def build_container(settings: Settings) -> ApplicationContainer:
),
DataSourcePolicy(),
)
market = MarketService(
gateway,
MarketSnapshotService(database, market_repository, gateway),
MarketInsightService(database, market_repository, gateway),
)
return ApplicationContainer(
settings=settings,
database=database,
@@ -64,9 +72,6 @@ def build_container(settings: Settings) -> ApplicationContainer:
memberships=MembershipService(database, account_repository),
system_credentials=credentials,
model_pool=ModelPoolService(database, model_pool_repository, cipher),
market=MarketService(
gateway,
MarketSnapshotService(database, market_repository, gateway),
MarketInsightService(database, market_repository, gateway),
),
market=market,
screener=ScreenerService(database, ScreenerRepository(), market_repository, gateway),
)