You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

会员忠诚度计划剩余积分与到期积分计算技术问询

积分交易计算方案

数据库字段说明

  • id:交易ID(对应transactionID)
  • type:交易类型
    • EARN:用户从门店获取积分
    • REDEEM:用户使用积分
  • expiredAt:积分到期时间(EARN类型积分有效期固定为1年)

核心计算需求

  1. 用户剩余有效积分:在指定查询时刻(如2024年2月19日),统计该用户未过期的剩余积分总额
  2. 本月到期积分:统计该用户当月即将到期的积分总和

剩余有效积分计算PHP实现(中文注释版)

public function calculateRemainingPoints($memberId)
{
    // 获取当前会员的所有交易记录,按创建时间排序
    $transactions = Transaction::where('memberId', $memberId)->orderBy('created_at')->get();

    // 初始化剩余积分总额
    $totalPoints = 0;

    // 逐条处理交易记录
    foreach ($transactions as $transaction) {
        if ($transaction->type == 'EARN') {
            // 解析积分到期时间并判断是否未过期
            $expiredAt = Carbon::parse($transaction->expiredAt);
            $currentDate = Carbon::now();
            if ($expiredAt->gt($currentDate)) {
                // 累加未过期的获取积分
                $totalPoints += $transaction->points;
            }
        } elseif ($transaction->type == 'REDEEM') {
            // 扣除已使用的积分
            $totalPoints -= $transaction->points;
        }
    }

    return $totalPoints;
}

本月到期积分计算PHP实现

public function calculateExpiringPointsThisMonth($memberId)
{
    // 获取本月的起始和结束时间
    $startOfMonth = Carbon::now()->startOfMonth();
    $endOfMonth = Carbon::now()->endOfMonth();

    // 筛选本月到期的EARN类型积分并求和
    $expiringPoints = Transaction::where('memberId', $memberId)
        ->where('type', 'EARN')
        ->whereBetween('expiredAt', [$startOfMonth, $endOfMonth])
        ->sum('points');

    return $expiringPoints;
}

内容的提问来源于stack exchange,提问作者Giffary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:07:46