UserSign.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace app\models\user;
  3. use crmeb\basic\BaseModel;
  4. use crmeb\services\SystemConfigService;
  5. use crmeb\traits\ModelTrait;
  6. /**
  7. * TODO 用户签到模型 Model
  8. * Class UserSign
  9. * @package app\models\user
  10. */
  11. class UserSign extends BaseModel
  12. {
  13. /**
  14. * 数据表主键
  15. * @var string
  16. */
  17. protected $pk = 'id';
  18. /**
  19. * 模型名称
  20. * @var string
  21. */
  22. protected $name = 'user_sign';
  23. use ModelTrait;
  24. /*
  25. * 设置签到数据
  26. * @param int $uid 用户uid
  27. * @param string $title 签到说明
  28. * @param int $number 签到获得积分
  29. * @param int $balance 签到前剩余积分
  30. * @return object
  31. * */
  32. public static function setSignData($uid,$title='',$number=0,$balance=0)
  33. {
  34. $add_time=time();
  35. return self::create(compact('uid','title','number','balance','add_time')) && UserBill::income($title,$uid,'integral','sign',$number,0,$balance,$title);
  36. }
  37. /*
  38. * 分页获取用户签到数据
  39. * @param int $uid 用户uid
  40. * @param int $page 页码
  41. * @param int $limit 显示多少条
  42. * @return array
  43. * */
  44. public static function getSignList($uid,$page,$limit)
  45. {
  46. if(!$limit) return [];
  47. if($page){
  48. return UserBill::where('a.category','integral')
  49. ->where('a.type','sign')
  50. ->where('a.status',1)
  51. ->where('a.uid',$uid)
  52. ->alias('a')
  53. ->join("__user__ u",'u.uid=a.uid')
  54. ->order('a.add_time desc')
  55. ->field('FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time,a.title,a.number')
  56. ->page((int)$page,(int)$limit)
  57. ->select();
  58. }else{
  59. return UserBill::where('a.category','integral')
  60. ->where('a.type','sign')
  61. ->where('a.status',1)
  62. ->where('a.uid',$uid)
  63. ->alias('a')
  64. ->join("__user__ u",'u.uid=a.uid')
  65. ->order('a.add_time desc')
  66. ->field('FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as add_time,a.title,a.number')
  67. ->select();
  68. }
  69. }
  70. /*
  71. * 获取用户累计签到次数
  72. * @Parma int $uid 用户id
  73. * @return int
  74. * */
  75. public static function getSignSumDay($uid)
  76. {
  77. return self::where('uid', $uid)->count();
  78. }
  79. /*
  80. * 获取用户今天是否签到
  81. * @param int $uid
  82. * */
  83. public static function getToDayIsSign($uid)
  84. {
  85. return self::where('uid', $uid)->whereTime('add_time','today')->count() ? true : false;
  86. }
  87. /*
  88. * 获取用户昨天是否签到
  89. * @param int $uid
  90. * */
  91. public static function getYesterDayIsSign($uid)
  92. {
  93. return self::where('uid', $uid)->whereTime('add_time','yesterday')->count() ? true : false;
  94. }
  95. /*
  96. * 获取签到配置
  97. * @param string
  98. * */
  99. public static function getSignSystemList($key='sign_day_num')
  100. {
  101. return \crmeb\services\GroupDataService::getData($key) ? : [];
  102. }
  103. /*
  104. * 用户签到
  105. * @param int $uid 用户uid
  106. * @return boolean
  107. * */
  108. public static function sign($uid)
  109. {
  110. $sign_list=self::getSignSystemList();
  111. if(!count($sign_list)) return self::setErrorInfo('请先配置签到天数');
  112. $user=User::where('uid',$uid)->find();
  113. $sign_num=0;
  114. //检测昨天是否签到
  115. if(self::getYesterDayIsSign($uid)){
  116. if($user->sign_num > (count($sign_list) -1)) $user->sign_num=0;
  117. }else{
  118. //如果昨天没签到,回退到第一天
  119. $user->sign_num=0;
  120. }
  121. foreach ($sign_list as $key=>$item){
  122. if($key==$user->sign_num){
  123. $sign_num=$item['sign_num'];
  124. break;
  125. }
  126. }
  127. $user->sign_num+=1;
  128. if($user->sign_num == count($sign_list))
  129. $res1 = self::setSignData($uid,'连续签到奖励',$sign_num,$user->integral);
  130. else
  131. // $res1 = self::setSignData($uid,'用户连续签到第'.(self::getSignSumDay($uid)+1).'天',$sign_num,$user->integral);
  132. $res1 = self::setSignData($uid,'签到奖励',$sign_num,$user->integral);
  133. $res2= User::bcInc($uid,'integral',$sign_num,'uid');
  134. $res3=$user->save();
  135. $res = $res1 && $res2 && $res3!==false;
  136. BaseModel::checkTrans($res);
  137. event('UserLevelAfter',[$user]);
  138. if($res)
  139. return $sign_num;
  140. else
  141. return false;
  142. }
  143. /*
  144. * 获取签到列表按月加载
  145. * @param int $uid 用户uid
  146. * @param int $page 页码
  147. * @param int $limit 显示多少条
  148. * @return array
  149. * */
  150. public static function getSignMonthList($uid,$page=1,$limit=8)
  151. {
  152. if(!$limit) return [];
  153. if($page){
  154. $list = UserBill::where('uid', $uid)
  155. ->where('category', 'integral')
  156. ->where('type', 'sign')
  157. ->field('FROM_UNIXTIME(add_time,"%Y-%m") as time,group_concat(id SEPARATOR ",") ids')
  158. ->group('time')
  159. ->order('time DESC')
  160. ->page($page, $limit)
  161. ->select();
  162. }else{
  163. $list = UserBill::where('uid', $uid)
  164. ->where('category', 'integral')
  165. ->where('type', 'sign')
  166. ->field('FROM_UNIXTIME(add_time,"%Y-%m") as time,group_concat(id SEPARATOR ",") ids')
  167. ->group('time')
  168. ->order('time DESC')
  169. ->select();
  170. }
  171. $data=[];
  172. foreach ($list as $key=>&$item){
  173. $value['month'] = $item['time'];
  174. $value['list'] = UserBill::where('id','in',$item['ids'])->field('FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time,title,number')->order('add_time DESC')->select();
  175. array_push($data,$value);
  176. }
  177. return $data;
  178. }
  179. public static function checkUserSigned($uid)
  180. {
  181. return UserBill::be(['uid'=>$uid,'add_time'=>['>',strtotime('today')],'category'=>'integral','type'=>'sign']);
  182. }
  183. public static function userSignedCount($uid)
  184. {
  185. return self::userSignBillWhere($uid)->count();
  186. }
  187. /**
  188. * @param $uid
  189. * @return UserBill
  190. */
  191. public static function userSignBillWhere($uid)
  192. {
  193. return UserBill::where('uid', $uid)->where('category', 'integral')->where('type', 'sign');
  194. }
  195. public static function signEbApi($userInfo)
  196. {
  197. $uid = $userInfo['uid'];
  198. $min = SystemConfigService::get('sx_sign_min_int')?:0;
  199. $max = SystemConfigService::get('sx_sign_max_int')?:5;
  200. $integral = rand($min,$max);
  201. BaseModel::beginTrans();
  202. $res1 = UserBill::income('用户签到',$uid,'integral','sign',$integral,0,$userInfo['integral'],'签到获得'.floatval($integral).'积分');
  203. $res2 = User::bcInc($uid,'integral',$integral,'uid');
  204. $res = $res1 && $res2;
  205. BaseModel::checkTrans($res);
  206. if($res)
  207. return $integral;
  208. else
  209. return false;
  210. }
  211. }