class IntegralService{
/**
* [积分赠送日志]公共方法
* @param $userId 用户ID
* @param $fkType 赠送类型:1:新用户注册;2用户签到;3用户消费;4邀请新用户;...
* @param int $fkId 关联ID:如果类型为用户消费,则关联ID为订单的ID;如果类型为邀请新用户,则关联ID为新用户的ID...
* @return array 返回[积分,备注]
*/
public static function insert($userId, $fkType, $fkId = 0){
$remark = '';
$integral = 0;
$userDao = new UserDao();
if ($fkType == 1){ //新用户注册
$integral = 20; //新用户注册赠送积分:这个可以写到配置里
$remark = '新用户赠送积分';
}else if ($fkType == 2){ //每日签到赠送额外积分
list($integral, $remark) = self::userSign($userId, $userDao);
}else if ($fkType == 3){ //消费
//...
}else if ($fkType == 4){ //推荐新用户
$userInfo = $userDao->info($fkId); //新用户的ID
if (empty($userInfo)){
exit('被邀请用户不存在');
}
$integral = 10; //推荐新用户注册赠送积分:这个可以写到配置里
$remark = '邀请新用户 [ ' . $userInfo['username'] . ' ] 赠送积分';
}
//积分日志记录
$data = [
'userId' => $userId,
'fkId' => $fkId,
'fkType' => $fkType,
'integral' => $integral,
'remark' => $remark
];
$integralDao = new IntegralLogDao();
$integralDao->insert($data); //添加数据,createTime,updateTime已在该方法中追加
//用户积分自增$integral
$userDao->setInc(['id' => $userId], 'integral', $integral);
return [$integral, $remark];
}
/**
* 获取会员签到获取的积分,备注
* @param $userId
* @param $userDao
* @return array
*/
public static function userSign($userId, $userDao){
$userInfo = $userDao->info($userId);
if (empty($userInfo)){
exit('用户不存在');
}
$signDay = $userInfo['signDay']; //用户连续签到天数
$remark = '';
$integral = 3; //用户每日签到积分:这个可以写到配置里
if ($signDay != 0){ //如果签到日期不为0
# 签到额外送积分:这个可以写到配置里
/**
* name:说明
* desc:备注,这里表示连续签到天数
* value:值,这里表示额外赠送积分数量
*/
$extraIntegral = [
['name' => '连续签到7天额外赠送1积分', 'desc' => 7, 'value' => 1],
['name' => '连续签到15天额外赠送2积分', 'desc' => 15, 'value' => 2],
['name' => '连续签到30天额外赠送5积分', 'desc' => 30, 'value' => 5],
];
//二维数组排序:按照积分降序,如果同时满足多个连续签到任务,则取最大签到天数的积分。
$values = array_column($extraIntegral, 'value');
array_multisort($values, SORT_DESC, $extraIntegral);
$isGiveExtra = false; //是否已经赠送了额外积分
foreach ($extraIntegral as $value){
$day = $value['desc']; //配置的签到天数
$giveIntegral = $value['value']; //赠送额外积分
if (($signDay % $day) == 0){ //如果:用户连续签到天数 % 配置的连续签到天数 = 0;我们认为该用户可以获取额外积分
if ($isGiveExtra){ //如果:已经赠送了额外积分,则不再赠送,结束循环
break;
}
$integral += $giveIntegral; //积分 = 每日签到默认积分 + 连续签到额外赠送的积分
$remark = "您已经连续签到了 [ {$day} ] 天,额外赠送您 [ {$giveIntegral} ] 积分"; //备注
$isGiveExtra = true; //设置为true,已经赠送了积分,不再重复赠送
}
}
}
$remark = $remark ? $remark : '签到赠送积分';
return [$integral, $remark];
}
}