需求:1.1日发公告1.1日之前的积分进行清零,在1.1-3.1这些天消费,在3.1这天进行1.1日之前积分清零,保留1.1-3.1这几天的获得积分(未进行消费的);
现有:用户表中的字段point(积分),积分记录表字段point(获得积分为正,消费积分为负,其实也可以有个字段表示类型),addtime(获得/消费时间);
思路:
1.首先user表中的积分是现在的积分=(1.1日之前的积分+1.1日之后获得的积分-1.1日之后消费的积分)。
有两种情况:1 1.1日之前的积分没有进行消费完或者刚好消费完了;
2 1.1日之前的积分不仅消费完了,并且也消费了一些1.1日之后的积分;
第一种情况:清零后的积分为 1.1日之后获得的积分;
第二种情况:清零后的积分为 现有的积分
判断条件是判断 1.1之前积分和消费积分的大小(这里 消费积分:spf(负数),获得积分: spz (正数),目前积分为 point,1.1日暂定为point_old);
即point = point_old + spz +spf
判断 point_old 与 -spf(如果消费积分为正则 point 与 spf ) 的大小
point_old ? -spf
这里point_old = point - spz -spf;
即这里point - spz -spf ? -spf
所以为 point ? spz
其实这样更好理解:即 现在的积分和获取积分比较若 获取积分大于现有积分也就是 第二种情况,若小于就是第一种情况。
代码表示(主要是sql):
UPDATE 用户表 AS U
INNER JOIN (
SELECT
IFNULL(SUM(IF( addtime > '2019-01-01 00:00:00' AND addtime < '2019-03-01 00:00:00 ' AND point > 0 , point, 0)),0) AS spz,
IFNULL(SUM(IF( addtime > '2019-01-01 00:00:00' AND addtime < '2019-03-01 00:00:00 ' AND point < 0 , point, 0)),0) AS spf,
userid
FROM
积分记录表
GROUP BY
userid
) AS L ON U.userid = L.userid
SET U.point =
IF (
U.point - L.spz > 0,
spz,
U.point
)
这时point里存在null这种情况
UPDATE 用户表 SET point = 0 WHERE point IS NULL
2.一月一日积分point进行同步到log_point (临界积分或沉淀积分)字段,将积分清零,之后增加积分按照原来的(也就是1.1日之后的积分),消费时首先消费沉淀积分,若沉淀积分不够进行消费现有积分;
代码表示(主要是php)
1.1日积分进行同步,消除现有积分 应该可以用定时任务但是安全起见没有做
sql:
UPDATE 用户表 AS SET log_point = point
UPDATE 用户表 SET point = 0
1.1 日 - 3.1 日 消费启用时:
这里传入参数是需要消费的积分,返回参数是消费后的积分和沉淀积分分别为多少
private function 积分情况($point)
{
$today=strtotime(date('Y-m-d H:i:s'));
$over=strtotime('2018-01-01 00:00:00');
$overdue=strtotime('2019-03-01 00:00:00');
$user=$this->获取个人积分情况();//获得我现有的积分和沉淀积分是多少
if($today < $over)
{
if($user['point'] < $point)
{
return ['code'=>1,'msg'=>'积分不够'];
}
return ['code'=>0,'point'=>$user['point']-$point,'log_point'=>$user['log_point']];
}
//$over todo 2019-01-01 该时间操作为将log_point 与point同步更新,point归零
if($over < $today && $today < $overdue)
{
if($user['point']+$user['log_point'] < $point)
{
return ['code'=>1,'msg'=>'积分不够'];
}else{
if($user['log_point']< $point)
{
return ['code'=>0,'point'=>$user['point']+$user['log_point']-$point,'log_point'=>0];
}else{
return ['code'=>0,'point'=>$user['point'],'log_point'=>$user['log_point']-$point];
}
}
}
//$overdue todo 2019-03-01 该时间操作为将log_point归零
if($today > $overdue)
{
if($user['point'] < $point)
{
return ['code'=>1,'msg'=>'积分不够'];
}
return ['code'=>0,'point'=>$user['point']-$point,'log_point'=>0];
}
}
3.1日进行沉淀积分清零:
sql:
UPDATE 用户表 SET log_point = 0
提示 : 这些代码还没有运用,也没有测试,只是我感觉可以用在较为少的用户表里,数据很多的话可能会出问题,建议多加测试,多备份数据表,以免有问题出现,如果有好的建议或是问题希望及时向我提醒,共同讨论,毕竟我还只是个菜鸟,希望大神带领打代码的天下,需要多加学习,谢谢;