vehicle_record.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package vehicle
  2. import (
  3. "wails-app/internal/dao"
  4. "wails-app/internal/global"
  5. "wails-app/internal/model/vehicle/request"
  6. )
  7. type VehicleRecordService struct{}
  8. // GetVehicleRecordByID 根据ID获取车辆记录
  9. func (s *VehicleRecordService) GetVehicleRecordByID(id uint) (dao.VehicleRecord, error) {
  10. var record dao.VehicleRecord
  11. result := global.GVA_DB.First(&record, id)
  12. if result.RowsAffected == 0 {
  13. return dao.VehicleRecord{}, result.Error
  14. }
  15. records := []dao.VehicleRecord{record}
  16. if err := hydratePassageNames(records); err != nil {
  17. return dao.VehicleRecord{}, err
  18. }
  19. return records[0], nil
  20. }
  21. // ListVehicleRecordsByPlateNumber 根据车牌号获取车辆记录列表
  22. func (s *VehicleRecordService) ListVehicleRecordsByPlateNumber(plateNumber string, page, pageSize int) (int64, []dao.VehicleRecord, error) {
  23. var records []dao.VehicleRecord
  24. var total int64
  25. query := global.GVA_DB.Model(&dao.VehicleRecord{}).Where("plate_number = ?", plateNumber)
  26. // 计算总数
  27. query.Count(&total)
  28. // 分页查询
  29. offset := (page - 1) * pageSize
  30. result := query.Order("entry_time DESC").Offset(offset).Limit(pageSize).Find(&records)
  31. if result.Error != nil {
  32. return 0, nil, result.Error
  33. }
  34. if err := hydratePassageNames(records); err != nil {
  35. return 0, nil, err
  36. }
  37. return total, records, nil
  38. }
  39. // ListVehicleRecords 获取所有车辆记录列表
  40. func (s *VehicleRecordService) ListVehicleRecords(info request.VehicleRecordRequest) (list []dao.VehicleRecord, total int64, err error) {
  41. db := global.GVA_DB.Debug().Model(&dao.VehicleRecord{})
  42. limit := info.PageSize
  43. offset := info.PageSize * (info.Page - 1)
  44. // 车牌号模糊查询
  45. if info.PlateNumber != "" {
  46. db = db.Where("plate_number LIKE ?", "%"+info.PlateNumber+"%")
  47. }
  48. // RFID标签精确查询
  49. if info.RFIDTag != "" {
  50. db = db.Where("rfid_tag LIKE ?", "%"+info.RFIDTag+"%")
  51. }
  52. // 查询总数
  53. err = db.Count(&total).Error
  54. if err != nil {
  55. return nil, 0, err
  56. }
  57. // 分页查询 + 排序
  58. err = db.Order("entry_time DESC").Limit(limit).Offset(offset).Find(&list).Error
  59. if err != nil {
  60. return nil, 0, err
  61. }
  62. if err := hydratePassageNames(list); err != nil {
  63. return nil, 0, err
  64. }
  65. return list, total, nil
  66. }
  67. func hydratePassageNames(records []dao.VehicleRecord) error {
  68. channelIDs := make([]uint, 0, len(records)*2)
  69. deviceCodes := make([]string, 0, len(records)*2)
  70. for _, record := range records {
  71. if record.EntryChannelName == "" && record.EntryChannelID != 0 {
  72. channelIDs = append(channelIDs, record.EntryChannelID)
  73. }
  74. if record.ExitChannelName == "" && record.ExitChannelID != 0 {
  75. channelIDs = append(channelIDs, record.ExitChannelID)
  76. }
  77. if record.EntryDeviceName == "" && record.EntryDeviceCode != "" {
  78. deviceCodes = append(deviceCodes, record.EntryDeviceCode)
  79. }
  80. if record.ExitDeviceName == "" && record.ExitDeviceCode != "" {
  81. deviceCodes = append(deviceCodes, record.ExitDeviceCode)
  82. }
  83. }
  84. channelNames := make(map[uint]string, len(channelIDs))
  85. if len(channelIDs) > 0 {
  86. var channels []dao.Channel
  87. if err := global.GVA_DB.Where("id IN ?", channelIDs).Find(&channels).Error; err != nil {
  88. return err
  89. }
  90. for _, channel := range channels {
  91. channelNames[channel.ID] = channel.ChannelName
  92. }
  93. }
  94. deviceNames := make(map[string]string, len(deviceCodes))
  95. if len(deviceCodes) > 0 {
  96. var devices []dao.UHFReader
  97. if err := global.GVA_DB.Where("device_code IN ?", deviceCodes).Find(&devices).Error; err != nil {
  98. return err
  99. }
  100. for _, device := range devices {
  101. deviceNames[device.DeviceCode] = device.DeviceName
  102. }
  103. }
  104. for i := range records {
  105. if records[i].EntryChannelName == "" {
  106. records[i].EntryChannelName = channelNames[records[i].EntryChannelID]
  107. }
  108. if records[i].ExitChannelName == "" {
  109. records[i].ExitChannelName = channelNames[records[i].ExitChannelID]
  110. }
  111. if records[i].EntryDeviceName == "" {
  112. records[i].EntryDeviceName = deviceNames[records[i].EntryDeviceCode]
  113. }
  114. if records[i].ExitDeviceName == "" {
  115. records[i].ExitDeviceName = deviceNames[records[i].ExitDeviceCode]
  116. }
  117. }
  118. return nil
  119. }