UserLevel.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. * */
  28. public static function setUserLevelCount($uids)
  29. {
  30. $model=new self();
  31. if(is_array($uids)) $model=$model->where('uid','in',$uids);
  32. else $model=$model->where('uid',$uids);
  33. return $model->count();
  34. }
  35. /*
  36. * 设置查询初始化条件
  37. * @param string $alias 表别名
  38. * @param object $model 模型实例化对象
  39. * @return object
  40. * */
  41. public static function valiWhere($alias='',$model=null)
  42. {
  43. $model=is_null($model) ? new self() : $model;
  44. if($alias){
  45. $model=$model->alias($alias);
  46. $alias.='.';
  47. }
  48. return $model->where("{$alias}status", 1)->where("{$alias}is_del", 0);
  49. }
  50. /*
  51. * 设置会员等级
  52. * @param int $uid 用户uid
  53. * @param int $level_id 等级id
  54. * @return boolean | array
  55. * */
  56. public static function setUserLevel($uid,$level_id){
  57. $vipinfo=SystemUserLevel::get($level_id);
  58. if(!$vipinfo) return false;
  59. $userinfo = User::find($uid);
  60. if(!$userinfo) return false;
  61. $add_valid_time=(int)$vipinfo->valid_date*86400;
  62. $uservipinfo=self::valiWhere()->where('uid', $uid)->where('level_id', $level_id)->find();
  63. //检查是否购买过
  64. if($uservipinfo){
  65. $stay=0;
  66. //剩余时间
  67. if(time() < $uservipinfo->valid_time) $stay=$uservipinfo->valid_time-time();
  68. //如果购买过当前等级的会员过期了.从当前时间开始计算
  69. //过期时效: 剩余时间+当前会员等级时间+当前time
  70. $add_valid_time=$stay+$add_valid_time+time();
  71. $data['is_forever']=$vipinfo->is_forever;
  72. $data['valid_time']=$add_valid_time;
  73. User::where('uid',$uid)->update(['level'=>$level_id]);
  74. return self::where('uid', $uid)->where('level_id', $level_id)->update($data);
  75. }else{
  76. $data=[
  77. 'is_forever'=>$vipinfo->is_forever,
  78. 'status'=>1,
  79. 'is_del'=>0,
  80. 'grade'=>$vipinfo->grade,
  81. 'uid'=>$uid,
  82. 'add_time'=>time(),
  83. 'level_id'=>$level_id,
  84. 'discount'=>$vipinfo->discount,
  85. ];
  86. if($data['is_forever'])
  87. $data['valid_time']=0;
  88. else
  89. $data['valid_time']=$add_valid_time+time();
  90. $data['mark']='尊敬的用户'.$userinfo['nickname'].'在'.date('Y-m-d H:i:s',time()).'成为了'.$vipinfo['name'];
  91. $res=self::create($data);
  92. if(!$res) return false;
  93. User::where('uid',$uid)->update(['level'=>$level_id]);
  94. return $res;
  95. }
  96. }
  97. /*
  98. * 获取当前用户会员等级返回当前用户等级id
  99. * @param int $uid 用户uid
  100. * @return int 会员id
  101. * */
  102. public static function getUserLevel($uid,$grade=0)
  103. {
  104. $model = self::valiWhere();
  105. if ($grade) $model = $model->where('grade', '<', $grade);
  106. $level = $model->where('uid', $uid)->order('grade desc')->field('level_id,is_forever,valid_time,id,status,grade')->find();
  107. if (!$level) return false;
  108. if ($level->is_forever) return $level->id;
  109. //会员已经过期
  110. if (time() > $level->valid_time){
  111. if($level->status==1){
  112. $level->status=0;
  113. $level->save();
  114. }
  115. return self::getUserLevel($uid, $level->grade);
  116. }else
  117. //会员没有过期
  118. return $level->id;
  119. }
  120. /*
  121. * 获取会员详细信息
  122. * @param int $id 会员记录id
  123. * @param string $keyName 字段名
  124. * @return array
  125. * */
  126. public static function getUserLevelInfo($id,$keyName=''){
  127. $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')
  128. ->join('__system_user_level__ l','l.id=a.level_id')->find();
  129. if($keyName) if(isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return '';
  130. return $vipinfo;
  131. }
  132. /*
  133. * 获取当前用户已成为的vip id
  134. * @param int $uid 用户id
  135. * @return array
  136. * */
  137. public static function getUserLevelIds($uid)
  138. {
  139. return self::valiWhere()->group('level_id')->where('uid',$uid)->order('grade asc')->column('level_id','level_id');
  140. }
  141. /*
  142. * 检查是否能成为会员
  143. * @param int $uid 用户
  144. * */
  145. public static function setLevelComplete($uid,$leveNowId=false)
  146. {
  147. $user=User::where('uid',$uid)->find();
  148. if(!$user) return self::setErrorInfo('没有此用户,无法检测升级会员');
  149. $level=self::getUserLevel($uid);
  150. if($level===false)
  151. $level_id=0;
  152. else
  153. $level_id=self::getUserLevelInfo($level,'level_id');
  154. $leveNowId=SystemUserLevel::getNextLevelId($level_id);
  155. if($leveNowId===0) return self::setErrorInfo('暂无可升会员');
  156. //查找当前需要升级的会员任务
  157. $taskAll=SystemUserTask::visibleWhere()->where('level_id',$leveNowId)->column('id','id');
  158. self::startTrans();
  159. $res2=true;
  160. try{
  161. if($level===false){
  162. //没有成为会员的从用户添加的时间开始算起,如果被清理过会员从清理的时间开始算起
  163. $add_time=$user['clean_time'] ? $user['clean_time'] :$user['add_time'];
  164. }else{
  165. $add_time=self::getUserLevelInfo($level,'add_time');
  166. }
  167. //查询并记录任务
  168. foreach ($taskAll as $id){
  169. $res=SystemUserTask::setTaskFinish($id,$uid,$add_time);
  170. if(!$res) return self::setErrorInfo(SystemUserTask::getErrorInfo(),true);
  171. }
  172. //获取需要成为会员的任务完成度
  173. if(SystemUserTask::getTaskComplete($leveNowId,$uid)){
  174. //设置任务已使用
  175. $res=SystemUserTask::setTarkStatus($leveNowId,$uid);
  176. if(!$res) return self::setErrorInfo('设置任务状态失败',true);
  177. //记录会员
  178. $res2=self::setUserLevel($uid,$leveNowId);
  179. }
  180. self::commitTrans();
  181. return $res2;
  182. }catch (\Exception $e){
  183. self::rollbackTrans();
  184. return self::setErrorInfo($e->getMessage());
  185. }
  186. }
  187. }