Sign.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\model\UserSignCard;
  4. use think\Db;
  5. use app\common\model\UserSign;
  6. /**
  7. * @title 会员签到
  8. * @controller Sign
  9. * @group base
  10. */
  11. class Sign extends Base
  12. {
  13. public function initialize()
  14. {
  15. parent::checkLogin();
  16. }
  17. /**
  18. * @title 验证会员当天是否签到
  19. * @desc 验证会员当天是否签到
  20. * @author qc
  21. * @url /api/Sign/checkSign
  22. * @method GET
  23. * @header name:Authorization require:1 desc:Token
  24. * @return name:is_sign type:int default:0 desc:是否签到0未签到,1已签到
  25. */
  26. public function checkSign()
  27. {
  28. $year = date('Y');
  29. $month = date('m');
  30. $day = date('d');
  31. $ck_sign = UserSign::where(['user_id'=>$this->user_id,'year'=>$year,'month'=>$month,'day'=>$day])->count();
  32. $this->success('ok',['is_sign'=>$ck_sign]);
  33. }
  34. /**
  35. * @title 获取会员连续签到天数
  36. * @desc 获取会员连续签到天数
  37. * @author qc
  38. * @url /api/Sign/getContinuousSign
  39. * @method GET
  40. * @header name:Authorization require:1 desc:Token
  41. * @return name:is_sign type:int default:-- desc:当天是否签到(0签到,1已签到)
  42. * @return name:sign_num type:int default:-- desc:连续签到天数
  43. * @return name:sign_card type:int default:-- desc:补签卡数量
  44. */
  45. public function getContinuousSign()
  46. {
  47. $today_sign = UserSign::where(['user_id'=>$this->user_id,'day_time'=>date('Y-m-d')])->find();
  48. $is_sign = !empty($today_sign) ? 1:0;
  49. $sign_num = 0;
  50. $week_sign = UserSign::where('user_id','=',$this->user_id)
  51. ->where('create_at','>= time',date('Y-m-d 00:00:00',strtotime('-6 days')))
  52. ->where('status','=',0)
  53. ->order('create_at desc')
  54. ->select()->toArray();
  55. $sign_date = array_column($week_sign,'day_time');
  56. for($i=0;$i<=6;$i++) {
  57. if(in_array(date('Y-m-d',strtotime("-$i days")),$sign_date)){
  58. $sign_num++;
  59. }else if($i>0){
  60. break;
  61. }
  62. }
  63. $sign_card = UserSignCard::where(['user_id'=>$this->user_id,'status'=>0])->count();
  64. $this->success('ok',['sign_num'=>$sign_num,'is_sign'=>$is_sign,'sign_card'=>$sign_card]);
  65. }
  66. /**
  67. * @title 会员签到
  68. * @desc 会员签到
  69. * @author qc
  70. * @url /api/Sign/userSign
  71. * @method POST
  72. * @header name:Authorization require:1 desc:Token
  73. * @return name:sign_crystal type:int default:-- desc:明信片
  74. * @return name:integral type:int default:-- desc:签到获得积分数
  75. * @return name:sign_num type:int default:-- desc:连续签到天数
  76. */
  77. public function userSign()
  78. {
  79. $year = date('Y');
  80. $month = date('m');
  81. $day = date('d');
  82. $ck_sign = UserSign::where(['user_id'=>$this->user_id,'year'=>$year,'month'=>$month,'day'=>$day])->count();
  83. if($ck_sign) $this->error('已签到');
  84. $sign_data=[
  85. 'user_id' =>$this->user_id,
  86. 'year' =>$year,
  87. 'month' =>$month,
  88. 'day' =>$day,
  89. 'day_time'=>date('Y-m-d'),
  90. 'create_at' => date('Y-m-d H:i:s'),
  91. 'desc' => '每日签到',
  92. ];
  93. UserSign::create($sign_data);
  94. $sign_num = 0;
  95. // 最近七天签到情况
  96. $week_sign = UserSign::where('user_id','=',$this->user_id)
  97. ->where('create_at','>= time',date('Y-m-d 00:00:00',strtotime('-6 days')))
  98. ->where('status','=',0)
  99. ->order('create_at desc')
  100. ->select()->toArray();
  101. $sign_date = array_column($week_sign,'day_time');
  102. for($i=0;$i<=6;$i++) {
  103. if(in_array(date('Y-m-d',strtotime("-$i days")),$sign_date)){
  104. $sign_num++;
  105. }else if($i>0){
  106. break;
  107. }
  108. }
  109. $integral = in_array($sign_num,[2,3]) ? $sign_num:1;
  110. $this->success('签到成功',['integral'=>$integral,'sign_num'=>$sign_num]);
  111. }
  112. /**
  113. * @title 会员领取签到卡
  114. * @desc 会员领取签到卡
  115. * @author qc
  116. * @url /api/Sign/getSignCard
  117. * @method POST
  118. * @header name:Authorization require:1 desc:Token
  119. */
  120. public function getSignCard()
  121. {
  122. $sign_num = 0;
  123. // 最近七天签到情况
  124. $week_sign = UserSign::where('user_id','=',$this->user_id)
  125. ->where('create_at','>= time',date('Y-m-d 00:00:00',strtotime('-6 days')))
  126. ->where('status','=',0)
  127. ->order('create_at desc')
  128. ->count();
  129. $sign_date = array_column($week_sign,'day_time');
  130. for($i=0;$i<=6;$i++) {
  131. if(in_array(date('Y-m-d',strtotime("-$i days")),$sign_date)){
  132. $sign_num++;
  133. }else if($i>0){
  134. break;
  135. }
  136. }
  137. if($sign_num != 7) $this->error('连续签到天数不足7天');
  138. UserSign::where('user_id','=',$this->user_id)
  139. ->where('create_at','>= time',date('Y-m-d 00:00:00',strtotime('-6 days')))
  140. ->where('status','=',0)
  141. ->update(['status'=>1]);
  142. UserSignCard::create([ 'user_id' => $this->user_id]);
  143. $this->success('领取成功');
  144. }
  145. /**
  146. * @title 会员补签
  147. * @desc 会员补签
  148. * @author qc
  149. * @url /api/Sign/retroactive
  150. * @method POST
  151. * @header name:Authorization require:1 desc:Token
  152. * @return name:date_time type:int default:-- desc:补签日期(2022-04-07)
  153. */
  154. public function retroactive()
  155. {
  156. $date_time = input('post.date_time',date('Y-m-d'));
  157. $year = date('Y',strtotime($date_time));
  158. $month = date('m',strtotime($date_time));
  159. $day = date('d',strtotime($date_time));
  160. $ck_sign = UserSign::where(['user_id'=>$this->user_id,'year'=>$year,'month'=>$month,'day'=>$day])->count();
  161. if($ck_sign) $this->error('已签到');
  162. $user_card = UserSignCard::where(['user_id'=>$this->user_id,'status'=>0])->min('id');
  163. if(!$user_card) $this->error('补签卡不足');
  164. $sign_data=[
  165. 'user_id' =>$this->user_id,
  166. 'year' =>$year,
  167. 'month' =>$month,
  168. 'day' =>$day,
  169. 'day_time'=>date('Y-m-d',$date_time),
  170. 'create_at' => date('Y-m-d H:i:s',$date_time),
  171. 'desc' => '每日签到(补签)',
  172. ];
  173. UserSign::create($sign_data);
  174. $this->success('补签成功');
  175. }
  176. /**
  177. * @title 会员签到列表
  178. * @desc 会员签到列表
  179. * @author qc
  180. * @url /api/Sign/getSignList
  181. * @method GET
  182. * @header name:Authorization require:1 desc:Token
  183. * @param name:page type:int default:1 desc:页数
  184. * @param name:page_num type:int : default:20 desc:每页数
  185. * @return name:create_at type:string default:-- desc:时间
  186. * @return name:desc type:string default:-- desc:描述
  187. */
  188. public function getSignList()
  189. {
  190. $list = UserSign::field('id,create_at,desc')
  191. ->where('user_id','=',$this->user_id)
  192. ->order('id desc')
  193. ->limit($this->off_set,$this->page_num)
  194. ->select();
  195. $this->success('ok',['list'=>$list ? $list->toAray() :[]]);
  196. }
  197. }