UserLevel.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. namespace app\models\user;
  3. use app\admin\model\user\UserReincarnation;
  4. use app\models\system\SystemUserLevel;
  5. use app\models\system\SystemUserTask;
  6. use crmeb\basic\BaseModel;
  7. use crmeb\traits\ModelTrait;
  8. use think\db\exception\DataNotFoundException;
  9. use think\db\exception\DbException;
  10. use think\db\exception\ModelNotFoundException;
  11. use think\Model;
  12. /**
  13. * TODO 会员等级Model
  14. * Class UserLevel
  15. * @package app\models\user
  16. */
  17. class UserLevel extends BaseModel
  18. {
  19. /**
  20. * 数据表主键
  21. * @var string
  22. */
  23. protected $pk = 'id';
  24. /**
  25. * 模型名称
  26. * @var string
  27. */
  28. protected $name = 'user_level';
  29. use ModelTrait;
  30. /**
  31. * 获取用户等级人数
  32. * @param $uids
  33. * @return int
  34. */
  35. public static function setUserLevelCount($uids)
  36. {
  37. $model = new self();
  38. if (is_array($uids)) $model = $model->where('uid', 'in', $uids);
  39. else $model = $model->where('uid', $uids);
  40. return $model->count();
  41. }
  42. /**
  43. * 设置查询初始化条件
  44. * @param string $alias 表别名
  45. * @param null $model 模型实例化对象
  46. * @return UserLevel
  47. */
  48. public static function valiWhere($alias = '', $model = null)
  49. {
  50. $model = is_null($model) ? new self() : $model;
  51. if ($alias) {
  52. $model = $model->alias($alias);
  53. $alias .= '.';
  54. }
  55. return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0);
  56. }
  57. /**
  58. * 设置会员等级
  59. * @param int $uid 用户uid
  60. * @param int $level_id 等级id
  61. * @return UserLevel|bool|Model
  62. * @throws DataNotFoundException
  63. * @throws ModelNotFoundException
  64. * @throws \think\exception\DbException
  65. */
  66. public static function setUserLevel($uid, $level_id)
  67. {
  68. $vipinfo = SystemUserLevel::get($level_id);
  69. if (!$vipinfo) return false;
  70. $userinfo = User::find($uid);
  71. if (!$userinfo) return false;
  72. $add_valid_time = (int)$vipinfo->valid_date * 86400;
  73. $uservipinfo = self::valiWhere()->where('uid', $uid)->where('level_id', $level_id)->find();
  74. //检查是否购买过
  75. if ($uservipinfo) {
  76. $stay = 0;
  77. //剩余时间
  78. if (time() < $uservipinfo->valid_time) $stay = $uservipinfo->valid_time - time();
  79. //如果购买过当前等级的会员过期了.从当前时间开始计算
  80. //过期时效: 剩余时间+当前会员等级时间+当前time
  81. $add_valid_time = $stay + $add_valid_time + time();
  82. $data['is_forever'] = $vipinfo->is_forever;
  83. $data['valid_time'] = $add_valid_time;
  84. User::where('uid', $uid)->update(['level' => $level_id]);
  85. return self::where('uid', $uid)->where('level_id', $level_id)->update($data);
  86. } else {
  87. $data = [
  88. 'is_forever' => $vipinfo->is_forever,
  89. 'status' => 1,
  90. 'is_del' => 0,
  91. 'grade' => $vipinfo->grade,
  92. 'uid' => $uid,
  93. 'add_time' => time(),
  94. 'level_id' => $level_id,
  95. 'discount' => $vipinfo->discount,
  96. ];
  97. if ($data['is_forever'])
  98. $data['valid_time'] = 0;
  99. else
  100. $data['valid_time'] = $add_valid_time + time();
  101. $data['mark'] = '尊敬的用户' . $userinfo['nickname'] . '在' . date('Y-m-d H:i:s', time()) . '成为了' . $vipinfo['name'];
  102. $res = self::create($data);
  103. if (!$res) return false;
  104. User::where('uid', $uid)->update(['level' => $level_id]);
  105. return $res;
  106. }
  107. }
  108. /**
  109. * 获取当前用户会员等级返回当前用户等级id
  110. * @param int $uid 用户uid
  111. * @param int $grade 会员id
  112. * @return bool|mixed
  113. * @throws DataNotFoundException
  114. * @throws ModelNotFoundException
  115. * @throws \think\exception\DbException
  116. */
  117. public static function getUserLevel($uid, $grade = 0)
  118. {
  119. $model = self::valiWhere();
  120. if ($grade) $model = $model->where('grade', '<', $grade);
  121. $level = $model->where('uid', $uid)->order('grade desc')->field('level_id,is_forever,valid_time,id,status,grade')->find();
  122. if (!$level) return false;
  123. if ($level->is_forever) return $level->id;
  124. //会员已经过期
  125. if (time() > $level->valid_time) {
  126. if ($level->status == 1) {
  127. $level->status = 0;
  128. $level->save();
  129. // 三级代理过期那前面的一二级代理也肯定过期了,不考虑低等级比高等级时间长的可能性
  130. $reincarnation = User::where('uid', $uid)->value('reincarnation');
  131. if ($reincarnation==1){ //转生过
  132. //转生过,重新统计直推下级业绩
  133. $num = UserReincarnation::where('uid',$uid)->value('num');
  134. UserReincarnation::where('uid', $uid)->update(['achievement' => 0,'update_time'=>time(),'num'=>bcadd($num,1)]);
  135. }else{ //没转生过
  136. UserReincarnation::create(['uid' => $uid, 'achievement' => 0, 'update_time' => time(), 'num' => 1]);
  137. User::where('uid', $uid)->update(['reincarnation' => 1]);
  138. }
  139. }
  140. return self::getUserLevel($uid, $level->grade);
  141. } else
  142. //会员没有过期
  143. return $level->id;
  144. }
  145. /**
  146. * 获取会员详细信息
  147. * @param $id 会员记录id
  148. * @param string $keyName 字段名
  149. * @return array|mixed|string|Model|null
  150. * @throws DataNotFoundException
  151. * @throws ModelNotFoundException
  152. * @throws \think\exception\DbException
  153. */
  154. public static function getUserLevelInfo($id, $keyName = '')
  155. {
  156. $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')
  157. ->join('system_user_level l', 'l.id=a.level_id')->find();
  158. if ($keyName) if (isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return '';
  159. return $vipinfo;
  160. }
  161. /**
  162. * 获取当前用户已成为的vip id
  163. * @param $uid 用户id
  164. * @return array
  165. */
  166. public static function getUserLevelIds($uid)
  167. {
  168. return self::valiWhere()->group('level_id')->where('uid', $uid)->order('grade asc')->column('level_id', 'level_id');
  169. }
  170. /**
  171. * 检查是否能成为会员
  172. * @param int $uid 用户uid
  173. * @param bool $leveNowId
  174. * @return UserLevel|bool|Model
  175. * @throws DataNotFoundException
  176. * @throws ModelNotFoundException
  177. * @throws DbException
  178. */
  179. public static function setLevelComplete($uid, $leveNowId = false)
  180. {
  181. @file_put_contents('quanju.txt', "-怎么现在又不行了1\r\n", 8);
  182. $user = User::where('uid', $uid)->find();
  183. if (!$user) return self::setErrorInfo('没有此用户,无法检测升级会员');
  184. $level = self::getUserLevel($uid);
  185. if ($level === false)
  186. $level_id = 0;
  187. else
  188. $level_id = self::getUserLevelInfo($level, 'level_id');
  189. if (sys_config('level_type', 0) == 0) {
  190. @file_put_contents('quanju.txt', "-怎么现在又不行了5\r\n", 8);
  191. $leveNowId = SystemUserLevel::getNextLevelId($level_id, SystemUserLevel::setWhere()->where('grade', '>', $level ? self::getUserLevelInfo($level, 'grade') : 0)->min('grade'));
  192. if ($leveNowId === 0) return self::setErrorInfo('暂无可升会员');
  193. //查找当前需要升级的会员任务
  194. $taskAll = SystemUserTask::visibleWhere()->where('level_id', $leveNowId)->column('id', 'id');
  195. if (!$taskAll) return true;
  196. // self::startTrans();
  197. $res2 = true;
  198. try {
  199. @file_put_contents('quanju.txt', "-怎么现在又不行了6\r\n", 8);
  200. if ($level === false) {
  201. //没有成为会员的从用户添加的时间开始算起,如果被清理过会员从清理的时间开始算起
  202. $add_time = $user['clean_time'] ? $user['clean_time'] : $user['add_time'];
  203. } else {
  204. $add_time = self::getUserLevelInfo($level, 'add_time');
  205. }
  206. //查询并记录任务
  207. foreach ($taskAll as $id) {
  208. $res = SystemUserTask::setTaskFinish($id, $uid, $add_time);
  209. if (!$res) return self::setErrorInfo(SystemUserTask::getErrorInfo());
  210. }
  211. //获取需要成为会员的任务完成度
  212. if (SystemUserTask::getTaskComplete($leveNowId, $uid)) {
  213. //设置任务已使用
  214. $res = SystemUserTask::setTarkStatus($leveNowId, $uid);
  215. if (!$res) return self::setErrorInfo('设置任务状态失败');
  216. //记录会员
  217. $res2 = self::setUserLevel($uid, $leveNowId);
  218. }
  219. // self::commitTrans();
  220. return $res2;
  221. } catch (\Exception $e) {
  222. // self::rollbackTrans();
  223. return self::setErrorInfo($e->getMessage());
  224. }
  225. } else {
  226. $leveNowId = SystemUserLevel::getNextLevelId($level_id, SystemUserLevel::setWhere()->max('grade'));
  227. @file_put_contents('quanju.txt', $leveNowId ."-怎么现在又不行了7\r\n", 8);
  228. // self::startTrans();
  229. try {
  230. while (1) {
  231. if ($leveNowId === 0) return self::setErrorInfo('暂无可升会员');
  232. //查找当前需要升级的会员任务
  233. $taskAll = SystemUserTask::visibleWhere()->where('level_id', $leveNowId)->column('id', 'id');
  234. if (!$taskAll) {
  235. $leveNowGrade = SystemUserLevel::where('id', $leveNowId)->value('grade');
  236. $leveNowId = SystemUserLevel::getNextLevelId($level_id, $leveNowGrade - 1);
  237. if ($leveNowId) {
  238. continue;
  239. } else {
  240. return self::setErrorInfo('暂无可升会员');
  241. }
  242. }
  243. $res2 = true;
  244. if ($level === false) {
  245. //没有成为会员的从用户添加的时间开始算起,如果被清理过会员从清理的时间开始算起
  246. $add_time = $user['clean_time'] ? $user['clean_time'] : $user['add_time'];
  247. } else {
  248. $add_time = self::getUserLevelInfo($level, 'add_time');
  249. }
  250. //查询并记录任务
  251. foreach ($taskAll as $id) {
  252. $res = SystemUserTask::setTaskFinish($id, $uid, $add_time);
  253. if (!$res) return self::setErrorInfo(SystemUserTask::getErrorInfo());
  254. }
  255. //获取需要成为会员的任务完成度
  256. if (SystemUserTask::getTaskComplete($leveNowId, $uid)) {
  257. //设置任务已使用
  258. $res = SystemUserTask::setTarkStatus($leveNowId, $uid);
  259. if (!$res) return self::setErrorInfo('设置任务状态失败');
  260. //记录会员
  261. $res2 = self::setUserLevel($uid, $leveNowId);
  262. } else {
  263. $leveNowGrade = SystemUserLevel::where('id', $leveNowId)->value('grade');
  264. $leveNowId = SystemUserLevel::getNextLevelId($level_id, $leveNowGrade - 1);
  265. if ($leveNowId) {
  266. continue;
  267. }
  268. }
  269. if ($res2) {
  270. // self::commitTrans();
  271. return $res2;
  272. } else {
  273. // self::rollbackTrans();
  274. return $res2;
  275. }
  276. }
  277. } catch (\Exception $e) {
  278. // self::rollbackTrans();
  279. return self::setErrorInfo($e->getMessage());
  280. }
  281. }
  282. }
  283. }