Explorar o código

fix: 手动进出场加入黑名单检查——三入口全覆盖,CheckVehicleShortlist支持车牌查询

lq hai 1 mes
pai
achega
c7ba8f3080

+ 1 - 1
internal/service/parking/passage.go

@@ -76,7 +76,7 @@ func (s *PassageService) HandlePassage(req common.PassageRequest) (*common.Passa
 	}
 
 	// ===================== 4. 黑名单检查 =====================
-	isBlack, _ := shortlistSvc.CheckVehicleShortlist(req.RFIDTag)
+	isBlack, _ := shortlistSvc.CheckVehicleShortlist(req.PlateNumber, req.RFIDTag)
 	if isBlack {
 		fmt.Printf("🚫 禁止通行 | 车辆在黑名单中 | 设备:%s 车牌:%s RFID:%s\n", req.DeviceCode, req.PlateNumber, req.RFIDTag)
 		return nil, fmt.Errorf("车辆在黑名单中")

+ 9 - 5
internal/service/vehicle/shortlist.go

@@ -27,16 +27,20 @@ func (shortlistService *ShortlistService) QueryShortlistByRFIDTag(rfidTag string
 	return dao.QueryShortlistByRFIDTag(rfidTag)
 }
 
-func (s *ShortlistService) CheckVehicleShortlist(rfid string) (isBlack bool, isWhite bool) {
+func (s *ShortlistService) CheckVehicleShortlist(plateNumber, rfidTag string) (isBlack bool, isWhite bool) {
 	var vehicle dao.Vehicle
-	err := global.GVA_DB.Where("rfid_tag = ?", rfid).First(&vehicle).Error
-	if err != nil {
+	query := global.GVA_DB
+	if rfidTag != "" {
+		query = query.Where("rfid_tag = ?", rfidTag)
+	} else {
+		query = query.Where("plate_number = ?", plateNumber)
+	}
+	if err := query.First(&vehicle).Error; err != nil {
 		return false, false
 	}
 
 	var shortlist dao.Shortlist
-	err = global.GVA_DB.Where("vehicle_id = ?", vehicle.ID).First(&shortlist).Error
-	if err != nil {
+	if err := global.GVA_DB.Where("vehicle_id = ?", vehicle.ID).First(&shortlist).Error; err != nil {
 		return false, false
 	}
 

+ 11 - 8
internal/service/vehicle/vehicle.go

@@ -174,6 +174,11 @@ func (s *VehicleService) DeleteVehicle(id uint) error {
 
 // VehicleEntry 车辆入场
 func (s *VehicleService) VehicleEntry(req request.VehicleEntry) (request.VehicleEntryResponse, error) {
+	// 黑名单检查
+	var shortlistSvc ShortlistService
+	if isBlack, _ := shortlistSvc.CheckVehicleShortlist(req.PlateNumber, req.RFIDTag); isBlack {
+		return request.VehicleEntryResponse{}, errors.New("车辆在黑名单中,禁止入场")
+	}
 	// 检查车辆是否存在
 	vehicle, err := s.GetVehicleByPlateNumber(req.PlateNumber, req.RFIDTag)
 	if err != nil {
@@ -326,46 +331,44 @@ 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
+	// 黑名单检查
+	var shortlistSvc ShortlistService
+	if isBlack, _ := shortlistSvc.CheckVehicleShortlist(req.PlateNumber, req.RFIDTag); isBlack {
+		return vehicleResponse.ExitConfirmResponse{}, errors.New("车辆在黑名单中,禁止出场")
+	}
+	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("车辆未入场或已出场")
 	}
-
 	vehicle, err := s.GetVehicleByPlateNumber(req.PlateNumber, req.RFIDTag)
 	if err != nil {
 		return vehicleResponse.ExitConfirmResponse{}, err
 	}
-
 	exitTime := time.Now()
 	stayTime := int64(exitTime.Sub(record.EntryTime).Minutes())
 	if stayTime < 0 {
 		stayTime = 0
 	}
 	fee := s.calculateFee(&vehicle, stayTime)
-
 	record.ExitTime = &exitTime
 	record.StayTime = stayTime
 	record.Fee = fee
 	record.PaymentMethod = req.PaymentMethod
 	global.GVA_DB.Save(&record)
-
 	vehicle.LastExitTime = &exitTime
 	vehicle.TotalStayTime += stayTime
 	vehicle.TotalFee += fee
 	global.GVA_DB.Save(&vehicle)
-
 	paymentSvc := paymentService.NewPaymentService()
 	pr, err := paymentSvc.ProcessPayment(record.ID, req.PaymentMethod, fee, req.PaidAmount, operatorID)
 	if err != nil {
 		return vehicleResponse.ExitConfirmResponse{}, err
 	}
-
 	changeAmount := 0.0
 	if pr != nil {
 		changeAmount = pr.ChangeAmount
 	}
-
 	return vehicleResponse.ExitConfirmResponse{
 		PlateNumber:   vehicle.PlateNumber,
 		EntryTime:     record.EntryTime.Unix(),