CountService.class.php
6.31 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<?php
/**
* 签到统计表
* @author: houyingcai
* @email: 594609175@qq.com
* @date : 2017-04-24 10:36:58
* @version $Id$
*/
namespace Common\Service;
use Common\Common\DataCenter;
use Common\Common\Integral;
use Common\Model\ConfigModel;
use Common\Model\CountModel;
use Common\Model\RecordModel;
class CountService extends AbstractService
{
/** 没有签到 */
const NO_SIGN = 0;
/** 已经签到 */
const HAS_SIGN = 1;
/** 签到状态 */
const SIGN_STATUS = 1;
/** 每次增加次数 */
const SIGN_ADD_TIME = 1;
/** 默认连续签到次数 */
const DEFAULT_SIGN_NUM = 1;
/** 已经签积分获得数 */
const HAS_SIGN_INGEGRAL = 0;
// 构造方法
public function __construct()
{
parent::__construct();
$this->_d = new CountModel();
}
/**
* 用户签到(手机端)
*
* @param array $result 返回签到信息
* @param array $user 用户信息
*
* @return bool
*/
public function user_sign(&$result, $user)
{
$serv_config = new ConfigModel();
$serv_record = new RecordModel();
// 获取签到配置信息
$config = $serv_config->get_by_conds(array());
// 积分规则
$integral_rules = unserialize($config['integral_rules']);
// 获取当前用户的签到统计信息
$uid = $user['memUid'];
$username = $user['memUsername'];
$user_count = $this->_d->get_by_conds(array('uid' => $uid));
// 初始化签到状态
$is_sign = self::NO_SIGN;
// 初始签到获得积分数
$sign_integral = $integral_rules[0];
// 初始化连续签到次数
$continuous = self::DEFAULT_SIGN_NUM;
try {
$this->_d->start_trans();
$count_info = array(
'username' => $username,
'last_time' => MILLI_TIME,
);
// 初始化签到状态
$sign_status = '';
//【1】当前用户是否有签到信息
if (empty($user_count)) {
// 插入签到统计表
$count_info['uid'] = $uid;
$count_info['continuous'] = $continuous;
$count_info['sign_nums'] = $continuous;
$count_info['integrals'] = $sign_integral;
$res = $this->_d->insert($count_info);
} else {
// 签到状态
$sign_status = rgmdate(NOW_TIME, 'Ymd') - rgmdate(to_second_time($user_count['last_time']), 'Ymd');
}
//【2】当前用户今日已签到
if (rgmdate(NOW_TIME, 'Ymd') == rgmdate(to_second_time($user_count['last_time']), 'Ymd')) {
$is_sign = self::HAS_SIGN;
$sign_integral = self::HAS_SIGN_INGEGRAL;
$continuous = $user_count['continuous'];
}
//【3】当前用户是否签到中断过
if ($sign_status > self::SIGN_STATUS) {
// 更新签到统计表
$count_info['continuous'] = $continuous;
$count_info['sign_nums'] = $user_count['sign_nums'] + self::SIGN_ADD_TIME;
$count_info['integrals'] = $sign_integral + $user_count['integrals'];
$res = $this->_d->update_by_conds(array('uid' => $uid), $count_info);
}
//【4】当前用户是否是连续签到
if ($sign_status == self::SIGN_STATUS) {
// 管理员是否中途修改过配置信息
$updated = to_second_time($config['rules_updated']);
$is_update = rgmdate($updated, 'Ymd') > rgmdate($user_count['last_time'], 'Ymd') ? true : false;
// 连续签到次数是否达到周期上限
$is_max_cycle = $user_count['continuous'] >= $config['cycle'] ? true : false;
// 未修改配置信息且未达周期上限
if (!$is_update && !$is_max_cycle) {
// 今日签到获得积分数
$sign_integral = $integral_rules[$user_count['continuous']];
// 更新连续签到次数
$continuous = $user_count['continuous'] + self::SIGN_ADD_TIME;
}
// 更新签到统计表
$count_info['continuous'] = $continuous;
$count_info['sign_nums'] = $user_count['sign_nums'] + self::SIGN_ADD_TIME;
$count_info['integrals'] = $sign_integral + $user_count['integrals'];
$res = $this->_d->update_by_conds(array('uid' => $uid), $count_info);
}
// 插入积分记录表
if ($res) {
// 插入记录表
$record_info = array(
'uid' => $uid,
'username' => $username,
'sign_integral' => $sign_integral,
);
$serv_record->insert($record_info);
}
// 事务提交
$this->_d->commit();
// 返回签到信息
$result = array(
'cycle' => (int)$config['cycle'],
'continuous' => (int)$continuous,
'sign_integral' => $sign_integral,
'is_sign' => $is_sign,
);
// 修改用户积分数
if ($sign_integral > 0) {
$integralUtil = &Integral::instance();
$integralUtil->asynUpdateIntegral(array(
'memUid' => $uid,
'miType' => 'mi_type0',
'irKey' => 'dt_sign',
'remark' => '签到',
'integral' => intval($sign_integral)
));
// 数据中心签到埋点
$dataCenter = &DataCenter::instance();
$dataCenter->addSign($user);
// 数据中心签到埋点
}
return true;
} catch (\Think\Exception $e) {
$this->_set_error($e->getMessage(), $e->getCode());
// 事务回滚
$this->_d->rollback();
return false;
} catch (\Exception $e) {
$this->_set_error($e->getMessage(), $e->getCode());
// 事务回滚
$this->_d->rollback();
return false;
}
}
}