123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <?php
- namespace app\common\repositories\user;
- use app\common\dao\user\UserSignDao;
- use app\common\repositories\BaseRepository;
- use app\common\repositories\system\groupData\GroupDataRepository;
- use app\common\repositories\system\groupData\GroupRepository;
- use think\exception\ValidateException;
- use think\facade\Db;
- class UserSignRepository extends BaseRepository
- {
- /**
- * @var UserSignDao
- */
- protected $dao;
- /**
- * UserSignRepository constructor.
- * @param UserSignDao $dao
- */
- public function __construct(UserSignDao $dao)
- {
- $this->dao = $dao;
- }
- /**
- * TODO 获取指定日期 用户的连续签到数
- * @param int $uid
- * @param string $day
- * @return array
- * @author Qinii
- * @day 6/8/21
- */
- public function getSign(int $uid,string $day)
- {
- return $this->dao->getSearch(['uid' => $uid,'day' => $day])->value('sign_num');
- }
- public function getDay($num)
- {
- if($num > 7) $num = ($num % 7);
- $title = $this->signConfig();
- if(empty($title)) throw new ValidateException('未开启签到功能');
- return $title[$num-1]['value'];
- }
- /**
- * TODO 签到操作
- * @param int $uid
- * @author Qinii
- * @day 6/8/21
- */
- public function create(int $uid)
- {
- /**
- * 用户昨天的签到情况,如果有就是连续签到,如果没有就是第一天签到
- * 根据签到天数计算签到积分等操作
- * 计算用户剩余积分
- *
- */
- return Db::transaction(function() use($uid){
- $yesterday = date("Y-m-d",strtotime("-1 day"));
- $sign_num = ($this->getSign($uid,$yesterday) ?: 0) + 1;
- //签到规则计算
- $sign_task = $this->getDay($sign_num);
- $integral = $sign_task['sign_integral'];
- $user_make = app()->make(UserRepository::class);
- $user = $user_make->get($uid);
- $integral_ = $user['integral'] + $sign_task['sign_integral'];
- $data = [
- 'uid' => $uid,
- 'sign_num' => $sign_num,
- 'number' => $sign_task['sign_integral'],
- 'integral' => $integral_,
- 'title' => '签到',
- ];
- $this->dao->create($data);
- //增加记录
- $arr = [
- 'status' => 1,
- 'mark' => '签到,获得积分'. $sign_task['sign_integral'],
- 'number' => $sign_task['sign_integral'],
- 'balance'=> $integral_,
- ];
- $user_make->incIntegral($uid,$sign_task['sign_integral'],'签到'.$sign_task['sign_day'],'sign_integral',$arr);
- return compact('integral');
- });
- }
- public function getList(array $where,int $page,int $limit)
- {
- $query = $this->dao->getSearch($where)->order('create_time DESC');
- $count = $query->count();
- $list = $query->page($page,$limit)->select();
- return compact('count','list');
- }
- public function info(int $uid)
- {
- /**
- * 连续签到日期展示 1 - 7天
- * 是否签到
- * 累计签到数
- */
- $ret = $this->signStatus($uid);
- $is_sign = $ret['is_sign'];
- $sign_num = $ret['sign_num'];
- $title = $this->signConfig();
- $userInfo = app()->make(UserRepository::class)->getWhere(['uid' => $uid],'uid,avatar,nickname,integral');
- $count = $this->dao->getSearch(['uid' => $uid])->count('*');
- return compact('userInfo','is_sign','sign_num','count','title');
- }
- public function signConfig(){
- $group_make = app()->make(GroupRepository::class);
- $sign_day_config = $group_make->keyById('sign_day_config');
- $title = app()->make(GroupDataRepository::class)
- ->getGroupDataWhere(0,$sign_day_config)
- ->where('status',1)->limit(7)
- ->hidden(['group_data_id','group_id','create_time','mer_id'])->select()->toArray();
- return $title;
- }
- /**
- * TODO 连续签到 获取 1- 7 天
- * @param $uid
- * @return array
- * @author Qinii
- * @day 6/10/21
- */
- public function signStatus($uid)
- {
- $day = date('Y-m-d',time());
- $sign_num = 0;
- $sign_num = $this->getSign($uid,$day);
- $is_sign = $sign_num ? 1 : 0;
- if($sign_num > 7){
- $sign_num = ($sign_num % 7);
- if(!$sign_num) $sign_num = 7;
- }
- if(!$is_sign){
- $yesterday = date("Y-m-d",strtotime("-1 day"));
- $sign_num = $this->getSign($uid,$yesterday) ?: 0;
- if($sign_num > 7){
- $sign_num = ($sign_num % 7);
- }
- }
- return compact('is_sign','sign_num');
- }
- /**
- * TODO 按月显示签到记录
- * @param array $where
- * @return array
- * @author Qinii
- * @day 6/10/21
- */
- public function month(array $where)
- {
- $group = $this->dao->getSearch($where)->field('FROM_UNIXTIME(unix_timestamp(create_time),"%Y-%m") as time')
- ->order('time DESC')->group('time')->select();
- $ret = [];
- foreach ($group as $k => $item){
- $ret[$k]['month'] = $item['time'];
- $query = $this->dao->getSearch($where)->field('title,number,create_time')->whereMonth('create_time',$item['time']);
- $ret[$k]['list'] = $query->order('create_time DESC')->select();
- }
- return $ret;
- }
- }
|