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); } }