Sign.php 2.8 KB

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