258 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			258 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace addons\xilufitness\services\user;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use addons\xilufitness\services\BaseService;
							 | 
						||
| 
								 | 
							
								use addons\xilufitness\services\ShopService;
							 | 
						||
| 
								 | 
							
								use think\Db;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class UserService extends BaseService
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected $model = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected function __initialize()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->model = new \addons\xilufitness\model\User;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取个人基本信息
							 | 
						||
| 
								 | 
							
								     * @return array|bool|false|\PDOStatement|string|\think\Model|null
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DataNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\ModelNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws \think\exception\DbException
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getUserInfo(int $brand_id){
							 | 
						||
| 
								 | 
							
								        $rechargeModel = new \addons\xilufitness\model\ActivityRecharge;
							 | 
						||
| 
								 | 
							
								        $coachModel = new \addons\xilufitness\model\Coach;
							 | 
						||
| 
								 | 
							
								        $info = $this->userInfo;
							 | 
						||
| 
								 | 
							
								        $rechargeInfo = $rechargeModel
							 | 
						||
| 
								 | 
							
								            ->normal()
							 | 
						||
| 
								 | 
							
								            ->where(['brand_id' => $brand_id])
							 | 
						||
| 
								 | 
							
								            ->field(['id','recharge_amount','account_amount','cut_amount'])
							 | 
						||
| 
								 | 
							
								            ->order("recharge_amount asc")
							 | 
						||
| 
								 | 
							
								            ->find();
							 | 
						||
| 
								 | 
							
								        if(!empty($info)){
							 | 
						||
| 
								 | 
							
								            $mobile = $info->getData('mobile');
							 | 
						||
| 
								 | 
							
								            $coachInfo = $coachModel
							 | 
						||
| 
								 | 
							
								                ->where(['coach_mobile' => $mobile ])
							 | 
						||
| 
								 | 
							
								                ->field(['id','coach_name'])
							 | 
						||
| 
								 | 
							
								                ->find();
							 | 
						||
| 
								 | 
							
								            $info->append(['is_coach']);
							 | 
						||
| 
								 | 
							
								            $info->is_coach = !empty($coachInfo) ? 1 : 0;
							 | 
						||
| 
								 | 
							
								            //解锁勋章
							 | 
						||
| 
								 | 
							
								            $mediaData['user_id'] = $this->auth->id;
							 | 
						||
| 
								 | 
							
								            $mediaData['brand_id'] = $this->brand_id;
							 | 
						||
| 
								 | 
							
								            \think\Hook::listen('xilufitness_medal_unlocking',$mediaData);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return ['info' => $info, 'recharge' => $rechargeInfo];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 保存基本信息
							 | 
						||
| 
								 | 
							
								     * @param array $params 保存的字段
							 | 
						||
| 
								 | 
							
								     * @param int $brand_id 品牌商id
							 | 
						||
| 
								 | 
							
								     * @return bool
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function saveBaseInfo(array $params, int $brand_id){
							 | 
						||
| 
								 | 
							
								        $validateName = '\\addons\\xilufitness\\validate\\User';
							 | 
						||
| 
								 | 
							
								        $userInfo = $this->model
							 | 
						||
| 
								 | 
							
								            ->where(['user_id' => $this->auth->id, 'brand_id' => $brand_id])
							 | 
						||
| 
								 | 
							
								            ->find();
							 | 
						||
| 
								 | 
							
								        $result = $userInfo
							 | 
						||
| 
								 | 
							
								            ->allowField(true)
							 | 
						||
| 
								 | 
							
								            ->validateFailException()
							 | 
						||
| 
								 | 
							
								            ->validate($validateName)
							 | 
						||
| 
								 | 
							
								            ->save($params);
							 | 
						||
| 
								 | 
							
								        return $result;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 用户余额变动
							 | 
						||
| 
								 | 
							
								     * @param string $title 变动说明
							 | 
						||
| 
								 | 
							
								     * @param int $user_id 用户id
							 | 
						||
| 
								 | 
							
								     * @param string $data_id 关联表的id
							 | 
						||
| 
								 | 
							
								     * @param float $amount 变动余额
							 | 
						||
| 
								 | 
							
								     * @param int $amount_type 类型 1 新增 2 减少
							 | 
						||
| 
								 | 
							
								     * @param int $account_type 关联类型 0 会员充值 1 团课 2 私教课 3 活动 4 提现
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function userAccountChange(string $title, int $user_id, string $data_id,
							 | 
						||
| 
								 | 
							
								                                      float $amount, int $amount_type, int $account_type,int $brand_id=0){
							 | 
						||
| 
								 | 
							
								        if(empty($this->userInfo)){
							 | 
						||
| 
								 | 
							
								            $userModel = new \addons\xilufitness\model\User;
							 | 
						||
| 
								 | 
							
								            $this->userInfo = $userModel
							 | 
						||
| 
								 | 
							
								                ->where(['id' => $user_id])
							 | 
						||
| 
								 | 
							
								                ->field(['id','nickname','avatar','gender','mobile','point','account','train_day','train_duration','train_count','is_vip'])
							 | 
						||
| 
								 | 
							
								                ->find();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $account['data_id'] = xilufitness_get_id_value($data_id);
							 | 
						||
| 
								 | 
							
								        $account['user_id'] = $user_id;
							 | 
						||
| 
								 | 
							
								        $account['brand_id'] = !empty($brand_id) ? $brand_id : $this->brand_id;
							 | 
						||
| 
								 | 
							
								        $account['title'] = $title;
							 | 
						||
| 
								 | 
							
								        $account['before_account'] = $this->userInfo->account ?? 0;
							 | 
						||
| 
								 | 
							
								        $account['amount_type'] = $amount_type;
							 | 
						||
| 
								 | 
							
								        if($amount_type == 1){
							 | 
						||
| 
								 | 
							
								            $account['after_account'] = bcadd($account['before_account'],$amount,2);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $account['after_account'] = bcsub($account['before_account'],$amount,2);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $account['amount'] = $amount;
							 | 
						||
| 
								 | 
							
								        $account['account_type'] = $account_type;
							 | 
						||
| 
								 | 
							
								        return \think\Hook::listen('xilufitness_user_account_change',$account);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取积分记录
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getMyPointList(){
							 | 
						||
| 
								 | 
							
								        $model = new \addons\xilufitness\model\UserPoint;
							 | 
						||
| 
								 | 
							
								        $rows = $model
							 | 
						||
| 
								 | 
							
								            ->where(['user_id' => $this->getUserId(), 'brand_id' => $this->brand_id])
							 | 
						||
| 
								 | 
							
								            ->field(['id','title','point','point_type','createtime'])
							 | 
						||
| 
								 | 
							
								            ->order('id desc')
							 | 
						||
| 
								 | 
							
								            ->paginate();
							 | 
						||
| 
								 | 
							
								        return ['list' => $rows->items(), 'total_count' => $rows->total()];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取余额记录
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getMyAccountList(){
							 | 
						||
| 
								 | 
							
								        $model = new \addons\xilufitness\model\UserAccount;
							 | 
						||
| 
								 | 
							
								        $rows = $model
							 | 
						||
| 
								 | 
							
								            ->where(['user_id' => $this->getUserId(), 'brand_id' => $this->brand_id])
							 | 
						||
| 
								 | 
							
								            ->field(['id','title','amount','amount_type','createtime'])
							 | 
						||
| 
								 | 
							
								            ->order('id desc')
							 | 
						||
| 
								 | 
							
								            ->paginate();
							 | 
						||
| 
								 | 
							
								        return ['list' => $rows->items(), 'total_count' => $rows->total()];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 收藏
							 | 
						||
| 
								 | 
							
								     * @param int $id id值
							 | 
						||
| 
								 | 
							
								     * @param string $is_type 类型 1 店铺 2 教练
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function addCollect(int $id,string $is_type,int $shop_id=0){
							 | 
						||
| 
								 | 
							
								        $model = new \addons\xilufitness\model\UserCollect;
							 | 
						||
| 
								 | 
							
								        $collectExists = $model
							 | 
						||
| 
								 | 
							
								            ->where(['user_id' => $this->getUserId(), 'brand_id' => $this->brand_id,
							 | 
						||
| 
								 | 
							
								                'data_id' => $id, 'is_type' => $is_type, 'shop_id' => $shop_id])
							 | 
						||
| 
								 | 
							
								            ->find();
							 | 
						||
| 
								 | 
							
								        if(!empty($collectExists)){
							 | 
						||
| 
								 | 
							
								            $result = $collectExists->delete();
							 | 
						||
| 
								 | 
							
								            return ['is_collect' => false !== $result ? 0 : 1];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $result = $model->save([
							 | 
						||
| 
								 | 
							
								                'user_id' => $this->getUserId(),
							 | 
						||
| 
								 | 
							
								                'brand_id' => $this->brand_id,
							 | 
						||
| 
								 | 
							
								                'data_id' => $id,
							 | 
						||
| 
								 | 
							
								                'is_type' => $is_type,
							 | 
						||
| 
								 | 
							
								                'shop_id' => $shop_id
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								            return  ['is_collect' => false !== $result ? 1 : 0];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 判断是否收藏过
							 | 
						||
| 
								 | 
							
								     * 门店,教练
							 | 
						||
| 
								 | 
							
								     * @param int $data_id 外健
							 | 
						||
| 
								 | 
							
								     * @param int $is_type 类型 1 门店 2 教练
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getCollectExists($data_id,$is_type,int $shop_id=0){
							 | 
						||
| 
								 | 
							
								        $model = new \addons\xilufitness\model\UserCollect;
							 | 
						||
| 
								 | 
							
								        $isCollect = $model
							 | 
						||
| 
								 | 
							
								            ->where(['user_id' => $this->getUserId(), 'brand_id' => $this->brand_id,
							 | 
						||
| 
								 | 
							
								                'data_id' => $data_id, 'is_type' => $is_type, 'shop_id' => $shop_id])
							 | 
						||
| 
								 | 
							
								            ->field(['id'])
							 | 
						||
| 
								 | 
							
								            ->find();
							 | 
						||
| 
								 | 
							
								        return  !empty($isCollect) ? 1 : 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 我的收藏
							 | 
						||
| 
								 | 
							
								     * @param int $is_type
							 | 
						||
| 
								 | 
							
								     * @param $lat 纬度
							 | 
						||
| 
								 | 
							
								     * @param $lng 经度
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getMyCollect(int $is_type, $lat, $lng){
							 | 
						||
| 
								 | 
							
								        $model = new \addons\xilufitness\model\UserCollect;
							 | 
						||
| 
								 | 
							
								        if($is_type == 1){
							 | 
						||
| 
								 | 
							
								            $list = $model
							 | 
						||
| 
								 | 
							
								                ->field(['id','user_id','is_type','data_id'])
							 | 
						||
| 
								 | 
							
								                ->with(['shop' => function($query) use($lat,$lng){
							 | 
						||
| 
								 | 
							
								                    return $query->withField(['id','shop_name','shop_image','lat','lng','address']);
							 | 
						||
| 
								 | 
							
								                }])
							 | 
						||
| 
								 | 
							
								                ->where(['user_collect.brand_id' => $this->brand_id, 'user_id' => $this->getUserId(), 'is_type' => 1])
							 | 
						||
| 
								 | 
							
								                ->select();
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $collects =  $model
							 | 
						||
| 
								 | 
							
								                ->field(['id','user_id','is_type','data_id'])
							 | 
						||
| 
								 | 
							
								                ->where(['brand_id' => $this->brand_id, 'user_id' => $this->getUserId(), 'is_type' => 2])
							 | 
						||
| 
								 | 
							
								                ->select();
							 | 
						||
| 
								 | 
							
								            $shop_ids = array_column($collects,'shop_id');
							 | 
						||
| 
								 | 
							
								            $shopModel = new \addons\xilufitness\model\Shop;
							 | 
						||
| 
								 | 
							
								            $list = $shopModel
							 | 
						||
| 
								 | 
							
								                ->field(['id','shop_name','shop_image','address','lat','lng',
							 | 
						||
| 
								 | 
							
								                    "(6378.138 * 2 * asin(sqrt(pow(sin((lat * pi() / 180 - ".$lat." * pi() / 180) / 2),2) + cos(lat * pi() / 180) * cos(".$lat." * pi() / 180) * pow(sin((lng * pi() / 180 - ".$lng." * pi() / 180) / 2),2))) * 1000) as distance"])
							 | 
						||
| 
								 | 
							
								                ->where(['id' => ['in', $shop_ids ?? [-1] ], 'brand_id' => $this->brand_id ])
							 | 
						||
| 
								 | 
							
								                ->order("distance asc")
							 | 
						||
| 
								 | 
							
								                ->select();
							 | 
						||
| 
								 | 
							
								            foreach ($list as $key => $val){
							 | 
						||
| 
								 | 
							
								                $val->append(['coach']);
							 | 
						||
| 
								 | 
							
								                $val->coach = ShopService::getInstance()->getCoach(xilufitness_get_id_value($val['id'] ?? 0));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return ['list' => $list];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取我的勋章
							 | 
						||
| 
								 | 
							
								     * @param int $page 分页码
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getMyMediaList(){
							 | 
						||
| 
								 | 
							
								        $mediaModel = new \addons\xilufitness\model\ActivityMedia;
							 | 
						||
| 
								 | 
							
								        $userMediaModel = new \addons\xilufitness\model\UserMedia;
							 | 
						||
| 
								 | 
							
								        $rows = $mediaModel
							 | 
						||
| 
								 | 
							
								            ->where(['status' => 'normal', 'brand_id' => $this->brand_id])
							 | 
						||
| 
								 | 
							
								            ->field(['id','thumb_image','thumb_active_image','medal_name','description'])
							 | 
						||
| 
								 | 
							
								            ->order("class_time asc")
							 | 
						||
| 
								 | 
							
								            ->paginate();
							 | 
						||
| 
								 | 
							
								        $list = $rows->items();
							 | 
						||
| 
								 | 
							
								        foreach ($list as $key => $value){
							 | 
						||
| 
								 | 
							
								            $value->append(['is_active']);
							 | 
						||
| 
								 | 
							
								            $is_active = $userMediaModel
							 | 
						||
| 
								 | 
							
								                ->where(['user_id' => $this->getUserId(), 'brand_id' => $this->brand_id, 'media_id' => xilufitness_get_id_value($value['id'] ?? 0)])
							 | 
						||
| 
								 | 
							
								                ->field(['id'])
							 | 
						||
| 
								 | 
							
								                ->find();
							 | 
						||
| 
								 | 
							
								            $value->is_active = !empty($is_active) ? 1 : 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return ['list' => $list, 'total_count' => $rows->total() ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取排行排名
							 | 
						||
| 
								 | 
							
								     * @param int $page 分页码
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getMyRanking(){
							 | 
						||
| 
								 | 
							
								        $userModel = new \addons\xilufitness\model\User;
							 | 
						||
| 
								 | 
							
								        $rows = $userModel
							 | 
						||
| 
								 | 
							
								            ->where(['brand_id' => $this->brand_id])
							 | 
						||
| 
								 | 
							
								            ->field(['id','nickname','avatar','train_duration'])
							 | 
						||
| 
								 | 
							
								            ->order("train_duration desc")
							 | 
						||
| 
								 | 
							
								            ->paginate();
							 | 
						||
| 
								 | 
							
								        $prefix = config('database.prefix');
							 | 
						||
| 
								 | 
							
								        $ranking_sql = "SELECT b.id,b.nickname,b.avatar,b.train_duration,b.rownum FROM(SELECT t.*, @rank_no := @rank_no + 1 AS rownum FROM (SELECT @rank_no := 0) r,(SELECT * FROM ".$prefix."xilufitness_user ORDER BY train_duration DESC) AS t ) AS b WHERE b.user_id =".$this->getUserId();
							 | 
						||
| 
								 | 
							
								        $userInfo = $userModel->query($ranking_sql);
							 | 
						||
| 
								 | 
							
								        if(!empty($userInfo[0])){
							 | 
						||
| 
								 | 
							
								            $userInfo[0]['train_duration'] = round(($userInfo[0]['train_duration']/60),1);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return ['list' => $rows->items(), 'total_count' => $rows->total(), 'userInfo' => $userInfo[0] ?? ''];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |