258 lines
10 KiB
PHP
Raw Normal View History

2025-08-01 11:39:06 +08:00
<?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] ?? ''];
}
}