parking_lot.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package parking
  2. import (
  3. "errors"
  4. "server/dao"
  5. "server/global"
  6. "server/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. // ListParkingLots 获取停车区域列表
  73. func (s *parkingLotService) ListParkingLots(req request.ParkingLotQuery) (int64, []dao.ParkingLot, error) {
  74. var lots []dao.ParkingLot
  75. var total int64
  76. query := global.GVA_DB.Model(&dao.ParkingLot{})
  77. if req.LotCode != "" {
  78. query = query.Where("lot_code LIKE ?", "%"+req.LotCode+"%")
  79. }
  80. if req.LotName != "" {
  81. query = query.Where("lot_name LIKE ?", "%"+req.LotName+"%")
  82. }
  83. // 计算总数
  84. query.Count(&total)
  85. // 分页查询
  86. offset := (req.Page - 1) * req.PageSize
  87. result := query.Offset(offset).Limit(req.PageSize).Find(&lots)
  88. if result.Error != nil {
  89. return 0, nil, result.Error
  90. }
  91. return total, lots, nil
  92. }
  93. // DeleteParkingLot 删除停车区域
  94. func (s *parkingLotService) DeleteParkingLot(id uint) error {
  95. result := global.GVA_DB.Delete(&dao.ParkingLot{}, id)
  96. if result.RowsAffected == 0 {
  97. return errors.New("停车区域不存在")
  98. }
  99. return result.Error
  100. }
  101. // UpdateParkingLotAvailability 更新停车区域可用车位
  102. func (s *parkingLotService) UpdateParkingLotAvailability(lotID uint, delta int) error {
  103. var lot dao.ParkingLot
  104. result := global.GVA_DB.First(&lot, lotID)
  105. if result.RowsAffected == 0 {
  106. return errors.New("停车区域不存在")
  107. }
  108. lot.Available += delta
  109. if lot.Available < 0 {
  110. lot.Available = 0
  111. } else if lot.Available > lot.Capacity {
  112. lot.Available = lot.Capacity
  113. }
  114. return global.GVA_DB.Save(&lot).Error
  115. }