| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- <?php
- // +----------------------------------------------------------------------
- // | Laravel框架 [ Laravel ]
- // +----------------------------------------------------------------------
- // | 版权所有 2017~2021 Laravel研发中心
- // +----------------------------------------------------------------------
- // | 官方网站: http://www.laravel.cn
- // +----------------------------------------------------------------------
- // | Author: wesmiler <12345678@qq.com>
- // +----------------------------------------------------------------------
- namespace App\Services;
- use App\Models\CityModel;
- use App\Models\FansModel;
- use App\Models\MemberModel;
- use App\Models\SiyuanModel;
- use App\Models\TradeModel;
- use SimpleSoftwareIO\QrCode\Facades\QrCode;
- /**
- * 会员管理-服务类
- * @author wesmiler
- * @since 2020/11/11
- * Class MemberService
- * @package App\Services
- */
- class MemberService extends BaseService
- {
- protected static $instance = null;
- /**
- * 构造函数
- * @author wesmiler
- * @since 2020/11/11
- * MemberService constructor.
- */
- public function __construct()
- {
- $this->model = new MemberModel();
- $this->cityModel = new CityModel();
- }
- /**
- * 静态入口
- * @return MemberService|null
- */
- public static function make(){
- if(!self::$instance){
- self::$instance = new MemberService();
- }
- return self::$instance;
- }
- /**
- * 添加会编辑会员
- * @return array
- * @since 2020/11/11
- * @author wesmiler
- */
- public function edit()
- {
- // 请求参数
- $data = request()->all();
- // 头像处理
- $avatar = trim($data['avatar']);
- if (strpos($avatar, "temp")) {
- $data['avatar'] = save_image($avatar, 'member');
- } else {
- $data['avatar'] = str_replace(IMG_URL, "", $data['avatar']);
- }
- // 出生日期
- if ($data['birthday']) {
- $data['birthday'] = strtotime($data['birthday']);
- }
- // 城市处理
- $city = isset($data['city']) ? $data['city'] : [3];
- if (!empty($data['city'])) {
- // 省份
- $data['province_id'] = $city[0];
- // 城市
- $data['city_id'] = $city[1];
- // 县区
- $data['district_id'] = $city[2];
- }
- unset($data['city']);
- return parent::edit($data); // TODO: Change the autogenerated stub
- }
- /**
- * 获取用户信息
- * @param $openid OPENID
- * @param array $field m用户表
- * @return array
- */
- public function getUserInfo($where, $field = [], $type=0)
- {
- $field = $field ? $field : ['m.id', 'm.openid', 'm.invite_id','m.birthday','m.age','m.gender','m.intro','m.province_id','m.city_id','m.district_id', 'ms.type as mtype', 'yg.status as yigong_status','yg.on_siyuan as yg_on_siyuan','yg.siyuan_id','ms.siyuan','ms.on_siyuan as sr_on_siyuan', 'ms.master_type', 'ms.realname as master_name', 'ms.status as master_status', 'm.mobile', 'm.nickname', 'm.avatar', 'm.gender', 'm.member_level', 'm.is_vip', 'm.realname', 'm.balance', 'm.salary', 'm.merits_num', 'm.coupon', 'm.score', 'm.login_time','m.intro', 'm.status'];
- $info = $this->model::from('member as m')
- ->leftJoin('member_level as ml', 'ml.id', '=', 'm.member_level')
- ->leftJoin('master as ms', 'ms.user_id', '=', 'm.id')
- ->leftJoin('yigong as yg', 'yg.user_id', '=', 'm.id')
- ->select($field)
- ->where($where)
- ->where('m.status', '>', 0)
- ->first();
- $info = $info ? $info->toArray() : [];
- if (isset($info['avatar'])) {
- $info['avatar'] = $info['avatar'] ? get_image_url($info['avatar']) : '';
- }
- if($info){
- // 僧人参数
- if(array_key_exists('mtype', $info)){
- $info['mtype'] = $info['mtype']? intval($info['mtype']) : 0;
- }
- if(array_key_exists('master_type', $info)){
- $info['master_type'] = $info['master_type']? intval($info['master_type']) : 0;
- }
- if(array_key_exists('master_status', $info)){
- $info['master_status'] = $info['master_status']? intval($info['master_status']) : 0;
- }
- if(array_key_exists('master_name', $info)){
- $info['master_name'] = $info['master_name']? trim($info['master_name']) : '';
- }
- if(array_key_exists('yigong_siyuan', $info)){
- $info['yigong_siyuan'] = $info['yigong_siyuan']? trim($info['yigong_siyuan']) : '';
- }
- if(array_key_exists('yg_on_siyuan', $info)){
- $info['yg_on_siyuan'] = $info['yg_on_siyuan']? intval($info['yg_on_siyuan']) : 0;
- }
- if(array_key_exists('yigong_status', $info)){
- $info['yigong_status'] = $info['yigong_status']? intval($info['yigong_status']) : 0;
- }
- if(array_key_exists('siyuan', $info)){
- $info['siyuan'] = $info['siyuan']? trim($info['siyuan']) : '';
- }
- if(array_key_exists('sr_on_siyuan', $info)){
- $info['sr_on_siyuan'] = $info['sr_on_siyuan']? intval($info['sr_on_siyuan']) : 0;
- }
- $info['yg_siyuan'] = '';
- if(array_key_exists('siyuan_id', $info) && $info['siyuan_id']){
- $info['yg_siyuan'] = $info['siyuan_id']? SiyuanModel::where('id', $info['siyuan_id'])->value('title') : '';
- }
- if($type == 1) {
- // 城市
- $cityData = [0, 0, 0];
- $cityNames = [];
- if (isset($info['province_id'])) {
- $info['province_name'] = $info['province_id'] ? CityService::make()->getName($info['province_id']) : '';
- $cityData[0] = $info['province_id'] ? $info['province_id'] : 0;
- $cityNames[] = $info['province_name'] ? $info['province_name'] : '';
- }
- if (isset($info['city_id'])) {
- $info['city_name'] = $info['city_id'] ? CityService::make()->getName($info['city_id']) : '';
- $openid = isset($info['openid']) ? $info['openid'] : '';
- $cityData[1] = $info['city_id'] ? $info['city_id'] : 0;
- $cityNames[] = $info['city_name'] ? $info['city_name'] : '';
- if (empty($info['city_name']) && $openid) {
- $info['city_name'] = FansModel::where(['openid' => $openid])->value('city');
- }
- }
- if (isset($info['district_id'])) {
- $info['district_name'] = $info['district_id'] ? CityService::make()->getName($info['district_id']) : '';
- $cityData[2] = $info['district_id'] ? $info['district_id'] : 0;
- $cityNames[] = $info['district_name'] ? $info['district_name'] : '';
- }
- if ($cityData) {
- $info['cityData'] = $cityData;
- $info['cityText'] = implode(' ', array_filter($cityNames));
- }
- if (is_empty($info['age'])) {
- if (!is_empty($info['birthday'])) {
- $year = date('Y', $info['birthday']);
- $info['age'] = date('Y') - $year > 0 ? date('Y') - $year : 0;
- } else {
- $info['age'] = 0;
- }
- }
- if (is_empty($info['birthday'])) {
- $info['birthday'] = 0;
- } else {
- $info['birthday'] = date('Y-m-d', $info['birthday']);
- }
- if (is_empty($info['intro'])) {
- $info['intro'] = '';
- }
- if (is_empty($info['realname'])) {
- $info['realname'] = '';
- }
- // 二维码
- $url = env('WEB_URL') . '/pages/entry/auth?sid=' . $info['id'];
- $qrcode = WechatService::makeNormalQrcode($url);
- $info['qrcode'] = $qrcode ? get_image_url($qrcode) : '';
- }
- }
- return $info;
- }
- /**
- * 保存资料
- * @param $userId
- * @return array
- */
- public function saveInfo($userId){
- $params = request()->all();
- $memberInfo = $this->model::where(['id'=> $userId])->first();
- if(!$memberInfo){
- return message('用户账号不可操作', false);
- }
- if($params['avatar']){
- $memberInfo->avatar = trim($params['avatar']);
- }
- if($params['birthday']){
- $memberInfo->birthday = strtotime($params['birthday']);
- }
- if($params['age']){
- $memberInfo->age = strtotime($params['age']);
- }
- if(!is_empty($params['intro'])){
- $memberInfo->intro = trim($params['intro']);
- }
- if(!empty($params['cityCodes'])){
- $cityData = $params['cityCodes'];
- if(!is_empty($cityData[0]) && $cityData[0]){
- $memberInfo->province_id = $cityData[0];
- }
- if(!is_empty($cityData[1]) && $cityData[1]){
- $memberInfo->city_id = $cityData[1];
- }
- if(!is_empty($cityData[2]) && $cityData[2]){
- $memberInfo->district_id = $cityData[2];
- }
- }
- $memberInfo->nickname = trim($params['nickname']);
- $memberInfo->gender = intval($params['gender']);
- if($memberInfo->save()){
- return message('保存成功', true);
- }else{
- return message('保存失败', false);
- }
- }
- public function inviteAward($userId, $inviteId, $nickname=''){
- // 验证当前用户是否已经奖励过
- $cacheKey = "caches:invite:u{$userId}_s{$inviteId}";
- $check = TradeModel::where(['user_id'=> $userId,'type'=> 6,'source_uid'=> $inviteId,'status'=>1,'mark'=> 1])->value('id');
- if($check){
- RedisService::set($cacheKey.':error_catched', ['error'=>'当前奖励已发放','date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- // 验证当前邀请用户是否账户有效
- $inviteInfo = $this->model::where(['id'=> $inviteId,'mark'=> 1,'status'=> 1])
- ->select(['id','openid','nickname','score','coupon','merits_num'])
- ->first();
- if(!$inviteInfo){
- RedisService::set($cacheKey.':error_invite', ['error'=>'当前邀请用户状态异常','date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- // 是否到达人数限制
- $curTime = strtotime(date('Y-m-d'));
- $inviteConfig = ConfigService::make()->getConfigByGroup(14);
- $inviteLimit = isset($inviteConfig['invite_limit'])? $inviteConfig['invite_limit']['value'] : 0;
- $checkCount = TradeModel::where(['user_id'=> $userId,'type'=> 6,'status'=>1,'mark'=> 1])
- ->where('create_time','>=',$curTime)
- ->count('id');
- if($inviteLimit>0 && $checkCount>=$inviteLimit){
- RedisService::set($cacheKey.':error_limit', ['error'=>'今日奖励已到达限制人数:'.$inviteLimit,'date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- // 奖励花灯券
- \DB::beginTransaction();
- $coupon = isset($inviteConfig['invite_give_coupon'])? intval($inviteConfig['invite_give_coupon']['value']) : 0;
- if($coupon>0){
- // 账户
- if(!$this->model::where(['id'=> $inviteId])->increment('coupon', $coupon)){
- \DB::rollBack();
- RedisService::set($cacheKey.':error_coupon', ['error'=>'奖励花灯券账户更新失败:'.$coupon,'date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- $data = [
- 'user_id'=> $inviteId,
- 'source_uid'=> $userId,
- 'type'=> 6,
- 'coin_type'=> 1,
- 'pay_type'=> 4,
- 'money'=> $coupon,
- 'change_type'=> 1,
- 'balance'=> $inviteInfo->coupon,
- 'create_time'=> time(),
- 'remark'=> "邀请用户[{$nickname}],奖励{$coupon}花灯券",
- 'status'=> 1,
- ];
- if(!TradeModel::insertGetId($data)){
- \DB::rollBack();
- RedisService::set($cacheKey.':error_acccount_coupon', ['error'=>'奖励花灯券账户明细处理失败','data'=> $data,'date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- }
- // 奖励功德值
- $giveGd = isset($inviteConfig['invite_give_gd'])? intval($inviteConfig['invite_give_gd']['value']) : 0;
- if($giveGd>0){
- // 账户
- if(!$this->model::where(['id'=> $inviteId])->increment('merits_num', $giveGd)){
- \DB::rollBack();
- RedisService::set($cacheKey.':error_gd', ['error'=>'奖励功德值账户更新失败:'.$giveGd,'date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- $data = [
- 'user_id'=> $inviteId,
- 'source_uid'=> $userId,
- 'type'=> 6,
- 'coin_type'=> 4,
- 'pay_type'=> 4,
- 'money'=> $giveGd,
- 'change_type'=> 1,
- 'balance'=> $inviteInfo->merits_num,
- 'create_time'=> time(),
- 'remark'=> "邀请用户[{$nickname}],奖励{$giveGd}功德值",
- 'status'=> 1,
- ];
- if(!TradeModel::insertGetId($data)){
- \DB::rollBack();
- RedisService::set($cacheKey.':error_acccount_gd', ['error'=>'奖励花灯券账户明细处理失败','data'=> $data,'date'=> date('Y-m-d H:i:s')], 7200);
- return false;
- }
- }
- // 奖励积分
- \DB::commit();
- return true;
- }
- }
|