UserSignRepository.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\repositories\user;
  12. use app\common\dao\user\UserSignDao;
  13. use app\common\repositories\BaseRepository;
  14. use app\common\repositories\system\groupData\GroupDataRepository;
  15. use app\common\repositories\system\groupData\GroupRepository;
  16. use think\exception\ValidateException;
  17. use think\facade\Db;
  18. class UserSignRepository extends BaseRepository
  19. {
  20. /**
  21. * @var UserSignDao
  22. */
  23. protected $dao;
  24. /**
  25. * UserSignRepository constructor.
  26. * @param UserSignDao $dao
  27. */
  28. public function __construct(UserSignDao $dao)
  29. {
  30. $this->dao = $dao;
  31. }
  32. /**
  33. * TODO 获取指定日期 用户的连续签到数
  34. * @param int $uid
  35. * @param string $day
  36. * @return array
  37. * @author Qinii
  38. * @day 6/8/21
  39. */
  40. public function getSign(int $uid,string $day)
  41. {
  42. return $this->dao->getSearch(['uid' => $uid,'day' => $day])->value('sign_num');
  43. }
  44. public function getDay(int $num)
  45. {
  46. if($num > 7) {
  47. $yu = ($num % 7);
  48. $num = ($yu == 0) ? 6 : $yu - 1;
  49. } else {
  50. $num = (($num -1) < 0) ? 0 : ($num -1);
  51. }
  52. $title = $this->signConfig();
  53. if(empty($title)) throw new ValidateException('未开启签到功能');
  54. if (isset($title[$num]['value'])) {
  55. $dat = $title[$num]['value'];
  56. } else {
  57. $dat = [
  58. 'sign_day' => '无',
  59. 'sign_integral' => 0,
  60. ];
  61. }
  62. return $dat;
  63. }
  64. /**
  65. * TODO 签到操作
  66. * @param int $uid
  67. * @author Qinii
  68. * @day 6/8/21
  69. */
  70. public function create(int $uid)
  71. {
  72. /**
  73. * 用户昨天的签到情况,如果有就是连续签到,如果没有就是第一天签到
  74. * 根据签到天数计算签到积分等操作
  75. * 计算用户剩余积分
  76. *
  77. */
  78. $yesterday = date("Y-m-d",strtotime("-1 day"));
  79. $sign_num = ($this->getSign($uid,$yesterday) ?: 0) + 1;
  80. //签到规则计算
  81. $sign_task = $this->getDay($sign_num);
  82. $user = app()->make(UserRepository::class)->get($uid);
  83. $integral = $sign_task['sign_integral'];
  84. if ($user->is_svip > 0) {
  85. $makeInteres = app()->make(MemberinterestsRepository::class);
  86. $integral = $integral * $makeInteres->getSvipInterestVal($makeInteres::HAS_TYPE_SIGN);;
  87. }
  88. $user_make = app()->make(UserRepository::class);
  89. $user = $user_make->get($uid);
  90. $integral_ = $user['integral'] + $integral;
  91. $data = [
  92. 'uid' => $uid,
  93. 'sign_num' => $sign_num,
  94. 'number' => $integral,
  95. 'integral' => $integral_,
  96. 'title' => '签到',
  97. ];
  98. //增加记录
  99. $arr = [
  100. 'status' => 1,
  101. 'mark' => '签到,获得积分'. $integral,
  102. 'number' => $integral,
  103. 'balance'=> $integral_,
  104. ];
  105. return Db::transaction(function() use($uid,$data,$user_make,$sign_task,$arr,$integral){
  106. $ret = $this->dao->create($data);
  107. $user_make->incIntegral($uid,$integral,'签到'.$sign_task['sign_day'],'sign_integral',$arr);
  108. app()->make(UserBrokerageRepository::class)->incMemberValue($uid, 'member_sign_num', $ret->sign_id);
  109. return compact('integral');
  110. });
  111. }
  112. public function getList(array $where,int $page,int $limit)
  113. {
  114. $query = $this->dao->getSearch($where)->order('create_time DESC');
  115. $count = $query->count();
  116. $list = $query->page($page,$limit)->select();
  117. return compact('count','list');
  118. }
  119. public function info(int $uid)
  120. {
  121. /**
  122. * 连续签到日期展示 1 - 7天
  123. * 是否签到
  124. * 累计签到数
  125. */
  126. $ret = $this->signStatus($uid);
  127. $is_sign = $ret['is_sign'];
  128. $sign_num = $ret['sign_num'];
  129. $title = $this->signConfig();
  130. $userInfo = app()->make(UserRepository::class)->getWhere(['uid' => $uid],'uid,avatar,nickname,integral');
  131. $count = $this->dao->getSearch(['uid' => $uid])->count('*');
  132. return compact('userInfo','is_sign','sign_num','count','title');
  133. }
  134. public function signConfig(){
  135. $group_make = app()->make(GroupRepository::class);
  136. $sign_day_config = $group_make->keyById('sign_day_config');
  137. $title = app()->make(GroupDataRepository::class)
  138. ->getGroupDataWhere(0,$sign_day_config)
  139. ->where('status',1)->limit(7)
  140. ->hidden(['group_data_id','group_id','create_time','mer_id'])->select()->toArray();
  141. return $title;
  142. }
  143. /**
  144. * TODO 连续签到 获取 1- 7 天
  145. * @param $uid
  146. * @return array
  147. * @author Qinii
  148. * @day 6/10/21
  149. */
  150. public function signStatus($uid)
  151. {
  152. $day = date('Y-m-d',time());
  153. $sign_num = 0;
  154. $sign_num = $this->getSign($uid,$day);
  155. $is_sign = $sign_num ? 1 : 0;
  156. if($sign_num > 7){
  157. $sign_num = ($sign_num % 7);
  158. if(!$sign_num) $sign_num = 7;
  159. }
  160. if(!$is_sign){
  161. $yesterday = date("Y-m-d",strtotime("-1 day"));
  162. $sign_num = $this->getSign($uid,$yesterday) ?: 0;
  163. if($sign_num > 7){
  164. $sign_num = ($sign_num % 7);
  165. }
  166. }
  167. return compact('is_sign','sign_num');
  168. }
  169. /**
  170. * TODO 按月显示签到记录
  171. * @param array $where
  172. * @return array
  173. * @author Qinii
  174. * @day 6/10/21
  175. */
  176. public function month(array $where)
  177. {
  178. $group = $this->dao->getSearch($where)->field('FROM_UNIXTIME(unix_timestamp(create_time),"%Y-%m") as time')
  179. ->order('time DESC')->group('time')->select();
  180. $ret = [];
  181. foreach ($group as $k => $item){
  182. $ret[$k]['month'] = $item['time'];
  183. $query = $this->dao->getSearch($where)->field('title,number,create_time')->whereMonth('create_time',$item['time']);
  184. $ret[$k]['list'] = $query->order('create_time DESC')->select();
  185. }
  186. return $ret;
  187. }
  188. }