6

我必须计算持卡人的总计费金额,用于基于卡的停车场访问。我的费率结构是这样的。停车场的每个区域都会有这些价格的优先列表。

public partial class HourlyPrice
{
    public int Id { get; set; }
    public int DayId { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public int MinHour { get; set; }
    public int MaxHour { get; set; }
    public decimal Price { get; set; }
}

DayId允许例如“从 13:00 开始的周日免费”。MinNour并且“MaxHour”允许 0 到 2 小时是免费的,其中 5 到 6 小时需要 R11.00。StartTimeEndTime允许“18h00 后费用 R7.00,统一费率”。

我担心的是没有指定多日价格。当一辆汽车在某一天进入一个价格结构,并在另一天退出另一个价格结构。在我看来,这就像我必须按顺序访问车辆停放的每个小时并累积到期金额。这似乎是一种非常昂贵的做事方式。

任何关于这种努力的建议将不胜感激。

4

2 回答 2

3

我认为这个库应该可以解决你所有的问题:

http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

于 2013-04-02T07:50:01.833 回答
0

您可以将每个特定日期的定价策略存储在间隔树中。树应该存储一天中的所有时间。除了小时范围外,还应保存一些信息:

  • 一个布尔单位:定价单位是额定的吗?(例如,R7.00 为间隔的所有时间段)
  • 整数价格:周期内一小时的成本。如果flat设置为 true,则这是整个期间的成本。

您在输入中获得停车记录。我认为它们是汽车到达和离开时间的时间戳。前两个小时是免费的,因此您将到达时间“增加”了两个小时。根据生成的时间戳,您可以构建一个三元组序列(开始时间结束时间)。它可能是空的(如果车主停车不到两个小时),这种情况是微不足道的:花费 R0.00

现在,处理序列的算法应该如下所示:

cost <- 0
while (NOT is_empty(sequence)) {
    dayTriplet <- pop(sequence)
    down <- dayTriplet.StartTime
    up <- dayTriplet.EndTime
    pricingTree <- getPriceTree(dayTriplet.dayId)
    while (down < up) {
        node <- findNode(pricingTree, down)
        nbHours <- min(up, node.up) - down
        if (node.flat) {
            cost <- cost + node.price
        } else {
            cost <- cost + nbHours*node.price
        }
        down <- down + nbHours
    }
}

该算法有点错误,但我觉得它背后的想法值得一试。例如,如果一辆汽车在一天 18:00 之后停到第二天 4:00,这个算法会解析 (d, 18, 24) 和 (d+1, 0, 4),因此车主应该支付两倍的费用期间的比率,而不是只有一次。一个类似进位的系统应该可以解决这个问题。我只是没有集成它留下一个相对清晰的算法。

于 2013-04-02T08:44:43.483 回答