UserSign.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2018/02/28
  6. */
  7. namespace app\routine\model\user;
  8. use basic\ModelBasic;
  9. use service\SystemConfigService;
  10. use think\Model;
  11. class UserSign
  12. {
  13. public static function checkUserSigned($uid)
  14. {
  15. return UserBill::be(['uid'=>$uid,'add_time'=>['>',strtotime('today')],'category'=>'integral','type'=>'sign']);
  16. }
  17. public static function userSignedCount($uid)
  18. {
  19. return self::userSignBillWhere($uid)->count();
  20. }
  21. /**
  22. * @param $uid
  23. * @return Model
  24. */
  25. public static function userSignBillWhere($uid)
  26. {
  27. return UserBill::where(['uid'=>$uid,'category'=>'integral','type'=>'sign']);
  28. }
  29. public static function sign($userInfo)
  30. {
  31. $uid = $userInfo['uid'];
  32. $min = SystemConfigService::get('sx_sign_min_int')?:0;
  33. $max = SystemConfigService::get('sx_sign_max_int')?:5;
  34. $integral = rand($min,$max);
  35. ModelBasic::beginTrans();
  36. $res1 = UserBill::income('用户签到',$uid,'integral','sign',$integral,0,bcadd($userInfo['integral'],$integral,2),'签到获得'.floatval($integral).'积分');
  37. $res2 = User::bcInc($uid,'integral',$integral,'uid');
  38. $res = $res1 && $res2;
  39. ModelBasic::checkTrans($res);
  40. if($res)
  41. return $integral;
  42. else
  43. return false;
  44. }
  45. public static function signFoodie($uid,$sign_list){
  46. ModelBasic::beginTrans();
  47. $user=User::where(['uid'=>$uid,'status'=>1])->field(['integral','sign_num','sign_time','sign_count'])->find();
  48. if(!$user) return false;
  49. $sign_num=0;
  50. //检测昨天是否签到
  51. if(User::where(['uid'=>$uid,'status'=>1])->whereTime('sign_time','yesterday')->count()){
  52. if($user->sign_num > (count($sign_list) -1)) $user->sign_num=0;
  53. }else{
  54. //如果昨天没签到,回退到第一天
  55. $user->sign_num=0;
  56. }
  57. foreach ($sign_list as $key=>$item){
  58. if($key==$user->sign_num){
  59. $sign_num=$item['sign_num'];
  60. break;
  61. }
  62. }
  63. $user->sign_time=time();
  64. $user->sign_num+=1;
  65. $user->sign_count+=1;
  66. if($user->sign_num == count($sign_list)){
  67. $res1 = UserBill::income('连续签到奖励',$uid,'integral','sign',$sign_num,0,bcadd($user->integral,$sign_num),'签到获得'.floatval($sign_num).'积分');
  68. }else{
  69. $res1 = UserBill::income('用户累计签到第'.$user->sign_count.'天',$uid,'integral','sign',$sign_num,0,bcadd($user->integral,$sign_num),'签到获得'.floatval($sign_num).'积分');
  70. }
  71. $res2= User::bcInc($uid,'integral',$sign_num,'uid');
  72. $res3=$user->save();
  73. $res = $res1 && $res2 && $res3;
  74. ModelBasic::checkTrans($res);
  75. if($res)
  76. return $sign_num;
  77. else
  78. return false;
  79. }
  80. public static function getSignLog($where,$gruop = false){
  81. $userbill = UserBill::where(['uid'=>$where['uid'],'category'=>'integral'])->order('add_time desc');
  82. $userinfo = [];
  83. if($gruop == false){
  84. $list = $userbill->where('type','sign')->page((int)$where['page'],(int)$where['limit'])->select();
  85. count($list) && $list=$list->toArray();
  86. $page=$where['page']+1;
  87. foreach ($list as &$item) $item['add_time']=date('Y-m-d H:i:s',$item['add_time']);
  88. }else{
  89. $list=$userbill->where('type','in','sign,clear,recommend')->field(['FROM_UNIXTIME(add_time,"%Y-%m") as time','group_concat(id SEPARATOR ",") ids'])
  90. ->group('time')
  91. ->order('time asc')
  92. ->page((int)$where['page'],(int)$where['limit'])
  93. ->select();
  94. count($list) && $list=$list->toArray();
  95. $sign_list = [];
  96. foreach ($list as $item){
  97. $value['month']=self::getUtf8Month($item['time']);
  98. $value['list']=($val=UserBill::where('id','in',$item['ids'])->order('add_time desc')
  99. ->field(['FROM_UNIXTIME(add_time,"%Y/%m/%d %H:%i:%s") as time','title','number'])
  100. ->select()) && count($val) ? $val->toArray() : [];
  101. $sign_list[]=$value;
  102. }
  103. $list = $sign_list;
  104. if($where['page']==1){
  105. //总共积分
  106. $userinfo['integral'] = User::where(['uid' => $where['uid']])->value('integral');
  107. //昨日积分
  108. $userinfo['yesterday_integral'] = UserBill::where(['uid' => $where['uid'], 'category' => 'integral'])->where('type','in',['sign','clear','recommend'])->value('number');
  109. //本周积分
  110. $userinfo['week_integral'] = UserBill::where(['uid' => $where['uid'], 'category' => 'integral'])->where('type','in',['sign','clear','recommend'])->whereTime('add_time', 'week')->value('number');
  111. //排名
  112. $userinfo['ranking'] = User::where('integral', '>', $userinfo['integral'])->count();
  113. $userinfo['ranking'] += 1;
  114. }
  115. $page=$where['page']+1;
  116. }
  117. return compact('list','page','userinfo');
  118. }
  119. public static function getUtf8Month($time){
  120. $num=['01'=>'一', '02'=>'二', '03'=>'三', '04'=>'四', '05'=>'五',
  121. '06'=>'六', '07'=>'七', '08'=>'八', '09'=>'九','10'=>'十','11'=>'十一','12'=>'十二'];
  122. list($year,$month)=explode('-',$time);
  123. return isset($num[$month]) ? $num[$month].'月' : '';
  124. }
  125. /*
  126. * 等级计算 返回当前等级
  127. * */
  128. public static function getdiscount(array $sign_deploy,$integral){
  129. $grade_name='';
  130. $discount=0;
  131. $sign_grade=0;
  132. $pic='';
  133. $site_url=SystemConfigService::get('site_url');
  134. foreach ($sign_deploy as $item){
  135. list($min,$max)=strstr($item['sign_num'],'-') ? explode('-',$item['sign_num']) : [$item['sign_num'],''];
  136. if($integral <= $min && $max==''){
  137. $grade_name=$item['sign_name'];
  138. $discount=bcdiv($item['discount'],10,1);
  139. $sign_grade=$item['sign_grade'];
  140. $pic=$site_url.$item['pic'];
  141. break;
  142. }else if($integral >= $min && $integral <= $max) {
  143. $grade_name = $item['sign_name'];
  144. $discount = bcdiv($item['discount'], 10, 1);
  145. $sign_grade = $item['sign_grade'];
  146. $pic = $site_url . $item['pic'];
  147. break;
  148. }else if($integral > $max && $integral > $min && $max!=''){
  149. $count=count($sign_deploy);
  150. $grade_name=$sign_deploy[$count-1]['sign_name'];
  151. $discount=bcdiv($sign_deploy[$count-1]['discount'],10,1);
  152. $sign_grade=$sign_deploy[$count-1]['sign_grade'];
  153. $pic=$site_url.$sign_deploy[$count-1]['pic'];
  154. break;
  155. }
  156. }
  157. $pic=strstr($pic,'s_') ? str_replace('s_','',$pic) : $pic;
  158. return [$grade_name,$discount,$sign_grade,$pic];
  159. }
  160. }