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

2394 lines
104 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;
use App\Common\cache\redis\ApiRedisKey;
use App\Models\ActivityShareHistory;
use App\Models\CommunityActivity;
use App\Models\Live\LiveBanner;
use App\Models\MerchantAccount;
use App\Models\MerchantUsers;
use App\Models\Server\ActivityPhoto;
use App\Models\Server\MatchLog;
use App\Models\Server\MerchantMembers;
use App\Models\Server\MerchantUser;
use App\Models\TouristOrder;
use App\Models\WangYiYunUser;
use App\Models\UserMember;
use App\Services\IMService;
use App\Services\UserService;
use Illuminate\Http\Request;
use App\Models\Activity;
use App\Models\ActivityMember;
use App\Models\Wechat;
use App\Models\ProfileCourt;
use App\Models\ProfileCourtship;
use App\Models\User;
use App\Models\Server\SaasNotice;
use App\Models\ActivitySexVote;
use App\Models\ActivityVote;
use App\Models\ActivityMatch;
use App\Models\ActivitySexMatch;
use App\Models\Announcement;
use App\Models\PaasAnnouncement;
use App\Models\AccessRecord;
use App\Models\ActivityClass;
use EasyWechat;
use App\Contracts\ActivityContract;
use App\Contracts\UserContract;
use App\Models\ActivitiesCollect;
use App\Models\AnchorVideo;
use App\Models\Live\Anchor;
use App\Models\Live\Viewer;
use App\Models\Server\CollageGroup;
use App\Models\Server\CollageGroupHistories;
use App\Models\VersionsCheck;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class ActivityController extends Controller
{
protected $activityCon;
protected $userCon;
public function __construct(ActivityContract $activityCon, UserContract $userCon)
{
$this->activityCon = $activityCon;
$this->userCon = $userCon;
}
/**
* 活动列表
* @param Request $Request [description]
* @return [type] [description]
*/
public function activities(Request $request)
{
$is_deadline = $request->input('is_deadline', 0);
$id = auth()->id();
$activities = Activity::withCount(['activityMember' => function ($query) use ($id) {
$query->where('user_id', auth()->id());
}
])->where('is_deadline', $is_deadline)->where('is_cancel', 0)->where('is_hidden', 0)->where('theme', '<>', '测试');
if ($is_deadline) {
$activities = $activities->orderBy('start_time', 'desc')->orderBy('id', 'desc');
} else {
$activities = $activities->orderBy('is_top', 'desc');
}
$keyword = $request->input('keyword');
if ($keyword) {
$keyword = trim($keyword);
$activities = $activities->where("theme", 'like', '%' . $keyword . '%');
}
$activities = $activities->paginate();
foreach ($activities as $activity) {
$start_time = date('Y/m/d', strtotime($activity->start_time));
$end_time = date('Y/m/d', strtotime($activity->end_time));
if ($start_time === $end_time) {
$time = $start_time;
} else {
if (empty($activity->end_time)) {
$time = $start_time . ' - ' . '待定';
} else {
$time = $start_time . ' - ' . $end_time;
}
}
$activity->city = $activity->city ?: '无';
$activity->dist = $activity->dist ?: '无';
$activity->time = $time;
$activity->poster = $activity->poster . '?x-oss-process=style/scale1';
}
return $this->success('ok', $activities);
}
/**活动列表 */
public function activitiesV2(Request $request)
{
$user = $this->getMyUserinfo();
$user_id = 0;
if ($user) {
$user_id = $user->id;
}
try {
$activities = Activity::with('class')->withCount([
'activityMember' => function ($query) use ($user_id) {
$query->where('user_id', $user_id);
}, 'activityMemberNotSign' => function ($query) use ($user_id) {
$query->where('user_id', $user_id);
$query->whereNull('sign_in');
}
])->where('is_cancel', 0)->where('is_hidden', 0)->where('theme', '<>', '测试');
$type = $request->input('type');
//类型
if ($type == '可报名' || $type == '进行中') {
$now = date('Y-m-d H:i:s');
$activities = $activities/*->where('start_time', '<', $now)*/ ->where('end_time', '>', $now);
} elseif ($type == '已结束') {
$activities = $activities->where('is_deadline', 1);
}
//分类
$class_id = $request->input('class_id');
if ($class_id && $class_id != '不限') {
$activities = $activities->where('class_id', $class_id);
}
//价格
$price = $request->input('price');
if ($price == '免费') {
$activities = $activities->where('fee', 0);
} elseif ($price == '收费') {
$activities = $activities->where('fee', '>', 0);
}
//筛选
$screen = $request->input('screen');
if ($screen == '已报名') {
if ($user_id) {
$activity_ids = ActivityMember::where('user_id', $user_id)->pluck('activity_id');
$activities = $activities->whereIn('id', $activity_ids);
}
} elseif ($screen == '未报名') {
if ($screen == '已报名') {
$activity_ids = ActivityMember::where('user_id', $user_id)->pluck('activity_id');
$activities = $activities->whereNotIn('id', $activity_ids);
}
}
$keyword = $request->input('keyword');
if ($keyword) {
$keyword = trim($keyword);
$activities = $activities->where("theme", 'like', '%' . $keyword . '%');
}
$activities = $activities->orderBy('is_top', 'desc')->orderBy('start_time', 'desc')->paginate();
foreach ($activities as $activity) {
if ($user_id == 0) {
$activity->activity_member_count = 0;
} else if ($activity->activity_member_count >= 1) {
if ($activity->can_repeat_sign == 1) {
if ($activity->activity_member_not_sign_count == 0) {
$activity->activity_member_count = 0;
} else {
$activity->activity_member_count = 1;
}
}
}
$apply_status = 1;
// 1.可以报名 。 2 .已经报名 3.截止报名 4.已结束
if ($activity->activity_member_count == 0) {
if (!empty($activity->apply_deadline)) {
$apply_deadline = strtotime($activity->apply_deadline);
if ($apply_deadline < time()) {
$apply_status = 3;
}
}
} else {
$apply_status = 2;
}
if ($activity->is_deadline == 1) {
$apply_status = 4;
}
$activity->apply_status = $apply_status;
$start_time = date('Y/m/d', strtotime($activity->start_time));
$end_time = date('Y/m/d', strtotime($activity->end_time));
if ($start_time === $end_time) {
$time = $start_time;
} else {
if (empty($activity->end_time)) {
$time = $start_time . ' - ' . '待定';
} else {
$time = $start_time . ' - ' . $end_time;
}
}
$activity->city = $activity->city ?: '无';
$activity->dist = $activity->dist ?: '无';
$activity->time = $time;
//sku
$skus = [];
if ($activity->sku) {
$skus = $activity->sku->skus;
if (!is_array($skus)) {
$skus = json_decode($activity->sku->skus, true);
}
}
$activity->skus = $skus;
unset($activity->sku);
if (count($skus) >= 1) {
$activity->fee = $skus[0]['price'];
}
if ($activity->fee == 0) {
$activity->fee = 0;
} else {
$activity->fee = floatval($activity->fee);
}
$activity->poster = $activity->poster . '?x-oss-process=style/scale1';
}
return $this->success('ok', $activities);
} catch (\Exception $e) {
return $this->failure('数据获取失败,请稍后再试');
}
}
/**
* 获取商户同步的活动
* @param Request $request
*/
public function businessActivities(Request $request)
{
$version_check = VersionsCheck::where('state',1)->pluck('versions')->toArray();//审核中的版本号
$user = $this->authCheck();
$userId = 0;
if ($user) {
$userId = $user->id;
}
$class = $request->input('class', 'one');
$wechat = Wechat::where('user_id', $userId)->first();
$result = CommunityActivity::where('status', 1)->where('class', $class)->where('is_mp_show', 1)->withCount('member');
//if($request->merchant_id != 88){
$result = $result->where('type', 'business');
//}
$keyword = $request->input('keyword');
if ($keyword) {
$keyword = trim($keyword);
$result = $result->where("title", 'like', '%' . $keyword . '%');
}
if(in_array($request->versions,$version_check)){
//审核中版本不展示盲盒相关活动
$result = $result->where('title','not like','%盲盒%');
}
$result = $result->orderBy('mp_top', 'desc')->orderBy('sort', 'desc')->orderBy('apply_deadline', 'desc')->orderBy('id', 'desc')->paginate();
$time = date('Y-m-d H:i:s');
foreach ($result as $key => $value) {
//该活动是否开启拼团
$group = CollageGroup::where('type', 'community')->where('type_id', $value->id)->where('start_time', '<', $time)->where('end_time','>',$time)->first();
if ($group) {
$is_group = 1;
} else {
$is_group = 0;
}
$merchant = Anchor::where('m_id', $value->merchant_id)->select('name as share_title', 'pic as share_icon')->first();
$value->merchant = $merchant;
if ($userId && $value->price > 0) {
$value['paymentStatus'] = TouristOrder::where('open_id', $wechat->openid)->where('type', 'community')->where('type_id', $value->id)->whereIn('pay_status', [1, 4])->count() ? true : false;
} elseif ($userId && $value->price == 0) {
$value['paymentStatus'] = TouristOrder::where('open_id', $wechat->openid)->where('type', 'community')->where('type_id', $value->id)->whereIn('pay_status', [1, 4])->exists();
} else {
$value['paymentStatus'] = false;
}
if ($value->sku) {
$sku = ltrim($value->sku, '[');
$sku = rtrim($sku, ']');
$value->sku = json_decode($sku, true);
}
//判断活动是否截止报名 is_deadline 0:可以报名 1:已报名 2:截止报名 3活动结束
if ($value->class == 'one') {
$is_deadline = 0;
if ($value['paymentStatus']) {
$is_deadline = 1;
} elseif ($value->apply_deadline && $value->apply_deadline <= $time) {
$is_deadline = 2;
} elseif ($value->end_time && $value->end_time <= $time) {
$is_deadline = 3;
}
$value->is_deadline = $is_deadline;
}
$value->is_group = $is_group;
}
return $this->success('ok', $result);
}
/**
* 同步的商户活动的详情
* @param Request $request
*/
public function businessActivity(Request $request)
{
$start = microtime(true);
$id = $request->id;
// if ($id == 1279) {
// $id = 1353;//临时切换
// }
$key = 'love_community_pv';
Redis::zincrby($key, 1, $id);
$openid = null;
$mp_openid = null;
$user = $this->authCheck();
$userId = 0;
$merchant_user_id = 0;
$linkmen['name'] = '';
$linkmen['mobile'] = '';
if ($user) {
// $openid = $user->wechat->official_openid;
$userId = $user->id;
$user_service = new UserService();
try {
$merchant_user = $user_service->syncSaasUser($user);
}catch (\Exception $e){
$this->getError($e);
}
$linkmen['name'] = $user->name;
$linkmen['mobile'] = $user->mobile;
$mp_openid = $user->wechat ? $user->wechat->openid : null;
}
//活动详情
$result = CommunityActivity::withTrashed()->where('id', $id)/*->where('merchant_id', 491)->where('is_mp_show',1)*/->first();
//记录首页弹框点击过来的人数
$home_popout_id = $request->input('home_popout_id');
if($home_popout_id && $user){
$cache_key = ApiRedisKey::getHomePopoutClickUserKey($home_popout_id);
Redis::sAdd($cache_key,$user->id);
}
if (!$result) return $this->failure('该活动已下线或不存在');
if ($user) $user->preview($result);
if(empty($result->address)) $result->address = '线上活动';
$result->linkmen = $linkmen;
$result->increment('pv', 1);
$result->price = floatval($result->price);
$banner = LiveBanner::where('class', 'community')->where('class_id', $id)->value('icon');
$result->banner = json_decode($banner, true);
$result->sku = json_decode($result->sku, true);
if ($result->pay_type == 'free'){
$result->sku = null;
}
//活动打赏
$reward_count = \App\Models\Server\TouristOrder::where('type', 'reward_activity')->where('type_id', $id)->whereIn('pay_status', [1, 4])->get()->count();
$result->reward_count = $reward_count;
//商户信息
$merchant = MerchantAccount::with('anchorV2')->where('id', $result->merchant_id)->first();
// $result->merchant_name = $merchant['anchorV2']['name'];
// $result->merchant_pic = $merchant['anchorV2']['pic'];
$result->merchant_name = !empty($merchant['anchorV2']) ? $merchant['anchorV2']['name'] : '未获取';
$result->merchant_pic = !empty($merchant['anchorV2']) ? $merchant['anchorV2']['pic'] : User::DefaultAvatar;
// $result->member_count = ($result->hidden_order_total == 1)?'':(TouristOrder::where('type', 'community')->where('type_id', $id)->whereIn('pay_status', [1, 4])->groupBy('open_id')->get()->count());
$orders = TouristOrder::where('type', 'community')->where('type_id', $id)->whereIn('pay_status', [1, 4])->groupBy('open_id')->get();
$count = 0;
foreach ($orders as $order) {
if ($order->linkmen) {
$link_count = count(json_decode($order->linkmen, true))?:1;
$count += $link_count;
}
}
if ($count == 0) {
$count = $orders->count();
}
$result->member_count = ($result->hidden_order_total == 1)?'': $count;
//活动成员
$join_member = [];
$i = 0;
//订单列表
$orders = TouristOrder::where('type', 'community')->where('type_id', $id)->whereIn('pay_status', [1, 4])->where('open_id', '<>', null)->whereIn('channel', [1, 3])->groupBy('open_id')->limit(5)->get();
foreach ($orders as $order) {
if ($order->channel == 1) {
$join_user = MerchantUser::where('openid', $order->open_id)->first();
$join_member[$i]['user_id'] = $join_user->user_id;
$join_member[$i]['photo'] = $join_user->pic;
$join_member[$i]['name'] = $join_user->nickname;
} else {
$join_user = Wechat::with('user')->where('openid', $order->open_id)->first();
if (empty($join_user)) continue;
$join_member[$i]['user_id'] = $join_user->user_id;
$join_member[$i]['photo'] = $join_user['user']['photo'];
$join_member[$i]['name'] = $join_user['user']['nickname'];
if (!($join_member[$i]['photo'])) $join_member[$i]['photo'] = MerchantUser::where('user_id', $join_user->user->id)->value('pic');
if (!($join_member[$i]['name'])) $join_member[$i]['name'] = MerchantUser::where('user_id', $join_user->user->id)->value('nickname');
}
$join_member[$i]['name'] = $result->hidden_avatar ? mb_substr($join_member[$i]['name'], 0, 1)."**": $join_member[$i]['name'];
$i++;
}
$result->join_member = $join_member;
$merchant_user_id = $this->matchMerchantUser($userId);
// 是否购买过
$pay_status = TouristOrder::where('account_id', $merchant_user_id)->where('type', 'community')->where('type_id', $id)->whereIn('pay_status', [1, 4])->exists();
$result->pay_status = $pay_status;
// $result->share_qr_code = $qr_code;
// 是否领取过优惠券
$coupon = UserMember::where('type', 'community')->where('type_id', $id)->where('m_id', $request->merchant_id)->where('m_user_id', $merchant_user_id)->exists();
$value = TouristOrder::where('type', 'community')->where('type_id', $id)->where('account_id', $merchant_user_id)->whereIn('pay_status', [1, 4])->first();
//判断活动是否截止报名 is_deadline 0:可以报名 1:已报名 2:截止报名 3活动结束
$time = date('Y-m-d H:i:s');
if ($result->class == 'one') {
$is_deadline = 0;
if ($value || $coupon) {
$is_deadline = 1;
} elseif ($result->apply_deadline && $result->apply_deadline <= $time) {
$is_deadline = 2;
} elseif ($result->end_time && $result->end_time <= $time) {
$is_deadline = 3;
}
$result->is_deadline = $is_deadline;
}
$result->start_time = $result->start_time ? date('Y-m-d H:i', strtotime($result->start_time)) : null;
$result->end_time = $result->end_time ? date('Y-m-d H:i', strtotime($result->end_time)) : null;
$result->apply_deadline = $result->apply_deadline ? date('Y-m-d H:i', strtotime($result->apply_deadline)) : null;
$end = microtime(true);
$result->cost_time = $end - $start;
//下架或删除状态 0下架 1正常上架 2已删除
$publish_state = 0;
if ($result->deleted_at) {
$publish_state = 2;
} elseif ($result->status == 1) {
$publish_state = 1;
} else {
$publish_state = 0;
}
$result->publish_state = $publish_state;
$order_id = null;
if ($request->from_openid && $request->from_openid != 'null') {
$user_service = new UserService();
$type = $result->class == 'one' ? '活动' : '服务';
$user_service->generateClientComment(2, $mp_openid, $request->from_openid, $type, $result->id, $result->title);
}
$result->love_pv = Redis::zscore('love_community_pv', $id) ?: 0;
//检查是否配置拼团内容
$group = CollageGroup::where('type', 'community')->where('type_id', $request->id)->where('start_time', '<', $time)->where('end_time','>',$time)->first();
if ($group) $group_sku = json_decode($group->sku, true);
$result->has_group = $group ? 1 : 0;//1有 0无
$result->group = $group;
if (isset($group_sku)) $result->sku = $group_sku;
if ($group) {
$result->group->need_count = $group->require_num;
$history = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
$sql->whereIn('pay_status', [1, 4]);
})->where('group_id', $group->id)->where('is_initiator', 1)->where('m_user_id', $merchant_user_id)->orderBy('created_at', 'desc')->first();
if ($history) {
$order_id = $history->m_order_id;
//目前参与人员
$user_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder', function ($sql) {
$sql->whereIn('pay_status', [1, 4]);
})->where('group_id', $group->id)->where('deadline', $history->deadline)->pluck('m_user_id')->toArray();
$count = count($user_ids);
$need_count = $history->group->require_num - $count;
unset($history->group);
$result->group->need_count = $need_count;
}
}
$result->order_id = $order_id;
$result->share_qrcode = $this->shareActivityQrcode($result,$mp_openid,$userId);
$result->has_pics = ActivityPhoto::where('type', 'activity')->where('type_id', $result->id)->count()?true:false;
//sku报名人数限制
$tourist_order = new \App\Models\Server\TouristOrder();
$sku = $result['sku'];
if($sku){
foreach ($sku as &$item) {
$item['sku_buy_num'] = 0;//该规格购买人数
$item['can_buy'] = 1;//是否可已购买
$total_limit_num = $item['total_limit_num'] ?? 0;
if (!$total_limit_num) {
continue;
}
$item['sku_buy_num'] = $tourist_order->getSkuBuyNum($id,$result->merchant_id,$item['sku_id']);
$item['can_buy'] = $item['sku_buy_num'] == $total_limit_num ? 0 : 1;
}
}
$result['sku'] = $sku;
return $this->success('ok', $result);
}
public function shareActivityQrcode($activity,$openid,$user_id,$versions=10){
try {
if($user_id){
$user = User::find($user_id);
$share_poster = $user->activityShareHistories()->where(['activity_id' => $activity->id, 'versions' => $versions])->first();
if ($share_poster && $share_poster->share_poster) return $share_poster->share_poster;
}
$app = EasyWechat::miniProgram();
$scene = 'party_id='.$activity->id.'&fuid='.$user_id;
if ($activity->class == 'one') {
// $response = $app->app_code->get('/pages/party/detail?party_id=' . $activity->id . '&from_openid=' . $openid . '&from_user_id=' . $user_id, $data);
$path = 'pages/party/detail';
} else {
// $response = $app->app_code->get('/pages/party/servicesDetail?party_id=' . $activity->id . '&from_openid=' . $openid . '&from_user_id=' . $user_id, $data);
$path = 'pages/party/servicesDetail';
}
$response = $app->app_code->getUnlimit($scene, [
'page'=>$path,
'is_hyaline'=>true
]);
$qrcode_path = storage_path('qrcode');
$file_name = 'activity'.$activity->id.'userid'.$user_id.'.jpg';
// Log::info("场景值:".$scene.' 长度:'.strlen($scene));
// Log::info($response);
if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
$response->saveAs($qrcode_path, $file_name);
}
$file_path = $qrcode_path.'/'.$file_name;
$qrcode = null;
if(file_exists($file_path)){
$qrcode = $this->uploadFile($file_path);
try{
unlink($file_path);
}catch(\Exception $e) {
return $qrcode;
// return $this->failure($e->getMessage());
}
}
// Log::info("二维码路径".$file_path);
// Log::info("分享二维码". $qrcode);
if ($user_id && $qrcode) {
ActivityShareHistory::updateOrCreate([
'user_id' => $user_id,
'activity_id' => $activity->id,
'versions' => $versions
], ['share_poster' => $qrcode]);
}
return $qrcode;
}catch (\Exception $e) {
$this->getError($e);
return '';
}
}
//某个活动 未完成拼团列表
public function unfinishedGroups(Request $request){
$user = $this->authCheck();
$userId = 0;
if ($user) {
$userId = $user->id;
}
$merchant_user = MerchantUsers::where('user_id', $userId)->first();
if(!$merchant_user){
$merchant_user_id = $this->matchMerchantUser($userId);
$merchant_user = MerchantUsers::where('id', $merchant_user_id)->first();
}
if($merchant_user){
//已参与
$exists = TouristOrder::where('type','community')->where('type_id',$request->id)->whereIn('pay_status',[1,4])->where('account_id',$merchant_user->id)->first();
if($exists) return $this->success('ok',[]);
}
$type = $request->input('type','activity');
if($type == 'activity' || 'service') $type = 'community';
$type_id = $request->type_id;
$group = CollageGroup::where('type',$type)->where('type_id',$type_id)->first();
if(!$group) return $this->success('ok',[]);
$time = date('Y-m-d H:i:s');
$histories = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){
$sql->whereIn('pay_status',[1,4]);
})->where('group_id',$group->id)->where('is_initiator',1)->where('status',0)->where('deadline','>',$time)->get();
foreach ($histories as $key => $history) {
$require_num = $history->group->require_num;
//已经参与人数
$user_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){
$sql->whereIn('pay_status',[1,4]);
})->where('group_id',$group->id)->where('deadline',$history->deadline)->pluck('m_user_id')->toArray();
$num = count($user_ids);
$need = ($require_num - $num) > 0 ? $require_num - $num : 0;
$history->need_count = $need;
$user_id = $history->mUser->user_id;
$user = User::find($user_id);
$history->avatar = $user ? $user->getOriginal('circle_avatar') : User::DefaultAvatar;
if(empty($history->avatar)) $history->avatar = User::DefaultAvatar;
$history->nickname = $user ? mb_substr(trim($user->nickname), 0, 1).'**' : '***';
unset($history->mUser);
unset($history->tOrder);
}
return $this->success('ok',$histories);
}
//热门拼团
public function hotGroups(Request $request){
$time = date('Y-m-d H:i:s');
$mine = $this->authCheck();
$order_id = $request->order_id;
// $order = TouristOrder::find($order_id);
$m_user_id = 0;
$join_ids = [];//我参与的活动id
if($mine){
$m_user_id = $this->matchMerchantUser($mine->id);
//我是否参与
$join_ids = TouristOrder::where('type','community')->where('account_id',$m_user_id)->whereIn('pay_status',[1,4])->pluck('type_id')->toArray();
}
$groups = CollageGroup::where('m_id',491)->where('type','community')->where('start_time','<',$time)->where('end_time','>',$time)->whereNotIn('type_id',$join_ids)->limit(5)->get();
foreach ($groups as $key => $group) {
$type = $group->type;
$group->title = $group->$type ? $group->$type->title : '未获取';
$group->pic = $group->$type ? $group->$type->pic : User::DefaultAvatar;
$group->sku = json_decode($group->sku,true);
$min_price = [];
$single_buy = $group->price;
foreach ($group->sku as $skus) {
$min_price[] = $skus['discount_price'];
}
$group->discount_price = min($min_price);
foreach ($group->sku as $skus) {
if($group->discount_price == $skus['discount_price']){
$single_buy = $skus['price'];
break;
}
}
$group->single_buy = $single_buy;
// $group->single_buy = $group->sku[0]['price'];
// $group->discount_price = $group->sku[0]['discount_price'];
$group->save_money = ($group->single_buy - $group->discount_price) > 0 ? number_format($group->single_buy - $group->discount_price,2):0;
unset($group->$type);
}
return $this->success('ok',$groups);
}
// public function hotGroups(Request $request){
// $time = date('Y-m-d H:i:s');
// $mine = $this->authCheck();
// $order_id = $request->order_id;
// $m_user_id = 0;
// $group_ids = [];
// if($mine){
// $m_user_id = $this->matchMerchantUser($mine->id);
// //我参与的拼团id
// $group_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){
// $sql->whereIn('pay_status',[1,4]);
// })->where('m_user_id',$m_user_id)->pluck('group_id');
// }
// $histories = CollageGroupHistories::with('tOrder','group')->whereHas('tOrder',function($sql){
// $sql->whereIn('pay_status',[1,4]);
// })->where('is_initiator',1)->where('status',0)->whereNotIn('group_id',$group_ids)->where('m_order_id','<>',$order_id)->where('deadline','>',$time)->orderBy('deadline','asc')->limit(5)->get();
// foreach ($histories as $key => $value) {
// $value->sku = json_decode($value->group->sku);
// $type = $value->group->type;
// $value->single_buy = $value->sku[0]->price;//原价
// $value->discount_price = $value->sku[0]->discount_price;//折扣价
// $value->save_money = ($value->single_buy - $value->discount_price) > 0 ? number_format($value->single_buy - $value->discount_price,2):0;
// $value->pic = $value->group->$type ? $value->group->$type->pic : User::DefaultAvatar;
// $value->title = $value->group->$type ? $value->group->$type->title : '未获取';
// $user_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){
// $sql->whereIn('pay_status',[1,4]);
// })->where('group_id',$value->group_id)->where('deadline',$value->deadline)->pluck('m_user_id')->toArray();
// $num = count($user_ids);
// $need = ($value->group->require_num - $num) > 0 ? ($value->group->require_num - $num) : 0;
// $value->need_count = $need;
// unset($value->group);
// unset($value->tOrder);
// }
// return $this->success('ok',$histories);
// }
/**
* 创建网易云信账号
* @param $data
* @param $merchant_user_id
*/
public function createWyyUser($data, $merchant_user_id)
{
$im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET'));
$result = $im_service->createUserId(10000000 + $merchant_user_id, $data['nickname'], $props = '{}', null);
\Log::info('创建网易云账号');
if ($result['code'] == 200) {
$wyyUser = new WangYiYunUser;
$wyyUser->accid = 10000000 + $merchant_user_id;
$wyyUser->name = $data['nickname'];
$wyyUser->gender = $data['sex'];
$wyyUser->token = $result['info']['token'];
$wyyUser->save();
} elseif ($result['code'] == 414 && $result['desc'] == 'already register') {
$result = $im_service->getUinfos([$data['openid']]);
if ($result['code'] == 200) {
$info = $result['uinfos'][0];
$accid = '';
$name = '';
$gender = '';
if (array_key_exists("accid", $info)) {
$accid = $info['accid'];
}
if (array_key_exists("name", $info)) {
$name = $info['name'];
}
if (array_key_exists("icon", $info)) {
$icon = $info['icon'];
}
if (array_key_exists("gender", $info)) {
$gender = $info['gender'];
}
$wyyUser = new WangYiYunUser;
$wyyUser->accid = $accid;
$wyyUser->name = $name;
$wyyUser->gender = $gender;
$wyyUser->icon = $icon;
$wyyUser->save();
//更新网易云token
$result = $im_service->updateUserToken($accid);
if ($result['code'] == 200) {
$wyyUser->token = $result['info']['token'];
}
$wyyUser->save();
}
}
}
public function activityClasses(Request $request)
{
$classes = ActivityClass::
withCount(['activity' => function ($q) {
$q->where('is_cancel', 0)
->where('is_hidden', 0)
->where('theme', '<>', '测试');
}])
->get()->toArray();
$array = [];
$i = 0;
foreach ($classes as $c) {
if ($c['activity_count'] > 0) {
$array[] = $c;
// $array[$i]['id'] = $c['id'];
// $array[$i]['title'] = $c['title'];
// $array[$i]['created_at'] = date('Y-m-d H:i:s',$c->created_at);
$i++;
}
}
return $this->success('ok', $array);
}
/**
* 活动详情
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function activity(Request $request, $activity_id)
{
$user = $this->authCheck();
$id = 0;
if ($user) {
$id = $user->id;
}
$is_set = Activity::where('id', $activity_id)->count();
if (empty($is_set)) {
return $this->failure('活动不存在');
}
$activity = Activity::with('class')->withCount([
'activityMember' => function ($query) use ($id) {
$query->where('user_id', $id);
}, 'activityMemberNotSign' => function ($query) use ($id) {
$query->where('user_id', $id);
$query->whereNull('sign_in');
}
])->findOrFail($activity_id);
$activity->end_time = $activity->end_time ? $activity->end_time : '待定';
$activity->end_time = substr($activity->end_time, 0, 16);
$activity->start_time = substr($activity->start_time, 0, 16);
$activity->address = $activity->address ?: '全国';
$activity->increment('click_num', 1);
//最近参加
$member_count = ActivityMember::where('activity_id', $activity_id)
->join('users', 'users.id', 'activity_members.user_id')
->where('is_joined', 1)
->orderBy('id', 'desc')->count();
$activity->member_count = $member_count;
if ($activity->activity_member_count >= 1) {
if ($activity->can_repeat_sign == 1) {
if ($activity->activity_member_not_sign_count == 0) {
$activity->activity_member_count = 0;
} else {
$activity->activity_member_count = 1;
}
}
}
// 1.可以报名 。 2 .已经报名 3.截止报名 4. 活动已结束
$apply_status = 1;
if ($activity->activity_member_count == 0) {
if (!empty($activity->apply_deadline)) {
$apply_deadline = strtotime($activity->apply_deadline);
if ($apply_deadline < time()) {
$apply_status = 3;
}
}
} else {
$apply_status = 2;
}
if ($activity->is_deadline == 1) {
$apply_status = 4;
}
$activity->apply_status = $apply_status;
$members = ActivityMember::where('activity_id', $activity_id)->where('is_joined', 1)
->orderBy('id', 'desc');
$members = $members
->join('users', 'users.id', 'activity_members.user_id')
->get(['activity_members.id',
'activity_members.user_id',
'activity_members.activity_id',
'activity_members.linkmen',
'activity_members.name',
'activity_members.mobile',
'activity_members.avatar',
'activity_members.sex',
'activity_members.is_joined',
'activity_members.sign_in',
'activity_members.created_at',
'activity_members.deleted_at',
'users.id as user_u_id',
'users.nickname',
'users.type',
'users.nickname as name',
'users.circle_avatar as user_circle_avatar',
'users.photo as user_photo',
'users.app_avatar as user_app_avatar'
]
);
foreach ($members as $member) {
if (!$member->avatar) {
if ($member->user_circle_avatar) {
$member->avatar = $member->user_circle_avatar;
} else if ($member->app_avatar) {
$member->avatar = $member->app_avatar;
} else if ($member->photo) {
$member->avatar = $member->photo;
} else {
$member->avatar = $this->userCon->defaultAvatar($member->sex);
}
}
$member->avatar = \CommonUtilsService::pictureLimit($member->avatar);
unset($member->user);
}
//缩略图海报
$activity->thumbnail_poster = $activity->poster . '?x-oss-process=image/auto-orient,1/resize,m_fill,w_500,h_400/quality,q_90';
$activity->detail_pic = json_decode($activity->detail_pic, true);
//sku
$skus = [];
if ($activity->sku) {
$skus = $activity->sku->skus;
if (!is_array($skus)) {
$skus = json_decode($activity->sku->skus, true);
}
$i = 0;
for ($s = 0; $s < count($skus); $s++) {
$skus[$s]['price'] = \CommonUtilsService::moneyFormat($skus[$s]['price'], 2);
}
}
$activity->hasFavorited = 0;
if ($user) {
//是否收藏
$activity->hasFavorited = ($user->hasFavorited($activity)) ? 1 : 0;
}
$activity->skus = $skus;
//价格区间
$activity->price_range = $this->getPriceRange($skus, $activity);
unset($activity->sku);
return $this->success('ok', compact('activity', 'members'));
}
public function getPriceRange($skus, $activity)
{
if (count($skus)) {
if (count($skus) == 1) {
return floatval($skus[0]['price']);
// return \CommonUtilsService::moneyFormat($skus[0]['price'],0);
} else {
$prices = [];
foreach ($skus as $sku) {
$prices[] = $sku['price'];
}
sort($prices);
$min_price = $prices[0];
$max_price = $prices[count($prices) - 1];
if ($min_price == $max_price) {
return floatval($min_price);
// return \CommonUtilsService::moneyFormat($min_price,0);
}
return floatval($min_price) . '~' . floatval($max_price);
}
} else {
return floatval($activity->fee);
// return \CommonUtilsService::moneyFormat($activity->fee,0) ;
}
}
/**
* 活动成员
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function activityMembers(Request $request, $activity_id)
{
$members = ActivityMember::whereHas('user', function ($sql) {
$sql->where('hidden_profile', '<>', 'ALLSEX');
})->where('activity_id', $activity_id)->where('is_joined', 1);
$keyword = $request->input('keyword');
if ($keyword) {
$keyword = trim($keyword);
$members = $members->where("name", 'like', '%' . $keyword . '%');
}
$sex = $request->input('sex');
if ($sex) {
$members = $members->where('sex', $sex);
}
$nopage = $request->input('nopage');
if ($nopage) {
$members = $members->get();
} else {
$members = $members->orderBy('id', 'desc')->paginate();
}
foreach ($members as $member) {
$member->type = User::where('id', $member->user_id)->value('type');
if (empty($member->sex)) {
$member->sex = $member->user->sex;
}
}
return $this->success('ok', $members);
}
/**
* 分享活动
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function shareActivity(Request $request, $activity_id)
{
$activity = Activity::find($activity_id);
if (empty($activity)) {
return $this->failure('该活动不存在');
}
$user = auth()->user();
if (empty($user)) {
$user = $this->authCheck();
}
$is_complete = 1;
$openid = '';
if (!empty($user)) {
$versions = 6;
$share_poster = $user->activityShareHistories()->where(['activity_id' => $activity_id, 'versions' => $versions])->first();
if ($share_poster) {
$pic = $share_poster->share_poster;
$thumbnail_poster = $pic . '?x-oss-process=image/auto-orient,1/resize,m_fill,w_500,h_400/quality,q_90';
$theme = $activity->theme;
return $this->success('ok', compact('pic', 'is_complete', 'thumbnail_poster', 'theme'));
}
$name = $user->nickname;
$openid = $user->wechat->openid;
if ($user->circle_avatar) {
$avatar = $user->circle_avatar;
} else {
$avatar = $user->wechat->avatar2 ?: $user->wechat->avatar;
// $avatar = $this->circleImage($avatar, $user->id);
}
if ($user->type == 'single') {
$profile = ProfileCourtship::where('user_id', $user->id)->first();
if (empty($profile)) {
$is_complete = 0;
} else {
$is_complete = ($this->userCon->isCompleteProfileV3($user)) ? 1 : 0;
}
}
} else {
$name = $request->input('name');
$avatar = $request->input('avatar');
$is_complete = 0;
}
$param = [
'avatar' => $avatar,
'openid' => $openid,
'name' => $name,
'user_id' => empty($user) ? 0 : $user->id
];
//生成海报
$pic = $this->makeUserShareActivityPoster($activity, $param);
if (empty($pic)) return $this->failure('图片上传失败,请稍后再试');
//创建记录
if ($user) {
$user->activityShareHistories()->create([
'activity_id' => $activity_id,
'share_poster' => $pic,
'versions' => $versions
]);
}
// $pic = 'http://local-pictures.oss-cn-shenzhen.aliyuncs.com/201812/18/1545103843activity_qrocde.png';
$thumbnail_poster = $activity->poster . '?x-oss-process=image/auto-orient,1/resize,m_fill,w_500,h_400/quality,q_90';
$theme = $activity->theme;
return $this->success('ok', compact('pic', 'is_complete', 'thumbnail_poster', 'theme'));
}
/**
* 生成用户分享海报
**/
public function makeUserShareActivityPoster($activity, $param)
{
$openid = $param['openid'];
$avatar = $param['avatar'];
$name = $param['name'];
$user_id = empty($param['user_id']) ? 0 : $param['user_id'];
$activity_id = $activity->id;
//二维码
$app = EasyWechat::miniProgram();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('/pages/party/detail?party_id=' . $activity_id . '&from_openid=' . $openid . '&from_user_id=' . $user_id, $data);
$path = time() . 'activity_qrocde.png';
$filename = $response->saveAs(storage_path('qrcode'), $path);
$qrcode_path = storage_path("qrcode/" . $path);
$qrcode = $qrcode_path;
$image1 = 'https://local-pictures.oss-cn-shenzhen.aliyuncs.com/202106/05/6a6bd16d5f9faf5d3a41f8d7d4f8bcbf.jpeg';
$image2 = $qrcode;
//二维码
$new_image = $this->imageAddImage($image1, $image2, 216, 216, 266, 196, 'bottom-left');
//头像
if (!empty($avatar)) {
// $back_avatar = 'https://local-pictures.oss-cn-shenzhen.aliyuncs.com/202106/05/12b054ed60c1d4469078f4b2871cfee7.png';
// $new_image = $this->imageAddImage($new_image, $back_avatar, 108, 108, 56, 62, 'top-left');
$new_image = $this->imageAddImage($new_image, $avatar, 98, 98, 61, 67, 'top-left');
}
//姓名
$new_image = $this->textAddImage($new_image, '您好,我是' . $name, 32, 190, 82, '#FFFFFF', 'left');
//介绍
$new_image = $this->textAddImage($new_image, '我在福恋发现了一个精彩活动', 32, 190, 126, '#FFFFFF', 'left');
//海报
$new_image = $this->imageAddImage($new_image, $activity->poster, 568, 322, 92, 258, 'top-left');
$top_height = 604;
//主题 标题
$new_image = $this->textAddImage($new_image, mb_substr($activity->theme, 0, 14), 40, 92, 604, '#000000', 'left');
$top_height += 20 + 40;
if (strlen($activity->theme) > 28) {
$new_image = $this->textAddImage($new_image, mb_substr($activity->theme, 14, strlen($activity->theme)), 40, 92, $top_height, '#000000', 'left');
$top_height += 20 + 40;
}
//主办方|费用
if ($activity->fee != 0.00) {
$fee = '¥' . $activity->fee;
} else {
$fee = '免费';
}
$host_img = 'https://local-pictures.oss-cn-shenzhen.aliyuncs.com/202106/05/52ef885b160b01df745e97e93802dc95.png';
$host = '主办:' . $activity->host/*.' | 费用:'.$fee*/
;
// $new_image = $this->imageAddImage($new_image, $host_img, 148,40, 92, 668, 'top-left');
$new_image = $this->textAddImage($new_image, $host, 28, 92, $top_height, '#333333', 'left');
$top_height += 28 + 28;
$address = str_limit($activity->address, 38, '...');
//地址 - 小图标
$addressIcon = 'https://local-pictures.oss-cn-shenzhen.aliyuncs.com/202106/05/d719038370411e4cb9da3ff2a94926da.png';
$new_image = $this->imageAddImage($new_image, $addressIcon, 22, 26, 92, $top_height, 'top-left');
$new_image = $this->textAddImage($new_image, $address, 26, 122, $top_height, '#666666', 'left');
$top_height += 26 + 19;
if (\CommonUtilsService::isDateValid($activity->start_time)) {
//时间
$d = \CommonUtilsService::diffBetweenTwoDays($activity->start_time, $activity->end_time);
if ($d != 0) {
$time = date('Y-m-d H:i', strtotime($activity->start_time)) . ' ~ ' . date('Y-m-d H:i', strtotime($activity->end_time));
} else {
$time = date('Y-m-d H:i', strtotime($activity->start_time)) . ' ~ ' . date('H:i', strtotime($activity->end_time));
}
} else {
$time = $activity->start_time . ' ~ ' . $activity->end_time;
}
//时间 - 小图标
$dateIcon = 'https://local-pictures.oss-cn-shenzhen.aliyuncs.com/202106/05/2df30990cb50a0960fa405bde93f132b.png';
$new_image = $this->imageAddImage($new_image, $dateIcon, 22, 22, 92, $top_height, 'top-left');
$new_image = $this->textAddImage($new_image, $time, 26, 122, $top_height, '#666666', 'left');
$file_path = storage_path("/qrcode/" . time() .mt_rand(0,999999). "activity_share.png");
$new_image->save($file_path);
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
if ($qrcode_path) {
unlink($qrcode_path);
}
unlink($file_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
return $pic;
}
/**
* 生成海报
**/
public function makeActivityPoster($activity, $param)
{
$openid = $param['openid'];
$avatar = $param['avatar'];
$name = $param['name'];
$user_id = empty($param['user_id']) ? 0 : $param['user_id'];
$activity_id = $activity->id;
//二维码
$app = EasyWechat::miniProgram();
$data = [];
$data['is_hyaline'] = true;
$response = $app->app_code->get('/pages/party/detail?party_id=' . $activity_id . '&from_openid=' . $openid . '&from_user_id=' . $user_id, $data);
$path = time() . 'activity_qrocde.png';
$filename = $response->saveAs(storage_path('qrcode'), $path);
$qrcode_path = storage_path("qrcode/" . $path);
$qrcode = $qrcode_path;
$image1 = 'http://images.ufutx.com/201904/17/d8d39f4e3be390539f43c6f57a733b85.jpeg';
$image2 = $qrcode;
//二维码
$new_image = $this->imageAddImage($image1, $image2, 234, 234, 258, 142, 'bottom-left');
//头像
if (!empty($avatar)) {
$new_image = $this->imageAddImage($new_image, $avatar, 108, 108, 56, 112, 'top-left');
}
//姓名
$new_image = $this->textAddImage($new_image, '您好,我是' . $name, 32, 176, 132, '#FFFFFF', 'left');
//介绍
$new_image = $this->textAddImage($new_image, '我在福恋发现一个好活动', 32, 176, 172, '#FFFFFF', 'left');
//海报
$new_image = $this->imageAddImage($new_image, $activity->poster, 592, 394, 80, 300, 'top-left');
//主题
$new_image = $this->textAddImage($new_image, mb_substr($activity->theme, 0, 15) . '...', 38, 80, 724, '#000000', 'left');
//主办方|费用
if ($activity->fee != 0.00) {
$fee = '¥' . $activity->fee;
} else {
$fee = '免费';
}
$host = '主办:' . $activity->host/*.' | 费用:'.$fee*/
;
$new_image = $this->textAddImage($new_image, $host, 26, 80, 784, '#585757', 'left');
//地址
// $address = $activity->city.' '.$activity->dist.' '.$activity->address;
$address = str_limit($activity->address, 44, '...');
$new_image = $this->textAddImage($new_image, $address, 26, 80, 828, '#929191', 'left');
//时间
$time = $activity->start_time . ' ~ ' . $activity->end_time;
$new_image = $this->textAddImage($new_image, $time, 26, 80, 868, '#000000', 'left');
$file_path = storage_path("/qrcode/" . time() .mt_rand(0,99999). "activity_share.png");
$new_image->save($file_path);
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
if ($qrcode_path) {
unlink($qrcode_path);
}
unlink($file_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
return $pic;
}
/**
* 支付页面
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function payActivity(Request $request, $activity_id)
{
$activity = Activity::findOrFail($activity_id);
//sku
$skus = [];
if ($activity->sku) {
$skus = $activity->sku->skus;
if (!is_array($skus)) {
$skus = json_decode($activity->sku->skus, true);
}
}
$activity->skus = $skus;
unset($activity->sku);
$user = auth()->user();
$user->profileCourtship;
$user->coin = $user->totalCoin();
return $this->success('ok', compact('activity', 'user'));
}
/**
* 用户参加的活动
* @param Request $request [description]
* @return [type] [description]
*/
public function userJoinedActivities(Request $request)
{
$user_id = auth()->id();
// $merchant_user = MerchantUser::where('user_id',$user_id)->first();
// $business_order = DB::table('tourist_orders')
// ->join('community_activities','tourist_orders.type_id','community_activities.id')
// ->where('community_activities.class','one')
// ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',[1,4])
// ->select('tourist_orders.id','tourist_orders.type','type_id',DB::raw("'business_order' as order_type"),'tourist_orders.price','tourist_orders.pay_type','pay_status','trade_no','desc as goods','tourist_orders.created_at');
// $order = DB::table('orders')->where('user_id', $user_id)->where('type', 'activity')->where('pay_status', 'PAID')
// ->select('id','type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at');
// $query = $business_order->union($order);
// $sql = $query->toSql();
// $orders = DB::table(DB::raw("($sql) as a"))->mergeBindings($query)
// ->orderBy('created_at','desc')->paginate();
$activity_ids = ActivityMember::where('user_id', $user_id)->pluck('activity_id');
// $is_deadline = $request->input('is_deadline', 0);
// $activities = Activity::whereIn('id', $activity_ids)->orderBy('id', 'desc');
// $type = $request->input('type', 'all');
// if ($type === 'joining') {
// $activities = $activities->where('is_deadline', 0);
// }elseif ($type === 'joined') {
// $activities = $activities->where('is_deadline', 1);
// }
// $keyword = $request->input('keyword');
// if ($keyword) {
// $keyword = trim($keyword);
// $activities = $activities->where('theme', 'like', '%'.$keyword.'%');
// }
// $activities = $activities->paginate();
// foreach ($activities as $activity) {
// $start_time = date('Y/m/d', strtotime($activity->start_time));
// $end_time = date('Y/m/d', strtotime($activity->end_time));
// if ($start_time === $end_time) {
// $time = $start_time;
// }else{
// $time = $start_time.' - '.$end_time;
// }
// $activity->time = $time;
// }
$type = $request->input('type', 'all');
if ($type === 'joining') {
$deadline = [0];
$apply_deadline = '>';
} elseif ($type === 'joined') {
$deadline = [1];
$apply_deadline = '<';
} else {
$deadline = [0, 1];
$apply_deadline = '<>';
}
$activities = DB::table('activities as a')
->rightJoin('activity_members as m', 'a.id', '=', 'm.activity_id')
->where('m.user_id', $user_id)->whereIn('a.is_deadline', $deadline)
->select('a.id as id', 'theme', 'poster', 'is_online', 'city', 'address', 'dist', 'start_time', 'end_time', 'class_id', 'fee', 'user_id', 'm.created_at', DB::raw("'fulllin_activity' as activity_type"));
$merchant_user = MerchantUser::where('user_id', $user_id)->first();
if (!$merchant_user) {
$activities = $activities->orderBy('created_at', 'desc')->paginate();
} else {
$type_ids = DB::table('tourist_orders')
->join('community_activities', 'tourist_orders.type_id', 'community_activities.id')
->where('community_activities.class', 'one')->where('channel', 3)
->where('tourist_orders.type', 'community')->where('account_id', $merchant_user->id)->whereIn('pay_status', [1, 4])
->pluck('tourist_orders.type_id');
//,'tourist_orders.type','type_id',DB::raw("'business_order' as order_type"),'tourist_orders.price','tourist_orders.pay_type','pay_status','trade_no','desc as goods','tourist_orders.created_at'
$community_activities = DB::table('community_activities')->whereIn('id', $type_ids)->where('apply_deadline', $apply_deadline, date('Y-m-d H:i:s'))
->select('id', 'title as theme', "pic as poster", "location as is_online", "address as city", 'address',
DB::raw("'' as dist"), 'start_time', 'end_time', DB::raw("'0' as class_id"), DB::raw("'price' as fee"), 'anchor_id as user_id', 'created_at', DB::raw("'business_activity' as activity_type"));
$query = $activities->union($community_activities);
$sql = $query->toSql();
$activities = DB::table(DB::raw("($sql) as a"))->mergeBindings($query)
->orderBy('created_at', 'desc')->paginate();
}
foreach ($activities as $activity) {
$activity->class_name = ActivityClass::where('id', $activity->class_id)->value('title');
$start_time = date('Y/m/d', strtotime($activity->start_time));
$end_time = date('Y/m/d', strtotime($activity->end_time));
if ($start_time === $end_time) {
$time = $start_time;
} else {
$time = $start_time . ' - ' . $end_time;
}
$activity->time = $time;
}
return $this->success('ok', $activities);
}
/**
* 投票成员
* @param Request $request [description]
* @return [type] [description]
*/
public function activityVoteMember(Request $request, User $user, $activity_id)
{
$user_id = auth()->id();
$activity = Activity::findOrFail($activity_id);
$count = $activity->vote_count;
$member = ActivityMember::with('user')->where('user_id', $user_id)->where('activity_id', $activity_id)->first();
if (empty($member)) {
$msg = '还未报名';
$path = 'pages/party/detail?party_id=' . $activity_id;
$operate = '去报名';
$notice = '您还未报名该活动';
return $this->fail($msg, $code = 5, $path, $operate, $notice);
}
if ($member->sign_in != 1) {
return $this->failure('您还没有签到活动');
}
if (empty($member->user->sex)) {
return $this->failure("请完善您的资料信息:性别");
}
$other_members = ActivityMember::with('user')->whereHas('user', function ($sql) use ($member) {
$sql->where('type', 'single')->where('sex', '<>', $member->user->sex)->where('sex', '<>', 0);
})->where('activity_id', $activity_id)->select('user_id', 'activity_id', 'name', 'mobile', 'avatar', 'sex', 'is_joined', 'sign_in', 'linkmen')->distinct()->get();
unset($member->user);
foreach ($other_members as $other_member) {
// $other_member->linkmen = json_decode($other_member->linkmen,true)??[];
$other_member->userAvatar = $user->userAvatar($other_member->user_id);
$other_member->sex = $other_member->user->sex;
$other_member->nickname = $other_member->user->nickname;
$other_member->industry = $other_member->user->industry ?: '未知';
$other_member->industry_sub = $other_member->user->industry_sub ?? '未知';
unset($other_member->user);
$file = ProfileCourtship::where('user_id', $other_member->user_id)->select('user_id', 'birthday', 'stature', 'city')->first();
if (empty($file)) {
$other_member->age = '未知';
$other_member->stature = '未知';
$other_member->city = '未知';
$other_member->era = '未知';
} else {
$other_member->age = $file->birthday ? $this->getAge($file->birthday) : '未知';
$other_member->stature = $file->stature ? $file->stature : '未知';
$other_member->city = $file->city ? $file->city : '未知';
$other_member->era = $file->birthday ? substr($file->birthday, 2, 1) . '0后' : '未知';
}
}
//我投票的用户
$my_vote_ids = ActivityVote::where('user_id', $user_id)->where('activity_id', $activity_id)->pluck('vote_user_id')->toArray();
$my_vote_users = User::whereIn('id', $my_vote_ids)->get();
return $this->success('ok', compact('count', 'member', 'other_members', 'my_vote_users'));
}
/**
* 心仪投票成员
* @param Request $request [description]
* @return [type] [description]
*/
public function activitySexVoteMember(Request $request, User $user, $activity_id)
{
$user_id = auth()->id();
$activity = Activity::findOrFail($activity_id);
$count = $activity->vote_sex_count;
$member = ActivityMember::with('user')->where('user_id', $user_id)->where('activity_id', $activity_id)->first();
if (empty($member)) {
$msg = '还未报名';
$path = 'pages/party/detail?party_id=' . $activity_id;
$operate = '去报名';
$notice = '您还未报名该活动';
return $this->fail($msg, $code = 5, $path, $operate, $notice);
}
if ($member->sign_in != 1) {
return $this->failure('您还没有签到活动');
}
if (empty($member->user->sex) || !$member->user->sex) {
return $this->failure("请联系工作人员填写性别");
}
$other_members = ActivityMember::with('user')->whereHas('user', function ($sql) use ($member) {
$sql->where('type', 'single')->where('sex', '<>', $member->user->sex)->where('sex', '<>', 0);
})->where('activity_id', $activity_id)->select('user_id', 'activity_id', 'name', 'mobile', 'avatar', 'sex', 'is_joined', 'sign_in')->distinct()->get();
unset($member->user);
foreach ($other_members as $other_member) {
$other_member->userAvatar = $user->userAvatar($other_member->user_id);
$other_member->sex = $other_member->user->sex;
$other_member->nickname = $other_member->user->nickname;
$other_member->industry = $other_member->user->industry ?: '未知';
$other_member->industry_sub = $other_member->user->industry_sub ?: '未知';
unset($other_member->user);
$file = ProfileCourtship::where('user_id', $other_member->user_id)->select('user_id', 'birthday', 'stature', 'city')->first();
if (empty($file)) {
$other_member->age = '未知';
$other_member->stature = '未知';
$other_member->city = '未知';
$other_member->era = '未知';
} else {
$other_member->age = $file->birthday ? $this->getAge($file->birthday) : '未知';
$other_member->stature = $file->stature ? $file->stature : '未知';
$other_member->city = $file->city ? $file->city : '未知';
$other_member->era = $file->birthday ? substr($file->birthday, 2, 1) . '0后' : '未知';
}
}
//我投票的用户
$my_vote_ids = ActivityVote::where('user_id', $user_id)->where('activity_id', $activity_id)->pluck('vote_user_id')->toArray();
$my_vote_users = User::whereIn('id', $my_vote_ids)->get();
return $this->success('ok', compact('count', 'member', 'other_members', 'my_vote_users'));
}
/**
* 活动匹配
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function activityVote(Request $request, $activity_id)
{
$user_id = auth()->id();
$activity = Activity::findOrFail($activity_id);
$vote_count = $activity->vote_count;
$count = ActivityVote::where('activity_id', $activity_id)->where('user_id', $user_id)->count();
if ($count > 0) {
return $this->failure('本轮活动已投票');
}
$member = ActivityMember::where('user_id', $user_id)->where('activity_id', $activity_id)->first();
if (empty($member->sign_in)) {
return $this->failure('您还未签到');
}
//被投票用户id
$vote_user_ids = $request->input('vote_user_ids');
$activity_members = ActivityMember::select('user_id', 'sign_in')->where('activity_id', $activity_id)->whereIn('user_id', $vote_user_ids)->get()->toArray();
$new_arr = array_column($activity_members, 'sign_in', 'user_id');
if (empty($vote_user_ids) || !count($vote_user_ids) || count($vote_user_ids) < 1 || count($vote_user_ids) > $vote_count) {
return $this->failure('请选择' . $vote_count . '位心仪对象');
}
foreach ($vote_user_ids as $key => $vote_user_id) {
if (!empty($new_arr[$vote_user_id]) && $new_arr[$vote_user_id]) {
$order = $key + 1;
ActivityVote::create([
'activity_id' => $activity_id,
'user_id' => $user_id,
'vote_user_id' => $vote_user_id,
'order' => $order,
]);
//判断对方是否选择你
$match = ActivityMatch::where('activity_id', $activity_id)->where('user_id', $vote_user_id)->where('other_user_id', $user_id)->first();
if ($match) {//选择了你
$rank = $this->getActivityMatchRank($match->user_order, $order);
$match->other_user_order = $order;
$match->rank = $rank;
$match->save();
} else {
ActivityMatch::create([
'activity_id' => $activity_id,
'user_id' => $user_id,
'user_order' => $order,
'other_user_id' => $vote_user_id,
]);
}
}
}
return $this->success('ok');
}
public function getActivityMatchRank($order1, $order2)
{
$order = $order1 + $order2;
switch ($order) {
case 2:
$rank = 1;
break;
case 3:
$rank = 2;
break;
case 4:
$rank = 3;
break;
case 5:
$rank = 4;
break;
case 6:
$rank = 5;
break;
default:
$rank = 0;
break;
}
return $rank;
}
/**
* 心仪活动匹配
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function activitySexVote(Request $request, $activity_id)
{
$user_id = auth()->id();
$activity = Activity::findOrFail($activity_id);
$vote_sex_count = $activity->vote_sex_count;
$count = ActivitySexVote::where('activity_id', $activity_id)->where('user_id', $user_id)->count();
if ($count > 0) {
return $this->failure('本轮活动已投票');
}
$member = ActivityMember::where('user_id', $user_id)->where('activity_id', $activity_id)->first();
if (empty($member->sign_in)) {
return $this->failure('您还未签到');
}
//被投票用户id
$vote_user_ids = $request->input('vote_user_ids');
$activity_members = ActivityMember::select('user_id', 'sign_in')->where('activity_id', $activity_id)->whereIn('user_id', $vote_user_ids)->get()->toArray();
$new_arr = array_column($activity_members, 'sign_in', 'user_id');
if (empty($vote_user_ids) || !count($vote_user_ids) || count($vote_user_ids) < 1 || count($vote_user_ids) > $vote_sex_count) {
return $this->failure('请选择' . $vote_sex_count . '位心仪对象');
}
foreach ($vote_user_ids as $key => $vote_user_id) {
if (!empty($new_arr[$vote_user_id]) && $new_arr[$vote_user_id]) {
$order = $key + 1;
ActivitySexVote::create([
'activity_id' => $activity_id,
'user_id' => $user_id,
'vote_user_id' => $vote_user_id,
'order' => $order,
]);
//判断对方是否选择你
$match = ActivitySexMatch::where('activity_id', $activity_id)->where('user_id', $vote_user_id)->where('other_user_id', $user_id)->first();
if ($match) {//选择了你
$rank = $this->getActivityMatchRank($match->user_order, $order);
$match->other_user_order = $order;
$match->rank = $rank;
$match->save();
} else {
ActivitySexMatch::create([
'activity_id' => $activity_id,
'user_id' => $user_id,
'user_order' => $order,
'other_user_id' => $vote_user_id,
]);
}
}
}
return $this->success('ok');
}
/**
* 签到 改版
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function activitySignInV2(Request $request, $activity_id)
{
$user = $this->getMyUserinfo();
$user_id = 0;
if ($user) {
$user_id = $user->id;
} else {
$data['code'] = 2;
$data['notice'] = '你还没登录,请登录后签到';
return $this->success('', $data);
}
$activity = Activity::find($activity_id);
$desc = $request->place;
if (empty($activity)) {
$msg = '活动不存在';
$code = 5;
$path = 'pages/tabBar/activities';
$operate = '去报名';
$notice = '活动不存在';
return $this->fail($msg, $code = 5, $path, $operate, $notice);
}
$member = ActivityMember::with('user')->where('user_id', $user_id)->where('activity_id', $activity_id)->first();
if (empty($member)) {
$data['path'] = '/pages/party/detail?party_id=' . $activity_id;
$data['operate'] = '去报名';
$data['notice'] = '你还没有报名该活动,赶快去报名吧';
$data['activity']['theme'] = $activity['theme'];
$data['code'] = 1;
return $this->success('', $data);
}
if ($activity->can_repeat_sign == 1) {
$memberv2 = ActivityMember::with('user')->where('user_id', $user_id)->where('activity_id', $activity_id)->wherenull('sign_in')->wherenull('desc')->first();
$exists = ActivityMember::where('user_id', $user_id)->where('activity_id', $activity_id)->where('sign_in', 1)->where('desc', $desc)->exists();
//有签到和没有未签到的订单
if (!$memberv2 && !$exists) {
$data['path'] = '/pages/party/detail?party_id=' . $activity_id;
$data['operate'] = '去报名';
$data['notice'] = '你还没有报名该活动,赶快去报名吧';
$data['activity']['theme'] = $activity['theme'];
$data['code'] = 1;
return $this->success('', $data);
} elseif (!$memberv2 && $exists) {
//没有有签到和没有未签到的订单
$data['path'] = '/pages/party/detail?party_id=' . $activity_id;
$data['operate'] = '进入活动';
$data['notice'] = '你已签到,请勿重复签到';
$data['activity']['theme'] = $activity['theme'];
$data['code'] = 1;
return $this->success('', $data);
}
$member = $memberv2;
}
if ($member->sign_in == 1) {
$data['path'] = '/pages/party/detail?party_id=' . $activity_id;
$data['operate'] = '进入活动';
$data['notice'] = '你已签到,请勿重复签到';
$data['activity']['theme'] = $activity['theme'];
$data['code'] = 1;
return $this->success('', $data);
}
$member->sign_in = 1;
$member->desc = $desc;
$order = $member->activityOrder();
$activity['price'] = '0.00';
$activity_order_sku = '';
if (!empty($order)) {
$activity['price'] = $order->price;
$goods = $order->goods;
$start = strpos($goods, '【');
$end = stripos($goods, '】');
$str = substr($goods, $start, $end);
$activity_order_sku = $str;
}
$member->save();
unset($activity->sku);
$data = array();
$data['code'] = 0;
$data['activity']['theme'] = $activity['theme'];
$data['activity']['sku'] = $activity_order_sku;
return $this->success('ID:' . $activity_id . '活动签到成功。', $data);
}
/**
* 签到
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
**/
public function activitySignIn(Request $request, $activity_id)
{
$user_id = auth()->id();
$activity = Activity::find($activity_id);
if (empty($activity)) {
return $this->failure('活动不存在');
}
$member = ActivityMember::
with('user')
->where('user_id', $user_id)
->where('activity_id', $activity_id)
->first();
if (empty($member)) {
$msg = '还未报名';
$code = 3;
$path = 'pages/party/detail?party_id=' . $activity_id;
$operate = '去报名';
$notice = '您还未报名该活动';
return $this->failure($msg);
}
if ($member->sign_in == 1) {
$msg = '你已签到,请勿重复签到';
$code = 3;
$path = 'pages/tabBar/activities';
$operate = '活动主页';
$notice = '你已签到,请勿重复签到';
return $this->failure($msg);
}
$member->sign_in = 1;
$order = $member->activityOrder();
if (!empty($order)) {
$activity['price'] = $order->price;
} else {
$activity['price'] = '0.00';
}
$member->save();
unset($activity->sku);
return $this->success('ID:' . $activity_id . '活动签到成功。', $activity);
}
/**
* 平台活动
* @param Request $request [description]
* @return [type] [description]
*/
public function officialActivities(Request $request)
{
$activities = $this->activityCon->officialActivities($request);
return $this->success('ok', $activities);
}
/**
* 活动详情
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function officialActivity(Request $request, $activity_id)
{
$user = $this->authCheck();
$activity = $this->activityCon->officialActivity($activity_id, $user);
return $this->success('ok', $activity);
}
/**
* 活动报名
* @param Request $request [description]
* @param [type] $activity_id [description]
* @return [type] [description]
*/
public function officailJoinActivity(Request $request, $activity_id)
{
$result = $this->activityCon->officailJoinActivity($request, $activity_id);
if ($result == '活动截止报名') {
return $this->failure($result);
} elseif ($result == '该活动已报名') {
return $this->failure($result);
}
return $this->success('ok', $result);
}
/**
* 活动轮播图
*/
public function activityCarousels(Request $request)
{
$time = date('Y-m-d H:i:s');
$announcement_ids = PaasAnnouncement::distinct('announcement_id')->pluck('announcement_id');
$announcements = Announcement::where('start_time', '<', $time)->where('end_time', '>', $time)->whereNotIn('id', $announcement_ids)->where('path', 'like', '/pages/party/detail?party_id=%')->get();
return $this->success("ok", $announcements);
}
/**
* 我的收藏
* @param Request $request [description]
* @return [type] [description]
*/
public function favorites(Request $request)
{
try {
$user = auth()->user();
$type = $request->input('type', 'activity');
if ($type == 'activity') {
$favorites = $user->favorites(Activity::class)->where('is_hidden', 0)->paginate();
foreach ($favorites as $favorite) {
$favorite->class_name = $favorite->class ? $favorite->class->title : null;
unset($favorite->pivot, $favorite->host, $favorite->detail, $favorite->detail_path, $favorite->detail_pic, $favorite->content, $favorite->is_top, $favorite->show_member_num, $favorite->province, $favorite->qrcode, $favorite->vote_qrcode, $favorite->sign_in_qrcode, $favorite->location_latitude, $favorite->location_longitude, $favorite->is_deadline, $favorite->is_cancel, $favorite->click_num, $favorite->is_hidden, $favorite->created_at, $favorite->deleted_at, $favorite->updated_at, $favorite->class_id, $favorite->class);
}
} elseif ($type == 'community_moment') {
$favorites = $user->favorites(CommunityMoment::class)->where('is_show', 1)->paginate();
foreach ($favorites as $favorite) {
$favorite->user_id = $user->id;
$favorite->nickname = $user->nickname;
$favorite->photo = $user->app_avatar ?: $user->photo;
$favorite->photos = json_decode($favorite->photos);
$favorite->topic_name = $favorite->topic()->value("name");
$favorite->community_title = $favorite->community()->value('title');
//是否点赞
$favorite->is_llker = $favorite->isLikedBy($user) ? 1 : 0;
//是否收藏
$favorite->is_favorite = $user->hasFavorited($favorite) ? 1 : 0;
//点赞数
$favorite->momentLikerCount = $favorite->likers()->get()->count() ?: 0;
//收藏数
$favorite->favoriteCount = $favorite->favoriters()->get()->count() ?: 0;
//评论数
$favorite->momentCommentCount = $favorite->totalCommentsCount();
unset($favorite->pivot, $favorite->community_id, $favorite->is_show, $favorite->created_at, $favorite->deleted_at, $favorite->updated_at, $favorite->topic_id);
}
}
return $this->success('ok', $favorites);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取收藏列表失败,请稍后再试');
}
}
/**
* 收藏活动
* @param Request $request [description]
* @param Activity $activity [description]
* @return [type] [description]
*/
public function favoriteActivity(Request $request, Activity $activity)
{
try {
$user = auth()->user();
if ($user->hasFavorited($activity)) {
$user->unfavorite($activity);
} else {
$user->favorite($activity);
}
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('收藏活动失败,请稍后再试');
}
}
/**
* 短视频列表
* **/
public function videoList(Request $request)
{
$keyword = $request->keyword;
$videos = AnchorVideo::where('status', 1)->where('is_love_show', 1)->select('id', 'title', 'anchor_id', 'm_id', 'cover', 'status', 'video_url', 'created_at', 'is_love_show');
if ($keyword) {
$keyword = trim($keyword);
$videos = $videos->where('title', 'like', '%' . $keyword . '%');
}
$videos = $videos->whereNotNull('m_id')->orderBy('id', 'desc')->paginate();
foreach ($videos as $key => $video) {
$video->pv = Redis::zscore('short_videopv', $video->id) ?: 0;
$video->type = 'video';
}
return $this->success('ok', $videos);
}
/**
* 短视频详情(上下滑动)
* **/
public function shortVideoDetail(Request $request, $video_id)
{
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
} else {
$openid = $request->openid;
}
$video = AnchorVideo::withTrashed()->where('id', $video_id)->select('id', 'title', 'anchor_id', 'm_id', 'cover', 'status', 'video_url', 'created_at', 'deleted_at')->first();
$video->pv = Redis::zincrby('short_videopv', 1, $video_id);
//点赞数
$video->liker_num = $video->likers()->count();
//评论数
$video->comment_num = $video->totalCommentsCount();
$video->merchant_name = Anchor::where('m_id', $video->m_id)->value('name');
//分享二维码
$jump_url = urlencode(env('APP_URL') . '/h5/#/videoDetail/' . $video_id);
$url = env('APP_URL') . '/api/official/live/wechat/oauth?merchant_id=' . $video->m_id . '&anchor_openid=&url=' . $jump_url;
$qr_code = Redis::get('VideoDetail_L' . $video_id);
if (!$qr_code) {
$qr_code = $this->getPreviewQrcode($url);
Redis::setex('VideoDetail_L' . $video_id, 60 * 60 * 24 * 30, $qr_code);
$qr_code = Redis::get('VideoDetail_L' . $video_id);
}
$viewer = Viewer::where('openid', $openid)->first();
$rand_str = $this->randString(8);
$pic = User::DefaultAvatar;
$nickname = '用户' . $rand_str;
if ($viewer) {
$pic = $viewer->avatar;
$nickname = $viewer->nickname;
}
$MerchantUsers = MerchantUser::where('openid', $openid)->first();
if (!$MerchantUsers) {
$MerchantUsers = new MerchantUser();
$MerchantUsers->openid = $openid;
$MerchantUsers->rand_str = $rand_str;
$MerchantUsers->pic = $pic;
$MerchantUsers->nickname = $nickname;
$MerchantUsers->save();
}
// 是否已经点赞
$video->liker_status = $MerchantUsers->hasLiked($video);
$user = AccessRecord::where('open_id', $openid)->where('account_id', $video->m_id)->exists();
if (!$user) {
$AccessRecord = new AccessRecord();
$AccessRecord->open_id = $openid;
$AccessRecord->account_id = $video->m_id;
$AccessRecord->channel = 1;
$AccessRecord->last_time = now();
$AccessRecord->save();
}
$video->share_qr_code = $qr_code;
$video->merchant_id = $video->m_id;
$pre_video_id = 0;//上一个视频id
$next_video_id = 0;//下一个视频id
$video_ids = AnchorVideo::whereNotNull('m_id')->where('status', 1)->orderBy('id', 'desc')->pluck('id')->toArray();
// dd($video_ids);
$video_count = count($video_ids);//100
foreach ($video_ids as $key => $value) {//0~99
if ($video_id != $value) continue;
if ($value == $video_id && $key == 0 && $video_count == 1) {//第一个视频 且 就一个视频
$pre_video_id = 0;
$next_video_id = 0;
} elseif ($value == $video_id && $key == 0 && $video_count > 1) {//第一个视频 且 不止一个视频
$pre_video_id = 0;
$next_video_id = $video_ids[$key + 1];
} elseif ($value == $video_id && $key > 0 && $key == $video_count - 1) {//不是第一个视频 是最后一个视频
$pre_video_id = $video_ids[$key - 1];
$next_video_id = 0;
} else {
$pre_video_id = $video_ids[$key - 1];
$next_video_id = $video_ids[$key + 1];
}
}
$video->pre_video_id = $pre_video_id;
$video->next_video_id = $next_video_id;
//下架或删除状态 0下架 1正常上架 2已删除
$publish_state = 0;
if ($video->deleted_at) {
$publish_state = 2;
} elseif ($video->status == 1) {
$publish_state = 1;
} else {
$publish_state = 0;
}
$video->publish_state = $publish_state;
unset($video->m_id);
Redis::zscore('love_video_pv', $video_id);
Redis::zincrby('love_video_pv', 1, $video_id);
$this->forgetBykey('homedata-user' . $MerchantUsers->id);
return $this->success('ok', $video);
}
/**
* 短视频详情
* **/
public function videoDetail(Request $request, $video_id)
{
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
} else {
$openid = $request->openid;
}
$video = AnchorVideo::where('id', $video_id)->select('id', 'title', 'm_id', 'anchor_id', 'm_id', 'cover', 'status', 'video_url', 'created_at')->first();
$video->pv = Redis::zincrby('short_videopv', 1, $video_id) ?? 0;
//点赞数
$video->liker_num = $video->likers()->count();
//评论数
$video->comment_num = $video->totalCommentsCount();
$viewer = Viewer::where('openid', $openid)->first();
$rand_str = $this->randString(8);
$pic = User::DefaultAvatar;
$nickname = '用户' . $rand_str;
if ($viewer) {
$pic = $viewer->avatar;
$nickname = $viewer->nickname;
}
$MerchantUsers = MerchantUser::where('openid', $openid)->first();
if (!$MerchantUsers) {
$MerchantUsers = new MerchantUser();
$MerchantUsers->openid = $openid;
$MerchantUsers->rand_str = $rand_str;
$MerchantUsers->pic = $pic;
$MerchantUsers->nickname = $nickname;
$MerchantUsers->save();
}
$user = AccessRecord::where('open_id', $openid)->where('account_id', $video->m_id)->exists();
if (!$user) {
$AccessRecord = new AccessRecord();
$AccessRecord->open_id = $openid;
$AccessRecord->account_id = $video->m_id;
$AccessRecord->channel = 1;
$AccessRecord->last_time = now();
$AccessRecord->save();
}
Redis::zscore('love_video_pv', $video_id);
Redis::zincrby('love_video_pv', 1, $video_id);
if (config('app.env') == 'production') {
$MerchantUsers->addlog($video, 1);
}
return $this->success('ok', $video);
}
/**
* 评论列表
* **/
public function videoCommentList(Request $request, $video_id)
{
$video = AnchorVideo::where('id', $video_id)->select('id', 'anchor_id', 'm_id', 'cover', 'video_url', 'created_at')->first();
$comments = $video->comments()->select('id', 'commentable_id', 'commented_id', 'reply_id', 'comment', 'created_at')->where('reply_id', 0)->orderBy('id', 'desc')->paginate();
foreach ($comments as $key => $value) {
# code...
$merchant_user = MerchantUsers::select('nickname', 'pic')->where('id', $value->commented_id)->first();
$value->nickname = $merchant_user->nickname ?? '匿名用户';
$value->pic = $merchant_user->pic ?? User::DefaultAvatar;
$reply = $video->comments()->select('id', 'commentable_id', 'commented_id', 'reply_id', 'comment', 'created_at')->where('reply_id', $value->id)->orderBy('id', 'desc')->get();
foreach ($reply as $k => $v) {
$merchant_user = MerchantUsers::select('nickname', 'pic')->where('id', $v->commented_id)->first();
$v->nickname = $merchant_user->nickname ?? '匿名用户';
$v->pic = $merchant_user->pic ?? User::DefaultAvatar;
}
$value->reply = $reply;
}
return $this->success('ok', $comments);
}
/**
* 点赞列表
* **/
public function videoLikes(Request $request, $video_id)
{
$video = AnchorVideo::select('id', 'title', 'cover')->where('id', $video_id)->first();
$comments = $video->likers()->select('id', 'likedable_id', 'created_at')->orderBy('id', 'desc')->paginate();
foreach ($comments as $key => $value) {
$user = MerchantUser::select('id', 'nickname', 'pic')->where('id', $value->likedable_id)->first();
$value->nickname = $user->nickname ?? '匿名用户';
$value->pic = $user->pic ?? User::DefaultAvatar;
}
return $this->success('ok', $comments);
}
/**
* 发表短视频评论
* **/
public function CommentVideo(Request $request, $video_id)
{
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
} else {
$openid = $request->openid;
}
$content = $request->input('content');
if (!$content) return $this->failure('评论内容不能为空');
$reply_id = $request->reply_id ?? 0;
$video = AnchorVideo::where('id', $video_id)->first();
if (!$video) return $this->failure('该记录不存在或已删除');
$merchant_user = MerchantUsers::where('openid', $openid)->first();
$result = $merchant_user->comment($video, $content);
$result->reply_id = $reply_id;
$result->save();
$content = $merchant_user->nickname . '在您的视频【' . $video->title . '】发表了评论';
SaasNotice::addRecord($video->m_id, $merchant_user->id, 'comment', $result->id, $content, 0);
return $this->success('ok', $result);
}
/**
* 点赞
* */
public function likeVideo(Request $request, $video_id)
{
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
}else{
$openid = $request->openid;
}
$merchant_user = MerchantUser::where('openid',$openid)->first();
$video = AnchorVideo::where('id',$video_id)->first();
if($merchant_user->hasLiked($video)){
$merchant_user->dislike($video,'like');
}else{
$result = $merchant_user->like($video,'like');
$content = $merchant_user->nickname.'点赞了您的视频【'.$video->title;
SaasNotice::addRecord($video->m_id,$merchant_user->id,'like',$result->id,$content,0);
}
return $this->success('ok');
}
public function sharePosterMp(Request $request, $id){
try {
$activity = CommunityActivity::find($id);
if (empty($activity)) {
return $this->failure('该活动不存在');
}
$user = auth()->user();
if (empty($user)) {
$user = $this->authCheck();
}
$openid = $user ? $user->wechat->openid : '';
$versions = 9;
$param = [
'openid' => $openid,
'user_id' => empty($user) ? 0 : $user->id,
'class' => $activity->class,
];
//生成海报
$pic = $this->newMakeUserShareActivityPosterMp($activity, $param);
if (empty($pic)) return $this->failure('图片上传失败,请稍后再试');
//创建记录
// if ($user) {
// $user->activityShareHistories()->create([
// 'activity_id'=>$id,
// 'share_poster'=>$pic,
// 'versions'=>$versions
// ]);
// }
return $this->success('ok', $pic);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('生成海报失败');
}
}
/**
* 生成用户分享海报 跳转小程序
**/
public function newMakeUserShareActivityPosterMp($activity, $param)
{
$openid = $param['openid'];
$user_id = empty($param['user_id']) ? 0 : $param['user_id'];
$activity_id = $activity->id;
//二维码
$app = EasyWechat::miniProgram();
$scene = 'party_id='.$activity->id.'&from_user_id='.$user_id;
if ($activity->class == 'one') {
$path = 'pages/party/detail';
} else {
$path = 'pages/party/servicesDetail';
}
$response = $app->app_code->getUnlimit($scene, [
'page'=>$path,
'is_hyaline'=>true
]);
$qrcode_path = storage_path('qrcode');
$file_name = 'activity'.$activity_id.'userid'.$user_id.'.jpg';
if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
$response->saveAs($qrcode_path, $file_name);
}
$qrcode_file_path = $qrcode_path.'/'.$file_name;
$image1 = 'https://image.fulllinkai.com/202201/07/1bae445f38e917615370718dc1e21e78.jpeg';
// $image2 = $qrcode_file_path;
//兼容老版本生成的路径
$share_data = ActivityShareHistory::where('user_id',$user_id)
->where('activity_id',$activity->id)
->orderBy('id','desc')
->first();
$image2 = $share_data->share_poster;
// $old_qrcode_file_path = $qrcode_path . '/' . substr($share_data->share_poster, strripos($share_data->share_poster, '/') + 1);
// if (!is_file($qrcode_file_path) && !is_file($old_qrcode_file_path)) {
// return $this->failure("海报生成失败,请稍后再试{$qrcode_file_path}---{$old_qrcode_file_path}");
// }
//二维码
$new_image = $this->imageAddImage($image1, $image2, 250, 250, 176, 176, 'bottom-left');
//提示
$tips = '长按识别二维码';
$new_image = $this->textAddImage($new_image, $tips, 28, 202, 954, '#333333', 'left');
$top_height = 100;
//主题 标题
$new_image = $this->textAddImage($new_image, mb_substr($activity->title, 0, 15), 32, 50, 100, '#333333', 'left');
$top_height += 40;
if (mb_strlen($activity->title) > 15 && mb_strlen($activity->title) <= 30) {
$new_image = $this->textAddImage($new_image, mb_substr($activity->title, 15, mb_strlen($activity->title)), 32, 50, $top_height, '#333333', 'left');
$top_height += 40;
}
if (mb_strlen($activity->title) > 30) {
$text = mb_substr($activity->title, 15, 15);
$title = $text . '..';
$new_image = $this->textAddImage($new_image, $title, 32, 50, $top_height, '#333333', 'left');
$top_height += 40;
}
//存在开始和结束时间 优先展示
if ($activity->start_time && $activity->end_time) {
$show = date('Y.m.d', strtotime($activity->start_time)) . ' 至 ' . date('Y.m.d', strtotime($activity->end_time));
} else {//没有开始和结束时间展示副标题
$show = $activity->Subtitle;
$show = str_replace(PHP_EOL, ' ', $show);
if (mb_strlen($show) >= 18) {
$result = mb_substr($show, 0, 18);
$show = $result . '...';
}
}
$new_image = $this->textAddImage($new_image, $show, 24, 50, 210, '#666666', 'left');
//海报
$new_image = $this->imageAddImage($new_image, $activity->pic, 500, 280, 50, 258, 'top-left');
$file_path = storage_path("/qrcode/" . time().mt_rand(0,999999) . "activity_share.png");
$new_image->save($file_path);
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
// if ($qrcode_file_path) {
// unlink($qrcode_file_path);
// }
unlink($file_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
return $pic;
}
public function sharePosterH5(Request $request, $id)
{
$activity = CommunityActivity::find($id);
$class = $request->class ?? 'one';
if (empty($activity)) {
return $this->failure('该活动不存在');
}
$user = auth()->user();
$wechatUser = session('wechat.oauth_user.new');
if ($wechatUser) {
$openid = $wechatUser->getId();
} else {
$openid = $request->openid;
}
$openid = '';
$versions = 9;
if (!empty($user)) {
$share_poster = $user->activityShareHistories()->where(['activity_id' => $id, 'versions' => $versions])->first();
if ($share_poster) {
$pic = $share_poster->share_poster;
return $this->success('ok', $pic);
}
}
$param = [
'openid' => $openid,
'user_id' => empty($user) ? 0 : $user->id,
'class' => $class,
];
//生成海报
$pic = $this->newMakeUserShareActivityPosterH5($activity, $param);
if (empty($pic)) return $this->failure('图片上传失败,请稍后再试');
//创建记录
if ($user) {
$user->activityShareHistories()->create([
'activity_id' => $id,
'share_poster' => $pic,
'versions' => $versions
]);
}
return $this->success('ok', $pic);
}
/**
* 生成用户分享海报 跳转H5
**/
public function newMakeUserShareActivityPosterH5($activity, $param)
{
$openid = $param['openid'];
$user_id = empty($param['user_id']) ? 0 : $param['user_id'];
$activity_id = $activity->id;
$data = [];
$activity_id = $activity->id;
$data['is_hyaline'] = true;
if($param['class'] == 'one'){//活动
$jump_url = urlencode(env('APP_URL').'/h5/#/activityDetails/'.$activity_id);
$jump_key = 'ActivityDetail_L';
}else{//服务
$jump_url = urlencode(env('APP_URL').'/h5/#/serveDetails/'.$activity_id);
}
$key = $jump_key . $activity_id;
$url = env('APP_URL') . '/api/official/live/wechat/oauth?url=' . $jump_url . 'from_user_id=' . $user_id . 'from_openid=' . $openid;
$qr_code = Redis::get($key);
// if(!$qr_code){
$qr_code = $this->getPreviewQrcode($url);
// Redis::setex($key,60*60*24*30,$qr_code);
// $qr_code = Redis::get($key);
// }
$qrcode = $qr_code;
$image1 = 'https://local-pictures.oss-cn-shenzhen.aliyuncs.com/202112/28/d7cdbf5cadcdcad5e656e762067a8545.png';
$image2 = $qrcode;
//二维码
$new_image = $this->imageAddImage($image1, $image2, 250, 250, 176, 176, 'bottom-left');
//提示
$tips = '长按识别二维码';
$new_image = $this->textAddImage($new_image, $tips, 28, 202, 954, '#333333', 'left');
$top_height = 100;
//主题 标题
$new_image = $this->textAddImage($new_image, mb_substr($activity->title, 0, 15), 32, 50, 100, '#333333', 'left');
$top_height += 40;
if (mb_strlen($activity->title) > 15) {
$new_image = $this->textAddImage($new_image, mb_substr($activity->title, 15, strlen($activity->title)), 32, 50, $top_height, '#000000', 'left');
$top_height += 40;
}
//存在开始和结束时间 优先展示
if ($activity->start_time && $activity->end_time) {
$show = date('Y.m.d', strtotime($activity->start_time)) . ' 至 ' . date('Y.m.d', strtotime($activity->end_time));
} else {//没有开始和结束时间展示副标题
$show = $activity->Subtitle;
$show = str_replace(array('\r\n', '\r', '\n'), ' ', $show);
if (mb_strlen($show) >= 18) {
$result = mb_substr($show, 0, 18);
$show = $result . '...';
}
}
$new_image = $this->textAddImage($new_image, $show, 24, 50, 210, '#666666', 'left');
//海报
$new_image = $this->imageAddImage($new_image, $activity->pic, 500, 280, 50, 258, 'top-left');
$file_path = storage_path("/qrcode/" . time().mt_rand(0,999999) . "activity_share.png");
$new_image->save($file_path);
if (file_exists($file_path)) {
$pic = $this->uploadFile($file_path);
try {
unlink($file_path);
} catch (Exception $e) {
return $this->failure($e->getMessage());
}
}
return $pic;
}
/**
* 匹配用户信息反馈
* @param Request $request
*/
public function matchUserFeedback(Request $request)
{
try {
$receive_user_id = $request->receive_user_id;
$send_user_id = $request->send_user_id;
$status = $request->status;
$merchant_id = $request->merchant_id ?? 491;
if (!isset($status) || !$send_user_id || !$receive_user_id) {
return $this->failure('参数不全');
}
$send_user = User::find($send_user_id);
if(!$send_user){
return $this->failure('订单用户不存在');
}
$receive_user = User::find($receive_user_id);
if(!$receive_user){
return $this->failure('接收用户不存在');
}
DB::beginTransaction();
if ($status == 0) {
MatchLog::where('receive_user_id', $receive_user_id)
->where('send_user_id', $send_user_id)
->update(['status' => 0, 'updated_at' => date('Y-m-d H:i:s')]);
MatchLog::where('receive_user_id', $send_user_id)
->where('send_user_id', $receive_user_id)
->update(['status' => 0, 'updated_at' => date('Y-m-d H:i:s')]);
} elseif($status == 1) {
MatchLog::where('receive_user_id', $send_user_id)
->where('send_user_id', $receive_user_id)
->update(['status' => 4, 'updated_at' => date('Y-m-d H:i:s')]);
$matchLog = MatchLog::where('receive_user_id', $receive_user_id)
->where('send_user_id', $send_user_id)
->first();
if ($matchLog) {
$matchLog->status = 4;
$matchLog->save();
$name = $send_user->name??$send_user->nickname;
if($matchLog->admin_id){
$admin = MerchantMembers::where('merchant_members.mch_id',$merchant_id)->where('merchant_members.admin_id',$matchLog->admin_id)
->join('merchant_admins', function ($join) use ($request) {
$join->on('merchant_members.admin_id', '=', 'merchant_admins.id');
}, null, null, 'left')
->select('merchant_admins.mobile')
->first();
if($admin && $admin->mobile){
$mobile = $admin->mobile;
}else{
$mobile = null;
}
}else{
$mobile = Anchor::where('m_id',$merchant_id)->value('mobile');
}
if($mobile){
$message = '用户:'.$receive_user_id.' 同意了用户'.$name.',用户id: '.$send_user_id.' 的交往请求,请及时跟进';
$this->sentMessage($mobile,$message);
}
}
}else{
return $this->failure('状态非法');
}
DB::commit();
return $this->success('ok');
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
public function activityPhotos(Request $request, $id)
{
$photos = ActivityPhoto::where('type', 'activity')->where('type_id', $id)->orderByDesc('id')->simplePaginate();
return $this->success('ok', $photos);
}
}