parking_lot.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package parking
  2. import (
  3. "errors"
  4. "wails-app/internal/dao"
  5. "wails-app/internal/global"
  6. "wails-app/internal/model/parking/request"
  7. )
  8. type parkingLotService struct{}
  9. func NewParkingLotService() *parkingLotService {
  10. return &parkingLotService{}
  11. }
  12. // CreateParkingLot 创建停车区域
  13. func (s *parkingLotService) CreateParkingLot(req request.ParkingLotCreate) error {
  14. // 检查区域编码是否已存在
  15. var existingLot dao.ParkingLot
  16. result := global.GVA_DB.Where("lot_code = ?", req.LotCode).First(&existingLot)
  17. if result.RowsAffected > 0 {
  18. return errors.New("区域编码已存在")
  19. }
  20. lot := dao.ParkingLot{
  21. LotCode: req.LotCode,
  22. LotName: req.LotName,
  23. Capacity: req.Capacity,
  24. Available: req.Capacity, // 初始可用车位等于总车位
  25. Description: req.Description,
  26. }
  27. return global.GVA_DB.Create(&lot).Error
  28. }
  29. // UpdateParkingLot 更新停车区域
  30. func (s *parkingLotService) UpdateParkingLot(req request.ParkingLotUpdate) error {
  31. var lot dao.ParkingLot
  32. result := global.GVA_DB.First(&lot, req.ID)
  33. if result.RowsAffected == 0 {
  34. return errors.New("停车区域不存在")
  35. }
  36. // 检查区域编码是否被其他区域使用
  37. var existingLot dao.ParkingLot
  38. result = global.GVA_DB.Where("lot_code = ? AND id != ?", req.LotCode, req.ID).First(&existingLot)
  39. if result.RowsAffected > 0 {
  40. return errors.New("区域编码已被其他区域使用")
  41. }
  42. // 计算可用车位的变化
  43. capacityDiff := req.Capacity - lot.Capacity
  44. lot.LotCode = req.LotCode
  45. lot.LotName = req.LotName
  46. lot.Capacity = req.Capacity
  47. lot.Available += capacityDiff
  48. if lot.Available < 0 {
  49. lot.Available = 0
  50. }
  51. lot.Description = req.Description
  52. return global.GVA_DB.Save(&lot).Error
  53. }
  54. // GetParkingLotByID 根据ID获取停车区域
  55. func (s *parkingLotService) GetParkingLotByID(id uint) (dao.ParkingLot, error) {
  56. var lot dao.ParkingLot
  57. result := global.GVA_DB.First(&lot, id)
  58. if result.RowsAffected == 0 {
  59. return dao.ParkingLot{}, errors.New("停车区域不存在")
  60. }
  61. return lot, nil
  62. }
  63. // GetParkingLotByCode 根据编码获取停车区域
  64. func (s *parkingLotService) GetParkingLotByCode(code string) (dao.ParkingLot, error) {
  65. var lot dao.ParkingLot
  66. result := global.GVA_DB.Where("lot_code = ?", code).First(&lot)
  67. if result.RowsAffected == 0 {
  68. return dao.ParkingLot{}, errors.New("停车区域不存在")
  69. }
  70. return lot, nil
  71. }
  72. func (s *parkingLotService) QueryAllParkingLots() ([]dao.ParkingLot, error) {
  73. var parkingLots []dao.ParkingLot
  74. err := global.GVA_DB.Find(&parkingLots).Error
  75. if err != nil {
  76. return parkingLots, err
  77. }
  78. return parkingLots, nil
  79. }
  80. // ListParkingLots 获取停车区域列表
  81. func (s *parkingLotService) ListParkingLots(req request.ParkingLotQuery) (int64, []dao.ParkingLot, error) {
  82. var lots []dao.ParkingLot
  83. var total int64
  84. query := global.GVA_DB.Model(&dao.ParkingLot{})
  85. if req.LotCode != "" {
  86. query = query.Where("lot_code LIKE ?", "%"+req.LotCode+"%")
  87. }
  88. if req.LotCode != "" {
  89. query = query.Where("id = ?", req.LotId)
  90. }
  91. if req.LotName != "" {
  92. query = query.Where("lot_name LIKE ?", "%"+req.LotName+"%")
  93. }
  94. // 计算总数
  95. query.Count(&total)
  96. // 分页查询
  97. offset := (req.Page - 1) * req.PageSize
  98. result := query.Offset(offset).Limit(req.PageSize).Preload("Booths").Preload("Channels").Preload("UHFReaders").Find(&lots)
  99. if result.Error != nil {
  100. return 0, nil, result.Error
  101. }
  102. return total, lots, nil
  103. }
  104. // DeleteParkingLot 删除停车区域
  105. func (s *parkingLotService) DeleteParkingLot(id uint) error {
  106. result := global.GVA_DB.Delete(&dao.ParkingLot{}, id)
  107. if result.RowsAffected == 0 {
  108. return errors.New("停车区域不存在")
  109. }
  110. return result.Error
  111. }
  112. // UpdateParkingLotAvailability 更新停车区域可用车位
  113. func (s *parkingLotService) UpdateParkingLotAvailability(lotID uint, delta int) error {
  114. var lot dao.ParkingLot
  115. result := global.GVA_DB.First(&lot, lotID)
  116. if result.RowsAffected == 0 {
  117. return errors.New("停车区域不存在")
  118. }
  119. lot.Available += delta
  120. if lot.Available < 0 {
  121. lot.Available = 0
  122. } else if lot.Available > lot.Capacity {
  123. lot.Available = lot.Capacity
  124. }
  125. return global.GVA_DB.Save(&lot).Error
  126. }