love_php/app/Http/Controllers/App/SocialController.php
2026-04-02 09:20:51 +08:00

1693 lines
75 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers\App;
use App\Jobs\LoveGPTChat;
use App\Jobs\SendSubTemplateMsg;
use App\Models\Moment;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Repositories\Eloquent\SmsRepository as Sms;
use App\Contracts\UserContract;
use App\Facades\CommonUtilsService;
use App\Services\IMService;
use App\Models\UserInfo;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use App\Models\User;
use App\Models\BannedHistory;
use App\Models\Linking;
use App\Models\Notice;
use App\Models\LinkingRequest;
use App\Models\RecommendUser;
use App\Models\RecommendLinkingNew;
use App\Models\ProfileCourtship;
use App\Models\MessageLinkman;
use App\Models\ChatMessage;
use App\Models\Address;
use App\Models\LinkingBlacklist;
use App\Models\UserPreview;
use App\Models\InteractLiveGift;
use App\Utils\Messenger;
use App\Models\Message;
use App\Jobs\SendEasySms;
use App\Contracts\MomentContract;
use App\Services\UserService;
use App\Contracts\LiveContract;
use App\Models\ApproveHistory;
use App\Models\CoinLog;
use App\Models\HandleLogs;
use function Clue\StreamFilter\fun;
class SocialController extends Controller
{
use ResponseJson;
protected $userCon;
protected $sms;
protected $momentCon;
protected $liveCon;
public function __construct(UserContract $userCon, Sms $sms, MomentContract $momentCon, LiveContract $liveCon)
{
$this->userCon = $userCon;
$this->sms = $sms;
$this->momentCon = $momentCon;
$this->liveCon = $liveCon;
}
/**
* 地图用户
* @param Request $request [description]
* @return [type] [description]
*/
public function mapUsers(Request $request)
{
try {
$user = auth()->user();
$location_longitude = $request->location_longitude;
$location_latitude = $request->location_latitude;
//修改经纬度
if($location_longitude && $location_latitude){
$rd_pt_key = User::cachePtKey($user->id);
$pt = ['location_longitude'=>$location_longitude, 'location_latitude'=>$location_latitude];
Cache::forever($rd_pt_key, $pt);
}
$users = User::where('hidden_profile', 'NONE');
//同信仰
if ($user->belief) {
$users = $users->where('belief', $user->belief);
}
//经纬度限制
$southwest = $request->input('southwest');
$northeast = $request->input('northeast');
if ($northeast && $southwest) {
$northeast_arr = json_decode($northeast, true);
$southwest_arr = json_decode($southwest, true);
$users = $users->whereBetween('location_latitude', [$southwest_arr['latitude'], $northeast_arr['latitude']])->whereBetween('location_longitude', [$southwest_arr['longitude'], $northeast_arr['longitude']]);
}
$users = $users->whereNotNull('location_latitude')->photo()->where('type', 'single')->where('sex', '<>', $user->sex)->whereNotIn('id', User::FULLLINKIDS)->select('id', 'nickname', 'location_longitude', 'location_latitude', 'sex','type', 'photo', 'app_avatar')->orderBy('is_approved', 'desc')->orderBy('rank_id', 'desc')->orderBy('id', 'desc')->limit(50)->get();
foreach ($users as $other_user) {
$rd_user_key = User::cacheUserKey($other_user->id);
if (Cache::has($rd_user_key)) {
$rd_user = Cache::get($rd_user_key);
}else{
$other_user->cacheUser();
$rd_user = Cache::get($rd_user_key);
}
$other_user->location_longitude = ($other_user->location_longitude * 1000000 + 0.009 * 1000000 ) /1000000;
$other_user->age = $rd_user->age;
//头像
$other_user->photo = $other_user->userAvatar();
//生活照
$other_user->profile_photos = $other_user->profilePhoto()->select('photo')->get()->toArray();
//粉丝数
$other_user->fans_count = $rd_user->fans_count;
//点击数
$other_user->preview_count = (int)$other_user->previewCacheCount();
$other_user->is_super_rank = $user->isSuperRank($other_user->id);
unset($other_user->wechat, $other_user->profileCourtship);
}
return $this->success('地图信息获取成功', $users);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取地图信息失败,请稍后再试');
}
}
//会话信息
public function chatInfo(Request $request)
{
//消息发送次数 、我的认证状态 、是否已提醒对方认证、对方是否已认证、
$user = auth()->user();
$other_user_id = $request->user_id;
$other_user = User::where('id',$other_user_id)->first();
if(!$other_user) return $this->failure('获取好友信息失败,请稍后再试');
ChatMessage::where(["user_id"=>$other_user_id, 'status'=>0, 'other_user_id'=>$user->id])->update(['status'=>1]);
$system_type = ['remind','greet','notice'];
$chat_num = ChatMessage::where('user_id',$user->id)->where('other_user_id',$other_user_id)->wherenotin('system_type',$system_type)->count();
$my_real_approved = $user->is_real_approved;
$other_real_approved = $other_user->is_real_approved;
$remind_status = ChatMessage::where('user_id',$user->id)->where('other_user_id',$other_user_id)->where('system_type','remind')->exists();
$data['chat_num'] = $chat_num ;
$data['my_real_approved'] = $my_real_approved ;
$data['other_real_approved'] = $other_real_approved ;
$data['remind_status'] = $remind_status?1:0 ;
$data['is_subscribe'] = $user->is_subscribe;
return $this->success('ok',$data);
}
/**
* 用户列表筛选条件
* @param Request $request [description]
* @return [type] [description]
*/
public function usersCondition(Request $request)
{
//地址
$address_arr = Address::where('parentId', 2)->select('name', 'codeId', 'parentId')->orderBy('codeId', 'asc')->get()->toArray();
$item['name'] = '不限';
foreach ($address_arr as &$address) {
$son = Address::where('parentId', $address['codeId'])->select('name', 'codeId', 'parentId')->get()->toArray();
// array_unshift($son, $item);
$address['son'] = $son;
}
//性别
$sex_arr = ['不限', '只看男', '只看女'];
//年龄
$age_arr = ['不限', '90后', '80后', '70后', '60后'];
return $this->success('ok', compact('address_arr', 'sex_arr', 'age_arr'));
}
public function bigDataLink()
{
//黑名单列表
$blacklist_user_ids = LinkingBlackList::where('user_id', auth()->id())->pluck('other_user_id')->toArray();
$dislike_user_ids = auth()->user()->dislikeLogs()->where('type', 'user')->pluck('type_id')->toArray();
$unset_user_ids = array_merge($blacklist_user_ids, $dislike_user_ids, User::FULLLINKIDS);
$user = auth()->user();
if (request()->page == 1 || empty(request()->page)) {
$ids = RecommendLinkingNew::where('id_users_left', $user->id)->whereHas('otherUser', function($sql) use($unset_user_ids){
$sql->where('is_approved',1)->where('hidden_profile', 'NONE')->whereNotIn('id', $unset_user_ids)->photo();
})->where('is_recommend', 1)->limit(100)->orderBy('score', 'desc')->orderBy('id','desc')->pluck('id')->toArray();
shuffle($ids);
Redis::set('user_linking_news_'.$user->id, json_encode($ids));
}else {
$ids = Redis::get('user_linking_news_'.$user->id);
$ids = empty($ids) ? [] : json_decode($ids, true);
}
$logs = RecommendLinkingNew::with('otherUser:id,nickname,sex,is_approved,is_real_approved,rank_id,photo,belief,industry_sub', 'otherUser.profileCourtship:id,user_id,province,city,stature,interest_hobby,birthday,introduction,degree')->whereIn('id', $ids)->orderBy(\DB::raw('FIND_IN_SET(id, "' . implode(",", $ids) . '"' . ")"))->paginate(10);
foreach ($logs as $log) {
if($log->otherUser->profileCourtship){
$log->age = CommonUtilsService::getAge($log->otherUser->profileCourtship->birthday);
}
//是否关注
$log->is_followed = auth()->user()->isFollowing($log->otherUser);
//是否是超级会员
$log->isSuperRank = $log->otherUser->isSuperRank();
$log->photo = $log->otherUser->photo.'?x-oss-process=style/scale1';
$user = $log->otherUser->toArray();
foreach ($user as $key => $value) {
$log->$key = $user[$key];
}
unset($log->otherUser);
}
if (empty(count($logs))) {
return false;
}
return $logs;
}
public function isLock()
{
$result = \DB::select("show OPEN TABLES where In_use > 0;");
$is_locked = 0;
if (count($result)) {
foreach ($result as $re) {
if ($re->Table == 'ufutx_recommend_linking_news') {
$is_locked = 1;
break;
}
}
}
return $is_locked;
}
/**
* 用户列表
* @param Request $request [description]
* @return [type] [description]
*/
public function users(Request $request, $user_id=null)
{
if ($user_id) {
$my_user = User::find($user_id);
}else{
$my_user = auth()->user();
}
$result = strstr(request()->route()->uri(), 'api/users/v2');
try {
$sex = $request->input('sex');
$age = $request->input('age');
switch ($age) {
case "60后":
$min_age = "1969-12-31";
$max_age = "1960-01-01";
break;
case "70后":
$min_age = "1979-12-31";
$max_age = "1970-01-01";
break;
case "80后":
$min_age = "1989-12-31";
$max_age = "1980-01-01";
break;
case "90后":
$min_age = "1999-12-31";
$max_age = "1990-01-01";
break;
default:
$min_age = $max_age = $age;
}
$min_age = CommonUtilsService::getAge($min_age);
$max_age = CommonUtilsService::getAge($max_age);
$province = $request->input('province');
$city = $request->input('city');
$is_approve = $request->input('is_approve');
$is_rank = $request->input('is_rank',0);
$keyword = $request->input('keyword');
$my_user->link_data = 1;
if ($my_user->link_data && empty($sex) && empty($min_age) &&empty($is_rank) && empty($max_age) && empty($province) && empty($city) && !is_numeric($is_approve) && empty($keyword) && !$result) {
$is_locked = $this->isLock();
if (!$is_locked) {
$result = $this->bigDataLink();
if ($result) return $this->success('ok',$result);
}
}
//成员类型 良人 佳偶 介绍人 红娘
$select_sex = $my_user->sex;
// dd($select_sex);
$sex = $sex?:($select_sex == 1?2:1);
// dd($sex);
$min_age = $min_age?:'不限';
$max_age = $max_age?:'不限';
// $times = CommonUtilsService::searchAge($age);
$province = $province?:'不限';
$city = $city?:'不限';
// $is_rank = $is_rank?:'不限';
$is_approve = $request->input('is_approve');
$users = User::with('profileCourtship')->whereHas('profileCourtship', function($sql) use($province, $city, $min_age, $max_age, $is_approve){
if ($province && $province != '不限') {
$sql = $sql->where('province', $province);
}
if ($city && $city != "不限") {
$sql = $sql->where('city', $city);
}
if ($min_age != '不限' && $max_age != '不限' && $min_age != $max_age) {
$min_age = (explode('岁', $min_age))[0];
$max_age = (explode('岁', $max_age))[0];
$max_birthday = date('Y-01-01',strtotime("-$max_age year"));
$min_birthday = date('Y-12-32',strtotime("-$min_age year"));
$sql = $sql->where('birthday','>=',$max_birthday)->where('birthday','<=',$min_birthday);
}
if($min_age != '不限' && $max_age != '不限' && $min_age = $max_age){
$min_age = (explode('岁', $min_age))[0];
$min_birthday = date('Y-01-01',strtotime("-$min_age year"));
$max_birthday = date('Y-12-31',strtotime("-$min_age year"));
$sql = $sql->where('birthday','>=',$min_birthday)->where('birthday','<=',$max_birthday);
}
if (is_numeric($is_approve)) {
$sql = $sql->where('is_approved', $is_approve);
}
});
if (is_numeric($is_rank) && $is_rank == 1) { //是会员
$users = $users->where('rank_id', '>', 0);
}
if (is_numeric($is_rank) && $is_rank == 2) { //非会员
$users = $users->where('rank_id',0);
}
if($sex){
$users = $users->where('sex',$sex);
}
if($keyword){
$users = $users->where(function($sql) use($keyword){
$sql->where('nickname', 'like', '%'.$keyword.'%')
->orWhere('name', 'like', '%'.$keyword.'%');
});
}
if ($keyword && $sex) {
$users = $users->where('sex',$sex);
$users = $users->where(function($sql) use($keyword){
$sql->where('nickname', 'like', '%'.$keyword.'%')
->orWhere('name', 'like', '%'.$keyword.'%');
});
}
// if($sex){
// $users = $users->where('sex',$sex);
// }elseif ($keyword && $sex) {
// $users = $users->where('sex',$sex);
// $users = $users->where(function($sql) use($keyword){
// $sql->where('nickname', 'like', '%'.$keyword.'%')
// ->orWhere('name', 'like', '%'.$keyword.'%');
// });
// }elseif($keyword){
// $users = $users->where(function($sql) use($keyword){
// $sql->where('nickname', 'like', '%'.$keyword.'%')
// ->orWhere('name', 'like', '%'.$keyword.'%');
// });
// }//else{
//小程序查看22-35的用户
// $users->where('sex',$sex);
// $users = $users->whereHas('profileCourtship', function ($query){
// $query->whereBetween('birthday', ['1989-01-01 00:00:00', '1999-01-01 00:00:00']);
// });
// }
$users = $users->where('can_be_found', 1);
//增加黑名单隐藏
$blacklist_user_ids = LinkingBlackList::where('user_id', $my_user->id)->pluck('other_user_id')->toArray();
$dislike_user_ids = $my_user->dislikeLogs()->where('type', 'user')->pluck('type_id')->toArray();
//客服id
$unset_user_ids = array_merge($blacklist_user_ids, $dislike_user_ids, User::FULLLINKIDS);
if (empty($sex) && empty($age) && empty($province) && empty($city) && !is_numeric($is_approve) && empty($keyword)) {
$user_ids = RecommendUser::where('user_id', $my_user->id)->whereHas('otherUser', function ($sql) use ($my_user) {
$sql->where('is_approved', 1)->where('sex', '<>', $my_user->sex)->where('hidden_profile', '<>', 'ALLSEX')->whereNotIn('id', User::FULLLINKIDS)->where('can_be_found', 1);
})->limit(7)->orderBy('start_time', 'asc')->pluck('other_user_id')->toArray();
$users = $users->whereNotIn('id', $user_ids);
}
$users = $users->whereNotIn('id', $unset_user_ids);
$users = $users->where('hidden_profile', 'NONE')->orderBy('rank_id', 'desc')->where('type', 'single')->orderBy('is_real_approved', 'desc')->orderBy('is_approved', 'desc')->orderBy('liveness', 'desc')->orderBy('info_complete_score', 'desc')->orderBy('last_visit', 'desc')->paginate();
foreach ($users as $user) {
$rd_user_key = User::cacheUserKey($user->id);
if (Cache::has($rd_user_key)) {
$rd_user = Cache::get($rd_user_key);
}else{
$user->cacheUser();
$rd_user = Cache::get($rd_user_key);
}
if(!empty($rd_user)){
if(!empty($rd_user->age)){
$user->age = $rd_user->age;
}else{
$user->age = null;
}
//是否是超级会员
if(!empty($rd_user->is_super_rank)){
$user->isSuperRank = $rd_user->is_super_rank;
}else{
$user->isSuperRank = null;
}
}
$user->profile_courtship = $user->profileCourtship;
$user->profile_courtship->interest_label = json_decode($user->profile_courtship->interest_label,true)?:null;
$user->profile_courtship->mate_conditon = json_decode($user->profile_courtship->mate_conditon,true)?:null;
// dd($user->profile_courtship->mate_conditon);
//是否关注
// $user->is_followed = $my_user->isFollowing($user);
$user->photo = $user->avatar;
unset($user->face_score);
}
// Cache::put($social_users_key, $users, 1);
return $this->success('ok', $users);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取用户列表失败,请稍后再试');
}
}
public function searchUsers(Request $request, $user_id=null)
{
if ($user_id) {
$my_user = User::find($user_id);
}else{
$my_user = auth()->user();
}
try {
$sex = $request->input('sex');
$min_age = $request->input('min_age');
$max_age = $request->input('max_age');
$province = $request->input('province');
$city = $request->input('city');
$is_approve = $request->input('is_approve');
$is_rank = $request->input('is_rank',0);
$keyword = $request->input('keyword');
$my_user->link_data = 1;
//成员类型 良人 佳偶 介绍人 红娘
$select_sex = $my_user->sex;
// dd($select_sex);
// $sex = $sex?:($select_sex == 1?2:1);
// dd($sex);
$min_age = $min_age?:'不限';
$max_age = $max_age?:'不限';
// $times = CommonUtilsService::searchAge($age);
$province = $province?:'不限';
$city = $city?:'不限';
// $is_rank = $is_rank?:'不限';
$is_approve = $request->input('is_approve');
$users = User::with('profileCourtship')->whereHas('profileCourtship', function($sql) use($province, $city, $min_age, $max_age, $is_approve){
if ($province && $province != '不限') {
$sql = $sql->where('province', $province);
}
if ($city && $city != "不限") {
$sql = $sql->where('city', $city);
}
if ($min_age != '不限' && $max_age != '不限' && $min_age != $max_age) {
$min_age = (explode('岁', $min_age))[0];
$max_age = (explode('岁', $max_age))[0];
$max_birthday = date('Y-01-01',strtotime("-$max_age year"));
$min_birthday = date('Y-12-32',strtotime("-$min_age year"));
$sql = $sql->where('birthday','>=',$max_birthday)->where('birthday','<=',$min_birthday);
}
if($min_age != '不限' && $max_age != '不限' && $min_age == $max_age){
$min_age = (explode('岁', $min_age))[0];
$min_birthday = date('Y-01-01',strtotime("-$min_age year"));
$max_birthday = date('Y-12-31',strtotime("-$min_age year"));
$sql = $sql->where('birthday','>=',$min_birthday)->where('birthday','<=',$max_birthday);
}
if (is_numeric($is_approve)) {
$sql = $sql->where('is_approved', $is_approve);
}
});
if (is_numeric($is_rank) && $is_rank == 1) { //是会员
$users = $users->where('rank_id', '>', 0);
}
if (is_numeric($is_rank) && $is_rank == 2) { //非会员
$users = $users->where('rank_id',0);
}
if($sex){
$users = $users->where('sex',$sex);
}
if($keyword){
$users = $users->where(function($sql) use($keyword){
$sql->where('nickname', 'like', '%'.$keyword.'%')
->orWhere('name', 'like', '%'.$keyword.'%');
});
}
if ($keyword && $sex) {
$users = $users->where('sex',$sex);
$users = $users->where(function($sql) use($keyword){
$sql->where('nickname', 'like', '%'.$keyword.'%')
->orWhere('name', 'like', '%'.$keyword.'%');
});
}
$users = $users->where('can_be_found', 1);
//增加黑名单隐藏
$blacklist_user_ids = LinkingBlackList::where('user_id', $my_user->id)->pluck('other_user_id')->toArray();
$dislike_user_ids = $my_user->dislikeLogs()->where('type', 'user')->pluck('type_id')->toArray();
//客服id
$unset_user_ids = array_merge($blacklist_user_ids, $dislike_user_ids, User::FULLLINKIDS);
if (empty($sex) && empty($age) && empty($province) && empty($city) && !is_numeric($is_approve) && empty($keyword)) {
$user_ids = RecommendUser::where('user_id', $my_user->id)->whereHas('otherUser', function ($sql) use ($my_user) {
$sql->where('is_approved', 1)->where('sex', '<>', $my_user->sex)->where('hidden_profile', '<>', 'ALLSEX')->whereNotIn('id', User::FULLLINKIDS)->where('can_be_found', 1);
})->limit(7)->orderBy('start_time', 'asc')->pluck('other_user_id')->toArray();
$users = $users->whereNotIn('id', $user_ids);
}
$users = $users->whereNotIn('id', $unset_user_ids);
$users = $users->where('hidden_profile', 'NONE')->orderBy('rank_id', 'desc')->where('type', 'single')->orderBy('is_real_approved', 'desc')->orderBy('is_approved', 'desc')->orderBy('liveness', 'desc')->orderBy('info_complete_score', 'desc')->orderBy('last_visit', 'desc')->paginate();
foreach ($users as $user) {
$rd_user_key = User::cacheUserKey($user->id);
if (Cache::has($rd_user_key)) {
$rd_user = Cache::get($rd_user_key);
}else{
$user->cacheUser();
$rd_user = Cache::get($rd_user_key);
}
$user->age = $rd_user->age;
$user->profile_courtship = $user->profileCourtship;
$user->profile_courtship->interest_label = json_decode($user->profile_courtship->interest_label,true)?:null;
$user->profile_courtship->mate_conditon = json_decode($user->profile_courtship->mate_conditon,true)?:null;
$user->isSuperRank = $rd_user->is_super_rank;
$user->photo = $user->avatar;
unset($user->face_score);
}
return $this->success('ok', $users);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取用户列表失败,请稍后再试');
}
}
/**
* 用户列表
* @param Request $request [description]
* @return [type] [description]
*/
public function usersV2(Request $request, $user_id=null)
{
Log::info("用戶列表V2");
if ($user_id) {
$my_user = User::find($user_id);
}else{
$my_user = auth()->user();
}
$result = strstr(request()->route()->uri(), 'api/users/v2');
// try {
$sex = $request->input('sex');
$age = $request->input('age');
$province = $request->input('province');
$city = $request->input('city');
$is_approve = $request->input('is_approve');
$keyword = $request->input('keyword');
$my_user->link_data = 1;
if ($my_user->link_data && empty($sex) && empty($age) && empty($province) && empty($city) && !is_numeric($is_approve) && empty($keyword) && !$result) {
$is_locked = $this->isLock();
if (!$is_locked) {
$result = $this->bigDataLink();
if ($result){
$result = $result->toArray();
if($result['last_page'] > $result['current_page']){
return $this->success('大数据推送',$result);
}else{
$users = $this->userCon->usersList($my_user,$sex,$age,$province,$city,$is_approve,$keyword)->toArray();
$users['data'] = array_merge($result['data'],$users['data']);
return $this->success('ok.', $users);
}
}
}
}
$users = $this->userCon->usersList($my_user,$sex,$age,$province,$city,$is_approve,$keyword);
return $this->success('ok', $users);
// } catch (\Exception $e) {
// $this->getError($e);
// return $this->failure('获取用户列表失败,请稍后再试');
// }
}
/**
* 推荐首页
* @param Request $request [description]
* @param integer $user_id [description]
* @return [type] [description]
*/
public function socialHome(Request $request, $user_id=0)
{
try {
$mine = auth()->user();
if (empty($mine)) {
$mine = $this->authCheck();
}
if ($mine) {//已登录
//生成推荐id
$user_ids = $this->homeUserIds($mine);
if (count($user_ids) < 7) {
//如果现在时间早于早上十点晚于凌晨 取昨天的时间
if (strtotime(date('Y-m-d')) < time() && time() < strtotime(date('10:00:00'))) {
$start_time = date('Y-m-d 10:00:00', strtotime('-1 day'));;
$end_time = date('Y-m-d 09:59:59');
}else{
$start_time = date('Y-m-d 10:00:00');
$end_time = date('Y-m-d 09:59:59', strtotime('+1 day'));
}
$user_ids = RecommendUser::where('user_id', $mine->id)->whereHas('otherUser', function($sql) use($mine){
$sql->where('is_approved',1)->where('sex', '<>', $mine->sex)->where('hidden_profile', '<>', 'ALLSEX')->where('belief', $mine->belief)->whereNotIn('id', User::FULLLINKIDS);
})->limit(7)->orderBy('start_time', 'asc')->pluck('other_user_id')->toArray();
RecommendUser::where('user_id', $mine->id)->whereIn('other_user_id', $user_ids)->update(['start_time'=>$start_time, 'end_time'=>$end_time]);
}
$users = User::whereIn('id', $user_ids)->where('belief', $mine->belief)->where('is_approved',1)->where('sex', '<>', $mine->sex)->whereNotIn('id', User::FULLLINKIDS)->select('id', 'nickname', 'sex', 'photo', 'is_approved', 'industry_sub', 'industry')->get();
}else{//未登录
$sex = $request->input('sex') == 1?2:1;
$users = \DB::table('followables')->leftJoin('users', 'users.id', '=', 'followables.followable_id')->where('followables.relation', 'follow')->where('users.sex', $sex)->whereNotNull('users.photo')->where('type', 'single')->whereNotIn('id', User::FULLLINKIDS)->where('hidden_profile', '<>', 'ALLSEX')->select(\DB::raw('count(*) as num'), 'followable_id','id', 'nickname', 'sex', 'photo', 'is_approved', 'industry_sub', 'industry')->orderBy('num', 'desc')->groupBy('followable_id')->limit(7)->get();
}
foreach ($users as $field) {
$profile = ProfileCourtship::where('user_id', $field->id)->select('user_id', 'sex', 'province','city', 'birthday', 'stature', 'state', 'belief','introduction')->first();
$age = '未知';
if (!empty($profile)) {
$age = \CommonUtilsService::getAge($profile->birthday);
$profile->age = $age;
}
$field->profile = $profile;
$user = User::find($field->id);
$field->isSuperRank = $user->isSuperRank();
//是否已关注
$field->is_followed = $mine->isFollowing($user);
}
return $this->success('ok', $users);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取信息失败,请稍后再试');
}
}
public function homeUserIds($user)
{
//判断当前时间是否需要刷新
$now = date('Y-m-d H:i:s');
$other_user_ids = RecommendUser::whereHas('otherUser', function($sql){
$sql->where('type', 'single')->where('hidden_profile', '<>', 'ALLSEX')->photo();
})->where('user_id', $user->id)->where('start_time', '<=', $now)->where('end_time', '>=', $now)->pluck('other_user_id');
if (count($other_user_ids)) {
return $other_user_ids;
}
$all_other_user_ids = RecommendUser::where('user_id', $user->id)->pluck('other_user_id');
if ($user->type == 'single') {
$belief = $user->belief;
$sex = $user->sex == 1?2:1;
//匹配的年龄
$max_birthday = $user->profileCourtship->max_age;
$min_birthday = $user->profileCourtship->min_age;
if (empty($max_birthday) || empty($min_birthday)) {
$max_birthday = date('Y-m-d', strtotime('-3 year', strtotime($user->ProfileCourtship->birthday)));
$min_birthday = date('Y-m-d', strtotime('+3 year', strtotime($user->ProfileCourtship->birthday)));
}
$other_user_ids = RecommendLinkingNew::whereHas('otherUser', function($sql) use($sex, $belief, $max_birthday, $min_birthday){
$sql = $sql->photo()->where('hidden_profile', '<>', 'ALLSEX')->where('type', 'single')->where('sex', $sex)->where('belief', $belief)->where('is_approved', 1)->where('nickname', 'not like', '%福恋%')->whereHas('profileCourtship', function($sq) use($max_birthday, $min_birthday){
$sq->whereBetween('birthday', [$max_birthday, $min_birthday]);
});
})->where('id_users_left', $user->id)->whereNotIn('id_users_right', $all_other_user_ids)->orderBy('id','desc')->limit(7)->pluck('id_users_right')->toArray();
if (!count($other_user_ids)) {
$other_user_ids = $this->getAgeNearUserIds($user, 7, $all_other_user_ids);
}elseif (count($other_user_ids) > 0 && count($other_user_ids) < 7) {
$limit = 7 - count($other_user_ids);
$ids = $this->getAgeNearUserIds($user, $limit, $all_other_user_ids);
$other_user_ids = array_merge($other_user_ids,$ids);
}
if (count($other_user_ids) < 7) {
return $other_user_ids;
}
}else{
$belief = $user->belief;
$other_user_ids = User::with('profileCourtship')->whereHas('profileCourtship', function($sql) use($belief){
$sql->where('belief', $belief);
})->photo()->whereNotIn('id', $all_other_user_ids)->where('hidden_profile', '<>', 'ALLSEX')->where('is_approved', 1)->where('type', 'single')->orderBy('face_score', 'desc')->limit(7)->pluck('id');
}
//如果现在时间早于早上十点晚于凌晨 取昨天的时间
if (strtotime(date('Y-m-d')) < time() && time() < strtotime(date('10:00:00'))) {
$start_time = date('Y-m-d 10:00:00', strtotime('-1 day'));;
$end_time = date('Y-m-d 09:59:59');
}else{
$start_time = date('Y-m-d 10:00:00');
$end_time = date('Y-m-d 09:59:59', strtotime('+1 day'));
}
//生成推荐ids
$arr = [];
foreach ($other_user_ids as $other_user_id) {
$data['user_id'] = $user->id;
$data['other_user_id'] = $other_user_id;
$data['start_time'] = $start_time;
$data['end_time'] = $end_time;
$data['created_at'] = date('Y-m-d H:i:s');
$data['updated_at'] = date('Y-m-d H:i:s');
$arr[] = $data;
}
RecommendUser::insert($arr);
return $other_user_ids;
}
public function getAgeNearUserIds($user, $limit, $all_other_user_ids)
{
$max_birthday = $user->profileCourtship->max_age;
$min_birthday = $user->profileCourtship->min_age;
if (empty($max_birthday) || empty($min_birthday)) {
$max_birthday = date('Y-m-d H:i:s', strtotime('- 3 year', strtotime($user->ProfileCourtship->birthday)));
$min_birthday = date('Y-m-d H:i:s', strtotime('+ 3 year', strtotime($user->ProfileCourtship->birthday)));
}
$belief = $user->profileCourtship->belief;
$sex = $user->sex == 1?2:1;
$other_user_ids = User::with('profileCourtship')->whereHas('profileCourtship', function($sql) use($max_birthday, $min_birthday, $belief){
$sql->whereBetween('birthday', [$max_birthday, $min_birthday])->where('belief', $belief);
})->photo()->where('sex', $sex)->where('type', 'single')->where('is_approved', 1)->where('hidden_profile', '<>', 'ALLSEX')->whereNotIn('id', User::FULLLINKIDS)->whereNotIn('id', $all_other_user_ids)->orderBy('is_approved', 'desc')->orderBy('face_score', 'desc')->limit($limit)->pluck('id');
return $other_user_ids->toArray();
}
//如果是查看用户详情,普通用户可以每天查看七个
public function checkPreview($user, $count, $other_user)
{
$other_user_id = $other_user->id;
$result = $user->isFriend($other_user);
if ($result) return true;
$is_super_rank = $user->isSuperRank();
if ($is_super_rank) return true;
$start_time = date('Y-m-d');
//普通用户可以查看7个用户
$history_count = UserPreview::where('preview_user_id', $user->id)->where('preview_time', '>', $start_time)->distinct('user_id')->pluck('user_id')->toArray();
$in_preview = in_array($other_user_id, $history_count);
if (count($history_count) >= $count && empty($in_preview)) {
return ['code'=>1, 'msg'=>'普通用户每天只能查看7个用户'];
}
return true;
}
/**
* 他人个人信息
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function otherUser(Request $request, $user_id)
{
try {
$rd_user_key = User::cacheUserKey($user_id);
if (Cache::has($rd_user_key)) {
$user = $rd_user = Cache::get($rd_user_key);
}else{
$user = User::find($user_id);
if (empty($user)) return $this->fail('真不巧,用户最近关闭了资料~',5);
$user->cacheUser();
$rd_user = Cache::get($rd_user_key);
}
if (empty($user) || $user->hidden_profile == 'ALLSEX') return $this->fail('真不巧,用户最近关闭了资料~',5);
//自己信息
$my_user = auth()->user();
if (!empty($user)) {
//是否在黑名单
$is_black = LinkingBlacklist::where('user_id', $user_id)->where('other_user_id', $my_user->id)->count();
if ($is_black) return $this->failure('您已被对方拉入黑名单');
}
//用户是否被冻结资料
$frozen_state = $this->userCon->getUserFrozenState($user_id);
if($frozen_state != 0) return $this->failure('该用户资料异常,请稍后访问');
//Ta是否是超级会员
$user->isSuperRank = $rd_user->is_super_rank;
//粉丝
$user->fans_count = $rd_user->fans_count;
//点击数
$user->preview_count = (int)$user->previewCacheCount();
//自己是否是超级会员
$user->selfIsSuperRank= $my_user->isSuperRank();
//Ta的其他信息
$profile = $rd_user->profileCourtship;
if (!empty($profile)) {
$profile->interest_label = json_decode($profile->interest_label, true);
//年龄
$profile->age = $rd_user->age;
$profile->mate_conditon = json_decode($profile->mate_conditon,true);
}
$user->profile = $profile;
//添加访问记录
$my_user->addUserPreview($user->id);
//获取头像
$user->avatar = $user->userAvatar();
//是否是好友
$user->is_friend = $user->isFriend($my_user)?1:0;
//是否已关注
$user->is_followed = $my_user->isFollowing($user);
//是否是自己
$user->self = $user->id == $my_user->id?1:0;
//生活照
$profile_photos = $user->profilePhoto()->limit(9)->orderBy('id', 'desc')->get()->toArray();
$user->profile_photos = $profile_photos;
$user->self_is_approved = $my_user->is_approved;
$result = UserService::isCompleteProfileV4($my_user, 'app');
$user->self_info_level = 0;
if ($result) {
$user->self_info_level = $result['level'];
}
//自己是否隐身
$user->self_hidden = $my_user->hidden;
//小程序路径
$user->mini_program_path = 'pages/home/information?id='.$user->id;
$user->official_path = env('APP_URL')."/h5/#/appUserDetails/".$user->id."?user_details_id=".$user->id."&from_user_id=".$my_user->id."&app_url=others_info";
//礼物榜
$user->gift_icons = $user->giftIcons();
//动态
$user->moment_count = $user->moments()->where('is_audited', 1)->where('is_show', 1)->count();
$moments = Moment::where(function($query){
$query->where('photos', '!=', '[]')->orWhereNotNull('aliyun_video_id');
})->where('user_id', $user->id)->orderBy('id', 'desc')->limit(6)->get();
$new_photos = [];
// return $this->success('ok', $moments);
foreach ($moments as $moment){
if(!empty($moment->photos)){
$moment_photo = json_decode($moment->photos);
if(!empty($moment_photo)){
foreach ($moment_photo as $value){
array_push($new_photos, $value);
}
}
}
if(!empty($moment->aliyun_video_id)){
$rd_moment_key = Moment::cacheMoemntKey($moment->id);
if (Cache::has($rd_moment_key)) {
$rd_moment = Cache::get($rd_moment_key);
if(!empty($rd_moment->cover_url)){
$new_photos[] = $rd_moment->cover_url;
}
}else{
$result = \AliyunService::getPlayInfo($moment->aliyun_video_id);
if(!empty($result['VideoBase']['CoverURL'])){
$new_photos[] = $result['VideoBase']['CoverURL'];
}
}
}
}
$user->service_man = UserInfo::where('user_id',$user_id)->where('is_service_client',1)->exists()?1:0;
$user->moment = array_slice($new_photos, 0, 4);
$type = 'remind_profile_photo';
$count = Notice::where('user_id', $user_id)->where('send_user_id', auth()->id())->where('type', $type)->count();
$user->is_remind = $count ? 1 : 0;
unset($user->profileCourtship, $user->face_score,$user->mobile);
return $this->success('ok', $user);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('信息获取失败,请稍后再试');
}
}
/**
* 用户礼物榜单
* @return [type] [description]
*/
public function userGiftList(Request $request, $user_id)
{
try {
$list = $this->userCon->userGiftList($user_id);
if (empty($list)) throw new \Exception("获取榜单失败", 1);
return $this->success('ok', $list);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取榜单失败,请稍后再试');
}
}
/**
* 取消好友
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function deleteFriend(Request $request, User $user)
{
try {
\DB::beginTransaction();
$user_id = $user->id;
$mine = auth()->user();
$mine_user_id = $mine->id;
$link = Linking::where(function($sql) use($user_id, $mine_user_id){
$sql->where('user_id', $user_id)->where('user_linking_id', $mine_user_id);
})->orWhere(function($sql) use($user_id, $mine_user_id){
$sql->where('user_id', $mine_user_id)->where('user_linking_id', $user_id);
})->first();
if ($link) {//是否有该好友
//删除好友
$link->delete();
//更新好友数
$user->decrement('friend_count',1);
$mine->decrement('friend_count',1);
//删除网易好友
$mine->deleteIMFriend($user);
//清空好友请求
LinkingRequest::where('user_id', $mine->id)->where('user_linking_id', $user->id)->delete();
//清空消息
Notice::where('user_id', $mine->id)->where('send_user_id', $user_id)->where('type', 'friend')->delete();
//聊天记录标记
ChatMessage::where('other_user_id', $mine->id)->where('user_id', $user_id)->update(['status'=>1]);
ChatMessage::where('other_user_id', $user_id)->where('user_id', $mine->id)->update(['status'=>1]);
//修改缓存
$user->updateCacheUser('friend_count');
$mine->updateCacheUser('friend_count');
}else{
return $this->failure('你们还不是好友');
}
\DB::commit();
return $this->success('删除好友成功');
} catch (\Exception $e) {
\DB::rollback();
$this->getError($e);
return $this->failure('删除好友失败,请稍后再试');
}
}
/**
* 拉入黑名单
* @param Request $request [description]
* @param [type] $id [description]
* @return [type] [description]
*/
public function blacklistFriend(Request $request, User $user)
{
try {
//判断是否是好友
// if ($user->isFriend(auth()->user())) {
$this->userCon->blacklistFriend(auth()->id(), $user->id);
return $this->success('拉黑好友成功');
// }else{
// return $this->failure('还不是好友');
// }
} catch (\Exception $e) {
$this->getError($e);
return $this->failure("拉黑好友失败,请稍有再试");
}
}
/**
* 举报用户
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function complaintUser(Request $request, User $user)
{
try {
$content = $request->input('content');
$label = $request->input('label');
$photos = $request->input('photos', []);
if(!$label){
return $this->failure('请选择举报类型');
}else if($photos == [] || empty($photos)){
return $this->failure('请提供举报截图');
}
$this->userCon->complaint($request, auth()->id(), $user->id);
//短信通知
$mobiles = Redis::smembers('repot_notice_mobile');
$param['message'] = '用户【'.auth()->user()->nickname.'】举报用户【'.$user->nickname.'】';
foreach ($mobiles as $mobile){
$param['mobile'] = $mobile;
SendEasySms::dispatch($param)->onQueue('love');
}
return $this->success('举报用户成功');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('举报用户失败,请稍后再试');
}
}
/**
* 好友申请
* @param Request $request [description]
* @param User $user [description]
*/
public function addFriend(Request $request, User $user)
{
try {
$mine = auth()->user();
// //是否禁言
// $banned = $user->isBanned('friend');
// if ($banned) {
// return $this->failure('您已被禁止申请好友,至'.$banned->end_time);
// }
//查看是否被禁言
$date = date('Y-m-d H:i:s');
$history = BannedHistory::where('user_id',$mine->id)->where('type','friend')->first();
if (!empty($history)) {
if($history->end_time >= $date && $history->start_time <= $date) return $this->failure('你被禁止添加好友至'.$history->end_time);
}
if ($user->hidden_profile == 'ALLSEX') {
return $this->success('ok');
}
//是否是拉黑好友
$result = $this->userCon->isBlacklist($mine->id, $user->id);
if ($result === 1) {
return $this->failure('对方设置了好友权限 暂不能加为好友');
}elseif ($result === 2) {
return $this->failure('对方已被您列入黑名单,请先移出黑名单');
}
$linking_id = LinkingRequest::where(['user_id'=>$user->id, 'user_linking_id'=>$mine->id])->where('status', 0)->value('id');
if(!$linking_id){
$linking_request = new LinkingRequest;
$linking_request->user_id = $user->id;
$linking_request->user_linking_id = $mine->id;
$linking_request->status = 0;
$linking_request->message = $request->message?:'申请加入你的福恋好友';
$linking_request->save();
//添加系统消息
$content = $user->nickname.'您好,'.$mine->nickname.'申请加您为好友!';
$message = $request->message?:$content;
$notice = $this->userCon->sendNotice($user->id, $mine->id, 'friend', $content, $message);
//todo 推送消息
$result = $this->momentCon->sendAttachMsg($notice->id, 'friend', $content, $mine->id, $user->id, $mine->app_avatar);
//订阅消息通知
SendSubTemplateMsg::dispatch($type = 'friend_request', $mine, $user)->onQueue('template_message');
}else{
$notice = Notice::where('user_id', $user->id)->where('send_user_id', $mine->id)->where('type', 'friend')->update(['created_at'=>date('Y-m-d H:i:s')]);
}
return $this->success('申请好友请求成功');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('申请好友请求失败,请稍后再试');
}
}
public function addFriendByLove($request, $user, $other_user_id)
{
$send_user = User::find($other_user_id);
//添加好友
$linking = $this->userCon->setLinking($other_user_id, $user->id);
//添加网易好友
$result = $user->addIMFriend($send_user);
if ($result) {
$linking->is_im = 1;
$linking->save();
}
//发送IM消息
if (config('app.env') == 'production') {
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$name = $send_user->is_real_approved?$send_user->name:$send_user->nickname;
$content = $name."你好,我是福恋脱单小助手小恋, 陪伴你一起找对象,有什么情感困惑可以随时找我!";
$body = ['msg'=>$content];
$result = $im_service->sendMsg($user->id, 0,$other_user_id,$type=0,$body);
}
}
/**
* 好友申请
* @param Request $request [description]
* @param User $user [description]
*/
public function addFriendv2(Request $request, User $user)
{
try {
$mine = auth()->user();
// //是否禁言
// $banned = $user->isBanned('friend');
// if ($banned) {
// return $this->failure('您已被禁止申请好友,至'.$banned->end_time);
// }
if ($mine->id == User::LOVEID) {
//小恋添加好友
$this->addFriendByLove($request, $mine, $user->id);
return $this->success("发送成功");
}
//查看是否被禁言
$date = date('Y-m-d H:i:s');
$history = BannedHistory::where('user_id',$mine->id)->where('type','friend')->first();
if (!empty($history)) {
if($history->end_time >= $date && $history->start_time <= $date) return $this->failure('你被禁止添加好友至'.$history->end_time);
}
//今日打招呼次数
$time = date('Y-m-d 00:00:00');
$num = LinkingRequest::where('user_linking_id',$mine->id)->whereBetween('created_at', [$time,now()])->count();
//查看会员身份
$isSuperRank = $mine->isSuperRank();
//查看今日购买次数
$pay_num = CoinLog::where('user_id',$mine->id)->where('type','friend_request')->where('type_id',0)->whereBetween('created_at', [$time,now()])->count();
$num = $pay_num + 3 -$num;
if($num<=0&&$isSuperRank==0) return $this->failure('今日打招呼次数达到上限');
//是否是拉黑好友
$result = $this->userCon->isBlacklist($mine->id, $user->id);
if ($result === 1) {
return $this->failure('对方设置了好友权限 暂不能加为好友');
}elseif ($result === 2) {
return $this->failure('对方已被您列入黑名单,请先移出黑名单');
}
if ($user->hidden_profile == 'ALLSEX') {
return $this->success('ok');
}
$linking_id = LinkingRequest::where(['user_id'=>$user->id, 'user_linking_id'=>$mine->id])->where('status', 0)->value('id');
if(!$linking_id){
$linking_request = new LinkingRequest;
$linking_request->user_id = $user->id;
$linking_request->user_linking_id = $mine->id;
$linking_request->status = 0;
$linking_request->message = $request->message?:'申请加入你的福恋好友';
$linking_request->save();
//添加系统消息
$content = $mine->nickname.'想认识你,向你打了一个招呼。';
$message = $request->message?:$content;
$notice = $this->userCon->sendNotice($user->id, $mine->id, 'friend', $content, $message);
//todo 推送消息
$result = $this->momentCon->sendAttachMsg($notice->id, 'friend', $content, $mine->id, $user->id, $mine->app_avatar);
//订阅消息通知
SendSubTemplateMsg::dispatch($type = 'friend_request', $mine, $user)->onQueue('template_message');
}else{
return $this->failure('对方已收到打招呼消息,正在处理好友请求~');
}
return $this->success('发送成功,等待对方处理好友请求');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('申请好友请求失败,请稍后再试');
}
}
/**
* 处理好友请求
* @param Request $request [description]
* @param Notice $notice [description]
* @return [type] [description]
*/
public function dealFriendRequest(Request $request, Notice $notice)
{
try {
$send_user = $notice->otherUser;
$result = $this->getFriendRequest($request, $send_user, $notice);
return $this->success('ok',$result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('处理好友请求失败,请稍后再试');
}
}
public function getFriendRequest($request, $user, $notice=null)
{
try {
$mine = auth()->user();
$link_request = LinkingRequest::where('user_id', $mine->id)->where('user_linking_id', $user->id)->where('status', 0)->first();
if (empty($link_request)) {
// throw new \Exception("好友请求记录不存在", 1);
return false;
}
$status = $request->input('status');
if (empty($status)) {
throw new \Exception("没有处理状态", 1);
}
$result = true;
\DB::beginTransaction();
if ($status == 1) {
$content = $user->nickname.'您好,'.$mine->nickname.'同意了你的好友申请!';
//添加好友
$linking = $this->userCon->setLinking($user->id, $mine->id);
//添加网易好友
$result = $mine->addIMFriend($user);
if ($result) {
$linking->is_im = 1;
$linking->save();
}
if ($notice) {
$result = $this->sendGreetMessage($notice, $user);
}
}elseif ($status == -1) {
$content = $user->nickname.'您好,'.$mine->nickname.'拒绝了你的好友申请!';
}
$link_request->status = $status;
$link_request->save();
\DB::commit();
return $result;
} catch (\Exception $e) {
\DB::rollback();
$this->getError($e);
return false;
}
}
public function sendGreetMessage($notice, $user)
{
try {
$body = ['msg'=>$notice->message];
//发送IM消息
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$result = $im_service->sendMsg($user->id, 0,auth()->id(),$type=0,$body,$option=array("push"=>false,"roam"=>true,"history"=>true,"sendersync"=>true, "route"=>false));
//创建打招呼记录
$message = ChatMessage::create([
'user_id'=>$user->id,
'other_user_id'=>auth()->id(),
'content'=>$notice->message,
'content_type'=>'text',
'system_type'=>'greet'
]);
return $result;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
public function responseFriendRequest(Request $request, User $user)
{
try {
$result = $this->getFriendRequest($request, $user);
if (empty($result)) {
\DB::rollback();
return $this->failure('处理好友请求失败,请稍后再试');
}
return $this->success('ok',$result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('处理好友请求失败,请稍后再试');
}
}
/**
* 关注用户
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function followUser(Request $request, $user)
{
try {
$user = User::find($user);
if(empty($user)) return $this->failure('用户不存在');
$mine = auth()->user();
if($user->id == $mine->id) return $this->failure('不能关注自己!');
$is_followed = $mine->isFollowing($user);
if ($is_followed) {
$mine->unfollow($user);
}else{
$mine->toggleFollow($user);
$notice = Notice::where('user_id', $user->id)->where('send_user_id', $mine->id)->where('type', 'follow')->first();
if ($notice) {
$content = '用户'.$mine->nickname.'关注了你喔!';
$data = [
'content'=>$content,
'updated_at'=>date('Y-m-d H:i:s'),
];
$this->userCon->updateNotice($notice, $data);
}else{
$content = '用户'.$mine->nickname.'关注了你喔!';
$this->sendNotice($user->id, $mine->id, 'follow', $content);
}
//计算年龄差
$mine_age = 0;
if($mine->type == 'single' && !empty($mine->profileCourtship)){
$mine_birthday = $mine->profileCourtship->birthday;
}
if($mine->type == 'marriage' && !empty($mine->profileMarriage)){
$mine_birthday = $mine->profileMarriage->birthday;
}
if(!empty($mine_birthday)){
$mine_age = CommonUtilsService::getAge($mine_birthday);
}
$user_age = 0;
if($user->type == 'single' && !empty($user->profileCourtship)){
$user_birthday = $user->profileCourtship->birthday;
}
if($user->type == 'marriage' && !empty($user->profileMarriage)){
$user_birthday = $user->profileMarriage->birthday;
}
if(!empty($user_birthday)){
$user_age = CommonUtilsService::getAge($user_birthday);
}
$age_diff = abs($user_age - $mine_age);
if($mine->sex != $user->sex && $age_diff > 10){
}else {
//todo 推送消息
$result = $this->momentCon->sendAttachMsg($user->id, 'follow', $content, $mine->id, $user->id, $mine->app_avatar);
}
}
$user->updateCacheUser('fans_count');
$mine->updateCacheUser('follow_count');
$is_followed = $mine->isFollowing($user);
return $this->success('follow_status', compact('is_followed'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('关注失败,请稍后再试');
}
}
/**
* 聊天记录
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function chatMessages(Request $request, User $user)
{
try {
$mine = auth()->user();
$begintime = $request->input('start_time', time() - 24 * 36600);
$endtime = $request->input('start_time', time());
$limit = 100;
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
//注册网易id
$user->createIMUser();
$mine->createIMUser();
$mine_messages = $im_service->querySessionMsg($mine->id,$user->id,$begintime,$endtime,$reverse='1');
$user_messages = $im_service->querySessionMsg($user->id,$mine->id,$begintime,$endtime,$reverse='1');
if ($mine_messages['code'] != 200 || $user_messages['code'] != 200) {
throw new \Exception("获取网易聊天记录失败", 1);
}
return $this->success('ok', compact('mine_messages', 'user_messages'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取聊天记录失败,请稍后再试');
}
}
public function chatMessagesV2(Request $request, User $user)
{
try {
$mine = auth()->user();
$begintime = $request->input('start_time', time() - 24 * 36600);
$endtime = $request->input('start_time', time());
$limit = 100;
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
//注册网易id
$user->createIMUser();
$mine->createIMUser();
$mine_messages = $im_service->querySessionMsg($mine->id,$user->id,$begintime,$endtime,$reverse='1');
$user_messages = $im_service->querySessionMsg($user->id,$mine->id,$begintime,$endtime,$reverse='1');
dd($mine_messages);
if ($mine_messages['code'] != 200 || $user_messages['code'] != 200) {
throw new \Exception("获取网易聊天记录失败", 1);
}
return $this->success('ok', compact('mine_messages', 'user_messages'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取聊天记录失败,请稍后再试');
}
}
/**
* 发送单聊类容
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function sendChatMessageToUserv2(Request $request, $other_user_id)
{
Log::info('sendChatMessageToUserv2');
try {
$user = $request->other_user;
\DB::beginTransaction();
$mine = auth()->user();
$date = date('Y-m-d H:i:s');
$history = BannedHistory::where('user_id',$mine->id)->where('type','chat')->first();
if (!empty($history)) {
if($history->end_time >= $date && $history->start_time <= $date) return $this->failure('你被禁止聊天至'.$history->end_time);
}
//双方是否建立联系
$system_type = ['remind','greet','notice'];
$my_num = ChatMessage::where('user_id',$mine->id)->where('other_user_id',$user->id)->wherenotin('system_type',$system_type)->count();
$other_num = ChatMessage::where('user_id',$user->id)->where('other_user_id',$mine->id)->wherenotin('system_type',$system_type)->count();
$content = $request->input('content', '');
//我的聯係人
$my_linkman = MessageLinkman::where('user_id', $mine->id)->where('other_user_id', $user->id)->first();
$other_linkman = MessageLinkman::where('user_id', $user->id)->where('other_user_id', $mine->id)->first();
if (empty($other_linkman)) {
$other_linkman = MessageLinkman::create([
'user_id'=>$user->id,
'other_user_id'=>$mine->id,
]);
}else{
$other_linkman->updated_at = date('Y-m-d H:i:s');
$other_linkman->save();
}
if (empty($my_linkman)) {
$my_linkman = MessageLinkman::create([
'user_id'=>$mine->id,
'other_user_id'=>$user->id,
]);
}else{
$my_linkman->updated_at = date('Y-m-d H:i:s');
$my_linkman->save();
}
//发送破冰问题
$data = [
'mine'=>auth()->user(),
'user'=>$user,
];
\App\Jobs\SendFriendQuestion::dispatch($data)->onQueue('love');
\DB::commit();
//如果双方已经通信.第三次
if($my_num<=1&&$other_num>=1){
//发送端已认证,接受端未认证
if($mine->is_real_approved==1&&$user->is_real_approved!=1){
$day = date('d');
$key = 'u'.$mine->id.'f'.$user->id.'chat'.$day;
$result = Cache::add($key, true, 60*24);
if($result)//是否提示过
return $this->success('消息发送成功',['status'=>1]);
return $this->success('消息发送成功',['status'=>0]);
}
return $this->success('消息发送成功',['status'=>0]);
}elseif ($my_num>=2) {
//如果发送方未认证
if($mine->is_real_approved!=1){
//如果在审核中
if($mine->is_real_approved==2)
return $this->success('消息发送成功',['status'=>3]);
return $this->success('消息发送成功',['status'=>2]);
}
//如果已邀请对方认证
$remind = ChatMessage::where('user_id',$mine->id)->where('other_user_id',$user->id)->where('system_type','remind')->exists();
if($remind&&$user->is_real_approved!=1)
return $this->success('消息发送成功',['status'=>5]);
//如果接受方未认证
if($user->is_real_approved!=1)
return $this->success('消息发送成功',['status'=>4]);
return $this->success('消息发送成功',['status'=>0]);
//如果双方已经通信.第一次
}else{
return $this->success('消息发送成功',['status'=>0]);
}
} catch (\Exception $e) {
\DB::rollback();
$this->getError($e);
return $this->failure('发送聊天信息失败,请稍后再试');
}
}
/**
* 发送单聊类容
* @param Request $request [description]
* @param User $user [description]
* @return [type] [description]
*/
public function sendChatMessageToUser(Request $request, User $user)
{
Log::info('sendChatMessageToUser');
try {
\DB::beginTransaction();
$mine = auth()->user();
$date = date('Y-m-d H:i:s');
$history = BannedHistory::where('user_id',$mine->id)->where('type','chat')->first();
if (!empty($history)) {
if($history->end_time >= $date && $history->start_time <= $date) return $this->failure('你被禁止聊天至'.$history->end_time);
}
$content = $request->input('content', '');
//我的聯係人
$my_linkman = MessageLinkman::where('user_id', $mine->id)->where('other_user_id', $user->id)->first();
$other_linkman = MessageLinkman::where('user_id', $user->id)->where('other_user_id', $mine->id)->first();
if (empty($other_linkman)) {
$other_linkman = MessageLinkman::create([
'user_id'=>$user->id,
'other_user_id'=>$mine->id,
]);
}else{
$other_linkman->updated_at = date('Y-m-d H:i:s');
$other_linkman->save();
}
if (empty($my_linkman)) {
$my_linkman = MessageLinkman::create([
'user_id'=>$mine->id,
'other_user_id'=>$user->id,
]);
}else{
$my_linkman->updated_at = date('Y-m-d H:i:s');
$my_linkman->save();
}
$content_type = $request->input('content_type', 'TEXT');
//创建聊天记录
$message = ChatMessage::create([
'user_id'=>$mine->id,
'other_user_id'=>$user->id,
'content'=>$content,
'content_type'=>$content_type,
]);
//发送破冰问题
$data = [
'mine'=>auth()->user(),
'user'=>$user,
];
\App\Jobs\SendFriendQuestion::dispatch($data)->onQueue('love');
\DB::commit();
return $this->success('消息发送成功');
} catch (\Exception $e) {
\DB::rollback();
$this->getError($e);
return $this->failure('发送聊天信息失败,请稍后再试');
}
}
//提醒好友认证
public function remindFriend(Request $request)
{
$mine = auth()->user();
$other_user_id = $request->user_id;
$user = User::where('id',$other_user_id)->first();
if(!$user)return $this->failure('好友信息获取失败~');
try {
//网易聊天消息发送
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$content = '你还没有真人认证,赶快一键认证来与我畅聊吧~';
$body = ['msg'=>$content];
$ext = ['type'=>'remind']; //friend_question破冰问题is_used 自己是否设置破冰问题
$result = $im_service->sendMsg($mine->id,$ope=0,$user->id,$type=0,$body,$option=array("push"=>false,"roam"=>true,"history"=>true,"sendersync"=>true, "route"=>false),$pushcontent='',$ext,1004);
if ($result['code'] != 200) {
throw new \Exception("网易发送提醒信息失败-".$result['desc'], 1);
}
//创建聊天记录
ChatMessage::create([
'user_id'=>$mine->id,
'other_user_id'=>$user->id,
'type'=>'CHAT',
'content'=>$content,
'status'=>1,
'system_type'=>'remind',
]);
//添加系统消息
$content = $mine->nickname.'对你很感兴趣提醒你真人认证与Ta继续畅聊点击真人认证》》';
$message = $request->message?:$content;
// $notice = $this->userCon->sendNotice($user->id, $mine->id, 'friend', $content, $message);
//todo 推送消息
// $this->momentCon->sendAttachMsg($notice->id, 'friend', $content, $mine->id, $user->id, $mine->app_avatar);
return $this->success('ok');
} catch (\Exception $e) {
//throw $th;
return $this->failure('提醒失败,请稍后再试~');
}
}
public function greetLog(Request $request)
{
$logs = \DB::table('greet_logs')->get()->toArray();
$count = count($logs);
if (empty($count)) return $this->success('ok');
$index = random_int(0, $count-1);
return $this->success('ok',$logs[$index]);
}
/**
* 提现对方上传生活照
* @param Request $request [description]
* @param [type] $user_id [description]
* @return [type] [description]
*/
public function remindProfilePhoto(Request $request, $user_id)
{
try {
$content = '【'.auth()->user()->nickname.'】对你的资料非常感兴趣,希望你能完善交友卡片';
$type = 'remind_profile_photo';
$count = Notice::where('user_id', $user_id)->where('send_user_id', auth()->id())->where('type', $type)->count();
if ($count) return $this->failure('已提醒对方');
//生成提醒记录
$notice = $this->userCon->sendNotice($user_id, auth()->id(), $type, $content,$content);
//发送提醒推送消息
$result = $this->momentCon->sendAttachMsg($notice->id, $type, $content, auth()->id(), $user_id, auth()->user()->app_avatar);
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('提醒失败,请稍后再试');
}
}
/**
* 不喜欢用户
* @param Request $request [description]
* @param [type] $user_id [description]
* @return [type] [description]
*/
public function dislikeUser(Request $request, $user_id)
{
try {
$log = auth()->user()->dislikeLogs()->firstOrCreate(['type_id'=>$user_id, 'type'=>'user']);
return $this->success('ok', $log);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('操作失败,请稍后再试');
}
}
/**
* 赠送礼物给用户
* @param Request $request [description]
* @param [type] $user_id [description]
* @param [type] $gift_id [description]
* @return [type] [description]
*/
public function sendUserGift(Request $request, $user_id, $gift_id)
{
try {
$user = User::find($user_id);
$gift = InteractLiveGift::find($gift_id);
$result = $this->liveCon->sendLiveGift($user_id, $gift_id, 'user');
if (empty($result)) throw new \Exception("赠送礼物失败", 1);
if (is_array($result) && $result['code']) return $this->failure($result['msg']);
$content = auth()->user()->nickname."赠送了「".$gift->name."」给你";
//发送系统通知
$this->userCon->sendNotice($user_id, auth()->id(), 'gift', $content, $content, $gift_id);
//发送推送消息和短信消息
$result = $this->momentCon->sendAttachMsg(auth()->id(), 'gift', $content, auth()->id(), $user_id, auth()->user()->avatar);
//短信
$this->sendGiftSms($user, $gift);
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('赠送礼物失败,请稍后再试');
}
}
public function sendGiftSms($user,$gift)
{
try {
$data = [
'name'=> $user->nickname,
'other_name'=> auth()->user()->nickname,
'gift'=>$gift->name,
'user_id'=>auth()->id(),
];
$m = Message::create([
'phone' => $user->mobile,
'message' => '',
'confirmed' => 1,
'code' => '活动',
'ip' => request() ? request()->ip() : '127.0.0.1',
]);
$message_url = \CommonUtilsService::clickUrl(env('APP_URL')."/h5/#/appUserDetails/".$data['user_id'],$m->id);
$result = \CommonUtilsService::shortUrl($message_url);
$short_url = $result['code'] == 0?$result['url']:$url;
$message = "Hi-".$data['name']."".$data['other_name']."给你送了一个「".$data['gift']."」,可点击".$short_url." 查看Ta的信息";
$m->message = $message;
Messenger::sendSMS($user->mobile, $message);
$m->message = $message;
$m->save();
return true;
} catch (\Exception $e) {
$this->getError($e);
return false;
}
}
/** 记录用户列表浏览 */
public function usersBrowse(Request $request)
{
try {
$result = $this->userCon->usersBrowse();
if (empty($result)) throw new \Exception("记录用户浏览失败");
} catch (\Exception $e) {
$this->getError($e);
}
return $this->success('ok');
}
}