【发布时间】: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 你对如何做到这一点有任何见解吗?