首页 > 解决方案 > 使用 PHP 跟踪过期的忠诚度积分

问题描述

我正在尝试改进我尚未编写的代码。其他人写了一个代码(用其他语言),但它有一个错误,所以我试图写一些没有错误的类似的东西,但我想不出一种简洁的方法。

这就是正在发生的事情。我们有一个会员卡系统,人们可以通过该系统获得积分。然后他们可以使用这些积分购买东西。导致问题的原因是一条规定积分在 6 个月后过期的规则。

现在正在使用但有一个错误的代码,简单地说如下:

$currentPoints = array_sum($lastSixMonths);

其中 $lastSixMonths 是一个包含前几个月所有正负点的数组。也许是这样的:

$lastSixMonths = array (
'2018-01-10' => -1000,  
'2018-02-10' => 10, 
'2018-03-10' => 10, 
'2018-04-10' => 10, 
'2018-05-10' => 10);

在这种情况下,$currentPoints = -960,这应该是不可能的。原因是如果我要花最后 7 个月,我会得到这样的东西(在大多数情况下,这是一个非常简化的版本):

$lastSevenMonths = array (
'2017-12-10' => 1000,
'2018-01-10' => -1000,  
'2018-02-10' => 10, 
'2018-03-10' => 10, 
'2018-04-10' => 10, 
'2018-05-10' => 10);

假设今天是 2018 年 7 月 1 日。过去 6 个月将是 2018 年 1 月 1 日至 6 月 30 日。过去 7 个月将是 2017 年 12 月 1 日至 2018 年 6 月 30 日。

所以在 12 月 10 日,一位客户获得了 1000 积分,并在 1 月 10 日使用了积分,当时积分还没有过期。但是今天,Dec 交易已经过期,但 Jan 交易没有。

如何才能做到这一点?

请记住,客户可以使用任意数量的积分,因此他可能在 1 月份只使用了 2 个积分或任何其他金额(最多 1000),所以我不能只将 12 月和 1 月的交易标记为“已完成” ”。

我能想到的唯一方法是在过去 6 个月内将每笔负面交易甚至所有正面交易都剔除。我还没有写出代码,但是如果我这样做的话,感觉会非常耗时,因为我必须为数百万条交易线和数万客户这样做,并且每条线都在循环过去六个月的每一天,从第一天开始。

有什么更好的方法建议吗?

标签: phplogic

解决方案


似乎任何答案都必须清楚地记录何时获得积分以及何时花费这些特定积分。

因此,对于每个点记录,您可能具有以下字段:

“积分”、“花费”、“获得日期”</p>

然后,当该人花费积分时,它将最旧(仍然有效)的积分记录标记为已花费。您的记录可能如下所示:

Points: 10, Spent: 7, Date Earned: 2018-03-15

然后,您查找过去六个月获得的积分,并从相同记录中减去总花费。类似(伪SQL)的东西:

SELECT ( sum(points) - sum(spent) ) AS points_remaining FROM loyalty_points WHERE date_earned > [date six months ago] AND user_id=?

棘手的部分是在花费时标记积分 - 因为花费 150 积分可能会跨越多个积分记录,从最旧到最新。


推荐阅读