UserSignServices.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\services\user;
  13. use app\services\BaseServices;
  14. use app\dao\user\UserSignDao;
  15. use app\services\user\member\MemberCardServices;
  16. use crmeb\exceptions\ApiException;
  17. use think\facade\Log;
  18. /**
  19. *
  20. * Class UserSignServices
  21. * @package app\services\user
  22. */
  23. class UserSignServices extends BaseServices
  24. {
  25. /**
  26. * UserSignServices constructor.
  27. * @param UserSignDao $dao
  28. */
  29. public function __construct(UserSignDao $dao)
  30. {
  31. $this->dao = $dao;
  32. }
  33. /**
  34. * 获取用户是否签到
  35. * @param $uid
  36. * @return bool
  37. */
  38. public function getIsSign(int $uid, string $type = 'today')
  39. {
  40. return (bool)$this->dao->count(['uid' => $uid, 'time' => $type]);
  41. }
  42. /**
  43. * 获取用户累计签到次数
  44. * @Parma int $uid 用户id
  45. * @return int
  46. * */
  47. public function getSignSumDay(int $uid)
  48. {
  49. return $this->dao->count(['uid' => $uid]);
  50. }
  51. /**
  52. * 设置签到数据
  53. * @param int $uid 用户uid
  54. * @param string $title 签到说明
  55. * @param int $number 签到获得积分
  56. * @param int $balance 签到前剩余积分
  57. * @return object
  58. * */
  59. public function setSignData($uid, $title = '', $number = 0, $integral_balance = 0, $exp_banlance = 0, $exp_num = 0)
  60. {
  61. $data = [];
  62. $data['uid'] = $uid;
  63. $data['title'] = $title;
  64. $data['number'] = $number;
  65. $data['balance'] = $integral_balance + $number;
  66. $data['add_time'] = time();
  67. if (!$this->dao->save($data)) {
  68. throw new ApiException(410290);
  69. }
  70. /** @var UserBillServices $userBill */
  71. $userBill = app()->make(UserBillServices::class);
  72. $data['mark'] = $title;
  73. $userBill->incomeIntegral($uid, 'sign', $data);
  74. if ($exp_num) {
  75. $data['number'] = $exp_num;
  76. $data['category'] = 'exp';
  77. $data['type'] = 'sign';
  78. $data['title'] = $data['mark'] = '签到奖励';
  79. $data['balance'] = $exp_banlance + $exp_num;
  80. $data['pm'] = 1;
  81. $data['status'] = 1;
  82. if (!$userBill->save($data)) {
  83. throw new ApiException(410291);
  84. }
  85. //检测会员等级
  86. try {
  87. //用户升级事件
  88. event('userLevelListener', [$uid]);
  89. } catch (\Throwable $e) {
  90. Log::error('会员等级升级失败,失败原因:' . $e->getMessage());
  91. }
  92. }
  93. return true;
  94. }
  95. /**
  96. * 获取用户签到列表
  97. * @param int $uid
  98. * @param string $field
  99. * @throws \think\db\exception\DataNotFoundException
  100. * @throws \think\db\exception\DbException
  101. * @throws \think\db\exception\ModelNotFoundException
  102. */
  103. public function getUserSignList(int $uid, string $field = '*')
  104. {
  105. [$page, $limit] = $this->getPageValue();
  106. $list = $this->dao->getList(['uid' => $uid], $field, $page, $limit);
  107. foreach ($list as &$item) {
  108. $item['add_time'] = $item['add_time'] ? date('Y-m-d', $item['add_time']) : '';
  109. }
  110. return $list;
  111. }
  112. /**
  113. * 用户签到
  114. * @param $uid
  115. * @return bool|int|mixed
  116. * @throws \think\db\exception\DataNotFoundException
  117. * @throws \think\db\exception\DbException
  118. * @throws \think\db\exception\ModelNotFoundException
  119. */
  120. public function sign(int $uid)
  121. {
  122. $sign_list = \crmeb\services\GroupDataService::getData('sign_day_num') ?: [];
  123. if (!count($sign_list)) {
  124. throw new ApiException(410292);
  125. }
  126. /** @var UserServices $userServices */
  127. $userServices = app()->make(UserServices::class);
  128. $user = $userServices->getUserInfo($uid);
  129. if (!$user) {
  130. throw new ApiException(410032);
  131. }
  132. if ($this->getIsSign($uid, 'today')) {
  133. throw new ApiException(410293);
  134. }
  135. $sign_num = 0;
  136. $user_sign_num = $user['sign_num'];
  137. //检测昨天是否签到
  138. if ($this->getIsSign($uid, 'yesterday')) {
  139. if ($user->sign_num > (count($sign_list) - 1)) {
  140. $user->sign_num = 0;
  141. }
  142. } else {
  143. $user->sign_num = 0;
  144. }
  145. foreach ($sign_list as $key => $item) {
  146. if ($key == $user->sign_num) {
  147. $sign_num = $item['sign_num'];
  148. break;
  149. }
  150. }
  151. $user->sign_num += 1;
  152. if ($user->sign_num == count($sign_list)) {
  153. $title = '连续签到奖励';
  154. } else {
  155. $title = '签到奖励';
  156. }
  157. //会员签到积分会员奖励
  158. if ($user->is_money_level > 0) {
  159. //看是否开启签到积分翻倍奖励
  160. /** @var MemberCardServices $memberCardService */
  161. $memberCardService = app()->make(MemberCardServices::class);
  162. $sign_rule_number = $memberCardService->isOpenMemberCard('sign');
  163. if ($sign_rule_number) {
  164. $old_num = $sign_num;
  165. $sign_num = (int)$sign_rule_number * $sign_num;
  166. $up_num = $sign_num - $old_num;
  167. if ($user->sign_num == count($sign_list)) {
  168. $title = '连续签到奖励(SVIP+' . $up_num . ')';
  169. } else {
  170. $title = '签到奖励(SVIP+' . $up_num . ')';
  171. }
  172. }
  173. }
  174. //用户等级是否开启
  175. $exp_num = 0;
  176. if (sys_config('member_func_status', 1)) {
  177. $exp_num = sys_config('sign_give_exp');
  178. }
  179. //增加签到数据
  180. $this->transaction(function () use ($uid, $title, $sign_num, $user, $exp_num) {
  181. $this->setSignData($uid, $title, $sign_num, $user['integral'], (int)$user['exp'], $exp_num);
  182. $user->integral = (int)$user->integral + (int)$sign_num;
  183. if ($exp_num) $user->exp = (int)$user->exp + (int)$exp_num;
  184. if (!$user->save()) {
  185. throw new ApiException(410287);
  186. }
  187. });
  188. return $sign_num;
  189. }
  190. /**
  191. * 签到用户信息
  192. * @param int $uid
  193. * @param $sign
  194. * @param $integral
  195. * @param $all
  196. * @return mixed
  197. */
  198. public function signUser(int $uid, $sign, $integral, $all)
  199. {
  200. /** @var UserServices $userServices */
  201. $userServices = app()->make(UserServices::class);
  202. $user = $userServices->getUserInfo($uid);
  203. if (!$user) {
  204. throw new ApiException(100026);
  205. }
  206. //是否统计签到
  207. if ($sign || $all) {
  208. $user['sum_sgin_day'] = $this->getSignSumDay($user['uid']);
  209. $user['is_day_sgin'] = $this->getIsSign($user['uid']);
  210. $user['is_YesterDay_sgin'] = $this->getIsSign($user['uid'], 'yesterday');
  211. if (!$user['is_day_sgin'] && !$user['is_YesterDay_sgin']) {
  212. $user['sign_num'] = 0;
  213. }
  214. }
  215. //是否统计积分使用情况
  216. if ($integral || $all) {
  217. /** @var UserBillServices $userBill */
  218. $userBill = app()->make(UserBillServices::class);
  219. $user['sum_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', 'sign,system_add,gain,lottery_add,product_gain,pay_product_integral_back'));
  220. $user['deduction_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', 'deduction,lottery_use,order_deduction', '', true) ?? 0);
  221. $user['today_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', 'sign,system_add,gain,product_gain,lottery_add,pay_product_integral_back', 'today'));
  222. /** @var UserBillServices $userBillServices */
  223. $userBillServices = app()->make(UserBillServices::class);
  224. $user['frozen_integral'] = $userBillServices->getBillSum(['uid' => $user['uid'], 'is_frozen' => 1]);
  225. }
  226. unset($user['pwd']);
  227. if (!$user['is_promoter']) {
  228. $user['is_promoter'] = (int)sys_config('store_brokerage_statu') == 2;
  229. }
  230. return $user->hidden(['account', 'real_name', 'birthday', 'card_id', 'mark', 'partner_id', 'group_id', 'add_time', 'add_ip', 'phone', 'last_time', 'last_ip', 'spread_uid', 'spread_time', 'user_type', 'status', 'level', 'clean_time', 'addres'])->toArray();
  231. }
  232. /**
  233. * 获取签到
  234. * @param $uid
  235. * @return array
  236. */
  237. public function getSignMonthList($uid)
  238. {
  239. [$page, $limit] = $this->getPageValue();
  240. $data = $this->dao->getListGroup(['uid' => $uid], 'FROM_UNIXTIME(add_time,"%Y-%m") as time,group_concat(id SEPARATOR ",") ids', $page, $limit, 'time');
  241. $list = [];
  242. if ($data) {
  243. $ids = array_unique(array_column($data, 'ids'));
  244. $dataIdsList = $this->dao->getList(['id' => $ids], 'FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time,title,number,id,uid', 0, 0);
  245. foreach ($data as $item) {
  246. $value['month'] = $item['time'];
  247. $value['list'] = array_merge(array_filter($dataIdsList, function ($val) use ($item) {
  248. if (in_array($val['id'], explode(',', $item['ids']))) {
  249. return $val;
  250. }
  251. }));
  252. array_push($list, $value);
  253. }
  254. }
  255. return $list;
  256. }
  257. }