fee.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package service
  2. import (
  3. "time"
  4. "wails-app/internal/dao"
  5. "wails-app/internal/global"
  6. )
  7. // CalculateFee is the shared parking-fee calculation used by vehicle exit
  8. // flows and the digital-ticket live preview.
  9. func CalculateFee(vehicle *dao.Vehicle, stayTime int64) float64 {
  10. if vehicle == nil || global.GVA_DB == nil {
  11. return 0
  12. }
  13. var feeConfig dao.FeeConfig
  14. if err := global.GVA_DB.Where("vehicle_type_id = ?", vehicle.VehicleTypeID).First(&feeConfig).Error; err != nil {
  15. return float64(stayTime) * 0.1
  16. }
  17. if feeConfig.UnitFee == 0 && feeConfig.StartFee == 0 && feeConfig.DailyMaxFee == 0 {
  18. return float64(stayTime) * 0.1
  19. }
  20. if feeConfig.UnitTime <= 0 {
  21. return feeConfig.StartFee
  22. }
  23. isVIP := false
  24. if vehicle.OwnerId != nil {
  25. var owner dao.Owner
  26. if err := global.GVA_DB.First(&owner, *vehicle.OwnerId).Error; err == nil {
  27. now := time.Now()
  28. isVIP = owner.IsVip && !owner.VipExpireTime.IsZero() && owner.VipExpireTime.After(now)
  29. }
  30. }
  31. if isVIP && feeConfig.IsVIPFree {
  32. return 0
  33. }
  34. if stayTime <= int64(feeConfig.StartTime) {
  35. return 0
  36. }
  37. extraTime := stayTime - int64(feeConfig.StartTime)
  38. extraUnits := extraTime / int64(feeConfig.UnitTime)
  39. if extraTime%int64(feeConfig.UnitTime) > 0 {
  40. extraUnits++
  41. }
  42. fee := feeConfig.StartFee + float64(extraUnits)*feeConfig.UnitFee
  43. if feeConfig.DailyMaxFee > 0 && fee > feeConfig.DailyMaxFee {
  44. fee = feeConfig.DailyMaxFee
  45. }
  46. if isVIP {
  47. fee *= feeConfig.VIPDiscount
  48. }
  49. return fee
  50. }