|
@@ -0,0 +1,255 @@
|
|
|
+<?php namespace Place_benefit\Lib;
|
|
|
+use Dever;
|
|
|
+class User
|
|
|
+{
|
|
|
+ # 获取用户当前有效的权益
|
|
|
+ public function getValid($uid, $type, $scope = '')
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ # 先验证用户是否有该权益
|
|
|
+ $user = Dever::db('user', 'place_benefit')->select(['uid' => $uid, 'type' => $type, 'status' => 1]);
|
|
|
+ if ($user) {
|
|
|
+ $result = Dever::load('scope', 'place_benefit')->check(1, $user, $type, $scope, $result);
|
|
|
+ }
|
|
|
+ # 再验证角色等级是否有该权益
|
|
|
+ $level = Dever::load('role', 'place_user')->getLevel($uid);
|
|
|
+ $role = Dever::db('role_upgrade', 'place_benefit')->select(['type' => $type, 'level_id' => ['in', $level]]);
|
|
|
+ if ($role) {
|
|
|
+ $result = Dever::load('scope', 'place_benefit')->check(2, $role, $type, $scope, $result);
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ # 获取用户所有持有的权益
|
|
|
+ public function getList($uid)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ $config = Dever::load('item', 'place_benefit')->getType(2, true);
|
|
|
+ # 我的权益
|
|
|
+ $user = Dever::db('user', 'place_benefit')->select(['uid' => $uid]);
|
|
|
+ # 固定权益
|
|
|
+ $level = Dever::load('role', 'place_user')->getLevel($uid);
|
|
|
+ if ($level) {
|
|
|
+ $user = array_merge($user, Dever::db('role_upgrade', 'place_benefit')->select(['level_id' => ['in', $level]]));
|
|
|
+ }
|
|
|
+ if ($user) {
|
|
|
+ foreach ($user as $v) {
|
|
|
+ $info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id'], true);
|
|
|
+ if ($info) {
|
|
|
+ if (empty($info['config_name'])) {
|
|
|
+ $info['config_name'] = $config[$v['type']];
|
|
|
+ }
|
|
|
+ if (isset($v['level_id'])) {
|
|
|
+ $info = $this->getEdate($uid, $v['level_id'], $info);
|
|
|
+ } else {
|
|
|
+ $info['config_user_id'] = $v['id'];
|
|
|
+ $info['type_name'] = Dever::load('item', 'place_benefit')->getNumDesc($v['type'], $v['type_id'], $v['num']);
|
|
|
+ $info['edate'] = date('Y-m-d H:i', $v['cdate']) . '领取';
|
|
|
+ $info['receive_tip'] = $this->getLog($uid, 1, $v['id'], $v['type'], $v['type_id']);
|
|
|
+
|
|
|
+ }
|
|
|
+ if ($v['type'] == 'exchange1') {
|
|
|
+ array_unshift($result, $info); // 插到最前面
|
|
|
+ } else {
|
|
|
+ $result[] = $info; // 正常追加
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ # 获取待领取权益
|
|
|
+ public function getReceive($uid)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ $config = Dever::load('item', 'place_benefit')->getType(2, true);
|
|
|
+ # 周期权益
|
|
|
+ $level = Dever::load('role', 'place_user')->getLevel($uid);
|
|
|
+ $period = Dever::db('role_period', 'place_benefit')->select(['level_id' => ['in', $level]]);
|
|
|
+ if ($period) {
|
|
|
+ foreach ($period as $v) {
|
|
|
+ $desc['config_day'] = $v['day'];
|
|
|
+ $desc['config_num'] = $v['num'];
|
|
|
+ $desc['config_max'] = $v['max'];
|
|
|
+ $info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id'], $desc);
|
|
|
+ if ($info) {
|
|
|
+ if (isset($info['tname']) && $info['tname']) {
|
|
|
+ $info['tname'] = '次卡';
|
|
|
+ $info['name'] .= '(优先使用)';
|
|
|
+ } else {
|
|
|
+ $info['tname'] = '';
|
|
|
+ }
|
|
|
+ if (isset($info['config_name'])) {
|
|
|
+ $info['config_name'] = $info['config_name'] . $info['tname'];
|
|
|
+ } else {
|
|
|
+ $info['config_name'] = $config[$v['type']] . $info['tname'];
|
|
|
+ }
|
|
|
+ $info['config_id'] = $v['id'];
|
|
|
+ if (isset($v['level_id'])) {
|
|
|
+ $info = $this->getEdate($uid, $v['level_id'], $info);
|
|
|
+ }
|
|
|
+ # 判断是否可以领取
|
|
|
+ $check = $this->check($uid, 1, $v['id'], $v['day'], $v['max']);
|
|
|
+ if ($check) {
|
|
|
+ $info['receive'] = 2;
|
|
|
+ $info['receive_tip'] = '<div style="color:red;text-align:center;margin-bottom:6px;">' . $check . '</div>' . $this->getLog($uid, 1, $v['id'], $v['type']);
|
|
|
+ } else {
|
|
|
+ $info['receive'] = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ $result[] = $info;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ # 检测是否可以领取
|
|
|
+ public function check($uid, $source, $source_id, $day, $max)
|
|
|
+ {
|
|
|
+ $where['uid'] = $uid;
|
|
|
+ $where['source'] = $source;
|
|
|
+ $where['source_id'] = $source_id;
|
|
|
+ # 检测是否达到最大次数
|
|
|
+ if ($max > 0) {
|
|
|
+ $count = Dever::db('user_log', 'place_benefit')->count($where);
|
|
|
+ if ($count >= $max) {
|
|
|
+ return '您已领取' . $count. '次,无法再次领取';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ # 每隔多少天发放一次奖励
|
|
|
+ if ($day > 0) {
|
|
|
+ $now = time();
|
|
|
+ $info = Dever::db('user_log', 'place_benefit')->find($where);
|
|
|
+ if ($info) {
|
|
|
+ $cur = $now - $info['cdate'];
|
|
|
+ $cur = floor($cur / 86400);
|
|
|
+ if ($cur < $day) {
|
|
|
+ $time = $info['cdate'] + $day * 86400;
|
|
|
+ return '您可以在' . date('Y-m-d H:i', $time) . '之后再次领取';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ # 获取领取日志
|
|
|
+ public function getLog($uid, $source, $source_id, $type, $type_id = false)
|
|
|
+ {
|
|
|
+ $where['uid'] = $uid;
|
|
|
+ if ($type_id) {
|
|
|
+ $where['type'] = $type;
|
|
|
+ $where['type_id'] = $type_id;
|
|
|
+ } else {
|
|
|
+ $where['source'] = $source;
|
|
|
+ $where['source_id'] = $source_id;
|
|
|
+ }
|
|
|
+
|
|
|
+ $log = Dever::db('user_log', 'place_benefit')->select($where);
|
|
|
+ $result = '';
|
|
|
+ if ($log) {
|
|
|
+ $name = '领取明细';
|
|
|
+ if ($type == 'perk') {
|
|
|
+ $result = '<div style="color:red;text-align:center;margin-bottom:6px;">点击兑换码可复制,请到权益包里兑换</div>';
|
|
|
+ $name = '兑换码';
|
|
|
+ }
|
|
|
+ $result .= '<table style="width:100%; border-collapse:collapse; text-align:left; table-layout:auto;">';
|
|
|
+ $result .= '<tr><td style="border:1px solid #ddd; padding:8px;">领取日期</td><td style="border:1px solid #ddd; padding:8px;">'.$name.'</td></tr>';
|
|
|
+ foreach ($log as $k => $v) {
|
|
|
+ $v['cdate'] = date('Y-m-d H:i', $v['cdate']);
|
|
|
+ if ($v['content']) {
|
|
|
+ $v['num'] = '<a data-content="'.$v['content'].'">' . $v['content'] . '</a>';
|
|
|
+ } else {
|
|
|
+ $v['num'] = Dever::load('item', 'place_benefit')->getNumDesc($v['type'], $v['type_id'], $v['num']);
|
|
|
+ }
|
|
|
+ $result .= '<tr><td style="border:1px solid #ddd; padding:8px;">'.$v['cdate'].'</td><td style="border:1px solid #ddd; padding:8px;">'.$v['num'].'</td></tr>';
|
|
|
+ }
|
|
|
+ $result .= '</table>';
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ # 领取权益
|
|
|
+ public function receive_commit(){}
|
|
|
+ public function receive($uid, $info, $source = 1)
|
|
|
+ {
|
|
|
+ $level = Dever::load('role', 'place_user')->getLevel($uid);
|
|
|
+ if ($source == 1) {
|
|
|
+ if (is_numeric($info)) {
|
|
|
+ $info = Dever::db('role_period', 'place_benefit')->find(['id' => $info, 'level_id' => ['in', $level]]);
|
|
|
+ }
|
|
|
+ $check = $this->check($uid, $source, $info['id'], $info['day'], $info['max']);
|
|
|
+ if ($check) {
|
|
|
+ Dever::error('未达到领取条件');
|
|
|
+ }
|
|
|
+ $level = Dever::db('level', 'place_role')->find($info['level_id']);
|
|
|
+ $msg = $level['name'] . '权益';
|
|
|
+ } else {
|
|
|
+ # 权益包
|
|
|
+ $msg = $info['name'] . '权益';
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!$info) {
|
|
|
+ Dever::error('权益不存在');
|
|
|
+ }
|
|
|
+
|
|
|
+ $log = [
|
|
|
+ 'uid' => $uid,
|
|
|
+ 'type' => $info['type'],
|
|
|
+ 'type_id' => $info['type_id'],
|
|
|
+ ];
|
|
|
+ $user = Dever::db('user', 'place_benefit')->find($log);
|
|
|
+ if (!$user) {
|
|
|
+ $log['num'] = $info['num'];
|
|
|
+ $user_id = Dever::db('user', 'place_benefit')->insert($log);
|
|
|
+ } else {
|
|
|
+ $log['num'] = ['+', $info['num']];
|
|
|
+ $user_id = $user['id'];
|
|
|
+ $log['cdate'] = time();
|
|
|
+ Dever::db('user', 'place_benefit')->update($user_id, $log);
|
|
|
+ }
|
|
|
+ $log['num'] = $info['num'];
|
|
|
+ $log['user_id'] = $user_id;
|
|
|
+ $log['source'] = $source;
|
|
|
+ $log['source_id'] = $info['id'];
|
|
|
+ $state = Dever::db('user_log', 'place_benefit')->insert($log);
|
|
|
+ if ($state) {
|
|
|
+ if ($info['type'] == 'score_num') {
|
|
|
+ # 发积分
|
|
|
+ Dever::load('log', 'place_score')->action('奖励积分', $info['type_id'])->add($uid, $msg, $info['num']);
|
|
|
+ } elseif($info['type'] == 'coupon') {
|
|
|
+ # 发优惠券
|
|
|
+ for ($i = 1; $i <= $info['num']; $i++) {
|
|
|
+ Dever::load('coupon', 'place_user')->receive($uid, $info['type_id'], false);
|
|
|
+ }
|
|
|
+ } elseif($info['type'] == 'gift') {
|
|
|
+ # 发礼品卡
|
|
|
+ for ($i = 1; $i <= $info['num']; $i++) {
|
|
|
+ Dever::load('gift', 'place_user')->receive($uid, $info['type_id'], false);
|
|
|
+ }
|
|
|
+ } elseif($info['type'] == 'perk') {
|
|
|
+ # 发放权益包兑换码
|
|
|
+ $content = Dever::load('item', 'place_benefit')->load('perk')->createCode(1, $uid, $info['type_id'], $info['num']);
|
|
|
+ if ($content) {
|
|
|
+ Dever::db('user_log', 'place_benefit')->update($state, ['content' => $content]);
|
|
|
+ } else {
|
|
|
+ Dever::error('领取失败,请重新领取');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return $state;
|
|
|
+ }
|
|
|
+
|
|
|
+ # 获取有效期
|
|
|
+ public function getEdate($uid, $level_id, $info)
|
|
|
+ {
|
|
|
+ $level = Dever::db('level', 'place_role')->find($level_id);
|
|
|
+ $user = Dever::db('user', 'place_role')->find(['uid' => $uid, 'info_id' => $level['info_id'], 'level_id' => $level['id']]);
|
|
|
+ $info['type_name'] = $level['name'];
|
|
|
+ $info['edate'] = '有效期至' . date('Y-m-d H:i', $user['edate']);
|
|
|
+ return $info;
|
|
|
+ }
|
|
|
+}
|