endpoint shipment/{cargo_id}/cost
This commit is contained in:
parent
5cf8dd1bb1
commit
40780ae405
20
README.md
20
README.md
@ -1,14 +1,32 @@
|
|||||||
# track-company
|
# Truck-Company
|
||||||
|
|
||||||
# В ПРОЦЕССЕ РАЗРАБОТКИ
|
# В ПРОЦЕССЕ РАЗРАБОТКИ
|
||||||
|
|
||||||
# Задание
|
# Задание
|
||||||
[Задание](Task15.md)
|
[Задание](Task15.md)
|
||||||
|
|
||||||
|
|
||||||
|
## Файл .env
|
||||||
|
|
||||||
|
- `POSTGRES_USER`=
|
||||||
|
- `POSTGRES_PASSWORD`=
|
||||||
|
- `POSTGRES_DB`=
|
||||||
|
|
||||||
|
- `DB_HOST`=postgres
|
||||||
|
- `DB_PORT`=5432
|
||||||
|
- `DB_SSLMODE`=disable
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
|
||||||
|
`podman-compose build && podman-compose up`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Рабочие Endpoints:
|
## Рабочие Endpoints:
|
||||||
|
|
||||||
- `/routes` - Получить список маршрутов;
|
- `/routes` - Получить список маршрутов;
|
||||||
- `/routes/{route_id}/transport` - Список транспорта, занятого на данном маршруте;
|
- `/routes/{route_id}/transport` - Список транспорта, занятого на данном маршруте;
|
||||||
|
- `/shipment/{cargo_id}/cost` - Рассчет стоимости услуг, оказанных по перевозке данного груза с учётом скидки постоянного клиента ;
|
||||||
## Схема БД
|
## Схема БД
|
||||||

|

|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@ func (h *TruckCompanyHandler) RegisterRoutes(r *mux.Router) {
|
|||||||
|
|
||||||
r.HandleFunc("/routes", h.GetRoutes).Methods("GET")
|
r.HandleFunc("/routes", h.GetRoutes).Methods("GET")
|
||||||
r.HandleFunc("/routes/{route_id}/transport", h.GetTransportByRoute).Methods("GET")
|
r.HandleFunc("/routes/{route_id}/transport", h.GetTransportByRoute).Methods("GET")
|
||||||
|
r.HandleFunc("/shipment/{cargo_id}/cost", h.GetShipmentCost).Methods("GET")
|
||||||
// r.HandleFunc("/routes/{route_id}/transport-types", h.GetTransportTypesByRoute).Methods("GET")
|
// r.HandleFunc("/routes/{route_id}/transport-types", h.GetTransportTypesByRoute).Methods("GET")
|
||||||
// r.HandleFunc("/shipments/cost", h.GetShipmentCost).Methods("GET")
|
|
||||||
// r.HandleFunc("/routes/{route_id}/cargo-turnover", h.GetCargoTurnoverByRoute).Methods("GET")
|
// r.HandleFunc("/routes/{route_id}/cargo-turnover", h.GetCargoTurnoverByRoute).Methods("GET")
|
||||||
|
|
||||||
//404 для всех остальных
|
//404 для всех остальных
|
||||||
@ -64,3 +64,29 @@ func (h *TruckCompanyHandler) GetTransportByRoute(w http.ResponseWriter, r *http
|
|||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
json.NewEncoder(w).Encode(transport)
|
json.NewEncoder(w).Encode(transport)
|
||||||
}
|
}
|
||||||
|
func (h *TruckCompanyHandler) GetShipmentCost(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
cargo_id, err := strconv.ParseInt(vars["cargo_id"], 10, 64)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
sendErrorResponse(w, http.StatusBadRequest, "Invalid cargo ID", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
final_cost, err := h.uc.GetCargoCost(cargo_id)
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
sendErrorResponse(w, http.StatusInternalServerError, "", err.Error())
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response := struct {
|
||||||
|
CargoCost float64 `json:"cargo_cost_count"`
|
||||||
|
}{
|
||||||
|
CargoCost: final_cost,
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
json.NewEncoder(w).Encode(response)
|
||||||
|
}
|
||||||
|
@ -8,4 +8,5 @@ type RepositoryInterface interface {
|
|||||||
GetAllRoutes() ([]domain.Route, error)
|
GetAllRoutes() ([]domain.Route, error)
|
||||||
GetTransportByRoute(routeID int64) ([]domain.Transport, error)
|
GetTransportByRoute(routeID int64) ([]domain.Transport, error)
|
||||||
GetShipmentCosts() ([]domain.Shipment, error)
|
GetShipmentCosts() ([]domain.Shipment, error)
|
||||||
|
GetCargoCost(cargoID int64) (float64, error)
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package repository
|
|||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
|
"log"
|
||||||
domain "truck-company/internal/domain"
|
domain "truck-company/internal/domain"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,8 +39,12 @@ func (r *AppRepo) GetAllRoutes() ([]domain.Route, error) {
|
|||||||
return routes, nil
|
return routes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *AppRepo) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
|
func (r *AppRepo) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
|
||||||
rows, err := t.db.Query(`
|
if r.db == nil {
|
||||||
|
return nil, errors.New("Ошибка подключения к бд. *db == nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
rows, err := r.db.Query(`
|
||||||
SELECT t.id, t.model, t.capacity, tt.name
|
SELECT t.id, t.model, t.capacity, tt.name
|
||||||
FROM transport t
|
FROM transport t
|
||||||
JOIN shipment s ON t.id = s.transport_id
|
JOIN shipment s ON t.id = s.transport_id
|
||||||
@ -60,3 +65,32 @@ func (t *AppRepo) GetTransportByRoute(routeID int64) ([]domain.Transport, error)
|
|||||||
}
|
}
|
||||||
return transports, nil
|
return transports, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *AppRepo) GetCargoCost(cargoID int64) (float64, error) {
|
||||||
|
if r.db == nil {
|
||||||
|
return 0, errors.New("Ошибка подключения к бд. *db == nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
var finalCost float64
|
||||||
|
query := `
|
||||||
|
SELECT
|
||||||
|
SUM( CASE
|
||||||
|
WHEN cl.is_regular THEN s.cost * 0.95 -- 5% скидка постоянным клиентам
|
||||||
|
ELSE s.cost
|
||||||
|
END) AS final_cost
|
||||||
|
|
||||||
|
FROM shipment s
|
||||||
|
JOIN client cl ON s.client_id = cl.id
|
||||||
|
JOIN route r ON s.route_id = r.id
|
||||||
|
JOIN cargo c ON s.cargo_id = c.id
|
||||||
|
WHERE c.id = $1
|
||||||
|
GROUP BY c.id;
|
||||||
|
`
|
||||||
|
err := r.db.QueryRow(query, cargoID).Scan(&finalCost)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Ошибка при получении стоимости перевозки:", err)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return finalCost, nil
|
||||||
|
}
|
||||||
|
@ -22,3 +22,7 @@ func (u *UseCase) GetAllRoutes() ([]domain.Route, error) {
|
|||||||
func (u *UseCase) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
|
func (u *UseCase) GetTransportByRoute(routeID int64) ([]domain.Transport, error) {
|
||||||
return u.AppRepo.GetTransportByRoute(routeID)
|
return u.AppRepo.GetTransportByRoute(routeID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *UseCase) GetCargoCost(cargoID int64) (float64, error) {
|
||||||
|
return u.AppRepo.GetCargoCost(cargoID)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user