Sign.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace app\api\model\plus\sign;
  3. use app\common\model\plus\sign\Sign as SignModel;
  4. use app\common\exception\BaseException;
  5. use app\api\model\settings\Setting as SettingModel;
  6. /**
  7. * 用户签到模型模型
  8. */
  9. class Sign extends SignModel
  10. {
  11. /**
  12. * @param $user_id int 用户id
  13. * @param $sign_date string 签到时间
  14. * @return int|mixed
  15. */
  16. public function getDays($user_id, $sign_date)
  17. {
  18. $row = $this->where('user_id', '=', $user_id)->order(['create_time' => 'desc'])->find();
  19. if (empty($row)) {
  20. return 1;
  21. }
  22. $dif = (strtotime($sign_date) - strtotime($row['create_time'])) / (24 * 60 * 60);
  23. if (strtotime($row['sign_date']) == strtotime($sign_date)) {
  24. throw new BaseException(['msg' => '今天已签到']);
  25. return false;
  26. }
  27. if ($dif > 1) {
  28. return 1;
  29. }
  30. if ($dif < 1) {
  31. return $row['days'] + 1;
  32. }
  33. }
  34. /**
  35. * 签到
  36. */
  37. public function add($user)
  38. {
  39. // 更新记录
  40. $this->startTrans();
  41. try {
  42. //积分别名
  43. $points_name = SettingModel::getPointsName();
  44. //获取签到配置
  45. $sign_conf = SettingModel::getItem('sign');
  46. //签到日期
  47. $sign_date = date('Y-m-d', time());
  48. $user_id = $user['user_id'];
  49. //获取连续签到天数
  50. $days = $this->getDays($user_id, $sign_date);
  51. //修改用户积分
  52. $points = $user->setPoints($user_id, $days, $sign_conf, $sign_date);
  53. $data = [
  54. 'user_id' => $user_id,
  55. 'sign_date' => date('Y-m-d', time()),
  56. 'sign_day' => intval(date('d', time())),
  57. 'days' => $days,
  58. 'points' => $points,
  59. 'prize' => $points.'积分',
  60. 'app_id' => self::$app_id
  61. ];
  62. $this->save($data);
  63. $this->commit();
  64. return "签到成功,奖励{$points_name}{$points}个";
  65. } catch (\Exception $e) {
  66. $this->rollback();
  67. return '';
  68. }
  69. }
  70. public function getListByUserId($user_id)
  71. {
  72. $str = date('Y-m-d', time());
  73. $arr = explode('-', $str);
  74. $start_time = strtotime($arr[0] . '-' . $arr[1] . '-01');
  75. $list = $this->where('user_id', '=', $user_id)
  76. ->where('create_time', 'between', [$start_time, time()])
  77. ->order(['create_time' => 'desc'])->select()->toArray();
  78. $res = array_column($list, 'sign_day');
  79. $len = count($list);
  80. if ($len == 0) {
  81. $days = 0;
  82. $is_sign = 0;
  83. }else{
  84. $days = $list[$len - 1]['days'];
  85. $is_sign = ($list[$len - 1]['sign_date'] == date('Y-m-d', time())) ? 1 : 0;
  86. }
  87. return [$res, $days, intval(date('d', time())), $is_sign];
  88. }
  89. }