._.
This commit is contained in:
parent
a7f8683b31
commit
0871e2f005
6
app/core/entities/calculate_total_order_request.py
Normal file
6
app/core/entities/calculate_total_order_request.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class CalculateTotalOrderRequest(BaseModel):
|
||||||
|
deadline: str
|
||||||
|
robotsCount: int
|
||||||
@ -19,6 +19,7 @@ from app.infrastructure.database.repository.truck_repository import TrucksReposi
|
|||||||
|
|
||||||
class NewTotalOrderService:
|
class NewTotalOrderService:
|
||||||
def __init__(self, db: Session):
|
def __init__(self, db: Session):
|
||||||
|
self.robotsCount = None
|
||||||
self.total_order_repository = TotalOrdersRepository(db)
|
self.total_order_repository = TotalOrdersRepository(db)
|
||||||
self.delivery_order_repository = DeliveryOrdersRepository(db)
|
self.delivery_order_repository = DeliveryOrdersRepository(db)
|
||||||
self.delivery_accessory_repository = DeliveryAccessoriesRepository(db)
|
self.delivery_accessory_repository = DeliveryAccessoriesRepository(db)
|
||||||
@ -26,7 +27,8 @@ class NewTotalOrderService:
|
|||||||
self.accessory_repository = AccessoriesRepository(db)
|
self.accessory_repository = AccessoriesRepository(db)
|
||||||
self.truck_repository = TrucksRepository(db)
|
self.truck_repository = TrucksRepository(db)
|
||||||
|
|
||||||
def total_calculate(self, current_user):
|
def total_calculate(self, current_user, deadline, robotsCount):
|
||||||
|
self.robotsCount = robotsCount
|
||||||
|
|
||||||
accessories = self.accessory_repository.get_with_cities_all()
|
accessories = self.accessory_repository.get_with_cities_all()
|
||||||
cities = self.city_repository.get_all_with_federal_district()
|
cities = self.city_repository.get_all_with_federal_district()
|
||||||
@ -39,7 +41,7 @@ class NewTotalOrderService:
|
|||||||
with connect() as session:
|
with connect() as session:
|
||||||
new_total_order = TotalOrder(
|
new_total_order = TotalOrder(
|
||||||
order_datetime=datetime.now(),
|
order_datetime=datetime.now(),
|
||||||
count_robots=2000,
|
count_robots=robotsCount,
|
||||||
deadline=datetime.now(),
|
deadline=datetime.now(),
|
||||||
price=0,
|
price=0,
|
||||||
user_id=current_user.id,
|
user_id=current_user.id,
|
||||||
@ -48,7 +50,6 @@ class NewTotalOrderService:
|
|||||||
session.add(new_total_order)
|
session.add(new_total_order)
|
||||||
session.flush()
|
session.flush()
|
||||||
|
|
||||||
|
|
||||||
for period, routes in routes_by_period.items():
|
for period, routes in routes_by_period.items():
|
||||||
for route in routes:
|
for route in routes:
|
||||||
vehicle_count, selected_truck = self.calculate_vehicle_requirements(
|
vehicle_count, selected_truck = self.calculate_vehicle_requirements(
|
||||||
@ -92,7 +93,6 @@ class NewTotalOrderService:
|
|||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def find_routes_by_period(self, grouped_by_period, distances, cities):
|
def find_routes_by_period(self, grouped_by_period, distances, cities):
|
||||||
purpose_city_id = self.city_repository.get_by_name('Челябинск').id
|
purpose_city_id = self.city_repository.get_by_name('Челябинск').id
|
||||||
|
|
||||||
@ -171,14 +171,13 @@ class NewTotalOrderService:
|
|||||||
for i in range(len(route) - 1):
|
for i in range(len(route) - 1):
|
||||||
if route[i].id != purpose_city_id:
|
if route[i].id != purpose_city_id:
|
||||||
city_accessories = [accessory for accessory in accessories if accessory.city_id == route[i].id]
|
city_accessories = [accessory for accessory in accessories if accessory.city_id == route[i].id]
|
||||||
total_weight += sum(accessory.weight for accessory in city_accessories) * 20.0
|
total_weight += sum(accessory.weight for accessory in city_accessories) * self.robotsCount / 100
|
||||||
total_cost += distances[route[i].id - 1][route[i + 1].id - 1] * (total_weight / 1000.0) * 8
|
total_cost += distances[route[i].id - 1][route[i + 1].id - 1] * (total_weight / 1000.0) * 8
|
||||||
|
|
||||||
return total_cost
|
return total_cost
|
||||||
|
|
||||||
@staticmethod
|
def calculate_vehicle_requirements(self, accessories, trucks):
|
||||||
def calculate_vehicle_requirements(accessories, trucks):
|
total_weight = sum(accessory.weight for accessory in accessories) * self.robotsCount / 100
|
||||||
total_weight = sum(accessory.weight for accessory in accessories) * 20
|
|
||||||
total_vehicles = float('inf')
|
total_vehicles = float('inf')
|
||||||
selected_truck = 0
|
selected_truck = 0
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ from typing import List
|
|||||||
from fastapi import APIRouter, HTTPException, Depends
|
from fastapi import APIRouter, HTTPException, Depends
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
|
||||||
|
from app.core.entities.calculate_total_order_request import CalculateTotalOrderRequest
|
||||||
from app.core.usecases.auth_service import verify_token
|
from app.core.usecases.auth_service import verify_token
|
||||||
from app.core.usecases.new_total_order_service import NewTotalOrderService
|
from app.core.usecases.new_total_order_service import NewTotalOrderService
|
||||||
from app.infrastructure.database.dependencies import get_db
|
from app.infrastructure.database.dependencies import get_db
|
||||||
@ -58,7 +59,11 @@ def delete_total_order(total_order_id: int, db: Session = Depends(get_db),
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/total-orders/calculate")
|
@router.post("/total-orders/calculate")
|
||||||
def calculate_total_order(db: Session = Depends(get_db), current_user: User = Depends(verify_token)):
|
def calculate_total_order(
|
||||||
|
request: CalculateTotalOrderRequest,
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
current_user: User = Depends(verify_token)
|
||||||
|
):
|
||||||
service = NewTotalOrderService(db)
|
service = NewTotalOrderService(db)
|
||||||
service.total_calculate(current_user)
|
service.total_calculate(current_user, request.deadline, request.robotsCount)
|
||||||
return "OK"
|
return {"status": "OK"}
|
||||||
Loading…
x
Reference in New Issue
Block a user