orderCon = $orderCon; } /** * 活动列表 * @param Request $request [description] * @return [type] [description] */ public function activities(Request $request) { $user = $this->getMyUserinfo(); $user_id = 0; if($user){ $user_id = $user->id; } try { $activities = Activity::with('sku', 'class', 'activityMember', 'activityMember') ->with(['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 == '进行中') { $now = date('Y-m-d H:i:s'); $activities = $activities->where('end_time', '>', $now)->where(function($q) use ($now){ $q->where('apply_deadline', '>', $now) ->orWhereNull('apply_deadline'); }); }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 == '已报名') { $activity_ids = ActivityMember::where('user_id', $user_id)->pluck('activity_id'); $activities = $activities->whereIn('id', $activity_ids); }elseif ($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->select('id','can_repeat_sign','is_deadline', 'apply_deadline','theme', 'class_id', 'is_top', 'city', 'dist', 'start_time', 'end_time', 'fee', 'poster','is_top','is_online')->orderBy('is_top', 'desc')->orderBy('start_time', 'desc')->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->activity_status = 0; if($activity->start_time>now()){ $activity->activity_status = 0; }elseif($activity->start_timeend_time){ $activity->activity_status = 1; }elseif(now()>$activity->end_time){ $activity->activity_status = 2; } $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; //价格区间 // $activity->fee = $this->getPriceRange($skus, $activity); if (count($skus)>=1) { $activity->fee = $skus[0]['price']; } if($activity->fee == 0){ $activity->fee = 0; }else{ $activity->fee = \CommonUtilsService::moneyFormat($activity->fee,0); } $activity->class_name= $activity->class?$activity->class->title:null; $activity->poster = $activity->poster.'?x-oss-process=style/scale1'; //是否报名 $activity->is_member = $activity->activityMember->where('user_id', $user_id)->first()?1:0; // 是否可以重复报名 if($activity->can_repeat_sign == 1 && $activity->is_member = 1){ //已报名 没有签到的数量 if(count($activity->activityMemberNotSign)==0){ $activity->is_member = 0; }else{ $activity->is_member = 1; } } // 1.可以报名 。 2 .已经报名 3.截止报名 4.已结束 $apply_status = 1; if($activity->is_member == 0){ if(!empty($activity->apply_deadline)){ $apply_deadline = strtotime($activity->apply_deadline); if($apply_deadlineis_deadline == 1){ $apply_status = 4; } $activity->apply_status = $apply_status; unset($activity->sku, $activity->skus, $activity->class, $activity->activityMember,$activity->activityMemberNotSign); } return $this->success('ok', $activities); } catch (\Exception $e) { $this->getError($e); return $this->failure('数据获取失败,请稍后再试'); } } public function getPriceRange($skus, $activity) { if (count($skus)) { if (count($skus) == 1) { 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 \CommonUtilsService::moneyFormat($min_price,0); } return \CommonUtilsService::moneyFormat($min_price,0).'~'. \CommonUtilsService::moneyFormat($max_price,0); } }else{ return \CommonUtilsService::moneyFormat($activity->fee,0) ; } } /** * 活动分类列表 * @param Request $request [description] * @return [type] [description] */ public function activityClasses(Request $request) { $classes = ActivityClass::orderBy('id', 'asc') ->withCount('activity') ->get()->toArray(); $test = [ 'id'=>0, 'title'=>'不限', 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s') ]; array_unshift($classes, $test); return $this->success('ok', $classes); } /** * 活动详情 * @param Request $request [description] * @param Activity $activity [description] * @return [type] [description] */ public function activity(Request $request, $activity) { $is_set = Activity::where('id', $activity)->count(); if(empty($is_set)){ return $this->failure('活动不存在'); } $Logging = 0 ; if (\Auth::guard('api')->check()) { $user = \Auth::guard('api')->user(); $Logging = 1; } $activity = Activity::find($activity); $activity = $activity->withCount('activityMember')->where('id', $activity->id)->select('id', 'can_repeat_sign','is_deadline', 'apply_deadline','theme','show_member_num', 'poster', 'fee', 'content', 'start_time', 'end_time', 'province', 'city', 'dist', 'address', 'detail_path', 'detail','location_latitude','location_longitude','activity_description','is_online')->first(); $activity->h5_link = env('APP_URL').'/h5/#/eventDetail/'.$activity->id; $activity->skus = $activity->skus(); //价格区间 $activity->price_range = $this->getPriceRange($activity->skus, $activity); //是否收藏 $activity->hasFavorited = 0; //是否登录 $activity->Logging = $Logging; //是否报名 $activity->is_member = 0; //订单号 $activity->order_id = null; $activity->link = null; if($Logging){ $activity->is_member = $activity->activityMember->where('user_id', $user->id)->count()?1:0; // 是否可以重复报名 if($activity->can_repeat_sign == 1 && $activity->is_member = 1){ $myActivityMemberNotSignCount = ActivityMember::where(['user_id'=> $user->id,'activity_id'=>$activity->id])->whereNull('sign_in')->count(); //已报名 没有签到的数量 if($myActivityMemberNotSignCount==0){ $activity->is_member = 0; }else{ $activity->is_member = 1; } } $activity->hasFavorited = $user->hasFavorited($activity)?1:0; $activity->activityMember->where('user_id', $user->id)->first()?1:0; //订单号 $activity->order_id = Order::where('user_id', $user->id)->where('type','activity')->where('type_id', $activity->id)->where('pay_status', 'PAID')->value('id'); //H5链接 $link = env('APP_URL')."/api/official/live/wechat/oauth?from_user_id=".$user->id."&url=https://love.ufutx.com/h5/#/activityDetail/".$activity->id; $link = UrlLink::firstOrCreate(['url'=>$link]); $code = $this->decb64($link->id); $activity->link = 'ufutx.cn/s/'.$code; } unset($activity->sku); //报名人数 $activity->member_num = $activity->activityMember()->with('user:id,photo,nickname')->whereHas('user', function($sql){ $sql->where('hidden_profile', 'NONE'); })->count(); //最近报名成员 $activityMembers = $activity->activityMember()->with('user:id,photo,nickname')->whereHas('user', function($sql){ $sql->where('hidden_profile', 'NONE'); })->select('user_id', 'activity_id')->orderBy('id', 'desc'); $activity->members = $activityMembers->get(); foreach ($activity->members as $member) { $member->nickname = $member->user->nickname; $userSer = new UserService(); $member->photo = $userSer->getUserValidPhoto($member->user); unset($member->user); } //活动状态 $activity->activity_status = 0; if($activity->start_time>now()){ $activity->activity_status = 0; }elseif($activity->start_timeend_time){ $activity->activity_status = 1; }elseif(now()>$activity->end_time){ $activity->activity_status = 2; } //增加点击量 $activity->increment('click_num', 1); // 1.可以报名 。 2 .已经报名 3.截止报名 $apply_status = 1; if($activity->is_member == 0){ if(!empty($activity->apply_deadline)){ $apply_deadline = strtotime($activity->apply_deadline); if($apply_deadlineis_deadline == 1){ $apply_status = 4; } $activity->apply_status = $apply_status; unset($activity->activityMember); return $this->success('ok', $activity); } /** * 报名活动 * @param Request $request [description] * @param Activity $activity [description] * @param [type] $sku_id [description] * @return [type] [description] */ public function joinActivity(Request $request, Activity $activity, $sku_id) { \DB::beginTransaction(); try { $user = auth()->user(); $user_id = $user->id; $member = $user->activityMember()->where('activity_id', $activity->id)->where('is_joined', 1)->first(); if ($member) { return $this->failure('已报名'); } // // 该活动特殊要求 // if($activity->id==554){ // $count = $user->ProfilePhoto()->count();// 大于七张 // if($count<7) // return $this->resp('您的照片不足七张。',null,3); // $introduction = mb_strlen($user->profileCourtship->introduction);//大于两百字 // if($introduction<200) // return $this->resp('您的个人介绍还不足200字。',null,3); // $interest_hobby = mb_strlen($user->profileCourtship->interest_hobby);//大于50字 // if($interest_hobby<50) // return $this->resp('您的兴趣爱好还不足50字。',null,3); // $ideal_mate =mb_strlen($user->profileCourtship->ideal_mate);// 大于50字 // if($ideal_mate<50) // return $this->resp('您的择偶需求还不足50字。',null,3); // return $user->is_educate_approved; // // 要求真人,实名,学历认证 // if($user->is_real_approved!=1) // return $this->resp('您尚未完成真人认证',null,3); // if($user->is_approved!=1) // return $this->resp('您尚未完成实名认证',null,3); // if($user->is_educate_approved!=1) // return $this->resp('您尚未完成学历认证',null,3); // } // if(!empty($activity->apply_deadline)){ // $apply_deadline = strtotime($activity->apply_deadline); // if($apply_deadlinefailure('当前活动,已截止报名'); // } // } if (empty($sku_id)) { return $this->failure('请选择活动规格'); } //sku $sub_sku = ($activity->skus())[$sku_id-1]; if (empty(count($sub_sku))) { return $this->failure('暂无活动规格'); } $price = $sub_sku['price']; $goods = $activity->theme.'【'.$sub_sku['name'].'】'; $linkmen = $request->input('linkmen', []); if (empty(count($linkmen))) { return $this->failure("请输入至少填写一位联系人"); } if ($price == 0) { $activity->activityMember()->create([ 'user_id'=>auth()->id(), 'linkmen'=>json_encode($linkmen), 'is_joined'=>1 ]); } //生成订单 $pay_order = $this->orderCon->makeAppOrder($request, $price, 'activity', $activity->id, $goods, $linkmen, $goods); if (empty($pay_order)) throw new \Exception("活动订单生成失败", 1); //发送模板通知给管理员(公众号) // $this->sendActivityNotice($activity, $user); \DB::commit(); return $this->success('ok', $pay_order); } catch (\Exception $e) { \DB::rollBack(); $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 decb64($dec) { //10进制转换成64进制 if ($dec < 0) { return false; } $map = array( 0=>'0',1=>'1',2=>'2',3=>'3',4=>'4',5=>'5',6=>'6',7=>'7',8=>'8',9=>'9', 10=>'A',11=>'B',12=>'C',13=>'D',14=>'E',15=>'F',16=>'G',17=>'H',18=>'I',19=>'J', 20=>'K',21=>'L',22=>'M',23=>'N',24=>'O',25=>'P',26=>'Q',27=>'R',28=>'S',29=>'T', 30=>'U',31=>'V',32=>'W',33=>'X',34=>'Y',35=>'Z',36=>'a',37=>'b',38=>'c',39=>'d', 40=>'e',41=>'f',42=>'g',43=>'h',44=>'i',45=>'j',46=>'k',47=>'l',48=>'m',49=>'n', 50=>'o',51=>'p',52=>'q',53=>'r',54=>'s',55=>'t',56=>'u',57=>'v',58=>'w',59=>'x', 60=>'y',61=>'z',62=>'_',63=>'=', ); $b64 = ''; do { $b64 = $map[($dec % 64)] . $b64; $dec /= 64; } while ($dec >= 1); return $b64; } //同步活动列表 public function businessActivities(Request $request) { $class = $request->class??'one'; $result = CommunityActivity::select('id','title','merchant_id','price','pic','class','Subtitle','start_time','apply_deadline','end_time'); if(isset($request->keyword) && $request->keyword) { $result = $result->where('title','like','%'.$request->keyword.'%'); } // $result = $result->where("title", 'not like', '%盲盒%'); $result = $result->where('status',1) ->where('type','business') ->where('is_love_show',1) ->where('class',$class) ->orderBy('apply_deadline','desc') ->orderBy('is_top','desc') ->orderBy('top_time','desc')->paginate(); $time = date('Y-m-d H:i:s'); foreach ($result as $key => $value) { if($value->class == 'one'){ $is_deadline = 0; $pay = TouristOrder::where('type','community')->where('type_id',$value->id)->where('account_id',$value->merchant_id)->whereIn('pay_status',[1,4])->first(); if($pay){ $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; } } return $this->success('ok', $result); } //同步活动详情 public function businessActivity(Request $request,$activity_id) { $user = $this->getMyUserinfo(); $result = CommunityActivity::where('id',$activity_id)->first(); if(!$result) return $this->failure('该活动已下线或不存在'); $result->price = floatval($result->price); $user_service = new UserService(); $merchant_user = $user_service->syncSaasUser($user); Redis::zscore('love_community_pv', $activity_id); $result->love_pv = Redis::zincrby('love_activity_pv', 1 ,$activity_id); $banner = LiveBanner::where('class','community')->where('class_id',$activity_id)->value('icon'); $result->banner = json_decode( $banner,true); $result->sku = json_decode($result->sku,true); if ($merchant_user) { $accid = 10000000+$merchant_user->id; $token = WangYiYunUser::where('accid',$accid)->value('token'); if(!$token){ $data['nickname'] =$merchant_user->nickname; $data['sex'] = 0; $this->createWyyUser($data,$accid); $token = WangYiYunUser::where('accid',$accid)->value('token'); } $result->token = $token; } // 是否购买过 $pay_status = TouristOrder::where('account_id',$merchant_user->id)->where('type','community')->whereIn('pay_status',[1,4])->where('type_id',$activity_id)->exists(); $result->pay_status = $pay_status; $reward_count = TouristOrder::where('type','reward_activity')->where('type_id', $activity_id)->whereIn('pay_status',[1,4])->get()->count(); $result->reward_count = $reward_count; $value = TouristOrder::where('type','community')->where('type_id',$activity_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){ $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; $result->h5_link = env('APP_URL').'/api/official/live/wechat/oauth?url='.urlencode(env('APP_URL').'/h5/#/activityDetails/'.$result->id); //$type = 'community'; //$key = 'love_'.$type.'_pv'; //Redis::zincrby($key,1,$activity_id); if(config('app.env') == 'production'){ $merchant_user->addlog($result,2); } return $this->success('ok', $result); } public function joinBusinessActivity(Request $request,$activity_id) { \DB::beginTransaction(); try { if (\Auth::guard('api')->check()) { $user = \Auth::guard('api')->user(); } $pay_type = $request->input('pay_type', 'free'); $merchant_user = MerchantUser::where('user_id',$user->id)->first(); $order = TouristOrder::where('type','community')->where('type_id',$activity_id)->where('account_id',$merchant_user->id)->whereIn('pay_status',[1,4])->first(); if ($order) { return $this->failure('已报名'); } $result = CommunityActivity::where('id',$activity_id)->where('status',1)->first(); //sku $sku_id = $request->sku_id; if(!$sku_id&&$result->pay_type =='wechat') return $this->failure('规格参数不存在,请稍后再试。'); if($sku_id){ $skus = json_decode($result->sku,true); $skus = array_column($skus, null,'sku_id'); $sku = $skus[$sku_id]; $price = $sku['price']; $goods = $sku['name']; $desc = $result->title.'-'.$sku['name'].''; }else{ $price = $result->price; $goods = null; $desc = $result->title; } if (empty($pay_type)) { $pay_type = 'free'; } if ($pay_type == 'free' && $price != 0) { throw new \Exception("订单价格大于0", 1); } $anchor = Anchor::where('id',$result->anchor_id)->first(); $trade_no = $this->getRefundTradeNo(); $TouristOrder = new TouristOrder(); $TouristOrder->open_id = null; $TouristOrder->price = floatval($price); $TouristOrder->pay_type = $result->pay_type; $TouristOrder->type = 'community'; $TouristOrder->type_id = $activity_id; $TouristOrder->trade_no = $trade_no; $TouristOrder->desc = $desc; $TouristOrder->goods = $goods; $TouristOrder->channel = 2; //$TouristOrder->from_openid = $request->from_openid; //$TouristOrder->share_channel_id = $request->share_channel_id; $TouristOrder->merchant_id = $result->merchant_id??0; $TouristOrder->account_id = $merchant_user->id; $TouristOrder->name = $request->name?:($merchant_user->nickname?:$user->nickname); $TouristOrder->area_code = $request->area_code; $TouristOrder->mobile = $request->mobile?:"未获取"; $TouristOrder->withdrawal_radio = $anchor->withdrawal_radio ??100; $TouristOrder->insurance = $result->insurance?:0; if($request->insurance_info) $TouristOrder->insurance_info = json_encode($request->insurance_info); if($request->linkmen) $TouristOrder->linkmen = json_encode($request->linkmen); if($price==0){ $TouristOrder->pay_status = 1; $TouristOrder->save(); $TouristOrder->pay_config = null; $TouristOrder->wx_pay = []; return $this->success('ok',$TouristOrder); } $TouristOrder->save(); //$receipt = request()->input('apple_receipt'); $ios_version = $request->header('app-version', '1.0.0'); $result = $ios_version == '1.3.17'?true:false; if ($result && $pay_type == 'ios' and empty($receipt)) throw new \Exception("没有支付凭证", 1); if ($price>0) { if ($pay_type == 'wechat') { $pay_params = [ 'user_id' => auth()->id(), 'trade_no' => $trade_no, 'pay_status' => $price == 0?'PAID':'UNPAID', 'cash' => $price, 'score' => 0, 'pay_type' => $pay_type, 'receipt' => $receipt = request()->input('apple_receipt'), ]; $ios_version = request()->header('ios_version'); $and_version = request()->header('and_version'); $callback = config('app.url').'/api/app/callback/business/orders/'.$trade_no.'?ios_version='.$ios_version.'&and_version='.$and_version; $pay_config = \WechatService::constructWXAppPay($pay_params, auth()->id(), $desc, $callback); $TouristOrder->pay_config = $pay_config; }elseif ($pay_type == 'alipay') { $pay_config = \AlipayService::purchase($desc, $trade_no, $price); $TouristOrder->pay_config = $pay_config; } } $TouristOrder->order_id = $TouristOrder->id; $TouristOrder->cash = $TouristOrder->price; //发送模板通知给管理员(公众号) // $this->sendActivityNotice($activity, $user); \DB::commit(); return $this->success('ok', $TouristOrder); } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return $this->failure('报名失败,请稍后再试'); } } public function createWyyUser($data,$accid) { $im_service = new IMService(env('IM_APP_KEY'), env('IM_APP_SECRET')); $result = $im_service->createUserId($accid,$data['nickname'],$props='{}',null); //\Log::info('创建网易云账号'); //\Log::info($result); if ($result['code'] == 200) { $wyyUser = new WangYiYunUser; $wyyUser->accid = $accid; $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([$accid]); if ($result['code'] == 200) { $info = $result['uinfos'][0]; $accid = ''; $name = ''; $gender = ''; $icon = ''; if(array_key_exists("accid",$info)){ $accid = $info['accid']; } if(array_key_exists("name",$info)){ $name = $info['name']; } if(array_key_exists("gender",$info)){ $gender = $info['gender']; } if(array_key_exists("icon",$info)){ $icon = $info['icon']; } $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(); } } } }