account_id; $type = $request->type; $type_id = $request->type_id; $result = $this->getModel($type,$type_id); if(empty($result)) return $this->failure('服务不存在,无法添加'); if($result->merchant_id != $m_id) return $this->failure('当前服务不属于你,无法添加'); $title = $request->title; if(empty($title)) return $this->failure('标题必填'); $input_type = $request->input_type ?? 'input'; $title_answer = $request->title_answer ? json_encode($request->title_answer) : null; $exist = ReportQuestion::where(['type'=>$type,'type_id'=>$type_id,'title'=>$title,'input_type'=>$input_type,'title_answer'=>$title_answer])->first(); if(in_array($request->input_type,['radio','checkbox']) && empty($request->title_answer)){ return $this->failure('输入方式为单选或多选 必须设置相对应的选项'); } if($exist) return $this->failure('已存在相同类型的标题'); ReportQuestion::create([ 'm_id'=>$request->account_id, 'type'=>$type, 'type_id'=>$type_id, 'title'=>$title, 'input_type'=>$input_type, 'title_answer'=>$title_answer, ]); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //添加填写时间 public function addReportTime(Request $request){ try { $m_id = $request->account_id; $type = $request->type; $type_id = $request->type_id; $class = $request->class ?? 'one'; $show_hint = $request->show_hint ?1:0; $positive_title = $request->positive_title ?? ''; $positive_pic_url = $request->positive_pic_url ??''; $negative_title = $request->negative_title ?? ''; $negative_pic_url = $request->negative_pic_url ?? ''; $steady_title = $request->steady_title ?? ''; $steady_pic_url = $request->steady_pic_url ?? ''; $notification_type = $request->notification_type ?? 0; $notification_time = $request->notification_time; $share_title = $request->share_title; $share_jump_page = $request->share_jump_page; $share_pic = $request->share_pic; $hint = json_encode([ 'positive_title' =>$positive_title, 'positive_pic_url' =>$positive_pic_url, 'negative_title' =>$negative_title, 'negative_pic_url' =>$negative_pic_url, 'steady_title' =>$steady_title, 'steady_pic_url' =>$steady_pic_url, ]); if(count($request->commitd_at) && count($request->commitd_at) != count(array_unique($request->commitd_at))){ return $this->failure('存在重复日期,确认后再保存'); } $commitd_at = ($request->commitd_at && is_array($request->commitd_at) && !empty($request->commitd_at[0])) ? json_encode($request->commitd_at) : null; $result = $this->getModel($type,$type_id); if(empty($result)) return $this->failure('服务不存在,无法添加'); if($result->merchant_id != $m_id) return $this->failure('当前服务不属于你,无法添加'); $where = ['m_id'=>$request->account_id,'type'=>$request->type,'type_id'=>$type_id]; $report_time = [ 'class'=>$class, 'commitd_at'=>$commitd_at, 'show_hint' => $show_hint, 'hint' => $hint, 'share_title' => $share_title, 'share_pic' => json_encode($share_pic), 'notification_type' => $notification_type, 'notification_time' => $notification_time, 'share_jump_page' => $share_jump_page, ]; MerchantReport::updateOrCreate($where, $report_time); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } public function getModel($type,$type_id){ if($type == 'activity' || $type == 'service') $type = 'community'; $result = null; switch ($type) { case 'community': $result = CommunityActivity::find($type_id); break; case 'shop': $result = MerchantShop::find($type_id); break; case 'course': $result = Course::find($type_id); break; case 'consult': $result = Consultation::find($type_id); $result->merchant_id = ConsultAccount::where('id',$result->consult_account_id)->value('merchant_id'); break; default: return $result; break; } return $result; } //报告问题列表 public function reportQuestions(Request $request){ try { $type = $request->type; $type_id = $request->type_id; $result = $this->getModel($type,$type_id); if(empty($result)) return $this->success('ok',$result); $time = MerchantReport::where('m_id',$request->account_id)->where('type',$type) ->where('type_id',$type_id) ->first(); if($time && $time->commitd_at){ $commitd_at = json_decode($time->commitd_at,true); sort($commitd_at); $time->commitd_at = $commitd_at; } if($time && $time->hint){ $time->hint = json_decode($time->hint, true); } if($time && $time->share_pic){ $time->share_pic = json_decode($time->share_pic, true); } $questions = ReportQuestion::where('type',$type)->where('type_id',$type_id)->orderBy('id','asc') ->select('id','title','input_type','title_answer','created_at') ->paginate(); foreach ($questions as $key => $value) { $value->title_answer = json_decode($value->title_answer); } return $this->success('ok',compact('time','questions')); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } public function reportTaskQrcode(Request $request) { try { //同步任务到第三方任务库 $type = $request->input('type'); $type_id = $request->input('type_id'); if (empty($type) || empty($type_id)) throw new \Exception("缺少参数type/type_id"); $task_no = MerchantReport::where('m_id', $request->account_id)->where('type', $type)->where('type_id', $type_id)->value('task_no'); if (empty($task_no)) { $task_no = uniqid(); MerchantReport::where('m_id', $request->account_id)->where('type', $type)->where('type_id', $type_id)->update(['task_no'=>$task_no]); } $activity = CommunityActivity::where('id', $type_id)->first(); $m_report = MerchantReport::where('m_id', $request->account_id)->where('type', $type)->where('type_id', $type_id)->first(); $commitd_at = $m_report->commitd_at; // if (empty($commitd_at)) return $this->failure("暂未设置报告填写时间"); $commitd_arr = $commitd_at?json_decode($commitd_at):[]; $quesiotns = ReportQuestion::where('m_id', $request->account_id)->where('type', $type)->where('type_id', $type_id)->get(); if (empty(count($quesiotns))) return $this->failure("暂未设置报告项目"); if (count($commitd_arr)) { sort($commitd_arr); $sync_date = ''; $last_commitd_at = ''; $group_no = 'g'.uniqid(); foreach ($commitd_arr as $commitd_at) { if ($sync_date) { $sync_date = date('Y-m-d', strtotime($last_commitd_at) + 24 * 3600); $db_task_no = ''; }else{ $sync_date = $commitd_at; $db_task_no = $task_no; } $last_commitd_at = $commitd_at; $this->syncReportTaskDatabase($activity, $quesiotns,$m_report, $db_task_no,$commitd_at,$sync_date, $group_no); } }else { $this->syncReportTaskDatabase($activity, $quesiotns, $m_report, $task_no); } $key = 'merchant:report:task:qrcode:'.$type.":".$type_id; if (Cache::has($key)) { $qrcode = Cache::get($key); }else { //领取任务二维码 $qrcode = $this->getTaskQrcode($task_no); if ($qrcode) { Cache::forever($key, $qrcode); } } return $this->success('ok', compact('qrcode')); }catch (\Exception $e) { $this->getError($e); return $this->failure(); } } public function getTaskQrcode($task_no) { $token = config('app.task_token'); $url = env("APP_TASK_URL")."/api/tp/tasks/bind/qrcode?task_no=".$task_no; $client = new Client(); $header = [ 'APPTOKEN' => $token, 'Content-Type' => 'application/json' ]; $options = [ RequestOptions::TIMEOUT => 3, RequestOptions::HTTP_ERRORS => false, RequestOptions::HEADERS => $header, ]; $response = $client->get($url, $options); $content = $response->getBody(); $res = json_decode($content, true); $qrcode = ''; if ($res && isset($res['code'])) { if ($res['code']) { throw new \Exception($res['message']); }else { $qrcode = $res['data']['qrcode']; } } return $qrcode; } public function syncReportTaskDatabase($activity, $questions, $m_report, $task_no=null, $commitd_at=null, $sync_date=null, $group_no=null) { if ($m_report->share_jump_page == 'first') { $url = 'https://love.ufutx.com/pu/#?merchant_id='.$activity->merchant_id; } else { $url = 'https://love.ufutx.com/pu/#/activityDetails/'.$activity->id.'?merchant_id='.$activity->merchant_id; } $url = urlencode($url); $share_url = 'https://love.ufutx.com/api/official/live/wechat/FamilyAuth?merchant_id='.$activity->merchant_id.'&url='.$url; $title = $activity->title; $cate_name = '任务清单一'; $sub_tasks = []; $callback = null; $task_no = $task_no?:uniqid(); foreach ($questions as $question) { $content_type = ['txt'=>1, 'img'=>1, 'file'=>1, 'video'=>1,'num'=>0, 'radio'=>0,'checkbox'=>0]; if ($question->input_type == 'numeric') { $content_type['num'] = 1; }elseif ($question->input_type == 'radio') { $content_type['radio'] = 1; }elseif ($question->input_type == 'checkbox') { $content_type['checkbox'] = 1; } $sub_task_no = uniqid(); $task['title'] = $question->title; $task['task_no'] = $sub_task_no; $task['start_time'] = $commitd_at?:null; $task['end_time'] = $commitd_at?date('Y-m-d 23:59:59', strtotime($commitd_at)):null; $task['sync_date'] = $sync_date; $task['content_type'] = $content_type; $task['callback'] = $callback?$callback.$sub_task_no:null; $task['options'] = json_decode($question->title_answer); $task['group_no'] = $group_no; $task['comment_num'] = 1; $sub_tasks[] = $task; } $team = []; $anchor = Anchor::where('m_id', $activity->merchant_id)->first(); if ($anchor) { $team_no = $anchor->team_no; if (empty($team_no)) { $team_no = 'team_'.uniqid(); Anchor::where('m_id', $activity->merchant_id)->update(['team_no'=>$team_no]); } $team = ['team_no'=>$team_no,'name'=>$anchor->name, 'pic'=>$anchor->pic]; } $data = [ 'cate_name' => $cate_name, 'title' => $commitd_at.$title.'用户报告', 'task_no' => $task_no, 'group_no' => $group_no, 'sync_date' => $sync_date, 'comment_num'=>1, 'sub_task' => $sub_tasks, 'team'=> $team, 'share_url'=>$share_url, 'share_poster' => $m_report->share_pic, 'share_desc' => $m_report->share_title, ]; SyncReportTaskDatabase::dispatch($data)->onQueue('sync.report.task.db'); return $task_no; } //编辑问题 public function updateReport(Request $request){ try { $question_id = $request->question_id; $question = ReportQuestion::find($question_id); if(empty($question)) return $this->failure('问题不存在'); if($request->title && $request->title != $question->title){ $question->title = $request->title; } if($request->input_type && $request->input_type != $question->input_type){ $question->input_type = $request->input_type; if(in_array($request->input_type,['radio','checkbox']) && empty($request->title_answer)){ return $this->failure('输入方式为单选或多选 必须设置相对应的选项'); } } if($request->title_answer && json_encode($request->title_answer) != $question->title_answer){ $question->title_answer = json_encode($request->title_answer); } $question->save(); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //删除用户报告问题 public function removeQuestion(Request $request){ try { $m_id = $request->account_id; $question_id = $request->question_id; $question = ReportQuestion::where('id',$question_id)->first(); if(empty($question)) return $this->failure('当前问题不存在或已被他人删除'); $result = $this->getModel($question->type,$question->type_id); if($result->merchant_id != $m_id) return $this->failure('当前服务不属于你,无法删除'); $question->delete(); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } // 用户报告提交列表 public function userReports(Request $request){ try { $commitd_at = $request->commitd_at; $commitd_at2 = $request->commitd_at. '00:00:00'; $keyword = trim($request->keyword); $result = $this->getModel($request->type,$request->type_id); if(empty($result)) return $this->success('ok',$result); //所有问题 $question_ids = ReportQuestion::withTrashed()->where(['type'=>$request->type,'type_id'=>$request->type_id])->orderBy('id','asc')->pluck('id')->toArray(); //回答了问题的用户 $m_user_ids = ReportAnswer::whereIn('question_id',$question_ids); if($commitd_at){ $m_user_ids = $m_user_ids->where('commitd_at',$commitd_at); } $m_user_ids = $m_user_ids->pluck('m_user_id')->toArray(); $users = MerchantUser::whereIn('id',$m_user_ids)->select('id','nickname','pic','mobile'); if($keyword){ $users = $users->where(function($sql) use($keyword){ $sql->where('nickname','like',"%$keyword%") ->orWhere('mobile','like',"%$keyword%"); }); } $users = $users->paginate(); foreach ($users as $user) { //这个用户提交答案个数 $commit_ids = ReportAnswer::where('m_user_id',$user->id)->whereIn('question_id',$question_ids)->pluck('question_id')->toArray(); //未提交 id $result = array_diff($question_ids,$commit_ids); $un_titles = ReportQuestion::withTrashed()->whereIn('id',$result)->pluck('title')->toArray(); $answer = []; $i = 0; foreach ($question_ids as $key => $question_id) { $q = ReportQuestion::withTrashed()->where('id',$question_id)->first(); if(in_array($question_id,$commit_ids)){ $a = ReportAnswer::where('question_id',$question_id)->where('m_user_id',$user->id)->first(); $answer[$key]['title'] = $a->title; $answer[$key]['answer'] = $a->answer; $answer[$key]['pics'] = !empty($a->pics) ? json_decode($a->pics,true) : []; }else{ $answer[$key]['title'] = $un_titles[$i]; $answer[$key]['answer'] = ''; $answer[$key]['pics'] = []; $i++; if($i >= count($un_titles)) continue; } $answer[$key]['input_type'] = $q->input_type; if($q->input_type == 'checkbox' && isset($a) && isset($a->answer2)){ $answer[$key]['answer2'] = json_decode($a->answer2); }elseif(isset($a)){ $answer[$key]['answer2'] = $a->answer2; }else{ $answer[$key]['answer2'] = ''; } } $user->answer = $answer; } return $this->success('ok',$users); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //提交了报告了用户 public function commitUsers(Request $request){ $keyword = trim($request->keyword); //所有问题 $question_ids = ReportQuestion::withTrashed()->where(['type'=>$request->type,'type_id'=>$request->type_id])->orderBy('id','asc')->pluck('id')->toArray(); //回答了问题的用户 $m_user_ids = ReportAnswer::whereIn('question_id',$question_ids)->orderBy('id','desc')->pluck('m_user_id')->toArray(); $users = MerchantUser::whereIn('id',$m_user_ids)->select('id','nickname','pic','mobile'); if($keyword){ $users = $users->where(function($sql) use($keyword){ $sql->where('nickname','like',"%$keyword%") ->orWhere('mobile','like',"%$keyword%"); }); } $users = $users->paginate(); foreach ($users as $key => $value) { //该用户的提交时间数组 $commitd_ats = ReportAnswer::where('m_user_id',$value->id)->whereIn('question_id',$question_ids)->groupBy('commitd_at')->pluck('commitd_at')->toArray(); $commitd_at = []; foreach ($commitd_ats as $key => $at) { $atm = date('Y-m-d',strtotime($at)); $commitd_at[]=$atm; } sort($commitd_at); $value->commitd_at = $commitd_at; //文件 $file = ReportFile::where('user_id', $value->id)->where('type', 'activity')->where('type_id', $request->type_id)->first(); $file_status = 0; $file_url = ''; if ($file && empty($file->url)) { $file_status = 1; $file_url = $file->url; }elseif ($file && $file->url) { $file_status = 2; $file_url = $file->url; } $value->file_url = $file_url; $value->file_status = $file_status; } return $this->success('ok',$users); } public function reportFile(Request $request, $user_id) { try { $type = $request->input('type'); $type_id = $request->input('type_id'); $order = TouristOrder::where('type', $type)->where('type_id', $type_id)->whereIn('pay_status', [1,4])->where('account_id', $user_id)->first(); if (empty($order)) throw new \Exception("生成文件失败,订单不存在"); ReportFile::updateOrCreate(['order_id'=>$order->id, 'user_id'=>$order->account_id, 'type'=>'activity', 'type_id'=>$order->type_id], ['url'=>'', 'file_type'=>'docx']); \App\Jobs\ReportExport::dispatch($order)->onQueue('report.export'); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } //该用户提交的答案列表 public function userAnswers(Request $request){ $m_user_id = $request->m_user_id; $commitd_at = $request->commitd_at; $commitd_at2 = $request->commitd_at.' 00:00:00'; $result = $this->getModel($request->type,$request->type_id); if(empty($result)) return $this->success('ok',$result); //所有问题 $question_ids = ReportQuestion::where(['type'=>$request->type,'type_id'=>$request->type_id])->orderBy('id','asc')->pluck('id')->toArray(); //这个用户提交答案个数 $commit_ids = ReportAnswer::where('m_user_id',$m_user_id)->whereIn('question_id',$question_ids); if($commitd_at){ $commit_ids = $commit_ids->where('commitd_at',$commitd_at2); } $commit_ids = $commit_ids->pluck('question_id')->toArray();//75 //未提交 id $result = array_diff($question_ids,$commit_ids);//76 77 $un_titles = ReportQuestion::whereIn('id',$result)->pluck('title')->toArray(); $answer = []; $i = 0; foreach ($question_ids as $key => $question_id) { $q = ReportQuestion::where('id',$question_id)->first(); $answer[$key]['input_type'] = $q->input_type; if(in_array($question_id,$commit_ids)){ $a = ReportAnswer::where('question_id',$question_id)->where('m_user_id',$m_user_id); if($request->commitd_at){ $a = $a->where('commitd_at',$commitd_at2); } $a = $a->first(); $answer[$key]['title'] = $a->title; $answer[$key]['answer'] = $a->answer; $answer[$key]['pics'] = !empty($a->pics) ? json_decode($a->pics,true) : []; }else{ $answer[$key]['title'] = $un_titles[$i]; $answer[$key]['answer'] = ''; $answer[$key]['pics'] = []; $i++; } if($q->input_type == 'checkbox' && isset($a) && isset($a->answer2)){ $answer[$key]['answer2'] = json_decode($a->answer2); }elseif(isset($a)){ $answer[$key]['answer2'] = $a->answer2; }else{ $answer[$key]['answer2'] = ''; } unset($a); // if($i >= count($un_titles)) continue; } return $this->success('ok',$answer); } }