123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- <?php
- namespace app\models\user;
- use app\models\system\SystemUserLevel;
- use app\models\system\SystemUserTask;
- use crmeb\basic\BaseModel;
- use crmeb\traits\ModelTrait;
- use think\db\exception\DataNotFoundException;
- use think\db\exception\DbException;
- use think\db\exception\ModelNotFoundException;
- use think\Model;
- class UserLevel extends BaseModel
- {
-
- protected $pk = 'id';
-
- protected $name = 'user_level';
- use ModelTrait;
-
- public static function setUserLevelCount($uids)
- {
- $model = new self();
- if (is_array($uids)) $model = $model->where('uid', 'in', $uids);
- else $model = $model->where('uid', $uids);
- return $model->count();
- }
-
- public static function valiWhere($alias = '', $model = null)
- {
- $model = is_null($model) ? new self() : $model;
- if ($alias) {
- $model = $model->alias($alias);
- $alias .= '.';
- }
- return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0);
- }
-
- public static function setUserLevel($uid, $level_id)
- {
- $vipinfo = SystemUserLevel::get($level_id);
- if (!$vipinfo) return false;
- $userinfo = User::find($uid);
- if (!$userinfo) return false;
- $add_valid_time = (int)$vipinfo->valid_date * 86400;
- $uservipinfo = self::valiWhere()->where('uid', $uid)->where('level_id', $level_id)->find();
-
- if ($uservipinfo) {
- $stay = 0;
-
- if (time() < $uservipinfo->valid_time) $stay = $uservipinfo->valid_time - time();
-
-
- $add_valid_time = $stay + $add_valid_time + time();
- $data['is_forever'] = $vipinfo->is_forever;
- $data['valid_time'] = $add_valid_time;
- User::where('uid', $uid)->update(['level' => $level_id]);
- return self::where('uid', $uid)->where('level_id', $level_id)->update($data);
- } else {
- $data = [
- 'is_forever' => $vipinfo->is_forever,
- 'status' => 1,
- 'is_del' => 0,
- 'grade' => $vipinfo->grade,
- 'uid' => $uid,
- 'add_time' => time(),
- 'level_id' => $level_id,
- 'discount' => $vipinfo->discount,
- ];
- if ($data['is_forever'])
- $data['valid_time'] = 0;
- else
- $data['valid_time'] = $add_valid_time + time();
- $data['mark'] = '尊敬的用户' . $userinfo['nickname'] . '在' . date('Y-m-d H:i:s', time()) . '成为了' . $vipinfo['name'];
- $res = self::create($data);
- if (!$res) return false;
- User::where('uid', $uid)->update(['level' => $level_id]);
- return $res;
- }
- }
-
- public static function getUserLevel($uid, $grade = 0)
- {
- $model = self::valiWhere();
- if ($grade) $model = $model->where('grade', '<', $grade);
- $level = $model->where('uid', $uid)->order('grade desc')->field('level_id,is_forever,valid_time,id,status,grade')->find();
- if (!$level) return false;
- if ($level->is_forever) return $level->id;
-
- if (time() > $level->valid_time) {
- if ($level->status == 1) {
- $level->status = 0;
- $level->save();
- }
- return self::getUserLevel($uid, $level->grade);
- } else
-
- return $level->id;
- }
-
- public static function getUserLevelInfo($id, $keyName = '')
- {
- $vipinfo = self::valiWhere('a')->where('a.id', $id)->field('l.id,a.add_time,l.discount,a.level_id,l.name,l.money,l.icon,l.is_pay,l.grade')
- ->join('system_user_level l', 'l.id=a.level_id')->find();
- if ($keyName) if (isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return '';
- return $vipinfo;
- }
-
- public static function getUserLevelIds($uid)
- {
- return self::valiWhere()->group('level_id')->where('uid', $uid)->order('grade asc')->column('level_id', 'level_id');
- }
-
- public static function setLevelComplete($uid, $leveNowId = false)
- {
- $user = User::where('uid', $uid)->find();
- if (!$user) return self::setErrorInfo('没有此用户,无法检测升级会员');
- $level = self::getUserLevel($uid);
- if ($level === false)
- $level_id = 0;
- else
- $level_id = self::getUserLevelInfo($level, 'level_id');
- if (sys_config('level_type', 0) == 0) {
- $leveNowId = SystemUserLevel::getNextLevelId($level_id, SystemUserLevel::setWhere()->where('grade', '>', $level ? self::getUserLevelInfo($level, 'grade') : 0)->min('grade'));
- if ($leveNowId === 0) return self::setErrorInfo('暂无可升会员');
-
- $taskAll = SystemUserTask::visibleWhere()->where('level_id', $leveNowId)->column('id', 'id');
- if (!$taskAll) return true;
- $res2 = true;
- try {
- if ($level === false) {
-
- $add_time = $user['clean_time'] ? $user['clean_time'] : $user['add_time'];
- } else {
- $add_time = self::getUserLevelInfo($level, 'add_time');
- }
-
- foreach ($taskAll as $id) {
- $res = SystemUserTask::setTaskFinish($id, $uid, $add_time);
- if (!$res) return self::setErrorInfo(SystemUserTask::getErrorInfo());
- }
-
- if (SystemUserTask::getTaskComplete($leveNowId, $uid)) {
-
- $res = SystemUserTask::setTarkStatus($leveNowId, $uid);
- if (!$res) return self::setErrorInfo('设置任务状态失败');
-
- $res2 = self::setUserLevel($uid, $leveNowId);
- }
- return $res2;
- } catch (\Exception $e) {
- return self::setErrorInfo($e->getMessage());
- }
- } else {
- $leveNowId = SystemUserLevel::getNextLevelId($level_id, SystemUserLevel::setWhere()->max('grade'));
- try {
- while (1) {
- if ($leveNowId === 0) return self::setErrorInfo('暂无可升会员');
-
- $taskAll = SystemUserTask::visibleWhere()->where('level_id', $leveNowId)->column('id', 'id');
- if (!$taskAll) {
- $leveNowGrade = SystemUserLevel::where('id', $leveNowId)->value('grade');
- $leveNowId = SystemUserLevel::getNextLevelId($level_id, $leveNowGrade - 1);
- if ($leveNowId) {
- continue;
- } else {
- return self::setErrorInfo('暂无可升会员');
- }
- }
- $res2 = true;
- if ($level === false) {
-
- $add_time = $user['clean_time'] ? $user['clean_time'] : $user['add_time'];
- } else {
- $add_time = self::getUserLevelInfo($level, 'add_time');
- }
-
- foreach ($taskAll as $id) {
- $res = SystemUserTask::setTaskFinish($id, $uid, $add_time);
- if (!$res) return self::setErrorInfo(SystemUserTask::getErrorInfo());
- }
-
- if (SystemUserTask::getTaskComplete($leveNowId, $uid)) {
-
- $res = SystemUserTask::setTarkStatus($leveNowId, $uid);
- if (!$res) return self::setErrorInfo('设置任务状态失败');
-
- $res2 = self::setUserLevel($uid, $leveNowId);
- } else {
- $leveNowGrade = SystemUserLevel::where('id', $leveNowId)->value('grade');
- $leveNowId = SystemUserLevel::getNextLevelId($level_id, $leveNowGrade - 1);
- if ($leveNowId) {
- continue;
- }
- }
- if ($res2) {
- return $res2;
- } else {
- return $res2;
- }
- }
- } catch (\Exception $e) {
- return self::setErrorInfo($e->getMessage());
- }
- }
- }
- }
|