account_id; $type = $request->type; $type_id = $request->type_id; switch ($type) { case 'community': case 'service': $result = CommunityActivity::where('merchant_id',$m_id)->where('id',$type_id)->first(); break; case 'shop': $result = MerchantShop::where('merchant_id',$m_id)->where('id',$type_id)->first(); break; case 'course': $result = Course::where('merchant_id',$m_id)->where('id',$type_id)->first(); break; case 'consult': $result = Consultation::find($type_id); $result->merchant_id = ConsultAccount::where('id',$result->consult_account_id)->value('merchant_id'); break; case 'evaluate': $result = MerchantEvaluate::find($type_id); break; default: return $this->failure('类型不存在或不受支持'); break; } if(!$result){ return $this->failure('服务不存在'); } $merchant = MerchantAccount::find($request->account_id); $is_exist = $merchant->checkCollageGroup($result);; if($is_exist) return $this->failure('你选择的商品已存在拼团信息,请勿重复创建'); $price = $request->price; $describe = $request->describe; $require_num = $request->require_num ?? 2; $num = $request->num ?? 1; $sku = $request->sku; $start_time = $request->start_time; $end_time = $request->end_time; if($start_time > $end_time) return $this->failure('成团开始时间需要小于成团结束时间'); $expire_in = $request->expire_in; if(!$type || !$type_id || !$describe || !$start_time || !$end_time || !$sku || !$expire_in) return $this->failure('完善表单信息'); if($type == 'community'){ if($result->class == 'one' && $result->apply_deadline < $end_time) return $this->failure('成团结束时间必须小于活动截止报名时间'); } $array = [ 'price' => $price, 'describe' => $describe, 'require_num' => $require_num, 'num' => $num, 'sku' => json_encode($sku), 'start_time' => $start_time, 'end_time' => $end_time, 'expire_in' => $expire_in, 'type' => $type, 'type_id' => $type_id, ]; $collage = $merchant->addCollageGroup($result,$array); return $this->success('ok'); } //获取当前拼团商品信息 public function goodDetail(Request $request){ $type = $request->type; $type_id = $request->type_id; if($type == 'community' || $type=='service'){ $result = CommunityActivity::where('id',$type_id)->select('id','title','sku','price')->first(); }elseif($type == 'shop'){ $result = MerchantShop::where('id',$type_id)->select('id','title','sku','price')->first(); }elseif($type == 'course'){ $result = Course::where('merchant_id',$request->account_id)->where('id',$type_id)->first(); }elseif($type == 'consult'){ $result = Consultation::where('id',$type_id)->first(); } if($result && $result->sku){ $result->sku = json_decode($result->sku,true); } return $this->success('ok',$result); } //修改拼团 public function setGroup(Request $request,$group_id){ $group = CollageGroup::find($group_id); try { if(!$group) return $this->failure('拼团信息不存在,无法修改'); if($request->has('describe')) { $group->describe = $request->describe; } $time = date('Y-m-d H:i:s'); if($request->has('require_num') && $request->require_num != $group->require_num) { $result = CollageGroupHistories::whereHas('tOrder', function($sql){ $sql->whereIn('pay_status',[1,4]); })->where('group_id',$group_id)->where('status',0)->where('deadline','>',$time)->first(); if($result) return $this->failure('该活动目前存在未完成拼团,暂不支持修改'); $group->require_num = $request->require_num; } if($request->has('expire_in')) { $group->expire_in = $request->expire_in; } if($request->has('start_time')) { $group->start_time = $request->start_time; } if($request->has('end_time')){ $group->end_time = $request->end_time; if($request->start_time && $request->end_time && $request->start_time > $request->end_time) return $this->failure('成团开始时间需要小于成团结束时间'); } if($request->input('sku')) { $min_price = []; $group->sku = json_encode($request->sku); foreach ($request->sku as $key => $skus) { $min_price[] = $skus['discount_price']; } //取最低价格为展示价 $group->price = min($min_price); } if($group->type == 'community'){ $activity = CommunityActivity::find($group->type_id); if($activity->class == 'one' && $activity->apply_deadline < $request->end_time) return $this->failure('成团结束时间必须小于活动截止报名时间'); } $group->save(); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } //拼团详情 public function groupDetail(Request $request){ try { $id = $request->id; $group = CollageGroup::where('id',$id)->first(); $group->sku = json_decode($group->sku,true); return $this->success('ok',$group); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //拼团列表 public function groups(Request $request){ try { $m_id = $request->account_id; $keyword = trim($request->keyword); $type = $request->input('type'); $origin_type = ($type == 'activity' || $type == 'service')?'community':$type; $groups = CollageGroup::where('m_id',$m_id); if($keyword){ $groups = $groups->whereHas($origin_type,function($sql) use($keyword){ $sql->where('title','like',"%$keyword%"); }); } if($type){ $groups = $groups->where('type', $origin_type); } if ($origin_type == 'community') { $groups = $groups->with($origin_type.':id,title,pic'); if ($type == 'activity') { $groups = $groups->whereHas($origin_type, function($sql) { $sql->where('class', 'one'); }); }elseif ($type == 'service') { $groups = $groups->whereHas($origin_type, function($sql) { $sql->where('class', 'many'); }); } }elseif ($origin_type == 'course') { $groups = $groups->with('course:id,title,thumb as pic'); }elseif ($origin_type == 'shop') { $groups = $groups->with('shop:id,title,icon as pic'); }elseif ($origin_type == 'evaluate') { $groups = $groups->with('evaluate:id,title,image as pic'); }elseif ($origin_type == 'consult') { $groups = $groups->with('consult:id,title,pic'); } $groups = $groups->orderBy('id','desc')->select('id', 'm_id', 'type', 'type_id', 'price', 'created_at','start_time', 'end_time', 'expire_in')->paginate(); foreach ($groups as $group) { if ($type == 'course') { $group->community = $group->course; unset($group->course); }elseif($type == 'shop') { $group->community = $group->shop; unset($group->course); }elseif($type == 'consult') { $group->community = $group->consult; unset($group->course); }elseif($type == 'evaluate') { $group->community = $group->evaluate; unset($group->course); } // $type = $value->type; // $value->$type; // $group->sku = json_decode($group->sku,true); } return $this->success('ok',$groups); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //删除拼团信息 public function removeGroup(Request $request,$group_id){ try { $group = CollageGroup::find($group_id); if(!$group) return $this->failure('拼团信息不存在或已被他人删除'); $history = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){ $sql->whereIn('pay_status',[1,4]); })->where('group_id',$group_id)->first(); if($history) return $this->failure('本团已有人发起拼团,无法删除'); $group->delete(); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //所有未完成拼团列表 public function unfinishedGroups(Request $request){ $m_id = $request->account_id; $group_id = $request->group_id; $group_status = $request->group_status ?? 0; $time = date('Y-m-d H:i:s'); $keyword = trim($request->keyword); $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',$group_status); // if($group_status == 0){//未成团 // $histories = $histories->where('deadline','>',$time); // } if($keyword){ $histories = $histories->whereHas('mUser.mpUser',function($query) use($keyword){ $query->where('nickname','like',"%$keyword%") ->orWhere('mobile','like',"%$keyword%"); }); } $histories = $histories->orderBy('deadline','desc')->paginate(); foreach ($histories as $key => $history) { $require_num = $history->group->require_num; $group = $history->group; if(!$group) continue; $type = $group->type; $history->title = $group->$type ? $group->$type->title : '未获取'; if($group->type == 'community'){ $history->type = $group->$type->class == 'many'? 'service':'activity'; }else{ $history->type = $group->type; } $initiator_id = CollageGroupHistories::where('group_id',$history->group_id)->where('deadline',$history->deadline) ->where('is_initiator',1)->value('m_user_id'); //已经参与人数 $user_ids = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){ $sql->whereIn('pay_status',[1,4]); })->where('group_id',$history->group_id)->where('deadline',$history->deadline) ->orderBy('id','desc')->pluck('m_user_id')->toArray(); $str = implode(',', $user_ids); $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; $history->avatar = $history->mUser->pic?:User::DefaultAvatar; $history->nickname = $history->mUser->nickname ? : '未获取'; $users = MerchantUser::whereIn('id',$user_ids)->select('id','user_id','pic','nickname') ->orderByRaw(DB::raw('FIELD(id,'.$str.') desc'))->get(); $batch = CollageGroupBatch::where('history_id',$history->id)->value('batch'); $virtual_num = CollageGroupBatch::where('history_id',0)->where('batch',$batch)->get()->count();//本团虚拟用户数量 $group_users = []; foreach ($users as $key => $value) { // if($value->user_id){ $group_users[$key]['avatar'] = $value->pic? : User::DefaultAvatar; $group_users[$key]['nickname'] = $value->nickname; // }else{ // $group_users[$key]['avatar'] = User::DefaultAvatar; // $group_users[$key]['nickname'] = '匿名用户'; // } $group_users[$key]['is_initiator'] = $value->id == $initiator_id ? 1 : 0; } if($virtual_num > 0){ for ($i=1; $i <=$virtual_num ; $i++) { $group_users[$key+$i]['avatar'] = User::DefaultAvatar; $group_users[$key+$i]['nickname'] = '虚拟用户'; $group_users[$key+$i]['is_initiator'] = 0; } } $history->group_users = $group_users; $history->virtual_num = $virtual_num; unset($history->mUser->mpUser); unset($history->mUser); unset($history->tOrder); unset($history->group->$type); unset($history->group); } return $this->success('ok',$histories); } //一键成团 public function handFinishGroup(Request $request){ DB::beginTransaction(); try { $m_id = $request->account_id; $history = CollageGroupHistories::where('id',$request->history_id)->first(); $group = CollageGroup::where('id',$history->group_id)->first(); $batch = CollageGroupBatch::where('history_id',$request->history_id)->value('batch'); $count = CollageGroupBatch::where('batch',$batch)->get()->count();//当前几人 $need_count = $group->require_num - $count;//需要几人 $insert = []; for ($i=0; $i < $need_count ; $i++) { $insert_sub = [ 'history_id' => 0,//0为虚拟用户 'batch' => $batch, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]; $insert[] = $insert_sub; } //插入虚拟用户 if(!empty($insert)) CollageGroupBatch::insert($insert); //拼团成功 $history_ids = CollageGroupBatch::where('batch',$batch)->where('history_id','<>',0)->pluck('history_id'); CollageGroupHistories::whereIn('id',$history_ids)->update(['status'=>1]); //本次拼团成功(给所有拼团人员发) $m_order_ids = CollageGroupHistories::whereIn('id',$history_ids)->pluck('m_order_id')->toArray(); $orders = TouristOrder::whereIn('id',$m_order_ids)->whereIn('pay_status',[1,4])->get(); foreach ($orders as $order) { if ($order->channel == "福恋小程序") { $param = $this->getGroupParams($order,$group,$history->deadline,1); \WechatService::sendJoinGroupNotice($param); }else{ //修改拼团对应的服务用户记录 if ($group->type == 'course') { UserCourses::whereHas('torder', function($sql) { $sql->whereIn('pay_status',[1,4]); })->where('course_id', $group->type_id) ->where('merchant_user_id', $order->account_id)->update(['status'=>1]); $jump_url = urlencode(env('APP_URL') . '/pu/#/courseDetail/' . $group->type_id); $url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $m_id . '&anchor_openid=&url=' . $jump_url; $first = "您的课程拼团订单已成功拼团!"; }elseif ($group->type == 'activity') { $first = '恭喜你,本次拼团成功'; $jump_url = urlencode(env('APP_URL') . '/pu/#/activityDetails/' . $group->type_id); $url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $m_id . '&anchor_openid=&url=' . $jump_url; }else { continue; } $param = [ 'touser'=> $order->open_id, 'template_id'=>config('wechat.tpls.buy_success_notice'), 'url'=>$url, 'data' => [ 'first' => $first, 'keyword1' => $order->desc, 'keyword2' => $order->trade_no, 'keyword3' => "¥".$order->price, 'keyword4' => $order->created_at->toDateTimeString(), 'remark' => '点击详情可查看课程', ] ]; //通知用户 SendTemplateMsg::dispatch($param)->onQueue("love"); } } DB::commit(); return $this->success('ok'); } catch (\Exception $e) { DB::rollBack(); $this->getError($e); return $this->failure(); } } public function getGroupParams($order,$group,$deadline,$status = 0){ $history_id = CollageGroupHistories::where('m_order_id',$order->id)->value('id'); $param['openid'] = $order->open_id; $param['order_id'] = $order->id; $param['title'] = mb_substr($order->desc,0,8).'..'; $param['price'] = $order->price.'元'; $param['num'] = $group->require_num.'人'; $param['deadline'] = $deadline; //发送给团员的温馨提示 $param['team_desc'] = '您已成功参与拼团,具体拼团成败请留意通知'; //发送给团张的温馨提示 $param['lead_desc'] = '本团有效期为'.$group->expire_in.'小时 赶紧邀请好友来拼团吧'; $param['desc'] = '恭喜你,本次拼团已成功'; $param['status'] = $status; $param['history_id'] = $history_id; return $param; } /** * @param Request $request * 旧拼团数据转换 */ public function collageGroupTransfer(Request $request){ $old_collect_groups = CollageGroup::all(); foreach ($old_collect_groups as $old_collect_group){ switch ($old_collect_group->type){ case 'community': case 'service': $service = CommunityActivity::class; break; case 'shop': $service = MerchantShop::class; break; case 'course': $service = Course::class; break; case 'consult': $service = Consultation::class; break; default: return $this->failure('类型不存在或不受支持'); break; } $old_collect_group->collageable_id = $old_collect_group->type_id; $old_collect_group->collageable_type = $service; $old_collect_group->save(); } } }