UserLevel.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. namespace app\models\user;
  3. use app\models\system\SystemUserLevel;
  4. use app\models\system\SystemUserTask;
  5. use crmeb\basic\BaseModel;
  6. use crmeb\traits\ModelTrait;
  7. /**
  8. * TODO 会员等级Model
  9. * Class UserLevel
  10. * @package app\models\user
  11. */
  12. class UserLevel extends BaseModel
  13. {
  14. /**
  15. * 数据表主键
  16. * @var string
  17. */
  18. protected $pk = 'id';
  19. /**
  20. * 模型名称
  21. * @var string
  22. */
  23. protected $name = 'user_level';
  24. use ModelTrait;
  25. /**
  26. * 获取用户等级人数
  27. * @param $uids
  28. * @return int
  29. */
  30. public static function setUserLevelCount($uids)
  31. {
  32. $model = new self();
  33. if (is_array($uids)) $model = $model->where('uid', 'in', $uids);
  34. else $model = $model->where('uid', $uids);
  35. return $model->count();
  36. }
  37. /**
  38. * 设置查询初始化条件
  39. * @param string $alias 表别名
  40. * @param null $model 模型实例化对象
  41. * @return UserLevel
  42. */
  43. public static function valiWhere($alias = '', $model = null)
  44. {
  45. $model = is_null($model) ? new self() : $model;
  46. if ($alias) {
  47. $model = $model->alias($alias);
  48. $alias .= '.';
  49. }
  50. return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0);
  51. }
  52. /**
  53. * 设置会员等级
  54. * @param $uid 用户uid
  55. * @param $level_id 等级id
  56. * @return UserLevel|bool|\think\Model
  57. * @throws \think\db\exception\DataNotFoundException
  58. * @throws \think\db\exception\ModelNotFoundException
  59. * @throws \think\exception\DbException
  60. */
  61. public static function setUserLevel($uid, $level_id,$type=0)
  62. {
  63. $vipinfo = SystemUserLevel::get($level_id);
  64. if (!$vipinfo) return false;
  65. $userinfo = User::find($uid);
  66. if (!$userinfo) return false;
  67. $add_valid_time = (int)$vipinfo->valid_date * 86400;
  68. $uservipinfo = self::valiWhere()->where('uid', $uid)->where('level_id', $level_id)->find();
  69. //检查是否购买过
  70. if ($uservipinfo) {
  71. $stay = 0;
  72. //剩余时间
  73. if (time() < $uservipinfo->valid_time) $stay = $uservipinfo->valid_time - time();
  74. //如果购买过当前等级的会员过期了.从当前时间开始计算
  75. //过期时效: 剩余时间+当前会员等级时间+当前time
  76. $add_valid_time = $stay + $add_valid_time + time();
  77. $data['is_forever'] = $vipinfo->is_forever;
  78. $data['valid_time'] = $add_valid_time;
  79. if($type==0) {
  80. User::where('uid', $uid)->update(['level' => $level_id]);
  81. return self::where('uid', $uid)->where('level_id', $level_id)->update($data);
  82. }
  83. else
  84. {
  85. User::where('uid', $uid)->update(['area_level' => $level_id]);
  86. }
  87. } else {
  88. $data = [
  89. 'is_forever' => $vipinfo->is_forever,
  90. 'status' => 1,
  91. 'is_del' => 0,
  92. 'grade' => $vipinfo->grade,
  93. 'uid' => $uid,
  94. 'add_time' => time(),
  95. 'level_id' => $level_id,
  96. 'type' => $type,
  97. 'discount' => $vipinfo->discount,
  98. ];
  99. if ($data['is_forever'])
  100. $data['valid_time'] = 0;
  101. else
  102. $data['valid_time'] = $add_valid_time + time();
  103. $data['mark'] = '尊敬的用户' . $userinfo['nickname'] . '在' . date('Y-m-d H:i:s', time()) . '成为了' . $vipinfo['name'];
  104. $res = self::create($data);
  105. if (!$res) return false;
  106. if($type==0) {
  107. User::where('uid', $uid)->update(['level' => $level_id]);
  108. }
  109. else
  110. {
  111. User::where('uid', $uid)->update(['zero_level' => $level_id]);
  112. }
  113. return $res;
  114. }
  115. }
  116. /**
  117. * 获取当前用户会员等级返回当前用户等级id
  118. * @param $uid 用户uid
  119. * @param int $grade 会员id
  120. * @return bool|mixed
  121. * @throws \think\db\exception\DataNotFoundException
  122. * @throws \think\db\exception\ModelNotFoundException
  123. * @throws \think\exception\DbException
  124. */
  125. public static function getUserLevel($uid, $grade = 0,$type=0)
  126. {
  127. $model = self::valiWhere();
  128. if ($grade) $model = $model->where('grade', '<', $grade);
  129. $level = $model->where('uid', $uid)->where('type',$type)->order('grade desc')->field('level_id,is_forever,valid_time,id,status,grade')->find();
  130. if (!$level) return false;
  131. if ($level->is_forever) return $level->id;
  132. //会员已经过期
  133. if (time() > $level->valid_time) {
  134. if ($level->status == 1) {
  135. $level->status = 0;
  136. $level->save();
  137. }
  138. return self::getUserLevel($uid, $level->grade,$type);
  139. } else
  140. //会员没有过期
  141. return $level->id;
  142. }
  143. /**
  144. * 获取会员详细信息
  145. * @param $id 会员记录id
  146. * @param string $keyName 字段名
  147. * @return array|mixed|string|\think\Model|null
  148. * @throws \think\db\exception\DataNotFoundException
  149. * @throws \think\db\exception\ModelNotFoundException
  150. * @throws \think\exception\DbException
  151. */
  152. public static function getUserLevelInfo($id, $keyName = '')
  153. {
  154. $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')
  155. ->join('system_user_level l', 'l.id=a.level_id')->find();
  156. if ($keyName) if (isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return '';
  157. return $vipinfo;
  158. }
  159. /**
  160. * 获取当前用户已成为的vip id
  161. * @param $uid 用户id
  162. * @return array
  163. */
  164. public static function getUserLevelIds($uid,$type=0)
  165. {
  166. return self::valiWhere()->group('level_id')->where('type',$type)->where('uid', $uid)->order('grade asc')->column('level_id', 'level_id');
  167. }
  168. /**
  169. * 检查是否能成为会员
  170. * @param $uid 用户uid
  171. * @param bool $leveNowId
  172. * @return UserLevel|bool|\think\Model
  173. * @throws \think\db\exception\DataNotFoundException
  174. * @throws \think\db\exception\ModelNotFoundException
  175. * @throws \think\exception\DbException
  176. */
  177. public static function setLevelComplete($uid, $leveNowId = false,$type=0)
  178. {
  179. $user = User::where('uid', $uid)->find();
  180. if (!$user) return self::setErrorInfo('没有此用户,无法检测升级会员');
  181. $level = self::getUserLevel($uid,0,$type);
  182. if ($level === false)
  183. $level_id = 0;
  184. else
  185. $level_id = self::getUserLevelInfo($level, 'level_id');
  186. //之后的所有等级
  187. $leveNowIds = SystemUserLevel::getNextLevelId($level_id, true,$type);
  188. if ($leveNowIds === 0) return self::setErrorInfo('暂无可升会员');
  189. //查找当前需要升级的会员任务
  190. $taskAll = SystemUserTask::visibleWhere()->where('level_id','IN' , $leveNowIds)->column('id', 'id');
  191. self::startTrans();
  192. $res2 = true;
  193. try {
  194. if ($level === false) {
  195. //没有成为会员的从用户添加的时间开始算起,如果被清理过会员从清理的时间开始算起
  196. $add_time = $user['clean_time'] ? $user['clean_time'] : $user['add_time'];
  197. } else {
  198. $add_time = self::getUserLevelInfo($level, 'add_time');
  199. }
  200. //查询并记录任务
  201. foreach ($taskAll as $id) {
  202. $res = SystemUserTask::setTaskFinish($id, $uid, $add_time);
  203. if (!$res) return self::setErrorInfo(SystemUserTask::getErrorInfo(), true);
  204. }
  205. foreach ($leveNowIds as $leveNowId){
  206. //获取需要成为会员的任务完成度
  207. if (SystemUserTask::getTaskComplete($leveNowId, $uid)) {
  208. //设置任务已使用
  209. $res = SystemUserTask::setTarkStatus($leveNowId, $uid);
  210. if (!$res) return self::setErrorInfo('设置任务状态失败', true);
  211. //记录会员
  212. $res2 = self::setUserLevel($uid, $leveNowId,$type);
  213. }
  214. }
  215. self::commitTrans();
  216. return $res2;
  217. } catch (\Exception $e) {
  218. self::rollbackTrans();
  219. return self::setErrorInfo($e->getMessage());
  220. }
  221. }
  222. }