//public override decimal CalculateFee(DateTime beginning, DateTime ending) //{ // decimal fee = 0; // decimal daysfee = 0; // TimeSpan ts = new TimeSpan(ending.Ticks - beginning.Ticks); // double totalMins = Math.Floor(ts.TotalMinutes); // double calMins = 0; //已经计费的分钟数 // if (totalMins < 0) return 0; //入场时间大于出场时间 // if (FreeMinutes > 0 && ts.TotalMinutes <= FreeMinutes) return 0;//小于免费停车时间 // if (FreeMinutes == 0 && ts.TotalMinutes == 0) return GetChargeUnitFee(beginning);//返回收费单元的费用 // DateTime begin = beginning; // DateTime end = begin.AddDays(1); // TariffBase tariff = this; // //收费都是按24小时为一周期 // while (end <= ending) // { // daysfee += tariff.CalcalateCycleFee(calMins, begin, end); // begin = end; // end = begin.AddDays(1); // calMins += 1440; // while (Card != null && begin < ending) // { // //开始一个收费周期 // tariff = TariffSetting.Current.GetIntradayTariff(Card, CarType, begin);//获取下一个收费周期的费率 // if (tariff != null || end >= ending) break; // begin = end; // end = begin.AddDays(1); // calMins += 1440; // } // } // if (tariff != null) // { // fee = tariff.CalcalateIntradayFee(calMins, begin, ending); // } // //计算超过3小时部分阶段 // fee = fee + daysfee; // if (FeeOfMax > 0 && fee > FeeOfMax) fee = FeeOfMax;//有封顶费用 // return fee; //} public override decimal CalcalateIntradayFee(double calMins, DateTime beginning, DateTime ending) { decimal fee = 0; //把预定时间的费用收完 double sliceAll = 0; TimeZone other = new TimeZone(LimitationTimezone.Ending, LimitationTimezone.Beginning); //如果有限价时段,那么其它的时间就组成另一个时段 while (beginning < ending) { sliceAll = other.Slice(beginning, ending, FirstFee.Minutes, false); if (sliceAll > 0) { if (calMins < FirstMinutes) //如果还在入场时间内 { double f**k = (FirstMinutes - calMins) > sliceAll ? sliceAll : (FirstMinutes - calMins); fee += ((decimal)Math.Ceiling(f**k / FirstFee.Minutes)) * FirstFee.Fee; calMins += f**k; beginning = beginning.AddMinutes(f**k); continue; } else { double f**k = sliceAll; fee += (decimal)Math.Ceiling(f**k / RegularFee.Minutes) * RegularFee.Fee; calMins += sliceAll; beginning = beginning.AddMinutes(sliceAll); } } sliceAll = LimitationTimezone.Slice(beginning, ending, FirstFee.Minutes, false); if (sliceAll > 0) { decimal tempFee = 0; double f**k = sliceAll; tempFee += (decimal)(Math.Ceiling(f**k / LimitationRegularFee.Minutes)) * LimitationRegularFee.Fee; fee += Limitation > 0 && tempFee > Limitation ? Limitation : tempFee; calMins += sliceAll; beginning = beginning.AddMinutes(sliceAll); } } if (FeeOf24Hour > 0 && FeeOf24Hour < fee) { fee = FeeOf24Hour; } if (FeeOfMax > 0 && fee > FeeOfMax) { fee = FeeOfMax; //有封顶费用 } return(fee); }
public override decimal CalcalateIntradayFee(double calMins, DateTime beginning, DateTime ending) { decimal fee = 0; //把预定时间的费用收完 double sliceAll = 0; TimeZone other = new TimeZone(LimitationTimezone.Ending, LimitationTimezone.Beginning); //如果有限价时段,那么其它的时间就组成另一个时段 while (beginning < ending) { sliceAll = other.Slice(beginning, ending, FirstFee.Minutes, false); if (sliceAll > 0) { if (sliceAll <= FirstMinutes) //如果还在入场时间内 { fee += (decimal)Math.Ceiling(sliceAll / FirstFee.Minutes) * FirstFee.Fee; } else { fee += ((decimal)Math.Ceiling((decimal)FirstMinutes / FirstFee.Minutes)) * FirstFee.Fee; //计算超过3小时部分阶段 double f**k = sliceAll - FirstMinutes; fee += ((decimal)Math.Ceiling(f**k / RegularFee.Minutes)) * RegularFee.Fee; } calMins += sliceAll; beginning = beginning.AddMinutes(sliceAll); } sliceAll = LimitationTimezone.Slice(beginning, ending, FirstFee.Minutes, false); if (sliceAll > 0) { decimal tempFee = 0; tempFee += (decimal)(Math.Ceiling(sliceAll / LimitationRegularFee.Minutes)) * LimitationRegularFee.Fee; fee += tempFee > Limitation ? Limitation : tempFee; calMins += sliceAll; beginning = beginning.AddMinutes(sliceAll); } } if (FeeOf24Hour > 0 && FeeOf24Hour < fee) { fee = FeeOf24Hour; } return(fee); }
public override decimal CalculateFee(DateTime beginning, DateTime ending) { decimal fee = 0; decimal daysfee = 0; TimeSpan ts = new TimeSpan(ending.Ticks - beginning.Ticks); double totalMins = Math.Ceiling(ts.TotalMinutes); double calMins = 0; //已经计费的分钟数 if (totalMins < 0) { return(0); //入场时间大于出场时间 } if (FreeMinutes > 0 && totalMins <= FreeMinutes) { return(0); //小于免费停车时间 } if (ts.TotalDays >= 1 && FeeOf24Hour > 0) //如果有每天最高收费,先计算出整天数的费用 { double days = Math.Floor(ts.TotalDays); daysfee += ((decimal)days) * FeeOf24Hour; calMins += days * 1440; beginning = beginning.AddDays(days); } //把预定时间的费用收完 double sliceAll = 0; TimeZone other = new TimeZone(LimitationTimezone.Ending, LimitationTimezone.Beginning); //如果有限价时段,那么其它的时间就组成另一个时段 while (beginning < ending) { sliceAll = other.Slice(beginning, ending, FirstFee.Minutes, false); if (sliceAll > 0) { if (sliceAll <= FirstMinutes) //如果还在入场时间内 { fee += (decimal)Math.Ceiling(sliceAll / FirstFee.Minutes) * FirstFee.Fee; } else { fee += ((decimal)Math.Ceiling((decimal)FirstMinutes / FirstFee.Minutes)) * FirstFee.Fee; //计算超过3小时部分阶段 double f**k = sliceAll - FirstMinutes; fee += ((decimal)Math.Ceiling(f**k / RegularFee.Minutes)) * RegularFee.Fee; } calMins += sliceAll; beginning = beginning.AddMinutes(sliceAll); } sliceAll = LimitationTimezone.Slice(beginning, ending, FirstFee.Minutes, false); if (sliceAll > 0) { decimal tempFee = 0; tempFee += (decimal)(Math.Ceiling(sliceAll / LimitationRegularFee.Minutes)) * LimitationRegularFee.Fee; fee += tempFee > Limitation ? Limitation : tempFee; calMins += sliceAll; beginning = beginning.AddMinutes(sliceAll); } } if (FeeOf24Hour > 0 && FeeOf24Hour < fee) { fee = FeeOf24Hour; } return(fee + daysfee); }