SignLogic.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LikeShop有特色的全开源社交分销电商系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 商业用途务必购买系统授权,以免引起不必要的法律纠纷
  7. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  8. // | 微信公众号:好象科技
  9. // | 访问官网:http://www.likemarket.net
  10. // | 访问社区:http://bbs.likemarket.net
  11. // | 访问手册:http://doc.likemarket.net
  12. // | 好象科技开发团队 版权所有 拥有最终解释权
  13. // +----------------------------------------------------------------------
  14. // | Author: LikeShopTeam
  15. // +----------------------------------------------------------------------
  16. namespace app\shopapi\logic;
  17. use app\common\enum\AccountLogEnum;
  18. use app\common\enum\SignEnum;
  19. use app\common\enum\YesNoEnum;
  20. use app\common\logic\AccountLogLogic;
  21. use app\common\logic\BaseLogic;
  22. use app\common\model\SignDaily;
  23. use app\common\model\SignLog;
  24. use app\common\model\User;
  25. use app\common\service\ConfigService;
  26. use app\common\service\FileService;
  27. use think\facade\Db;
  28. /**
  29. * 签到逻辑层
  30. * Class SignLogic
  31. * @package app\shopapi\logic
  32. */
  33. class SignLogic extends BaseLogic
  34. {
  35. /**
  36. * @notes 查看签到列表
  37. * @param $userId
  38. * @return array
  39. * @author Tab
  40. * @date 2021/8/16 16:49
  41. */
  42. public static function lists($userId)
  43. {
  44. // 用户信息
  45. $user = User::field('nickname,avatar,user_integral')->findOrEmpty($userId)->toArray();
  46. $user['avatar'] = FileService::getFileUrl($user['avatar']);
  47. // 先标识用户当天未签到
  48. $user['today_sign'] = false;
  49. // 先标识用户连续签到天数为0
  50. $user['continuous_days'] = 0;
  51. // 获取昨天签到记录
  52. $yesterdaySign = SignLog::where('user_id', $userId)->whereDay('create_time', 'yesterday')->findOrEmpty();
  53. if(!$yesterdaySign->isEmpty()) {
  54. // 读取连续签到天数
  55. $user['continuous_days'] = $yesterdaySign['days'];
  56. }
  57. // 获取当天签到记录
  58. $todaySign = SignLog::where('user_id', $userId)->whereDay('create_time')->findOrEmpty();
  59. if(!$todaySign->isEmpty()) {
  60. // 标识用户已签到
  61. $user['today_sign'] = true;
  62. // 读取连续签到天数
  63. $user['continuous_days'] = $todaySign['days'];
  64. }
  65. // 获取签到规则列表
  66. $signDailyLists = SignDaily::field('type,days,integral,integral_status')->order(['type' => 'asc', 'days' => 'asc'])->column('*', 'days');
  67. $lists =[];
  68. if(!empty($signDailyLists)) {
  69. // 格式化列表
  70. $lists = self::format($signDailyLists, $user);
  71. }
  72. $isOpen = ConfigService::get('sign', 'is_open', YesNoEnum::NO);
  73. $earn = [];
  74. if ($isOpen && $signDailyLists) {
  75. // 赚积分
  76. $earn[] = [
  77. 'name' => '每日签到',
  78. 'is_done' => $user['today_sign'],
  79. 'integral' => $signDailyLists[1]['integral_status'] ? $signDailyLists[1]['integral'] : 0,
  80. 'icon' => FileService::getFileUrl('resource/image/shopapi/default/sign.png')
  81. ];
  82. }
  83. return [
  84. 'user' => $user,
  85. 'lists' => $lists,
  86. 'earn' => $earn,
  87. 'is_open' => $isOpen,
  88. ];
  89. }
  90. /**
  91. * @notes 格式化连续签到列表
  92. * @param $lists
  93. * @param $user
  94. * @return array
  95. * @author Tab
  96. * @date 2021/8/16 16:38
  97. */
  98. public static function format($lists, $user)
  99. {
  100. // 取最后一个数组元素
  101. $last = end($lists);
  102. $data = [];
  103. for($i = 1; $i <= $last['days']; $i++) {
  104. $item['day'] = $i . '天';
  105. if(isset($lists[$i]) && $i > 1) {
  106. // 每日签到奖励
  107. $dayIntegral = $lists[1]['integral_status'] ? $lists[1]['integral'] : 0;
  108. // 有连续签到奖励 : 连续签到赠送积分 + 每日签到赠送积分
  109. $item['integral'] = $lists[$i]['integral_status'] ? ($lists[$i]['integral'] + $dayIntegral) : $dayIntegral;
  110. $item['is_sign'] = $i <= $user['continuous_days'];
  111. }else{
  112. // 没有连续签到奖励: 每日签到赠送积分
  113. $item['integral'] = $lists[1]['integral_status'] ? $lists[1]['integral'] : 0;
  114. $item['is_sign'] = $i <= $user['continuous_days'];
  115. }
  116. $data[] = $item;
  117. }
  118. return $data;
  119. }
  120. /**
  121. * @notes 签到
  122. * @param $userId
  123. * @return array|bool
  124. * @author Tab
  125. * @date 2021/8/16 17:35
  126. */
  127. public static function sign($userId)
  128. {
  129. Db::startTrans();
  130. try {
  131. $isOpen = ConfigService::get('sign', 'is_open', YesNoEnum::YES);
  132. if(!$isOpen) {
  133. throw new \think\Exception('系统已关闭签到功能');
  134. }
  135. // 判断是否已签到
  136. $signLog = SignLog::where('user_id', $userId)->whereDay('create_time')->findOrEmpty();
  137. if(!$signLog->isEmpty()) {
  138. throw new \think\Exception('今天已签到,请明天再来');
  139. }
  140. // 判断是否连续签到
  141. $continuousDays = 0;
  142. $yesterdaySignLog = SignLog::where('user_id', $userId)->whereDay('create_time', 'yesterday')->findOrEmpty();
  143. if(!$yesterdaySignLog->isEmpty()) {
  144. // 记录已连续签到天数
  145. $continuousDays = $yesterdaySignLog['days'];
  146. }
  147. // 计算积分赠送数量
  148. $dailySign = SignDaily::order(['type' => 'asc', 'days' => 'asc'])->column('*', 'days');
  149. if(empty($dailySign)) {
  150. // 每日签到赠送积分
  151. $integral = 0;
  152. // 连续签到赠送积分
  153. $continuousIntegral = 0;
  154. }
  155. // 首次签到
  156. $integral = isset($dailySign[1]) && $dailySign[1]['integral_status'] ? $dailySign[1]['integral'] : 0;
  157. if($continuousDays == 0) {
  158. $continuousIntegral = 0;
  159. } else { // 连续签到
  160. $continuousIntegral = isset($dailySign[$continuousDays + 1]) && $dailySign[$continuousDays + 1]['integral_status'] ? $dailySign[$continuousDays + 1]['integral'] : 0;
  161. }
  162. // 获取最大连续签到天数
  163. $maxDays = SignDaily::max('days');
  164. $continuousDays = $continuousDays >= $maxDays ? 0 : $continuousDays;
  165. $data = [
  166. 'days' => $continuousDays + 1,
  167. 'user_id' => $userId,
  168. 'integral' => $integral,
  169. 'continuous_integral' => $continuousIntegral
  170. ];
  171. $signLog = SignLog::create($data);
  172. // 增加用户积分
  173. $user = User::findOrEmpty($userId);
  174. $user->user_integral = $user->user_integral + $integral + $continuousIntegral;
  175. $user->save();
  176. // 记录积分流水
  177. $remark = $continuousDays == 0 ? '每日签到' : '连续签到' . ($continuousDays + 1) . '天';
  178. AccountLogLogic::add($userId, AccountLogEnum::INTEGRAL_INC_SIGN, AccountLogEnum::INC, ($integral + $continuousIntegral), '', $remark);
  179. Db::commit();
  180. return [
  181. 'total_integral' => $integral + $continuousIntegral,
  182. 'days' => $continuousDays + 1
  183. ];
  184. } catch(\Exception $e) {
  185. Db::rollback();
  186. self::setError($e->getMessage());
  187. return false;
  188. }
  189. }
  190. }