UserSignService.class.php
4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
/**
* Created by PhpStorm.
* User: zhonglei
* Date: 17/7/26
* Time: 16:36
*/
namespace Common\Service;
use Common\Common\Constant;
use Common\Common\DailytaskConfig;
use Common\Model\UserSignModel;
class UserSignService extends AbstractService
{
// 构造方法
public function __construct()
{
parent::__construct();
$this->_d = new UserSignModel();
}
/**
* 取
* @author tangxingguo
* @param $uid
* @return int|mixed
*/
public function signIntegral($uid)
{
// 签到规则
$taskConfig = &DailytaskConfig::instance();
$res = $taskConfig->getCacheData(Constant::APP_SIGN);
if (empty($res) || $res['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) {
// 没有配置签到规则 或 签到关闭
return 0;
}
$rules = $res['rules'];
// 签到信息
$signInfo = $this->get_by_conds(['uid' => $uid]);
if (!empty($signInfo)) {
if (rgmdate(MILLI_TIME, 'Y-m-d') == rgmdate($signInfo['update_time'], 'Y-m-d')) {
// 今天已签到
return $signInfo['integral'];
}
// 最后一个次签到时间与当前时间间隔超过一天,断签
if ($this->signCrackDays($signInfo['update_time']) > 1) {
$signInfo['sign_total'] = 0;
}
}
// 从未签到,连续签到1天
$signInfo['sign_total'] = empty($signInfo) ? 1 : $signInfo['sign_total'] + 1;
// 签到规则计算
switch ($rules['sign_type']) {
case Constant::DAILYTASK_SIGN_TYPE_IS_FIXED:
// 固定签到
$integral = $this->signFixed($rules['sign_fixed'], $signInfo['sign_total']);
break;
case Constant::DAILYTASK_SIGN_TYPE_IS_CYCLE:
$integral = $this->signCycle($rules['sign_cycle'], $signInfo['sign_total']);
break;
}
return $integral;
}
/**
* 上次签到与当前时间间隔天数
* @author tangxingguo
* @param $updateTime
* @return int
*/
public function signCrackDays($updateTime)
{
$lastSign = rstrtotime(rgmdate($updateTime, 'Y-m-d'), 1);
$nowTime = rstrtotime(rgmdate(MILLI_TIME, 'Y-m-d'), 1);
$spaceDays = intval(($nowTime - $lastSign) / 24 / 60 / 60 / 1000);
return $spaceDays;
}
/**
* 固定签到积分
* @author tangxingguo
* @param array $rules 固定签到规则
* @param int $signTotal 连续签到天数
* @return mixed
*/
private function signFixed($rules, $signTotal)
{
if (!isset($rules['reward_rule']) || empty($rules['reward_rule'])) {
// 没有固定规则
return $rules['day_integral'];
}
// 连续签到
$rewardRule = array_combine_by_key($rules['reward_rule'], 'cycle');
$cycles = array_column($rewardRule, 'cycle');
if ($signTotal > max($cycles)) {
// 连续签到天数大于最大周期,求余
$signTotal = $signTotal % max($cycles) == 0 ? max($cycles) : $signTotal % max($cycles);
}
if (in_array($signTotal, $cycles)) {
// 匹配到周期
$integral = $rewardRule[$signTotal]['integral'] + $rules['day_integral'];
} else {
// 未匹配周期
$integral = $rules['day_integral'];
}
return $integral;
}
/**
* 递增签到积分
* @author tangxingguo
* @param array $rules 递增签到规则
* @param int $signTotal 连续签到天数
* @return int
*/
private function signCycle($rules, $signTotal)
{
if (!isset($rules['cycle'], $rules['integral'], $rules['first'])) {
return 0;
}
// 连续签到,公式=(连续签到天数《大于周期取余》 - 1) * 多得积分 + 签到默认积分
if ($signTotal > $rules['cycle']) {
//$integral = (($signTotal % $rules['cycle']) - 1) * $rules['integral'] + $rules['first'];
$integral = (($signTotal % $rules['cycle'] ? $signTotal % $rules['cycle'] : $rules['cycle']) - 1) * $rules['integral'] + $rules['first'];
} else {
$integral = ($signTotal - 1) * $rules['integral'] + $rules['first'];
}
return $integral;
}
}