|
@@ -0,0 +1,240 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Score\Lib;
|
|
|
+
|
|
|
+use Dever;
|
|
|
+
|
|
|
+class Core
|
|
|
+{
|
|
|
+
|
|
|
+ * 增加日志 Dever::load('score/lib/core')->log($uid, $key, $name);
|
|
|
+ *
|
|
|
+ * @return mixed
|
|
|
+ */
|
|
|
+ public function log($uid, $action_key, $action_name, $callback = '', $score = false, $num = false)
|
|
|
+ {
|
|
|
+ $action = Dever::db('score/action')->one(array('key' => $action_key));
|
|
|
+
|
|
|
+ if (!$action) {
|
|
|
+ $action = array();
|
|
|
+ $action['id'] = Dever::db('score/action')->insert(array('key' => $action_key, 'name' => $action_name));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($action['id']) && $action['id'] > 0) {
|
|
|
+ $insert = array();
|
|
|
+ $insert['uid'] = $uid;
|
|
|
+ $insert['action_id'] = $action['id'];
|
|
|
+ $insert['callback'] = $callback;
|
|
|
+ if ($score > 0) {
|
|
|
+ $insert['mscore'] = $score;
|
|
|
+ }
|
|
|
+ if ($num > 0) {
|
|
|
+ $insert['num'] = $num;
|
|
|
+ }
|
|
|
+ $log_id = Dever::db('score/action_log')->insert($insert);
|
|
|
+
|
|
|
+ Dever::daemon('lib/core.oper?log_id='.$log_id, 'score');
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 根据用户行为,增加积分
|
|
|
+ *
|
|
|
+ * @return mixed
|
|
|
+ */
|
|
|
+ public function oper()
|
|
|
+ {
|
|
|
+ $log_id = Dever::input('log_id');
|
|
|
+
|
|
|
+ $log = Dever::db('score/action_log')->one($log_id);
|
|
|
+
|
|
|
+ $this->operAction($log);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function rule($log, $info)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (isset($log['mscore']) && $log['mscore'] > 0) {
|
|
|
+ $info['num'] = $log['mscore'];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($log['num']) && $log['num'] > 0) {
|
|
|
+ $info['num'] = $info['num'] * $log['num'];
|
|
|
+ }
|
|
|
+ if ($info['num'] == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ $uid = $log['uid'];
|
|
|
+
|
|
|
+ $user = Dever::db('score/user')->one(array('uid' => $uid, 'config_id' => $info['config_id']));
|
|
|
+
|
|
|
+ if (!$user) {
|
|
|
+ $user = array();
|
|
|
+ $user['id'] = Dever::db('score/user')->insert(array('uid' => $uid, 'config_id' => $info['config_id'], 'score' => 0, 'no_score' => 0));
|
|
|
+ $user['score'] = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ $num = $info['num'];
|
|
|
+
|
|
|
+ if ($info['upper'] == 2 && $info['upper_limit'] >= 1) {
|
|
|
+ $upper = $this->upper($uid, $info, $log);
|
|
|
+ if (!$upper) {
|
|
|
+ Dever::db('score/action_log')->update(array('where_id' => $log['id'], 'score_type' => 3, 'score' => '0'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Dever::db('score/action_log')->update(array('where_id' => $log['id'], 'score_type' => 2, 'score' => $num));
|
|
|
+ }
|
|
|
+
|
|
|
+ $update = array();
|
|
|
+ $update['where_id'] = $user['id'];
|
|
|
+ $update['score'] = $user['score'] + $num;
|
|
|
+
|
|
|
+ $insert['uid'] = $uid;
|
|
|
+ $insert['config_id'] = $info['config_id'];
|
|
|
+ $insert['action_id'] = $info['action_id'];
|
|
|
+ $insert['status'] = 1;
|
|
|
+ $insert['num'] = $num;
|
|
|
+ $insert['total'] = $update['score'];
|
|
|
+ $user_log_id = Dever::db('score/user_log')->insert($insert);
|
|
|
+
|
|
|
+ Dever::db('score/user')->update($update);
|
|
|
+
|
|
|
+
|
|
|
+ $this->setLevel($uid);
|
|
|
+
|
|
|
+ if ($log['callback']) {
|
|
|
+ if (strstr($log['callback'], '?')) {
|
|
|
+ Dever::load($log['callback'] . '&user_log_id=' . $user_log_id);
|
|
|
+ } else {
|
|
|
+ Dever::load($log['callback'], $user_log_id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private function upper($uid, $info)
|
|
|
+ {
|
|
|
+
|
|
|
+ $limit = $info['upper_limit'];
|
|
|
+
|
|
|
+
|
|
|
+ $time = time();
|
|
|
+
|
|
|
+ $where = array();
|
|
|
+ $where['config_id'] = $info['config_id'];
|
|
|
+ $where['action_id'] = $info['action_id'];
|
|
|
+ $where['uid'] = $uid;
|
|
|
+ $where['status'] = 1;
|
|
|
+ $user_log = Dever::db('score/user_log')->getNew($where);
|
|
|
+ if ($user_log) {
|
|
|
+ if ($info['upper_type'] == 1) {
|
|
|
+
|
|
|
+ $where['start'] = Dever::maketime(date('Y-m-d 00:00:00', $time));
|
|
|
+
|
|
|
+ } elseif ($info['upper_type'] == 2) {
|
|
|
+
|
|
|
+ $where['start'] = $time - ($info['upper_time'] * 3600);
|
|
|
+
|
|
|
+ } elseif ($info['upper_type'] == 3) {
|
|
|
+
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ $user_log_num = Dever::db('score/user_log')->getNewTotal($where);
|
|
|
+ if ($user_log_num >= $info['upper_limit']) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private function operAction($log)
|
|
|
+ {
|
|
|
+ if ($log && $log['score_type'] == 1) {
|
|
|
+ $where = array();
|
|
|
+ $where['state'] = 1;
|
|
|
+ $where['id'] = $log['action_id'];
|
|
|
+ $action = Dever::db('score/action')->one($where);
|
|
|
+
|
|
|
+ if ($action) {
|
|
|
+ $rule = Dever::db('score/rule')->state(array('action_id' => $action['id']));
|
|
|
+
|
|
|
+ if ($rule) {
|
|
|
+ foreach ($rule as $k => $v) {
|
|
|
+ $this->rule($log, $v);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 根据积分日志和规则,增加积分,这是一个定时任务,暂时不开启了
|
|
|
+ *
|
|
|
+ * @return mixed
|
|
|
+ */
|
|
|
+ public function cron()
|
|
|
+ {
|
|
|
+ $where['score_type'] = 1;
|
|
|
+ $log = Dever::db('score/action_log')->all($where);
|
|
|
+ if ($log) {
|
|
|
+ foreach ($log as $k => $v) {
|
|
|
+ $this->operAction($v);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 根据积分算等级
|
|
|
+ *
|
|
|
+ * @return mixed
|
|
|
+ */
|
|
|
+ public function setLevel($uid)
|
|
|
+ {
|
|
|
+
|
|
|
+ $where['uid'] = $uid;
|
|
|
+ $user_level = Dever::db('score/user_level')->one($where);
|
|
|
+ if ($user_level && $user_level['type'] == 2) {
|
|
|
+ return;
|
|
|
+ } elseif ($user_level && $user_level['type'] == 1) {
|
|
|
+ $config = Dever::db('score/level')->one($user_level['level_id']);
|
|
|
+ $level = $config['level'] + 1;
|
|
|
+ } else {
|
|
|
+ $level = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ $config = Dever::db('score/level')->one(array('level' => $level, 'state' => 1));
|
|
|
+
|
|
|
+ if ($config) {
|
|
|
+
|
|
|
+ $yes = false;
|
|
|
+ $rule = Dever::array_decode($config['score']);
|
|
|
+ if ($rule) {
|
|
|
+ $user_score = Dever::db('score/user')->getScoreByConfig($where);
|
|
|
+ if ($user_score) {
|
|
|
+ foreach ($rule as $k => $v) {
|
|
|
+ $score = $v['config'];
|
|
|
+ $num = $v['num'];
|
|
|
+ if (isset($user_score[$score]) && $user_score[$score]['score'] && $user_score[$score]['score'] >= $num) {
|
|
|
+ $yes = $config['id'];
|
|
|
+ } else {
|
|
|
+ $yes = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($yes) {
|
|
|
+
|
|
|
+ if ($user_level) {
|
|
|
+ Dever::db('score/user_level')->update(array('where_id' => $user_level['id'], 'level_id' => $yes));
|
|
|
+ } else {
|
|
|
+ Dever::db('score/user_level')->insert(array('uid' => $uid,'level_id' => $yes, 'type' => 1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|