type)->where('type_id',$request->type_id)->first(); if($naire) return $this->failure('请勿重复创建'); $data = $request->data; // choice 0 单选 1多选 2输入框 3 投票匹配 Questionnaire::create([ 'm_id'=>$request->account_id, 'admin_id'=>$request->merchant_admin_id ?? 0, 'type'=>$request->type ?? 'activity', 'type_id'=>$request->type_id ?? 1, 'title'=>$request->title ?? '测试', 'status'=>1, 'content'=>json_encode($data), ]); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } // 调查问卷详情 public function questionaireDetail(Request $request){ try { $type = $request->type; $type_id = $request->type_id; $result = Questionnaire::where('type',$type)->where('type_id',$type_id)->select('m_id','admin_id','id','title','content','created_at','updated_at')->first(); if(!$result) return $this->success('ok',[]); if($result) $result->content = json_decode($result->content); if($result->admin_id){//创建人头像 昵称 $user = MerchantMembers::where(['mch_id'=>$result->m_id,'admin_id'=>$result->admin_id])->select('name','avatar')->first(); }else{ $user = Anchor::where('m_id',$result->m_id)->select('name','pic as avatar')->first(); } $result->user = $user; //todo 生成跳转二维码 $jump_url = urlencode(env('APP_URL') . '/pu/#/questionnaireV2/'.$result->id); $share_url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id='.$request->account_id.'&url=' . $jump_url; $share_qrcode = $this->getPreviewQrcode($share_url); $result->share_qrcode = $share_qrcode; return $this->success('ok',$result); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } //修改问卷 public function updateQuestionnire(Request $request,$questionnaire_id){ $value = Questionnaire::find($questionnaire_id); if(!$value) return $this->failure('要修改的问卷不存在'); $value->data = json_decode($request->data); $value->save(); return $this->success('ok'); } //用户提交问卷列表 public function userAnswers(Request $request){ try { $keyword = trim($request->input('keyword')); $questionnaire_id = $request->questionnaire_id; $result = Answers::with('mUser:id,nickname,pic,mobile')->whereHas('mUser')->where('questionnaire_id',$questionnaire_id)->select('id','user_id','questionnaire_id','content','created_at','desc'); if($keyword){ $result = $result->whereHas('mUser',function($sql) use($keyword){ $sql->where('nickname','like',"%$keyword%"); }); } $result = $result->orderBy('id','desc')->paginate(); foreach ($result as $key => $value) { $value->content = json_decode($value->content); if($value->mUser->mobile) continue; $value->mUser->mobile = TouristOrder::where('account_id',$value->mUser->id)->whereRaw('char_length(mobile)=11')->value('mobile'); } return $this->success('ok',$result); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } //用户提交问卷列表 public function userAnswersV2(Request $request){ try { $questionnaire_id = $request->questionnaire_id; $title = []; $results = Answers::with('mUser:id,nickname,pic,mobile')->whereHas('mUser')->where('questionnaire_id',$questionnaire_id)->select('id','user_id','questionnaire_id','content','created_at','desc'); $results = $results->orderBy('id','desc')->get(); foreach ($results as $key => $result) { $result->content = json_decode($result->content); foreach ($result->content as $value) { if($key == 0) $title[] = $value->title; $answers = implode(' ',$value->answer); $value->answer = $answers; } if($result->mUser->mobile) continue; $result->mUser->mobile = TouristOrder::where('account_id',$result->mUser->id)->whereRaw('char_length(mobile)=11')->value('mobile'); } return $this->success('ok',compact('results','title')); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } //问卷调查列表 public function questionaireList(Request $request){ try { $result = Questionnaire::where('m_id',$request->account_id)->select('id','type','type_id','title','content')->orderBy('id','desc')->paginate(); foreach ($result as $key => $value) { $value->content = json_decode($value->content); } return $this->success('ok',$result); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } //嘉宾编号 public function memberSort(Request $request){ $questionnaire_id = $request->questionnaire_id; $result = Questionnaire::find($questionnaire_id); if(!$result) return $this->failure('问卷不存在'); $orders = TouristOrder::where('type','community')->where('type_id',$result->type_id)->whereIn('pay_status',[1,4])->get(); $i = 1; $j = 1; foreach ($orders as $key => $value) { $m_user = MerchantUser::find($value->account_id); if($m_user->sex){ if($m_user->sex == 1) { $value->update(['remark'=>$i.'男']); $i++; } if($m_user->sex == 2) { $value->update(['remark'=>$j.'女']); $j++; } continue; } if($value->channel == '福恋小程序'){ $user_id = $this->getUseridByOpenid($value->open_id,2); }else{ $user_id = $this->getUseridByOpenid($value->open_id,0); } if($user_id){ $user = User::find($user_id); if($user->sex == 0) continue; if($user->sex == 1) { $value->update(['remark'=>$i.'男']); $i++; } if($user->sex == 2) { $value->update(['remark'=>$j.'女']); $j++; } } } return $this->success('ok',$orders); } //问卷互选 public function voteEachOther(Request $request){ try { $m_id = $request->account_id; $questionnaire_id = $request->questionnaire_id; $questionnaire = Questionnaire::find($questionnaire_id); if($questionnaire_id == 33 || $questionnaire_id == 30) return $this->failure('该活动未开启配对'); if($m_id != $questionnaire->m_id) return $this->failure('没有权限访问'); if(!$questionnaire) return $this->failure('问卷不存在'); $my_choose = []; $choose_me = []; $choose_each = []; $user_id = $request->user_id; //我是几号嘉宾 $order = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)->where('account_id',$user_id)->whereIn('pay_status',[1,3,4])->first(); //$remark = $order->remark.'-'.$order->name; $answer = Answers::with('mUser:id,nickname,pic')->where('user_id',$user_id)->where('questionnaire_id',$questionnaire_id)->first(); if($answer && $answer->content){ $desc = json_decode($answer->content); foreach ($desc as $key => $value) { if($value->choice != 3) continue; //我选择了谁 $my_choose = $value->answer; } } $answers = Answers::with('mUser:id,nickname,pic')->where('questionnaire_id',$questionnaire_id)->where('user_id','!=',$user_id)->select('id','user_id','questionnaire_id','content')->get(); // return $this->success('ok',$answers); $other_order = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)->where('account_id',$user_id)->whereIn('pay_status',[1,3,4])->first(); if($other_order){ $other_remark = $other_order->remark.'-'.$other_order->name; }else{ $other_remark = null; } foreach ($answers as $key => $answer) { $answer->content = json_decode($answer->content); foreach ($answer->content as $key => $value) { if($value->choice != 3) continue; if(in_array($other_remark,$value->answer)) { //选择了他的用户 $other_orders = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)->where('account_id',$answer->user_id)->whereIn('pay_status',[1,3,4])->first(); $other_remarks = $other_orders->remark.'-'.$other_orders->name; $choose_me[] = $other_remarks; } } } //互选 $choose_each = array_intersect($my_choose,$choose_me); $my_choose_user_ids = []; $choose_me_user_ids = []; $choose_each_user_ids = []; if($my_choose){ foreach ($my_choose as $key => $mc) { $arr = explode('-',$mc); $num = $arr[0]; $my_choose_user_ids[] = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)->whereIn('pay_status',[1,3,4])->where('remark',$num)->value('account_id'); } } //我选择的用户 $my_choose_users = MerchantUser::whereIn('id',$my_choose_user_ids)->select('id','mobile','nickname','pic')->get(); if($choose_me){ foreach ($choose_me as $key => $mc) { $arr = explode('-',$mc); $num = $arr[0]; $choose_me_user_ids[] = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)->whereIn('pay_status',[1,3,4])->where('remark',$num)->value('account_id'); } } //选择我的用户 $choose_me_users = MerchantUser::whereIn('id',$choose_me_user_ids)->select('id','mobile','nickname','pic')->get(); if($choose_each){ foreach ($choose_each as $key => $mc) { $arr = explode('-',$mc); $num = $arr[0]; $choose_each_user_ids[] = TouristOrder::where('type','community')->where('type_id',$questionnaire->type_id)->whereIn('pay_status',[1,3,4])->where('remark',$num)->value('account_id'); } } //互选用户 $choose_each_users = MerchantUser::whereIn('id',$choose_each_user_ids)->select('id','mobile','nickname','pic')->get(); return $this->success('ok',compact('my_choose_users','choose_me_users','choose_each_users')); } catch (\Exception $e) { $this->getError($e); return $this->failure('服务器休息,请稍后再试'); } } /** * 第二个版本,独立的调查问卷功能 */ /** * */ public function getQuestionaireList() { $list = Questionnaire::orderby('id', 'DESC')->paginate(); return $this->success('ok', $list); } /** * 创建新的调查问卷 */ public function initQuestionaire(Request $request) { $data = $request->data; Questionnaire::create([ 'm_id'=>$request->account_id, 'admin_id'=>$request->merchant_admin_id ?? 0, 'type'=> '', 'type_id'=> '', 'title'=>$request->title ?? '测试', 'status'=>1, 'content'=>json_encode($data), ]); return $this->success('ok'); } public function updateQuestionaire(Request $request, $q_id) { $auth = $this->checkQuestionaireAuth($request->account_id, $q_id); if(!$auth){ return $this->failure('权限不足'); } $data = $request->data; Questionnaire::where('id', $q_id)->update([ 'title'=>$request->title ?? '新的调查问卷', 'content'=>json_encode($data), ]); return $this->success('ok'); } public function deleteQuestionaire(Request $request, $q_id) { $auth = $this->checkQuestionaireAuth($request->account_id, $q_id); if(!$auth){ return $this->failure('权限不足'); } $data = $request->data; Questionnaire::where('id', $q_id)->delete(); return $this->success('ok'); } /** * 增加调查问卷的问题 * @param $q_id questionaire_id */ public function addQuestion(Request $request, $q_id) { $title = $request->title; $option = $request->option; $input_type = $request->input_type?$request->input_type:'input'; if($input_type == 'radio' || $input_type == 'checkbox') { if(!(is_array($option) && count($option) > 0)){ return $this->failure('请添加选项内容'); } } $auth = $this->checkQuestionaireAuth($request->account_id, $q_id); if(!$auth){ return $this->failure('权限不足'); } QuestionaireQuestion::create(array( 'questionaire_id' => $q_id, 'title'=>$title, 'input_type' => $input_type, 'option'=> json_encode($option, JSON_UNESCAPED_UNICODE), )); return $this->success('ok'); } /** * @param $m_id merchant_id * @param $q_id questionaire_id */ private function checkQuestionaireAuth($m_id, $q_id) { $auth = false; $count = Questionnaire::where('m_id', $m_id)->where('id',$q_id)->count(); if($count > 0) { $auth = true; } return $auth; } /** * 修改调查问卷的问题 * @param $q_id questionaire_id */ public function updateQuestion(Request $request, $q_id, $id) { $title = $request->title; $option = $request->option; $input_type = $request->input_type; $auth = $this->checkQuestionaireAuth($request->account_id, $q_id); if(!$auth){ return $this->failure('权限不足'); } QuestionaireQuestion::where('id', $id)->update(array( 'title'=> $title, 'input_type' => $input_type, 'option'=> json_encode($option, JSON_UNESCAPED_UNICODE), )); return $this->success('ok'); } /** * 删除调查问卷的问题 * @param $q_id questionaire id * @param $id question_id */ public function deleteQuestion(Request $request, $q_id, $id) { $auth = $this->checkQuestionaireAuth($request->account_id, $q_id); if(!$auth){ return $this->failure('权限不足'); } QuestionaireQuestion::where('id', $id)->delete(); return $this->success('ok'); } /** * 绑定调查问卷到指定的 实体中去 */ public function bindQuestionaire(Request $request, $id) { $type = $request->type; $type_id = $request->type_id; Questionnaire::where('id', $id)->update(array( 'type'=> $type, 'type_id'=> $type_id, )); return $this->success('ok'); } /** * 获取单个调查问卷 */ public function getQuestionaireDetail(Request $request, $id) { $questionarie = Questionnaire::where('id', $id) ->select('id', 'type', 'type_id', 'title') ->first(); if(empty($questionarie)){ return $this->failure("questionaire not found"); } $question_list = QuestionaireQuestion::where('questionaire_id', $id)->get(); foreach($question_list as &$question) { $question->option_list = json_decode($question->option); } $questionarie->question_list = $question_list; return $this->success('ok',$questionarie); } /** * @depercated since 2022年12月12日18:12:41 * 这个功能是用户端功能,不在Admin端实现 * 填写调查问卷 */ public function answerQuestion(Request $request, $questionaire_id, $question_id) { $answer = $request->answer; $question = QuestionaireQuestion::where('id', $question_id) ->where('questionnaire_id', $questionaire_id) ->first(); if(empty($question)){ return $this->failure('question not found'); } $fill = array( 'questionaire_id' => $questionaire_id, 'question_id' => $question_id, 'question' => json_decode($question), 'answer' => $answer ); QuestionaireAnswer::create($fill); return $this->success('ok'); } /** * @depercated since 2022年12月12日18:12:41 * 这个功能是用户端功能,不在Admin端实现 * 修改调查问卷 */ public function updateQuestionAnswer(Request $request, $questionaire_id, $question_id) { $answer = $request->answer; $question = QuestionaireQuestion::where('id', $question_id) ->where('questionnaire_id', $questionaire_id) ->first(); if(empty($question)){ return $this->failure('question not found'); } $fill = array( 'questionaire_id' => $questionaire_id, 'question_id' => $question_id, 'question' => json_decode($question), 'answer' => $answer ); QuestionaireAnswer::create($fill); return $this->success('ok'); } /** * 公版问卷调查列表 * @param Request $request */ public function pubSurveys(Request $request) { $m_id = $request->account_id; $surveys = Survey::where('m_id', $m_id); $keyword = $request->input('keyword'); if ($keyword) { $surveys = $surveys->where('title', 'like', '%'.$keyword.'%'); } $surveys = $surveys->orderByDesc('id')->paginate(); return $this->success('ok', $surveys); } /** * 公版问卷调查增加 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function storePubSurveys(Request $request) { $m_id = $request->account_id; $title = $request->input('title'); if (empty($title)) return $this->failure("请输入问卷调查标题"); $content = $request->input('content', []); if (empty($content) || count($content) == 0) return $this->failure("请输入问卷调查内容"); $note = $request->input('note'); $price = $request->input('price'); DB::beginTransaction(); $survey = Survey::create(['m_id'=>$m_id, 'title'=>$title, 'content'=> json_encode($content), 'note'=>$note, 'price'=>$price]); $type = $request->input('type'); $type_id = $request->input('type_id'); if ($type && $type_id) { //是否已绑定其他服务 // $s_service = SurveyServiceModel::where(['type'=>$type, 'type_id'=>$type_id])->first(); // if ($s_service) return $this->failure("该服务已绑定其他问卷调查"); SurveyService::bindSurveyService(['m_id'=>$m_id, 'type'=>$type, 'type_id'=>$type_id, 'survey_id'=>$survey->id]); MakeSurveyQrcode::dispatch($m_id, $type, $type_id, $survey->id)->onQueue('love'); // $this->MakeSurveyQrcode($m_id, $type, $type_id, $survey->id); } else { MakeSurveyQrcode::dispatch($m_id, null, null, $survey->id)->onQueue('love'); // $this->MakeSurveyQrcode($m_id, null, null, $survey->id); } DB::commit(); //todo 异步生成二维码 return $this->success('ok'); } public function MakeSurveyQrcode($m_id, $type, $type_id, $survey_id) { $base_url = env('APP_URL')."/pu/#/questionnaireV3/".$survey_id."?merchant_id=".$m_id."&type=".$type."&type_id=".$type_id; $base_url = urlencode($base_url); $url = env('APP_URL')."/survey/auth?url=".$base_url; $pic_path = storage_path('qrcode/'.$m_id.'_survey_'.$survey_id."_".$type.'_'.$type_id.'_sharer_qrcode.png'); //二维码图片 QrCode::format('png')->margin(1)->size(300)->generate($url, $pic_path); if(file_exists($pic_path)){ $qrcode = $this->MakeSurveyQrcodeUploadFile($pic_path); if ($type && $type_id) { SurveyService::where('survey_id', $survey_id)->where('type', $type)->where('type_id', $type_id)->update(['qrcode'=>$qrcode, 'share_url'=>$url]); }else { Survey::where('id', $survey_id)->update(['qrcode'=>$qrcode, 'share_url'=>$url]); } unlink($pic_path); } } public function MakeSurveyQrcodeUploadFile($file) { $ossClient = UploadController::getOssClient(); //生成file $object = date('Y') . date('m') . "/" . date('d') . "/" . basename($file); $url = 'https://' . config('alioss.picture_domain') . '/' . $object; try { $ossClient->uploadFile(config('alioss.buckets.picture'), $object, $file); } catch (\OSS\Core\OssException $e) { Log::info($e->getMessage()); return false; } return $url; } /** * 公版问卷调查修改 * @param Request $request * @param $id * @return \Illuminate\Http\JsonResponse|string */ public function updatePubSurveys(Request $request, $id) { $m_id = $request->account_id; $survey = Survey::where('m_id', $m_id)->where('id', $id)->first(); if ($request->has('title') ) { $survey->title = $request->title; } if ($request->has('content') ) { $survey->content = json_encode($request->input('content')); } if ($request->has('price') ) { $survey->price = $request->price; } if ($request->has('note') ) { $survey->note = $request->note; } $survey->save(); return $this->success('ok'); } /** * 公版问卷调查详情 * @param Request $request * @param $id * @return \Illuminate\Http\JsonResponse|string */ public function pubSurvey(Request $request, $id) { $m_id = $request->account_id; $survey = Survey::where('m_id', $m_id)->where('id', $id)->first(); return $this->success('ok', $survey); } /** * 公版问卷调查删除 * @param Request $request * @param $id * @return \Illuminate\Http\JsonResponse|string */ public function deletePubSurvey(Request $request, $id) { $m_id = $request->account_id; //todo 是否有被引用 $using = false; if ($using) return $this->failure("删除失败-该问卷正被使用"); $survey = Survey::where('m_id', $m_id)->where('id', $id)->delete(); SurveyServiceModel::where("survey_id",$id)->delete(); return $this->success('ok', $survey); } /** * 公版问卷-绑定服务 * @param Request $request * @throws \Exception */ public function bindSurveyService(Request $request, $id) { $m_id = $request->account_id; $type_id = $request->input('type_id'); $type = $request->input('type'); if (empty($type_id) || empty($type)) throw new \Exception("缺少类型参数或类型id"); SurveyService::bindSurveyService(['m_id'=>$m_id, 'type'=>$type, 'type_id'=>$type_id, 'survey_id'=>$id]); MakeSurveyQrcode::dispatch($m_id, $type, $type_id, $id)->onQueue('love'); return $this->success('ok'); } public function unbindSurveyService(Request $request, $id) { $m_id = $request->account_id; $type_id = $request->input('type_id'); $type = $request->input('type'); if (empty($type_id) || empty($type)) throw new \Exception("缺少类型参数或类型id"); SurveyServiceModel::where(['m_id'=>$m_id, 'survey_id'=>$id, 'type'=>$type, 'type_id'=>$type_id])->delete(); return $this->success('ok'); } public function surveyServices(Request $request, $id) { $services = SurveyServiceModel::where('survey_id', $id); $keyword = $request->input('keyword'); if ($keyword) { $services = $services->where('title', 'like', '%'.$keyword.'%'); } $type = $request->input('type'); if ($type) { $services = $services->where('type', $type); } $services = $services->orderByDesc('id')->paginate(); return $this->success('ok', $services); } public function surveyService(Request $request) { $type = $request->input('type'); $type_id = $request->input('type_id'); $service = SurveyServiceModel::with('survey')->where('type', $type)->where('type_id',$type_id)->first(); return $this->success('ok', $service); } public function surveyServiceUsers(Request $request, $id=null) { $survey_users = SurveyUser::with('merchantUser:id,mobile,nickname,pic')->whereHas('payOrder'); if ($id) { $survey_users = $survey_users->where('survey_service_id', $id); }else { $survey_service_id = $request->input('survey_service_id'); $type = $request->input('type'); $type_id = $request->input('type_id'); if (empty($type) || empty($type_id)) throw new \Exception("缺少参数type,type_id"); $where = [ ['type','=',$type], ['type_id','=',$type_id], ['survey_service_id','=',$survey_service_id], ]; $survey_users = $survey_users->where($where); } $keyword = $request->input('keyword'); if ($keyword) { $survey_users = $survey_users->whereHas('merchantUser', function($sql) use($keyword) { $sql->where('nickname', 'like', '%'.$keyword.'%') ->orWhere('mobile', 'like', '%'.$keyword.'%'); }); } $nopage = $request->input('nopage', 0); if ($nopage) { $survey_users = $survey_users->orderByDesc('id')->get(); }else { $survey_users = $survey_users->orderByDesc('id')->paginate(); } return $this->success('ok', $survey_users); } public function surveyUsers(Request $request, $id) { $survey_users = SurveyUser::with('merchantUser:id,mobile,nickname,pic') ->whereHas('payOrder') ->where('survey_id', $id) ->whereNull('survey_service_id') ->whereNull('type')->whereNull('type_id'); $keyword = $request->input('keyword'); if ($keyword) { $survey_users = $survey_users->whereHas('merchantUser', function($sql) use($keyword) { $sql->where('nickname', 'like', '%'.$keyword.'%') ->orWhere('mobile', 'like', '%'.$keyword.'%'); }); } $nopage = $request->input('nopage', 0); if ($nopage) { $survey_users = $survey_users->orderByDesc('id')->get(); }else { $survey_users = $survey_users->orderByDesc('id')->paginate(); } return $this->success('ok', $survey_users); } /** * 活动/服务详情 问卷列表 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function surveysByService(Request $request) { try { $merchant_id = $request->account_id; $type = $request->input('type'); $type_id = $request->input('type_id'); $list = SurveyServiceModel::with('survey') ->where('type',$type) ->where('type_id',$type_id) ->where('m_id',$merchant_id) ->paginate(); return $this->success('ok',$list); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } }