处理到期航空公司里程的流程

时间:2009-11-30 17:07:03

标签: algorithm

我正在开发一个需要处理到期航空里程的应用程序。可以使用里程,但如果它们在特定日期之前未使用,则它们将过期。我想确保我到达适当的里程数,但如果已经使用过,则不会使它们失效。因此,我必须检查在给定的日期范围内是否已使用足够的里程数。以下是我最初的想法:

拥有包含以下列的里程表:

  • user_id - 用户表的外键
  • number_miles - 此记录的里程数
  • miles_type - 表示是否添加,使用或过期里程
  • miles_expire - 表示这些里程是否到期的布尔值
  • miles_date - 添加此记录的日期
  • exipration_date - 这些里程过期的日期(如果miles_expire标志为真)
  • 已处理 - 表示此记录是否已处理 - 仅在miles_type设置为过期时适用

如果我每次从特定用户帐户添加,使用或过期时都有记录,我想我可以计算过期里程:

  1. 对于每个用户,获取miles_expire标志设置为true,expiration_date在当前日期之前,processed标志设置为false的记录的日期。这将获得应该过期的所有里程的记录。
  2. 从上一个查询中获取第一个和最后一个expiration_date
  3. 使用上一步中的第一个和最后一个expiration_date值,获取该日期范围内所有已用里程的列表。
  4. 如果上一步的使用里程总和小于到期点的总和,则使差异到期。如果使用的里程相等或更大,则无需过期。
  5. 为第一个和最后一个processed范围内的所有记录设置expiration_date标志为true。这些里程已经过期或被忽略,因为它们已被使用。
  6. 这似乎符合以下要求:

    • 首先使用过期里程
    • 它只会检查使用的里程与使用的里程相同的时间范围,因此过去使用许多里程将无法保存未来的里程数
    • 里程仅在日期后过期,如果用户使用了足够的里程则不会过期

    我还需要考虑其他因素吗?这可以正常到期吗?

2 个答案:

答案 0 :(得分:4)

由于多种原因,您的方法无效。最容易解释的可能是:

  

对于每个用户,获取miles_expire标志设置为true,expiration_date在当前日期之前,并且处理过的标志设置为false的记录的日期。这将获得应该过期的所有里程的记录。

请注意,这可能只是一条记录。如果您经常进行检查,实际上通常只有一条记录。让我们假设为了简单起见,每天最多一条记录到期(如果超过一条记录到期,你的算法仍然失败,那就更难解释了。)

  

从上一个查询中获取第一个和最后一个expiration_date。

你会在这里得到相同的日期,因为只有一条记录。

  

使用上一步中的第一个和最后一个expiration_date值,获取该日期范围内所有已用里程的列表。

由于第一个和最后一个相等,因此没有范围,所以在该范围内永远不会使用里程。

  

如果上一步的使用里程总和小于到期点的总和,则使差异到期。如果使用的里程相等或更大,则无需过期。

由于上一步没有返回任何行,因此总和为零,因此您将始终使“过期英里数”和“0”之间的差异到期。即使已使用里程。

此过程将重复。

总体而言,您的设计似乎不必要地编译。我只会为每个用户存储一张未使用的优惠券清单。当他们付款时,使用的凭证被标记为已使用。如果凭证已被使用一半,则将其标记为已使用,并且发出具有相同到期日期但具有较小金额的新凭证。如果有更多的凭证超过需要,很快到期的凭证将首先用完,并且最后使用非到期凭证。已过期的优惠券永远不会用于付款,因此您无需采取任何措施使其过期。

总而言之:您不需要使任何优惠券到期,只需确保支付代码不允许使用已过期或已使用的优惠券。

答案 1 :(得分:0)

我认为您不必担心在库存应用程序中首先使用哪些里程;它们要么已过期(基于到期日期)。关键是:还剩多少里程?过期里程,就像用过的里程一样,就像是对帐户的借记(只有您不需要单独的交易来表示到期,您只能将它们从用于计算当前余额的公式中排除。)。