关于积分清零的一些思路

需求: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

 

提示 : 这些代码还没有运用,也没有测试,只是我感觉可以用在较为少的用户表里,数据很多的话可能会出问题,建议多加测试,多备份数据表,以免有问题出现,如果有好的建议或是问题希望及时向我提醒,共同讨论,毕竟我还只是个菜鸟,希望大神带领打代码的天下,需要多加学习,谢谢;

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值