| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package service
- import (
- "time"
- "wails-app/internal/dao"
- "wails-app/internal/global"
- )
- // CalculateFee is the shared parking-fee calculation used by vehicle exit
- // flows and the digital-ticket live preview.
- func CalculateFee(vehicle *dao.Vehicle, stayTime int64) float64 {
- if vehicle == nil || global.GVA_DB == nil {
- return 0
- }
- var feeConfig dao.FeeConfig
- if err := global.GVA_DB.Where("vehicle_type_id = ?", vehicle.VehicleTypeID).First(&feeConfig).Error; err != nil {
- return float64(stayTime) * 0.1
- }
- if feeConfig.UnitFee == 0 && feeConfig.StartFee == 0 && feeConfig.DailyMaxFee == 0 {
- return float64(stayTime) * 0.1
- }
- if feeConfig.UnitTime <= 0 {
- return feeConfig.StartFee
- }
- isVIP := false
- if vehicle.OwnerId != nil {
- var owner dao.Owner
- if err := global.GVA_DB.First(&owner, *vehicle.OwnerId).Error; err == nil {
- now := time.Now()
- isVIP = owner.IsVip && !owner.VipExpireTime.IsZero() && owner.VipExpireTime.After(now)
- }
- }
- if isVIP && feeConfig.IsVIPFree {
- return 0
- }
- if stayTime <= int64(feeConfig.StartTime) {
- return 0
- }
- extraTime := stayTime - int64(feeConfig.StartTime)
- extraUnits := extraTime / int64(feeConfig.UnitTime)
- if extraTime%int64(feeConfig.UnitTime) > 0 {
- extraUnits++
- }
- fee := feeConfig.StartFee + float64(extraUnits)*feeConfig.UnitFee
- if feeConfig.DailyMaxFee > 0 && fee > feeConfig.DailyMaxFee {
- fee = feeConfig.DailyMaxFee
- }
- if isVIP {
- fee *= feeConfig.VIPDiscount
- }
- return fee
- }
|