Php 处理具有不同到期日和计算方法的忠诚度积分

Php 处理具有不同到期日和计算方法的忠诚度积分,php,mysql,Php,Mysql,我正在为一家餐厅创建一个会员制,其中包含忠诚度积分 每位会员在餐厅消费时,商户将为会员发放忠诚度积分作为现金返还,会员可以在其账户中使用忠诚度积分作为交易资金每个积分都有其到期日,即3个月 这是我面临的问题: 我编写的逻辑无法计算剩余的点,如果它们仅使用部分点,则无法添加到剩余的点。 这是我的桌子 CREATE TABLE `transaction_record_tpg` ( `trans_id` int(15) NOT NULL, `collected_datetime` dateti

我正在为一家餐厅创建一个会员制,其中包含忠诚度积分

每位会员在餐厅消费时,商户将为会员发放忠诚度积分作为现金返还,会员可以在其账户中使用忠诚度积分作为交易资金每个积分都有其到期日,即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个pts,到期日和收款日期应保持不变,即(9月1日至12月4日)

然后用户在10月31日和12月5日分别获得了25分,1月10日使用了10分,但现在上面的4分无法添加到计算中,因为分数已经过期

因此,我们应该只使用10月31日的20分减10分,从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)
    ";
?>


谁能告诉我哪里出了问题,我该怎么做来修复这个错误?还是有更好的方法来记录和执行此类功能?

为了在评论中详细阐述我的建议,我将实施以下支出点算法:

  • 查找最早的仍然有效的行(例如A和B),其总和等于或大于所需的数量(X)
  • 如果这些行不存在,则返回一个错误
  • 将A行和B行标记为“已用”
  • 计算剩余的点(C=A+B-X)
  • 如果C==0,则转到末尾
  • 查找A和B之间的最大过期日期(D)
  • 创建一个包含过期日期D和金额C的新行
  • 结局

  • 确保将所有数据库调用封装到一个事务中,否则可能会为奇怪的bug和漏洞创建一个空间。

    注意,目前没有INT(15)之类的东西。我建议重新考虑如何存储这些点。您可以为每个点创建一行,并使用一个字段表示是否花费了该点,或者,如果使用了部分点,则将该行替换为两个。@EriksKlotins您对如何准确地进行此操作有何见解?