You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
4.2 KiB
PHTML
178 lines
4.2 KiB
PHTML
5 years ago
|
<?php
|
||
|
namespace Sdk\Event;
|
||
|
use Think\Controller;
|
||
|
/**
|
||
|
* 积分
|
||
|
* @author 鹿文学
|
||
|
*/
|
||
|
class PointEvent extends Controller {
|
||
|
|
||
|
const model_point_type = 'point_type';
|
||
|
|
||
|
const model_point_record = 'point_record';
|
||
|
|
||
|
const model_user = 'user';
|
||
|
|
||
|
const model_prefix = 'tab_';
|
||
|
|
||
|
/**
|
||
|
* 获取积分类型
|
||
|
* @param string $key 类型名称
|
||
|
* @return mixed
|
||
|
* @author 鹿文学
|
||
|
*/
|
||
|
public function get_point_type($key) {
|
||
|
|
||
|
$map['key'] = $key;
|
||
|
$map['status'] = 1;
|
||
|
$type = M(self::model_point_type,self::model_prefix)->where($map)->find();
|
||
|
if(empty($type)){
|
||
|
return false;
|
||
|
}
|
||
|
return $type;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 获取用户签到信息
|
||
|
* @param integer $user_id 用户编号
|
||
|
* @param integer $type_id 积分类型编号
|
||
|
* @return array
|
||
|
* @author 鹿文学
|
||
|
*/
|
||
|
public function get_sign_in_info($user_id,$type_id){
|
||
|
$map['type_id'] = $type_id;
|
||
|
$map['user_id'] = $user_id;
|
||
|
$record = M(self::model_point_record,self::model_prefix)->where($map)->order("create_time desc")->find();
|
||
|
return $record;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 操作用户积分
|
||
|
* @param integer $user_id 用户编号
|
||
|
* @param integer $point 积分
|
||
|
* @param integer $type 1 增加 2减少
|
||
|
* @return bool
|
||
|
* author: 鹿文学
|
||
|
*/
|
||
|
public function operation_point($user_id,$point,$type){
|
||
|
|
||
|
$usermodel = M(self::model_user,self::model_prefix);
|
||
|
|
||
|
$user = $usermodel->find($user_id);
|
||
|
|
||
|
if($type == 1){
|
||
|
$user['point'] += $point;
|
||
|
}else{
|
||
|
if($user['point'] >= $point){
|
||
|
$user['point'] -= $point;
|
||
|
}else{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $usermodel->save($user);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 用户签到
|
||
|
* @param integer $user_id 用户编号
|
||
|
* @author 鹿文学
|
||
|
*/
|
||
|
public function sign_in($user_id) {
|
||
|
|
||
|
$day_count = 7;
|
||
|
|
||
|
$type = $this->get_point_type("sign_in");
|
||
|
|
||
|
if(!$type){/* 此奖励不存在或被禁用 */
|
||
|
return ['mark'=>-1];
|
||
|
}
|
||
|
|
||
|
$base_point = $type['point'];
|
||
|
|
||
|
$increase_point = $type['time_of_day'];
|
||
|
|
||
|
$record = $this->get_sign_in_info($user_id,$type['id']);
|
||
|
|
||
|
|
||
|
//计算间隔时间
|
||
|
$today = strtotime(date("Y-m-d"));
|
||
|
$time = strtotime(date("Y-m-d",$record['create_time']));
|
||
|
$day = ($today-$time)/86400;
|
||
|
|
||
|
if($day == 0){/* 今日已签过 */
|
||
|
$point = M('user','tab_')->field('point')->where(['id'=>$user_id])->find();
|
||
|
return [
|
||
|
'mark'=>-2,
|
||
|
'sign_day'=>$record['day'], /* 签到天数 */
|
||
|
'day_count'=>$day_count, /* 循环周期的总数 */
|
||
|
'base_point'=>$type['point'],
|
||
|
'increase_point'=>$type['time_of_day'],
|
||
|
'point'=>!empty($point)?$point['point']:0,/* 用户积分 */
|
||
|
];
|
||
|
}elseif($day == 1){//昨日积分 + 递增积分
|
||
|
$add_point = $record['point'] + $increase_point;
|
||
|
//超过7天 重新计算
|
||
|
if ($record['day'] >= $day_count) {
|
||
|
$add_point = $base_point;
|
||
|
$sign_day = 1;
|
||
|
}else{
|
||
|
$sign_day = $record['day'] + 1;
|
||
|
}
|
||
|
$data['point'] = $add_point;
|
||
|
}else{//基础积分
|
||
|
$data['point'] = $base_point;
|
||
|
$sign_day = 1;
|
||
|
}
|
||
|
|
||
|
$data['user_id'] = $user_id;
|
||
|
$data['type_id'] = $type['id'];
|
||
|
$data['create_time'] = time();
|
||
|
$data['day'] = $sign_day;
|
||
|
$data['type'] = 1;
|
||
|
|
||
|
$pointrecordmodel = M(self::model_point_record,self::model_prefix);
|
||
|
|
||
|
$pointrecordmodel->startTrans();
|
||
|
|
||
|
$record_result = $pointrecordmodel->add($data);
|
||
|
|
||
|
$user_result = $this->operation_point($user_id,$data['point'],1);
|
||
|
|
||
|
if($user_result !== false && $record_result !== false){
|
||
|
$pointrecordmodel->commit();
|
||
|
|
||
|
$point = M('user','tab_')->field('point')->where(['id'=>$user_id])->find();
|
||
|
|
||
|
return array(
|
||
|
'mark'=>1,
|
||
|
'sign_day'=>$sign_day, /* 签到天数 */
|
||
|
'day_count'=>$day_count, /* 循环周期的总数 */
|
||
|
'base_point'=>$type['point'],
|
||
|
'increase_point'=>$type['time_of_day'],
|
||
|
'point'=>!empty($point)?$point['point']:0,/* 用户积分 */
|
||
|
);
|
||
|
}else{
|
||
|
$pointrecordmodel->rollback();
|
||
|
|
||
|
$point = M('user','tab_')->field('point')->where(['id'=>$user_id])->find();
|
||
|
|
||
|
return [
|
||
|
'mark'=>-3,
|
||
|
'sign_day'=>$record['day']?$record['day']:0, /* 签到天数 */
|
||
|
'day_count'=>$day_count, /* 循环周期的总数 */
|
||
|
'base_point'=>$type['point'],
|
||
|
'increase_point'=>$type['time_of_day'],
|
||
|
'point'=>!empty($point)?$point['point']:0
|
||
|
];
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|