Преглед на файлове

fix: 修复rfid_tag空字符串OR条件恒真——VehicleEntry/Exit/Preview/Confirm四处

lq преди 1 месец
родител
ревизия
f5c7e8b9df
променени са 1 файла, в които са добавени 15 реда и са изтрити 7 реда
  1. 15 7
      internal/service/vehicle/vehicle.go

+ 15 - 7
internal/service/vehicle/vehicle.go

@@ -9,10 +9,20 @@ import (
 	"wails-app/internal/model/vehicle/request"
 	vehicleResponse "wails-app/internal/model/vehicle/response"
 	paymentService "wails-app/internal/modules/payment/service"
+
+	"gorm.io/gorm"
 )
 
 type VehicleService struct{}
 
+// buildPlateOrRfidQuery 按车牌或RFID查询,RFID为空时仅用车牌(避免 rfid_tag='' 匹配所有无标签车辆)
+func buildPlateOrRfidQuery(db *gorm.DB, plateNumber, rfidTag string) *gorm.DB {
+	if rfidTag != "" {
+		return db.Where("plate_number = ? OR rfid_tag = ?", plateNumber, rfidTag)
+	}
+	return db.Where("plate_number = ?", plateNumber)
+}
+
 // CreateVehicle 创建车辆信息
 func (s *VehicleService) CreateVehicle(req request.VehicleCreate) error {
 	// 检查车牌号是否已存在
@@ -186,7 +196,7 @@ func (s *VehicleService) VehicleEntry(req request.VehicleEntry) (request.Vehicle
 
 	// 检查是否有未出场的记录
 	var existingRecord dao.VehicleRecord
-	result := global.GVA_DB.Where("(plate_number = ? OR rfid_tag = ?) AND exit_time IS NULL", req.PlateNumber, req.RFIDTag).First(&existingRecord)
+	result := buildPlateOrRfidQuery(global.GVA_DB, req.PlateNumber, req.RFIDTag).Where("exit_time IS NULL").First(&existingRecord)
 	if result.RowsAffected > 0 {
 		return request.VehicleEntryResponse{}, errors.New("车辆已入场,未出场")
 	}
@@ -228,7 +238,7 @@ func (s *VehicleService) VehicleEntry(req request.VehicleEntry) (request.Vehicle
 func (s *VehicleService) VehicleExit(req request.VehicleExit) (request.VehicleExitResponse, error) {
 	// 1. 查询未出场记录
 	var record dao.VehicleRecord
-	if err := global.GVA_DB.Where("(plate_number = ? OR rfid_tag = ?) AND exit_time IS NULL", req.PlateNumber, req.RFIDTag).First(&record).Error; err != nil {
+	if err := buildPlateOrRfidQuery(global.GVA_DB, req.PlateNumber, req.RFIDTag).Where("exit_time IS NULL").First(&record).Error; err != nil {
 		return request.VehicleExitResponse{}, errors.New("车辆未入场或已出场")
 	}
 
@@ -280,8 +290,7 @@ func (s *VehicleService) VehicleExit(req request.VehicleExit) (request.VehicleEx
 // ExitPreview 费用预览(不修改数据库,仅查询+计算费用)
 func (s *VehicleService) ExitPreview(req request.VehicleEntry) (vehicleResponse.ExitPreviewResponse, error) {
 	var record dao.VehicleRecord
-	err := global.GVA_DB.Where("(plate_number = ? OR rfid_tag = ?) AND exit_time IS NULL",
-		req.PlateNumber, req.RFIDTag).First(&record).Error
+	err := buildPlateOrRfidQuery(global.GVA_DB, req.PlateNumber, req.RFIDTag).Where("exit_time IS NULL").First(&record).Error
 	if err != nil {
 		return vehicleResponse.ExitPreviewResponse{}, errors.New("车辆未入场或已出场")
 	}
@@ -317,9 +326,8 @@ func (s *VehicleService) ExitPreview(req request.VehicleEntry) (vehicleResponse.
 
 // ExitConfirm 确认出场 + 支付(更新车辆记录 + 创建支付记录)
 func (s *VehicleService) ExitConfirm(req request.ExitConfirmRequest, operatorID uint) (vehicleResponse.ExitConfirmResponse, error) {
-	var record dao.VehicleRecord
-	err := global.GVA_DB.Where("(plate_number = ? OR rfid_tag = ?) AND exit_time IS NULL",
-		req.PlateNumber, req.RFIDTag).First(&record).Error
+var record dao.VehicleRecord
+	err := buildPlateOrRfidQuery(global.GVA_DB, req.PlateNumber, req.RFIDTag).Where("exit_time IS NULL").First(&record).Error
 	if err != nil {
 		return vehicleResponse.ExitConfirmResponse{}, errors.New("车辆未入场或已出场")
 	}