Procházet zdrojové kódy

feat: 在场车辆统计API——GET /vehicle/in-park,按停车场/车牌筛选

lq před 1 měsícem
rodič
revize
b38984b212

+ 14 - 0
internal/api/v1/vehicle/vehicle.go

@@ -2,6 +2,8 @@ package vehicle
 
 import (
 	"fmt"
+	"strconv"
+
 	"github.com/gin-gonic/gin"
 	"wails-app/internal/model/common/response"
 	"wails-app/internal/model/vehicle/request"
@@ -158,3 +160,15 @@ func VehicleExit(c *gin.Context) {
 
 	response.OkWithData(resp, c)
 }
+
+// GetInParkVehicles 获取所有在场车辆
+func GetInParkVehicles(c *gin.Context) {
+	lotID, _ := strconv.Atoi(c.Query("parking_lot_id"))
+	plateNumber := c.Query("plate_number")
+	list, err := vehicleService.GetInParkVehicles(uint(lotID), plateNumber)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithData(list, c)
+}

+ 1 - 0
internal/router/vehicle/vehicle.go

@@ -19,6 +19,7 @@ func SetupVehicleRouter(router *gin.RouterGroup) {
 		vehicleGroup.GET("/type/all", vehicle.GetAllVehicleTypes)
 
 		// 车辆管理
+		vehicleGroup.GET("/in-park", vehicle.GetInParkVehicles)
 		vehicleGroup.POST("/create", vehicle.CreateVehicle)
 		vehicleGroup.PUT("/update", vehicle.UpdateVehicle)
 		vehicleGroup.GET("/get", vehicle.GetVehicleByID)

+ 50 - 0
internal/service/vehicle/vehicle.go

@@ -436,3 +436,53 @@ func (s *VehicleService) calculateFee(vehicle *dao.Vehicle, stayTime int64) floa
 
 	return fee
 }
+
+// InParkVehicle 在场车辆信息
+type InParkVehicle struct {
+	RecordID      uint    `json:"record_id"`
+	PlateNumber   string  `json:"plate_number"`
+	VehicleType   string  `json:"vehicle_type"`
+	OwnerName     string  `json:"owner_name"`
+	OwnerPhone    string  `json:"owner_phone"`
+	EntryTime     string  `json:"entry_time"`
+	StayMinutes   int64   `json:"stay_minutes"`
+	ParkingLot    string  `json:"parking_lot"`
+	ParkingSpace  string  `json:"parking_space"`
+}
+
+// GetInParkVehicles 获取所有在场车辆
+func (s *VehicleService) GetInParkVehicles(lotID uint, plateNumber string) ([]InParkVehicle, error) {
+	var results []InParkVehicle
+	now := time.Now()
+	query := global.GVA_DB.Table("vehicle_record").
+		Select(`vehicle_record.id as record_id, vehicle_record.plate_number, vehicle_type.name as vehicle_type,
+			owner.owner_name, owner.owner_phone, vehicle_record.entry_time,
+			parking_lot.lot_name as parking_lot`).
+		Joins("LEFT JOIN vehicle ON vehicle.plate_number = vehicle_record.plate_number").
+		Joins("LEFT JOIN vehicle_type ON vehicle_type.id = vehicle.vehicle_type_id").
+		Joins("LEFT JOIN owner ON owner.id = vehicle.owner_id").
+		Joins("LEFT JOIN parking_lot ON parking_lot.id = vehicle_record.parking_lot_id").
+		Where("vehicle_record.exit_time IS NULL")
+	if lotID > 0 {
+		query = query.Where("vehicle_record.parking_lot_id = ?", lotID)
+	}
+	if plateNumber != "" {
+		query = query.Where("vehicle_record.plate_number LIKE ?", "%"+plateNumber+"%")
+	}
+	err := query.Order("vehicle_record.entry_time ASC").Scan(&results).Error
+	if err != nil {
+		return nil, err
+	}
+	for i := range results {
+		// Parse entry time and calculate stay duration
+		t, parseErr := time.Parse("2006-01-02T15:04:05-07:00", results[i].EntryTime)
+		if parseErr != nil {
+			t, _ = time.Parse("2006-01-02 15:04:05", results[i].EntryTime)
+		}
+		results[i].StayMinutes = int64(now.Sub(t).Minutes())
+		if results[i].StayMinutes < 0 {
+			results[i].StayMinutes = 0
+		}
+	}
+	return results, nil
+}