【问题标题】:Handling loyalty credits with different expiry date and calculation处理具有不同到期日期和计算的忠诚度积分
【发布时间】:2020-02-25 08:01:10
【问题描述】:

我正在为一家餐厅创建一个包含忠诚度积分的会员系统。

每位会员在餐厅消费,商家都会为会员发放积分作为返现,他们可以使用账户中的积分作为交易资金。 每个积分都有3个月的有效期

这是我面临的问题:

我写的逻辑如果只使用部分点,就无法计算剩余的点并添加到其余部分。

这是我的桌子

CREATE TABLE `transaction_record_tpg` (
  `trans_id` int(15) NOT NULL,
  `collected_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `expired_date` datetime NOT NULL,
  `user_id` int(15) NOT NULL,
  `m_debit` decimal(6,2) NOT NULL,
  `m_credit` decimal(6,2) NOT NULL,
  `collect_outlet` varchar(255) NOT NULL,
)

我想创建一个表,可以自动计算用户不同到期日的借记/贷记交易记录。

以下是我创建的测试用例:

从表中, 您可以看到该会员在 9 月 1 日获得了 15 分,在 9 月 10 日和 10 月 10 日分别使用了 11 分。

所以用户实际上还剩下 4 分,到期日期和收集日期应该保持不变,即(9 月 1 日至 12 月 4 日)。

然后用户分别在 10 月 31 日和 12 月 5 日获得了 25 分,而在 1 月 10 日使用了 10 分,但是由于 pts 已经过期,现在上面的 4 分不能添加到计算中。

因此,我们应该只使用从 10 月 31 日到负 10 分的 20 分,从 12 月 5 日起我们剩下 10 分加上 5 分。

所以到现在(2020 年 2 月 25 日),从 10 月 31 日剩下的 10 分已经过期,总共只剩下 5 分。

所以计算机应该显示给我 5 分。

但是计算机计算为 -16 分,这显然不是答案。

这是我用来从数据库中提取结果的逻辑:

<?php 

$member_session = $_SESSION['u_id'];
$get_member = 
"SELECT(SELECT SUM(m_debit) AS metallic_point FROM transaction_record_tpg WHERE user_id = $member_session AND  expired_date >= CURRENT_DATE())
    -
    (SELECT SUM(m_credit) AS metallic_point FROM transaction_record_tpg WHERE user_id = $member_session)
    ";
?>

谁能告诉我出了什么问题,我应该怎么做才能修复这个错误?或者有没有更好的方法来记录和做这种功能?

【问题讨论】:

  • 请注意,目前没有 INT(15) 之类的东西
  • 我建议重新考虑如何存储积分。您可以为每个点创建一行,并使用一个字段 is_used 来表示它是否已花费,或者,如果使用部分点,则将该行替换为两个。
  • @EriksKlotins 你对如何做到这一点有任何见解吗?

标签: php mysql


【解决方案1】:

为了详细说明我在 cmets 中的建议,我将实现以下用于花费积分的算法:

  1. 查找总和等于或大于所需数量 (X) 的最旧仍然有效的行(例如 A 和 B)。 How to select rows that sum to a certain value
  2. 如果此类行不存在,则返回错误。
  3. 将 A 行和 B 行标记为“已用”
  4. 计算剩余点数 (C = A + B - X)
  5. 如果 C == 0 走到最后
  6. 查找 A 和 B 之间的最长到期日期 (D)
  7. 创建一个包含到期日期 D 和金额 C 的新行。
  8. 结束

确保将所有数据库调用打包到一个事务中,否则您可能会为奇怪的错误和漏洞利用创造空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多