| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- package vehicle
- import (
- "testing"
- "time"
- "github.com/stretchr/testify/require"
- "wails-app/internal/dao"
- "wails-app/internal/global"
- "wails-app/internal/model/vehicle/request"
- ticketService "wails-app/internal/modules/digital-ticket/service"
- sessionRequest "wails-app/internal/modules/parking-session/model/request"
- sessionService "wails-app/internal/modules/parking-session/service"
- paymentService "wails-app/internal/modules/payment/service"
- )
- func TestVehicleEntryOpensSessionUsingCanonicalVehicleIdentity(t *testing.T) {
- svc := setupVehiclePaymentTest(t)
- vehicleType := &dao.VehicleType{Name: "session-entry", IsSystem: true}
- require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
- vehicle := &dao.Vehicle{
- PlateNumber: "SESSION-ENTRY", RFIDTag: "RFID-SESSION-ENTRY", VehicleTypeID: vehicleType.ID,
- }
- require.NoError(t, global.GVA_DB.Create(vehicle).Error)
- entryResult, err := svc.VehicleEntry(request.VehicleEntry{
- PlateNumber: vehicle.PlateNumber, ParkingLotID: 1,
- EntryChannelID: 31, EntryChannelCode: "ENTRY-31", EntryChannelName: "入口三号通道",
- EntryDeviceCode: "GATE-31", EntryDeviceName: "入口三号设备",
- TriggerMode: "ticket_machine",
- })
- require.NoError(t, err)
- session, err := sessionService.NewParkingSessionService().FindActiveSession(sessionRequest.ResolveActiveSessionRequest{
- RFIDTag: vehicle.RFIDTag,
- })
- require.NoError(t, err)
- require.Equal(t, vehicle.PlateNumber, session.PlateNumber)
- require.Equal(t, vehicle.RFIDTag, session.RFIDTag)
- require.EqualValues(t, 31, session.EntryChannelID)
- require.Equal(t, "ENTRY-31", session.EntryChannelCode)
- require.Equal(t, "入口三号通道", session.EntryChannelName)
- require.Equal(t, "GATE-31", session.EntryDeviceCode)
- require.Equal(t, "入口三号设备", session.EntryDeviceName)
- var ticket dao.DigitalTicket
- require.NoError(t, global.GVA_DB.Where("vehicle_record_id = ?", session.ID).First(&ticket).Error)
- require.Equal(t, vehicle.PlateNumber, ticket.PlateNumber)
- require.Equal(t, "ticket_machine", ticket.TriggerMode)
- require.Equal(t, session.ID, entryResult.Data.SessionID)
- require.Equal(t, ticket.ID, entryResult.Data.TicketID)
- require.Equal(t, ticket.TicketNo, entryResult.Data.TicketNo)
- }
- func TestOperationContextResolvesRFIDOnlyVehicleForEntry(t *testing.T) {
- svc := setupVehiclePaymentTest(t)
- vehicleType := &dao.VehicleType{Name: "rfid-entry", IsSystem: true}
- require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
- vehicle := &dao.Vehicle{PlateNumber: "RFID-CAR", RFIDTag: "RFID-ONLY-001", VehicleTypeID: vehicleType.ID}
- require.NoError(t, global.GVA_DB.Create(vehicle).Error)
- context, err := svc.GetOperationContext(request.VehicleIdentityRequest{RFIDTag: vehicle.RFIDTag})
- require.NoError(t, err)
- require.Equal(t, "entry", context.Action)
- require.True(t, context.VehicleFound)
- require.NotNil(t, context.Vehicle)
- require.Equal(t, vehicle.PlateNumber, context.Vehicle.PlateNumber)
- }
- func TestVehicleEntryCreatesTemporaryPlateForRFIDOnlyVehicle(t *testing.T) {
- svc := setupVehiclePaymentTest(t)
- vehicleType := &dao.VehicleType{Name: "rfid-temporary", IsSystem: true}
- require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
- const rfidTag = "E20047034BD060264B74010E"
- entry, err := svc.VehicleEntry(request.VehicleEntry{RFIDTag: rfidTag, ParkingLotID: 1})
- require.NoError(t, err)
- require.Len(t, entry.Data.PlateNumber, 19)
- require.Contains(t, entry.Data.PlateNumber, temporaryRFIDPlatePrefix)
- var vehicle dao.Vehicle
- require.NoError(t, global.GVA_DB.Where("rfid_tag = ?", rfidTag).First(&vehicle).Error)
- require.Equal(t, entry.Data.PlateNumber, vehicle.PlateNumber)
- require.NotEmpty(t, vehicle.PlateNumber)
- _, err = svc.VehicleEntry(request.VehicleEntry{RFIDTag: rfidTag, ParkingLotID: 1})
- require.Error(t, err)
- var vehicleCount int64
- require.NoError(t, global.GVA_DB.Model(&dao.Vehicle{}).Where("rfid_tag = ?", rfidTag).Count(&vehicleCount).Error)
- require.EqualValues(t, 1, vehicleCount)
- }
- func TestOperationContextReturnsSessionAndTicketForExit(t *testing.T) {
- svc := setupVehiclePaymentTest(t)
- record, vehicle := createVehiclePaymentFixture(t, true)
- context, err := svc.GetOperationContext(request.VehicleIdentityRequest{PlateNumber: vehicle.PlateNumber})
- require.NoError(t, err)
- require.Equal(t, "exit", context.Action)
- require.NotNil(t, context.Exit)
- require.Equal(t, record.ID, context.Exit.SessionID)
- require.Equal(t, ticketService.StatePendingPayment, context.Exit.TicketState)
- require.NotEmpty(t, context.Exit.TicketNo)
- require.Equal(t, sessionService.PaymentStatusUnpaid, context.Exit.PaymentStatus)
- }
- func TestExitConfirmAcceptsZeroFeeFreeReleaseBySession(t *testing.T) {
- svc := setupVehiclePaymentTest(t)
- record, vehicle := createVehiclePaymentFixture(t, true)
- require.NoError(t, global.GVA_DB.Model(record).Update("entry_time", time.Now()).Error)
- // 零费用场景:该车辆类型显式免费配置(单位费用为 0)
- require.NoError(t, global.GVA_DB.Model(&dao.FeeConfig{}).
- Where("vehicle_type_id = ?", vehicle.VehicleTypeID).Update("unit_fee", 0).Error)
- result, err := svc.ExitConfirm(request.ExitConfirmRequest{
- SessionID: record.ID, PlateNumber: vehicle.PlateNumber,
- PaymentEntry: paymentService.EntryCounter, PaymentMethod: paymentService.PaymentFree,
- ExitChannelID: 41, ExitChannelCode: "EXIT-41", ExitChannelName: "出口四号通道",
- ExitDeviceCode: "GATE-41", ExitDeviceName: "出口四号设备",
- }, 1)
- require.NoError(t, err)
- require.Zero(t, result.Fee)
- var persisted dao.VehicleRecord
- require.NoError(t, global.GVA_DB.First(&persisted, record.ID).Error)
- require.NotNil(t, persisted.ExitTime)
- require.EqualValues(t, 41, persisted.ExitChannelID)
- require.Equal(t, "EXIT-41", persisted.ExitChannelCode)
- require.Equal(t, "出口四号通道", persisted.ExitChannelName)
- require.Equal(t, "GATE-41", persisted.ExitDeviceCode)
- require.Equal(t, "出口四号设备", persisted.ExitDeviceName)
- }
|