会员忠诚度计划剩余积分与到期积分计算技术问询
积分交易计算方案
数据库字段说明
id:交易ID(对应transactionID)type:交易类型EARN:用户从门店获取积分REDEEM:用户使用积分
expiredAt:积分到期时间(EARN类型积分有效期固定为1年)
核心计算需求
- 用户剩余有效积分:在指定查询时刻(如2024年2月19日),统计该用户未过期的剩余积分总额
- 本月到期积分:统计该用户当月即将到期的积分总和
剩余有效积分计算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
相关产品推荐
相关产品推荐

