UserSignServices.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 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\jobs\user\UserLevelJob;
  14. use app\services\BaseServices;
  15. use app\services\user\member\MemberCardServices;
  16. use app\dao\user\UserSignDao;
  17. use think\exception\ValidateException;
  18. /**
  19. *
  20. * Class UserSignServices
  21. * @package app\services\user
  22. * @mixin UserSignDao
  23. */
  24. class UserSignServices extends BaseServices
  25. {
  26. /**
  27. * UserSignServices constructor.
  28. * @param UserSignDao $dao
  29. */
  30. public function __construct(UserSignDao $dao)
  31. {
  32. $this->dao = $dao;
  33. }
  34. /**
  35. * 获取用户是否签到
  36. * @param $uid
  37. * @return bool
  38. */
  39. public function getIsSign(int $uid, string $type = 'today')
  40. {
  41. return (bool)$this->dao->count(['uid' => $uid, 'time' => $type]);
  42. }
  43. /**
  44. * 获取用户累计签到次数
  45. * @Parma int $uid 用户id
  46. * @return int
  47. * */
  48. public function getSignSumDay(int $uid)
  49. {
  50. return $this->dao->count(['uid' => $uid]);
  51. }
  52. /**
  53. * 设置签到数据
  54. * @param int $uid 用户uid
  55. * @param string $title 签到说明
  56. * @param int $number 签到获得积分
  57. * @param int $integral_balance
  58. * @param int $exp_banlance
  59. * @param int $exp_num
  60. * @return bool
  61. * @throws \think\Exception
  62. */
  63. public function setSignData($uid, $title = '', $number = 0, $integral_balance = 0, $exp_banlance = 0, $exp_num = 0)
  64. {
  65. $data = [];
  66. $data['uid'] = $uid;
  67. $data['title'] = $title;
  68. $data['number'] = $number;
  69. $data['balance'] = $integral_balance;
  70. $data['add_time'] = time();
  71. if (!$this->dao->save($data)) {
  72. throw new ValidateException('添加签到数据失败');
  73. }
  74. /** @var UserBillServices $userBill */
  75. $userBill = app()->make(UserBillServices::class);
  76. $data['mark'] = $title;
  77. $userBill->incomeIntegral($uid, 'sign', $data);
  78. if ($exp_num) {
  79. $data['number'] = $exp_num;
  80. $data['category'] = 'exp';
  81. $data['type'] = 'sign';
  82. $data['title'] = $data['mark'] = '签到奖励';
  83. $data['balance'] = $exp_banlance;
  84. $data['pm'] = 1;
  85. $data['status'] = 1;
  86. if (!$userBill->save($data)) {
  87. throw new ValidateException('赠送经验失败');
  88. }
  89. //检测会员等级
  90. UserLevelJob::dispatch([$uid]);
  91. }
  92. return true;
  93. }
  94. /**
  95. * 获取用户签到列表
  96. * @param int $uid
  97. * @param string $field
  98. * @throws \think\db\exception\DataNotFoundException
  99. * @throws \think\db\exception\DbException
  100. * @throws \think\db\exception\ModelNotFoundException
  101. */
  102. public function getUserSignList(int $uid, string $field = '*')
  103. {
  104. [$page, $limit] = $this->getPageValue();
  105. $list = $this->dao->getList(['uid' => $uid], $field, $page, $limit);
  106. foreach ($list as &$item) {
  107. $item['add_time'] = $item['add_time'] ? date('Y-m-d', $item['add_time']) : '';
  108. }
  109. return $list;
  110. }
  111. /**
  112. * 用户签到
  113. * @param $uid
  114. * @return bool|int|mixed
  115. * @throws \think\db\exception\DataNotFoundException
  116. * @throws \think\db\exception\DbException
  117. * @throws \think\db\exception\ModelNotFoundException
  118. */
  119. public function sign(int $uid)
  120. {
  121. $sign_list = \crmeb\services\GroupDataService::getData('sign_day_num') ?: [];
  122. if (!count($sign_list)) {
  123. throw new ValidateException('请先配置签到天数');
  124. }
  125. /** @var UserServices $userServices */
  126. $userServices = app()->make(UserServices::class);
  127. $user = $userServices->getUserInfo($uid);
  128. if (!$user) {
  129. throw new ValidateException('用户不存在');
  130. }
  131. if ($this->getIsSign($uid, 'today')) {
  132. throw new ValidateException('已经签到');
  133. }
  134. //检测昨天是否签到
  135. if ($this->getIsSign($uid, 'yesterday')) {
  136. if ($user->sign_num > (count($sign_list) - 1)) {
  137. $user->sign_num = 0;
  138. }
  139. } else {
  140. $user->sign_num = 0;
  141. }
  142. $integral_num = 0;
  143. foreach ($sign_list as $key => $item) {
  144. if ($key == $user->sign_num) {
  145. $integral_num = $item['sign_num'];
  146. break;
  147. }
  148. }
  149. //会员签到积分会员奖励
  150. if ($user->is_money_level > 0) {
  151. //看是否开启签到积分翻倍奖励
  152. /** @var MemberCardServices $memberCardService */
  153. $memberCardService = app()->make(MemberCardServices::class);
  154. $sign_rule_number = $memberCardService->isOpenMemberCardCache('sign');
  155. if ($sign_rule_number) {
  156. $integral_num = (int)$sign_rule_number * $integral_num;
  157. }
  158. }
  159. $user_data = [];
  160. $user_data['sign_num'] = bcadd((string)$user->sign_num, '1', 0);
  161. if ($user_data['sign_num'] > 1) {
  162. $title = '连续签到奖励';
  163. } else {
  164. $title = '签到奖励';
  165. }
  166. //用户等级是否开启
  167. $exp_num = 0;
  168. if (sys_config('member_func_status', 1)) {
  169. $exp_num = sys_config('sign_give_exp');
  170. }
  171. //增加签到数据
  172. $this->transaction(function () use ($uid, $title, $integral_num, $user, $exp_num, $user_data, $userServices) {
  173. $user_data['integral'] = $integral_balance = bcadd((string)$user['integral'], (string)$integral_num, 0);
  174. $user_data['exp'] = $exp_balance = bcadd((string)$user['exp'], (string)$exp_num);
  175. $this->setSignData($uid, $title, $integral_num, $integral_balance, $exp_balance, $exp_num);
  176. if (!$userServices->update($user->uid, $user_data)) {
  177. throw new ValidateException('修改用户信息失败');
  178. }
  179. });
  180. return $integral_num;
  181. }
  182. /**
  183. * 签到用户信息
  184. * @param int $uid
  185. * @param $sign
  186. * @param $integral
  187. * @param $all
  188. * @return mixed
  189. */
  190. public function signUser(int $uid, $sign, $integral, $all)
  191. {
  192. /** @var UserServices $userServices */
  193. $userServices = app()->make(UserServices::class);
  194. $user = $userServices->getUserInfo($uid);
  195. if (!$user) {
  196. throw new ValidateException('数据不存在');
  197. }
  198. //是否统计签到
  199. if ($sign || $all) {
  200. $user['sum_sgin_day'] = $this->getSignSumDay($user['uid']);
  201. $user['is_day_sgin'] = $this->getIsSign($user['uid']);
  202. $user['is_YesterDay_sgin'] = $this->getIsSign($user['uid'], 'yesterday');
  203. if (!$user['is_day_sgin'] && !$user['is_YesterDay_sgin']) {
  204. $user['sign_num'] = 0;
  205. }
  206. }
  207. /** @var UserIntegralServices $userIntegralServices */
  208. $userIntegralServices = app()->make(UserIntegralServices::class);
  209. [$clear_integral, $clear_time] = $userIntegralServices->getUserClearIntegral($uid, $user);
  210. $user['clear_integral'] = $clear_integral;
  211. $user['clear_time'] = $clear_time;
  212. //是否统计积分使用情况
  213. if ($integral || $all) {
  214. /** @var UserBillServices $userBill */
  215. $userBill = app()->make(UserBillServices::class);
  216. $user['sum_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', '', '', true));
  217. $user['deduction_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral') ?? 0);
  218. $user['today_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', '', 'today', true));
  219. }
  220. unset($user['pwd']);
  221. if (!$user['is_promoter']) {
  222. $user['is_promoter'] = (int)sys_config('store_brokerage_statu') == 2;
  223. }
  224. 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();
  225. }
  226. /**
  227. * 获取签到
  228. * @param $uid
  229. * @return array
  230. */
  231. public function getSignMonthList($uid)
  232. {
  233. [$page, $limit] = $this->getPageValue();
  234. $data = $this->dao->getListGroup(['uid' => $uid], 'FROM_UNIXTIME(add_time,"%Y-%m") as time,group_concat(id SEPARATOR ",") ids', $page, $limit, 'time');
  235. $list = [];
  236. if ($data) {
  237. $ids = array_unique(array_column($data, 'ids'));
  238. $dataIdsList = $this->dao->getList(['id' => $ids], 'FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time,title,number,id,uid', 0, 0);
  239. foreach ($data as $item) {
  240. $value['month'] = $item['time'];
  241. $value['list'] = array_merge(array_filter($dataIdsList, function ($val) use ($item) {
  242. if (in_array($val['id'], explode(',', $item['ids']))) {
  243. return $val;
  244. }
  245. }));
  246. array_push($list, $value);
  247. }
  248. }
  249. return $list;
  250. }
  251. }