2025-06-24 14:22:50 +02:00

364 lines
15 KiB
Python

from typing import Optional
from dotenv import load_dotenv
from app.repos.sql.CrnMicroUpdateSqlRepo import CrnMicroUpdateSqlRepo
from app.repos.sql.GpsServiceTimeSqlRepo import GpsServiceTimeSqlRepo
from app.repos.sql.GpsSqlRepo import GpsSqlRepo
from app.repos.sql.GpsStopTimeSqlRepo import GpsStopTimeSqlRepo
from app.repos.sql.GpsDeliverySqlRepo import GpsDeliverySqlRepo
from app.repos.sql.OptimizationMetricsSqlRepo import OptimizationMetricsSqlRepo
from app.services.FsFtpService import FsFtpService
from app.services.OsrmRoutingService import OsrmRoutingService
from app.services.SolvesallOptimizationService import SolvesallOptimizationService
from core.domain.worker.Worker import Worker
from core.repos.CrnMicroUpdateRepo import CrnMicroUpdateRepo
from core.repos.GpsDeliveryRepo import GpsDeliveryRepo
from core.repos.GpsRepo import GpsRepo
from core.repos.GpsServiceTimeRepo import GpsServiceTimeRepo
from core.repos.GpsStopTimeRepo import GpsStopTimeRepo
from core.types.Id import Id
from core.usecases.Print_file_hashes import Print_file_hashes
from core.usecases.Run_gps_worker import Run_gps_worker
from core.usecases.gps_worker.Analyze_delivery_data import Analyze_delivery_data
from core.usecases.gps_worker.Analyze_gps_data import Analyze_gps_data
from core.usecases.gps_worker.Match_crnPoints_with_allLandPlots import Match_crnPoints_with_allLandPlots
from core.usecases.gps_worker.Match_crnPoints_with_landPlots import Match_crnPoints_with_landPlots
from core.usecases.gps_worker.Update_service_times import Update_service_times
from core.usecases.optimization_worker.Update_optimization_points import Update_optimization_points
from core.usecases.updating_worker.Test_transport_matrix import Test_transport_matrix
load_dotenv()
from sqlalchemy import create_engine
from app.Env import Env
from app.repos.sql.GpsSessionSqlRepo import GpsSessionSqlRepo
from app.repos.sql.OptimizationResultSqlRepo import OptimizationResultSqlRepo
from app.repos.sql.OptimizationSqlRepo import OptimizationSqlRepo
from app.repos.sql.OptimizationVehicleSqlRepo import OptimizationVehicleSqlRepo
from app.repos.sql.PostOfficeSqlRepo import PostOfficeSqlRepo
from app.repos.sql.WorkerJobLogSqlRepo import WorkerJobLogSqlRepo
from app.repos.sql.WorkerJobSqlRepo import WorkerJobSqlRepo
from app.repos.sql.WorkerJobStatusSqlRepo import WorkerJobStatusSqlRepo
from app.repos.sql.WorkerLogSqlRepo import WorkerLogSqlRepo
from app.repos.sql.WorkerSqlRepo import WorkerSqlRepo
from app.repos.sql.WorkerStatusSqlRepo import WorkerStatusSqlRepo
from app.services.EProstorLandService import EProstorLandService
from app.services.PostaApiService import PostaApiService
from app.services.PsutilSystemService import PsutilSystemService
from core.domain.worker.WorkerJob import WorkerJob
from core.repos.GpsSessionRepo import GpsSessionRepo
from core.repos.OptimizationRepo import OptimizationRepo
from core.repos.OptimizationResultRepo import OptimizationResultRepo
from core.repos.OptimizationVehicleRepo import OptimizationVehicleRepo
from core.repos.PostOfficeRepo import PostOfficeRepo
from core.repos.WorkerJobLogRepo import WorkerJobLogRepo
from core.repos.WorkerJobRepo import WorkerJobRepo
from core.repos.WorkerJobStatusRepo import WorkerJobStatusRepo
from core.repos.WorkerLogRepo import WorkerLogRepo
from core.repos.WorkerRepo import WorkerRepo
from core.repos.WorkerStatusRepo import WorkerStatusRepo
from core.services.FtpService import FtpService
from core.services.LandService import LandService
from core.services.OptimizationService import OptimizationService
from core.services.PostaService import PostaService
from core.services.RoutingService import RoutingService
from core.services.SystemService import SystemService
from core.usecases.Run_optimization_worker import Run_optimization_worker
from core.usecases.Run_updating_worker import Run_updating_worker
from core.usecases.optimization_worker.Read_optimization_files import Read_optimization_files
from core.usecases.updating_worker.Calculate_optimization_points import Calculate_optimization_points
from core.usecases.updating_worker.Write_optimization_files import Write_optimization_files
from core.usecases.initialization.Register_worker import Register_worker
from core.usecases.optimization_worker.Run_optimization_job import Run_optimization_job
from core.usecases.logging.Log_worker_job_status import Log_worker_job_status
from core.usecases.logging.Log_worker_status import Log_worker_status
class App:
# REPOS
class repos:
optimizationResultRepo: OptimizationResultRepo = None
optimizationRepo: OptimizationRepo = None
optimizationVehicleRepo: OptimizationVehicleRepo = None
workerRepo: WorkerRepo = None
workerLogRepo: WorkerLogRepo = None
workerStatusRepo: WorkerStatusRepo = None
workerJobRepo: WorkerJobRepo = None
workerJobStatusRepo: WorkerJobStatusRepo = None
workerJobLogRepo: WorkerJobLogRepo = None
gpsSessionRepo: GpsSessionRepo = None
gpsRepo: GpsRepo = None
gpsStopTimeRepo: GpsStopTimeRepo = None
gpsServiceTimeRepo: GpsServiceTimeRepo = None
gpsDeliveryRepo: GpsDeliveryRepo = None
postOfficeRepo: PostOfficeRepo = None
crnMicroUpdateRepo: CrnMicroUpdateRepo = None
# SERVICES
class services:
postaService: PostaService = None
systemService: SystemService = None
ftpService: FtpService = None
routingService: RoutingService = None
landService: LandService = None
optimizationService: OptimizationService = None
# USE CASES
class usecases:
run_gps_worker: Run_gps_worker = None
print_file_hashes: Print_file_hashes = None
analyze_gps_data: Analyze_gps_data = None
analyze_delivery_data: Analyze_delivery_data = None
update_service_times: Update_service_times = None
match_crnPoints_with_landPlots: Match_crnPoints_with_landPlots = None
match_crnPoints_with_allLandPlots: Match_crnPoints_with_allLandPlots = None
test_transport_matrix: Test_transport_matrix = None
log_worker_job_status: Log_worker_job_status = None
log_worker_status: Log_worker_status = None
register_worker: Register_worker = None
run_optimization_worker: Run_optimization_worker = None
run_updating_worker: Run_updating_worker = None
write_optimization_files: Write_optimization_files = None
calculate_optimization_points: Calculate_optimization_points = None
read_optimization_files: Read_optimization_files = None
update_optimization_points: Update_optimization_points = None
@staticmethod
def init_log_worker_status(id: Id[Worker]):
db = create_engine(Env.DB_URL)
workerStatusRepo = WorkerStatusSqlRepo(db=db)
workerRepo = WorkerSqlRepo(db=db)
systemService = PsutilSystemService()
log_worker_status = Log_worker_status(
workerRepo=workerRepo,
workerStatusRepo=workerStatusRepo,
systemService=systemService,
)
log_worker_status.now(id=id)
@staticmethod
def init_run_worker_optimization_job(workerJob: WorkerJob):
db = create_engine(Env.DB_URL)
# REPOS
optimizationRepo = OptimizationSqlRepo(db=db)
optimizationResultRepo = OptimizationResultSqlRepo(db=db)
optimizationVehicleRepo = OptimizationVehicleSqlRepo(db=db)
workerJobStatusRepo = WorkerJobStatusSqlRepo(db=db)
workerJobLogRepo = WorkerJobLogSqlRepo(db=db)
workerLogRepo = WorkerLogSqlRepo(db=db)
postOfficeRepo = PostOfficeSqlRepo(db=db)
gpsStopTimeRepo = GpsStopTimeSqlRepo(db=db)
gpsServiceTimeRepo = GpsServiceTimeSqlRepo(db=db)
optimizationMetricsRepo = OptimizationMetricsSqlRepo(db=db)
gpsSessionRepo = GpsSessionSqlRepo(db=db)
# SERVICES
ftpService = FsFtpService()
systemService = PsutilSystemService()
routingService = OsrmRoutingService(domain=Env.ROUTING_DOMAIN_OSRM)
optimizationService = SolvesallOptimizationService()
postaService = PostaApiService(
useMocks=Env.POSTA_API_USE_MOCKS,
authDomain=Env.POSTA_API_AUTH,
crnDomain=Env.POSTA_API_CRN,
deliveryDomain=Env.POSTA_API_DELIVERY,
username=Env.POSTA_API_USERNAME,
password=Env.POSTA_API_PASSWORD,
authToken=Env.POSTA_API_AUTH_TOKEN,
crnToken=Env.POSTA_API_CRN_TOKEN,
deliveryToken=Env.POSTA_API_DELIVERY_TOKEN,
)
# USE CASES
log_worker_job_status = Log_worker_job_status(
workerJobStatusRepo=workerJobStatusRepo,
systemService=systemService,
)
update_service_times = Update_service_times(
gpsStopTimeRepo=gpsStopTimeRepo,
gpsServiceTimeRepo=gpsServiceTimeRepo,
postaService=postaService,
gpsSessionRepo=gpsSessionRepo,
)
read_optimization_files = Read_optimization_files(ftpService=ftpService)
update_optimization_points = Update_optimization_points(
gpsStopTimeRepo=gpsStopTimeRepo,
gpsServiceTimeRepo=gpsServiceTimeRepo,
update_service_times=update_service_times
)
run_worker_optimization_job = Run_optimization_job(
optimizationMetricsRepo=optimizationMetricsRepo,
systemService=systemService,
workerLogRepo=workerLogRepo,
workerJobLogRepo=workerJobLogRepo,
log_worker_job_status=log_worker_job_status,
optimizationVehicleRepo=optimizationVehicleRepo,
optimizationRepo=optimizationRepo,
postOfficeRepo=postOfficeRepo,
read_optimization_files=read_optimization_files,
optimizationResultRepo=optimizationResultRepo,
optimizationService=optimizationService,
routingService=routingService,
update_optimization_points=update_optimization_points
)
run_worker_optimization_job.now(workerJob=workerJob)
@staticmethod
def init(maxCrnPoints: Optional[int] = None):
db = create_engine(Env.DB_URL)
# REPOS
App.repos.optimizationRepo = OptimizationSqlRepo(db=db)
App.repos.optimizationResultRepo = OptimizationResultSqlRepo(db=db)
App.repos.optimizationVehicleRepo = OptimizationVehicleSqlRepo(db=db)
App.repos.workerRepo = WorkerSqlRepo(db=db)
App.repos.workerLogRepo = WorkerLogSqlRepo(db=db)
App.repos.workerStatusRepo = WorkerStatusSqlRepo(db=db)
App.repos.workerJobRepo = WorkerJobSqlRepo(db=db)
App.repos.workerJobStatusRepo = WorkerJobStatusSqlRepo(db=db)
App.repos.workerJobLogRepo = WorkerJobLogSqlRepo(db=db)
App.repos.gpsSessionRepo = GpsSessionSqlRepo(db=db)
App.repos.gpsRepo = GpsSqlRepo(db=db)
App.repos.gpsStopTimeRepo = GpsStopTimeSqlRepo(db=db)
App.repos.gpsServiceTimeRepo = GpsServiceTimeSqlRepo(db=db)
App.repos.postOfficeRepo = PostOfficeSqlRepo(db=db)
App.repos.crnMicroUpdateRepo = CrnMicroUpdateSqlRepo(db=db)
App.repos.gpsDeliveryRepo = GpsDeliverySqlRepo(db=db)
# SERVICES
App.services.routingService = OsrmRoutingService(domain=Env.ROUTING_DOMAIN_OSRM)
App.services.systemService = PsutilSystemService()
App.services.optimizationService = SolvesallOptimizationService()
App.services.landService = EProstorLandService()
App.services.postaService = PostaApiService(
useMocks=Env.POSTA_API_USE_MOCKS,
authDomain=Env.POSTA_API_AUTH,
crnDomain=Env.POSTA_API_CRN,
deliveryDomain=Env.POSTA_API_DELIVERY,
username=Env.POSTA_API_USERNAME,
password=Env.POSTA_API_PASSWORD,
authToken=Env.POSTA_API_AUTH_TOKEN,
crnToken=Env.POSTA_API_CRN_TOKEN,
maxCrnPoints=maxCrnPoints,
deliveryToken=Env.POSTA_API_DELIVERY_TOKEN,
)
App.services.ftpService = FsFtpService()
# USE CASES
App.usecases.print_file_hashes = Print_file_hashes()
App.usecases.log_worker_job_status = Log_worker_job_status(
workerJobStatusRepo=App.repos.workerJobStatusRepo,
systemService=App.services.systemService,
)
App.usecases.update_optimization_points = Update_optimization_points(
gpsStopTimeRepo=App.repos.gpsStopTimeRepo,
gpsServiceTimeRepo=App.repos.gpsServiceTimeRepo,
update_service_times=App.usecases.update_service_times
)
App.usecases.log_worker_status = Log_worker_status(
workerRepo=App.repos.workerRepo,
workerStatusRepo=App.repos.workerStatusRepo,
systemService=App.services.systemService
)
App.usecases.register_worker = Register_worker(
workerRepo=App.repos.workerRepo,
workerStatusRepo=App.repos.workerStatusRepo,
workerLogRepo=App.repos.workerLogRepo,
systemService=App.services.systemService,
)
App.usecases.run_optimization_worker = Run_optimization_worker(
register_worker=App.usecases.register_worker,
workerLogRepo=App.repos.workerLogRepo,
optimizationRepo=App.repos.optimizationRepo,
workerJobRepo=App.repos.workerJobRepo,
init_run_optimization_job=App.usecases.init_run_worker_optimization_job,
init_log_worker_status=App.usecases.init_log_worker_status,
systemService=App.services.systemService,
workerRepo=App.repos.workerRepo
)
App.usecases.read_optimization_files = Read_optimization_files(ftpService=App.services.ftpService)
App.usecases.calculate_optimization_points = Calculate_optimization_points(
gpsServiceTimeRepo=App.repos.gpsServiceTimeRepo,
crnMicroUpdateRepo=App.repos.crnMicroUpdateRepo,
)
App.usecases.test_transport_matrix = Test_transport_matrix(routingService=App.services.routingService)
App.usecases.match_crnPoints_with_landPlots = Match_crnPoints_with_landPlots(
landService=App.services.landService,
postaService=App.services.postaService,
)
App.usecases.match_crnPoints_with_allLandPlots = Match_crnPoints_with_allLandPlots(
landService=App.services.landService,
postaService=App.services.postaService,
)
App.usecases.write_optimization_files = Write_optimization_files(
postOfficeRepo=App.repos.postOfficeRepo,
crnMicroUpdateRepo=App.repos.crnMicroUpdateRepo,
postaService=App.services.postaService,
ftpService=App.services.ftpService,
routingService=App.services.routingService,
calculate_optimization_points=App.usecases.calculate_optimization_points,
match_crnPoints_with_landPlots=App.usecases.match_crnPoints_with_landPlots
)
App.usecases.run_updating_worker = Run_updating_worker(
register_worker=App.usecases.register_worker,
workerLogRepo=App.repos.workerLogRepo,
postOfficeRepo=App.repos.postOfficeRepo,
write_optimization_files=App.usecases.write_optimization_files,
gpsSessionRepo=App.repos.gpsSessionRepo,
init_log_worker_status=App.usecases.init_log_worker_status,
ftpService=App.services.ftpService,
)
App.usecases.analyze_gps_data = Analyze_gps_data(gpsRepo=App.repos.gpsRepo, postaService=App.services.postaService)
App.usecases.analyze_delivery_data = Analyze_delivery_data(postaService=App.services.postaService)
App.usecases.update_service_times = Update_service_times(
gpsServiceTimeRepo=App.repos.gpsServiceTimeRepo,
gpsStopTimeRepo=App.repos.gpsStopTimeRepo,
postaService=App.services.postaService,
gpsSessionRepo=App.repos.gpsSessionRepo
)
App.usecases.run_gps_worker = Run_gps_worker(
init_log_worker_status=App.usecases.init_log_worker_status,
register_worker=App.usecases.register_worker,
workerLogRepo=App.repos.workerLogRepo,
analyze_gps_data=App.usecases.analyze_gps_data,
gpsSessionRepo=App.repos.gpsSessionRepo,
gpsStopTimeRepo=App.repos.gpsStopTimeRepo,
crnMicroUpdateRepo=App.repos.crnMicroUpdateRepo,
update_service_times=App.usecases.update_service_times,
analyze_delivery_data=App.usecases.analyze_delivery_data,
gpsDeliveryRepo=App.repos.gpsDeliveryRepo,
gpsServiceTimeRepo=App.repos.gpsServiceTimeRepo,
match_crn_points_with_land_plots=App.usecases.match_crnPoints_with_landPlots,
postaService=App.services.postaService
)
App.__check()
@staticmethod
def __check():
not_inited = []
for group in [App.repos, App.services, App.usecases]:
for key, value in group.__dict__.items():
if not str(key).startswith("_") and key not in ['init']:
if value is None:
not_inited.append(key)
if len(not_inited) > 0:
raise Exception(f"App dependencies not inited: {not_inited}")