处理即将过期的航空里程的过程

Dav*_*ley 3 algorithm

我正在开发需要处理即将到期的航空里程的应用程序。可以使用里程,但是如果在某个日期之前未使用里程,它们将过期。我想确保我使适当的里程数过期,但是如果已经使用过,则不要使其过期。因此,我必须检查在给定的日期范围内是否使用了足够的里程,然后再终止里程。这是我最初的想法:

有一个包含以下各列的里程表:

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

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

  1. 对于每个用户,获取记录的日期,其中miles_expire标记设置为true,expiration_date当前日期之前为,processed标记设置为false。这将获取应该过期的所有里程的记录。
  2. expiration_date从上一个查询中获取第一个和最后一个。
  3. 使用expiration_date上一步中的第一个和最后一个值,获取该日期范围内所有已使用里程的列表。
  4. 如果上一步使用的英里数之和小于到期点之和,则使差值过期。如果使用的里程等于或大于英里,则不必过期。
  5. processed第一个和最后一个expiration_date范围内的所有记录的标志设置为true 。这些里程已过期或已被忽略。

看来这符合以下要求:

  • 首先使用有效里程
  • 它只会在与使用的里程相同的时间范围内检查使用的里程,因此过去使用很多里程不会节省未来的里程
  • 里程仅在日期之后过期,如果用户使用了足够的里程,则不会过期

我还需要考虑其他因素吗?这项工作会适当地使里程过期吗?

Mar*_*ers 5

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

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

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

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

您将在这里获得相同的日期,因为只有一条记录。

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

因为first和last相等,所以没有范围,因此在该范围内永远不会使用英里。

如果上一步使用的英里数之和小于到期点之和,则使差值过期。如果使用的里程等于或大于英里,则不必过期。

由于上一步未返回任何行,因此总和为零,因此您将始终使“ expired miles”和“ 0”之间的差值过期。即使里程已被使用。

此过程将重复。

总体而言,您的设计似乎不必要地进行了编译。我只存储每个用户未使用的凭证列表。付款时,已使用的代金券被标记为已使用。如果优惠券使用了一半,则将其标记为已使用,并以相同的到期日期发行更小的优惠券。如果凭证数量超出需求,则首先使用即将到期的凭证,最后使用未到期的凭证。过期的凭单永远无法用于付款,因此您无需做任何事情即可过期。

因此,总而言之:您无需使任何凭证过期,只需确保付款代码不允许使用已过期或已使用的凭证即可。