123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <?php
- declare (strict_types=1);
- namespace app\services\user;
- use app\jobs\user\UserLevelJob;
- use app\services\BaseServices;
- use app\services\user\member\MemberCardServices;
- use app\dao\user\UserSignDao;
- use think\exception\ValidateException;
- class UserSignServices extends BaseServices
- {
-
- public function __construct(UserSignDao $dao)
- {
- $this->dao = $dao;
- }
-
- public function getIsSign(int $uid, string $type = 'today')
- {
- return (bool)$this->dao->count(['uid' => $uid, 'time' => $type]);
- }
-
- public function getSignSumDay(int $uid)
- {
- return $this->dao->count(['uid' => $uid]);
- }
-
- public function setSignData($uid, $title = '', $number = 0, $integral_balance = 0, $exp_banlance = 0, $exp_num = 0)
- {
- $data = [];
- $data['uid'] = $uid;
- $data['title'] = $title;
- $data['number'] = $number;
- $data['balance'] = $integral_balance;
- $data['add_time'] = time();
- if (!$this->dao->save($data)) {
- throw new ValidateException('添加签到数据失败');
- }
-
- $userBill = app()->make(UserBillServices::class);
- $data['mark'] = $title;
- $userBill->incomeIntegral($uid, 'sign', $data);
- if ($exp_num) {
- $data['number'] = $exp_num;
- $data['category'] = 'exp';
- $data['type'] = 'sign';
- $data['title'] = $data['mark'] = '签到奖励';
- $data['balance'] = $exp_banlance;
- $data['pm'] = 1;
- $data['status'] = 1;
- if (!$userBill->save($data)) {
- throw new ValidateException('赠送经验失败');
- }
-
- UserLevelJob::dispatch([$uid]);
- }
- return true;
- }
-
- public function getUserSignList(int $uid, string $field = '*')
- {
- [$page, $limit] = $this->getPageValue();
- $list = $this->dao->getList(['uid' => $uid], $field, $page, $limit);
- foreach ($list as &$item) {
- $item['add_time'] = $item['add_time'] ? date('Y-m-d', $item['add_time']) : '';
- }
- return $list;
- }
-
- public function sign(int $uid)
- {
- $sign_list = \crmeb\services\GroupDataService::getData('sign_day_num') ?: [];
- if (!count($sign_list)) {
- throw new ValidateException('请先配置签到天数');
- }
-
- $userServices = app()->make(UserServices::class);
- $user = $userServices->getUserInfo($uid);
- if (!$user) {
- throw new ValidateException('用户不存在');
- }
- if ($this->getIsSign($uid, 'today')) {
- throw new ValidateException('已经签到');
- }
-
- if ($this->getIsSign($uid, 'yesterday')) {
- if ($user->sign_num > (count($sign_list) - 1)) {
- $user->sign_num = 0;
- }
- } else {
- $user->sign_num = 0;
- }
- $integral_num = 0;
- foreach ($sign_list as $key => $item) {
- if ($key == $user->sign_num) {
- $integral_num = $item['sign_num'];
- break;
- }
- }
-
- if ($user->is_money_level > 0) {
-
-
- $memberCardService = app()->make(MemberCardServices::class);
- $sign_rule_number = $memberCardService->isOpenMemberCardCache('sign');
- if ($sign_rule_number) {
- $integral_num = (int)$sign_rule_number * $integral_num;
- }
- }
- $user_data = [];
- $user_data['sign_num'] = bcadd((string)$user->sign_num, '1', 0);
- if ($user_data['sign_num'] > 1) {
- $title = '连续签到奖励';
- } else {
- $title = '签到奖励';
- }
-
- $exp_num = 0;
- if (sys_config('member_func_status', 1)) {
- $exp_num = sys_config('sign_give_exp');
- }
-
- $this->transaction(function () use ($uid, $title, $integral_num, $user, $exp_num, $user_data, $userServices) {
- $user_data['integral'] = $integral_balance = bcadd((string)$user['integral'], (string)$integral_num, 0);
- $user_data['exp'] = $exp_balance = bcadd((string)$user['exp'], (string)$exp_num);
- $this->setSignData($uid, $title, $integral_num, $integral_balance, $exp_balance, $exp_num);
- if (!$userServices->update($user->uid, $user_data)) {
- throw new ValidateException('修改用户信息失败');
- }
- });
- return $integral_num;
- }
-
- public function signUser(int $uid, $sign, $integral, $all)
- {
-
- $userServices = app()->make(UserServices::class);
- $user = $userServices->getUserInfo($uid);
- if (!$user) {
- throw new ValidateException('数据不存在');
- }
-
- if ($sign || $all) {
- $user['sum_sgin_day'] = $this->getSignSumDay($user['uid']);
- $user['is_day_sgin'] = $this->getIsSign($user['uid']);
- $user['is_YesterDay_sgin'] = $this->getIsSign($user['uid'], 'yesterday');
- if (!$user['is_day_sgin'] && !$user['is_YesterDay_sgin']) {
- $user['sign_num'] = 0;
- }
- }
-
- $userIntegralServices = app()->make(UserIntegralServices::class);
- [$clear_integral, $clear_time] = $userIntegralServices->getUserClearIntegral($uid, $user);
- $user['clear_integral'] = $clear_integral;
- $user['clear_time'] = $clear_time;
-
- if ($integral || $all) {
-
- $userBill = app()->make(UserBillServices::class);
- $user['sum_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', '', '', true));
- $user['deduction_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral') ?? 0);
- $user['today_integral'] = intval($userBill->getRecordCount($user['uid'], 'integral', '', 'today', true));
- }
- unset($user['pwd']);
- if (!$user['is_promoter']) {
- $user['is_promoter'] = (int)sys_config('store_brokerage_statu') == 2;
- }
- 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();
- }
-
- public function getSignMonthList($uid)
- {
- [$page, $limit] = $this->getPageValue();
- $data = $this->dao->getListGroup(['uid' => $uid], 'FROM_UNIXTIME(add_time,"%Y-%m") as time,group_concat(id SEPARATOR ",") ids', $page, $limit, 'time');
- $list = [];
- if ($data) {
- $ids = array_unique(array_column($data, 'ids'));
- $dataIdsList = $this->dao->getList(['id' => $ids], 'FROM_UNIXTIME(add_time,"%Y-%m-%d") as add_time,title,number,id,uid', 0, 0);
- foreach ($data as $item) {
- $value['month'] = $item['time'];
- $value['list'] = array_merge(array_filter($dataIdsList, function ($val) use ($item) {
- if (in_array($val['id'], explode(',', $item['ids']))) {
- return $val;
- }
- }));
- array_push($list, $value);
- }
- }
- return $list;
- }
- }
|