config = [ 'app_id' => config('wechat.official_account.new.app_id'), 'secret' => config('wechat.official_account.new.secret'), 'token' => config('wechat.official_account.new.token'), 'aes_key' => config('wechat.official_account.new.aes_key') ]; $this->app = Factory::officialAccount($this->config); } /** * 联系人列表 * @param Request $request [description] * @return [type] [description] */ public function linkmen(Request $request, AssistantLinkman $link) { $users = $link->with('user'); $keyword = $request->input('keyword'); if ($keyword) { $keyword = trim($keyword); $users = $users->whereHas('user', function($sql) use($keyword){ $sql->where('name', 'like', '%'.$keyword.'%') ->orWhere('mobile', 'like', '%'.$keyword.'%'); }); } $users = $users->orderBy('id', 'desc')->paginate(); return $this->success('ok', $users); } /** * 用户与客服消息列表 * @param Request $request [description] * @return [type] [description] */ public function userAssistantMessages(Request $request, User $user, AssistantUser $message) { $messages = $message->where('user_id', $user->id)->with('serviceUser')->orderBy('id', 'desc')->paginate(); $assistant_user = User::find(1); return $this->success('ok', compact('messages', 'user', 'assistant_user')); } /** * 发消息 * @param Request $request [description] * @param User $user [description] * @return [type] [description] */ public function sendMessage(Request $request, User $user, AssistantUser $message, AssistantLinkman $linkman) { $content = $request->input('content'); if (empty($content)) { return $this->failure('请输入内容'); } $message->create([ 'user_id'=>$user->id, 'assistant_user_id'=>1, 'service_user_id'=>auth()->id(), 'status'=>0, 'content'=>$content, 'type'=>'SEND', ]); $linkman = $linkman->firstOrcreate(['user_id'=>$user->id]); $linkman->updated_at = date('Y-m-d H:i:s'); $linkman->save(); return $this->success('ok', $message); } //已发短信列表 public function messageList(Request $request){ $messages = Message::orderBy('created_at','desc'); $keyword = $request->keyword; $start_time = $request->start_time; $end_time = $request->end_time; $birthday = $request->birthday; if ($start_time && $end_time) { $messages = $messages->whereBetween('created_at',[$start_time,$end_time]); } if ($keyword) { $messages = $messages->where(function($sql) use($keyword){ $sql->where('phone','like','%'.$keyword.'%') ->orWhere('message','like','%'.$keyword.'%'); }); } if ($birthday) { $messages = $messages->where('message','like','%生日快乐%'); } $messages = $messages->paginate(); foreach ($messages as $message) { $mobile = $message->phone; $user = User::where('mobile',$mobile)->select('id','nickname','app_avatar','circle_avatar')->first(); $link = ''; $str = $message->message; if (strstr($str,'http')) { //长链接 //获取链接起始位置 $start = strpos($str, 'http'); //获取链接结束位置 $end = strrpos($str,'/'); //截取链接 $link = substr($str, $start,($end-$start)+4); $link = preg_replace('/([\x80-\xff]*)/i','',$link); } if (strstr($str, 'ufutx.cn/s/')) { //短链接 //获取链接起始位置 $start = strpos($str, 'ufutx.cn/s/'); //获取链接结束位置 $end = strrpos($str,'/'); //截取链接 $link = substr($str, $start,($end-$start)+4); $link = preg_replace('/([\x80-\xff]*)/i','',$link); } $message->link = $link; $message->user = $user; } return $this->success('ok',$messages); } //获取点击短信链接人的号码 public function getPhone(Request $request){ $uri = $request['uri']; $message_id = $request['message_id']; $message = Message::where('id',$message_id)->first(); $message->update(['is_click'=>1]); return redirect($uri); } //更改短信点击状态 并跳转 public function messageUrlGoto(Request $request){ $uri = $request['uri']; $link = UrlLink::where('url','like','%uri='.$uri.'%')->first(); $uri = base64_decode($uri); if ($link){ $link->update(['is_click'=>1]); $link->increment('click_num',1); } return redirect($uri); } public function messageUrlGotov2(Request $request){ $uri = $request['uri']; $message_id = $request['message_id']; $uri = base64_decode($uri); Message::where('id',$message_id)->update(['is_click'=>1]); $message = Message::find($message_id); $user = User::where('mobile',$message->phone)->first(); $now_date = date('Y-m-d H:i:s'); $send_time = $message->created_at;//短信发送时间 //过期时间 $expire_time = date('Y-m-d H:i:s',strtotime('+3 days',strtotime($send_time))); if($now_date < $expire_time){//发送时间 小于三天 // $user->hidden_profile = 'NONE'; $user->can_be_found = 1; $user->save(); // WrongInfoHistories::where('user_id',$user->id)->where('type','frozen')->delete(); } return redirect($uri); } //每天发送短信折线图统计 public function dailySendSms(Request $request){ if($request->start_time && $request->end_time){ $start_time = $request->start_time; $end_time = $request->end_time; //间隔天数 $between_time = ceil((strtotime($end_time) - strtotime($start_time))/3600/24) + 1; for($i=0; $i<$between_time; $i++){ $date[] = date("Y-m-d 00:00:00",strtotime("+$i day", strtotime($start_time))); } } foreach ($date as $start_time) { $end_time = date("Y-m-d 23:59:59",strtotime($start_time)); $date_arr[] = $start_time; $message_count = Message::whereBetween('created_at',[$start_time,$end_time])->count(); $messages_count[] = $message_count; $click_count = Message::where('is_click',1)->whereBetween('created_at',[$start_time,$end_time])->count(); $clicks_count[] = $click_count; } return $this->success('ok',compact('date_arr','messages_count','clicks_count')); } //短信统计点击率 public function messageClickRate(Request $request){ $page = $request->input('page',1);//第几页 $size = $request->input('size',15);//每页数量 $keyword = $request->keyword; $key = 'message_click_rate_'.$request->page; if(!$keyword){ if (Cache::has($key)) { $data = Cache::get($key); if($data){ return $this->success($data['count'],$data['results']); } } } if ($keyword) { $keyword = trim($keyword); $count = 15; $sql = "SELECT u.id,u.nickname ,u.app_avatar,u.circle_avatar,u.mobile, (SELECT COUNT(*) FROM ufutx_messages as m WHERE m.phone = u.mobile AND created_at >= '2021-06-01 00:00:00') as sms_count, (SELECT COUNT(*) FROM ufutx_messages as m WHERE m.phone = u.mobile AND is_click = 1 AND created_at >= '2021-06-01 00:00:00') as sms_click_num FROM ufutx_users as u where (SELECT COUNT(*) FROM ufutx_messages as m WHERE m.phone = u.mobile AND created_at >= '2021-06-01 00:00:00')>0 AND u.nickname like '%".$keyword."%' order by sms_click_num desc , sms_count desc LIMIT ".($page-1)*$size.',15'; } else { // $count = Message::where('created_at','>','2021-06-01 00:00:00')->groupBy('phone')->count(); $query = "SELECT COUNT(1) FROM (SELECT * FROM `ufutx_messages` WHERE created_at > '2021-06-01 00:00:00' GROUP BY phone) as messagecount"; $count = DB::select($query); $sql = "SELECT u.id,u.nickname ,u.app_avatar,u.circle_avatar,u.mobile, (SELECT COUNT(*) FROM ufutx_messages as m WHERE m.phone = u.mobile AND created_at >= '2021-06-01 00:00:00') as sms_count, (SELECT COUNT(*) FROM ufutx_messages as m WHERE m.phone = u.mobile AND is_click = 1 AND created_at >= '2021-06-01 00:00:00') as sms_click_num FROM ufutx_users as u where (SELECT COUNT(*) FROM ufutx_messages as m WHERE m.phone = u.mobile AND created_at >= '2021-06-01 00:00:00')>0 order by sms_click_num desc , sms_count desc LIMIT ".($page-1)*$size.',15'; } $results = DB::select($sql); if(!$keyword){ $data = ['count'=>$count,'results'=>$results]; Cache::put($key,$data,86400); } if (!empty($results)){ foreach ($results as $result) { if ($result->sms_count == 0) { $result->click_rate = 0; }else { $result->click_rate = ($result->sms_click_num) / ($result->sms_count); } } } return $this->success($count,$results); } //生日短信点击率 public function birthdaySmsInfo(Request $request){ $birth_send_sms_count = Message::where('message','like','%生日快乐%')->count();//发送生日短信总数 $birth_click_sms_count = Message::where('message','like','%生日快乐%')->where('is_click',1)->count();//生日短信点击总数 $get_rank_by_birth_sms = RankHistory::where('type','birthday_give')->count();//领取生日会员数 if ($birth_send_sms_count == 0){ $birth_sms_click_rate = 0; $get_rank_by_birth_sms_rate = 0; }else{ $birth_sms_click_rate = ($birth_click_sms_count)/($birth_send_sms_count);//生日短信点击率 $get_rank_by_birth_sms_rate = ($get_rank_by_birth_sms) / ($birth_send_sms_count);//生日会员领取率 } return $this->success('ok',compact('birth_send_sms_count','birth_click_sms_count','get_rank_by_birth_sms','birth_sms_click_rate','get_rank_by_birth_sms_rate')); } public function testSendMessages(Request $request){ // $result = \WechatService::queryBankCardOrder($request->trade_no); // dd($result); //优质单身加入置顶 // $good_singles = ClassArea::where('id',$request->area_id)->first(); // try { // $good_singles = AreaUser::where('area_id',$request->area_id)->where('is_show',1)->where('is_audited',1)->select('id','user_id','area_id')->get(); // DB::beginTransaction(); // foreach ($good_singles as $key => $good_single) { // AreaUser::updateOrCreate(['area_id'=>1,'user_id'=>$good_single->user_id],['is_show'=>1,'is_audited'=>1,'is_apply'=>0]); // } // DB::commit(); // return $this->success('ok'); // } catch (\Exception $e) { // DB::rollBack(); // $this->getError($e); // return $this->failure(); // } $type_ids = ReportQuestion::withTrashed()->where('m_id',0)->pluck('type_id')->toArray(); $result = CommunityActivity::whereIn('id',$type_ids)->select('id','merchant_id')->get(); foreach ($result as $key => $value) { ReportQuestion::withTrashed()->where('type_id',$value->id)->update(['m_id'=>$value->merchant_id]); } // $time = MerchantReport::where('id',2)->first(); // if($time && $time->commitd_at){ // $commitd_arr = json_decode($time->commitd_at,true); // // dd($commitd_arr); // sort($commitd_arr); // dd($commitd_arr); // foreach ($commitd_arr as $key => $value) { // $commitd_at[$key] = $value; // } // $time->commitd_at = $commitd_at; // } return $this->success('ok'); } //自定义学历排序 degree 1专 2本 3硕 4博 public function degreeSort($min_degree = null,$max_degree = null){ $degree_arr = ['专科','本科','硕士','博士']; $need_arr = []; if(empty($min_degree) && empty($max_degree)){ return $need_arr; }elseif(empty($min_degree) && !empty($max_degree)){ foreach ($degree_arr as $key => $value) { $need_arr[] = $value; if($max_degree == $key+1) return $need_arr; } }elseif(!empty($min_degree) && empty($max_degree)){ foreach ($degree_arr as $key => $value) { $need_arr[] = $value; if($min_degree == $key+1) return $need_arr; } }elseif(!empty($min_degree) && !empty($max_degree) && $min_degree != $max_degree){ foreach ($degree_arr as $key => $value) {//23 12 if($min_degree > ($key + 1)) continue; $need_arr[] = $value; if($max_degree == $key+1) return $need_arr; } }else{//最低学历最高学历相等 $need_arr[] = $degree_arr[$min_degree-1]; return $need_arr; } } public function sendCilentMessage(Request $request) { //短信内容 $content = '【福恋】诚邀专注婚恋交际、家庭情感、个人成长领域的咨询老师,免费入驻福恋服务商ufutx.cn/s/7Sv,打造您的专属服务平台!'; //客服手机号 $mobile = Configs::where('key','client_mobile')->value('value'); // dd($mobile); //咨询师手机号 $mobiles = Counselor::where('id','>',7)->pluck('mobile')->toArray(); $nicknames = Counselor::where('id','>',7)->pluck('name')->toArray(); // 创建客服消息 ClientMessage::create([ 'mobile'=>$mobile, 'content'=>$content, 'mobiles'=>json_encode($mobiles), 'nicknames'=>json_encode($nicknames,JSON_UNESCAPED_UNICODE), 'is_completed'=>0, 'operator'=>auth()->id(), ]); //返回 return $this->success('ok'); } //给客服分发号码和内容 public function spreadMessage(Request $request){ $user = auth()->user(); $message_id = $request->message_id; $send_mobile = $user->mobile; $data = ['id'=>0,'mobile'=>'','content'=>'','name'=>'','created_at'=>'']; if(empty($send_mobile)) return $this->failure('请选择要发送短信的客服号码'); $message = ClientMessage::where('id',$message_id)->first(); $mobiles = json_decode($message->mobile); if(!in_array($send_mobile,$mobiles)){ return $this->success('ok',$data); }else{ //已经发送的号码 $sended_user_mobiles = MessageRecive::where('client_message_id',$message->id)->pluck('mobile')->toArray(); //总发送的user_id $need_user_mobiles = ClientMessage::where('id',$message->id)->value('mobiles'); $need_user_mobiles = json_decode($need_user_mobiles,true); //最终要发送的user_id; $final_user_mobiles = array_diff($need_user_mobiles,$sended_user_mobiles); if(empty($final_user_mobiles)) return $this->failure('任务已分发完成'); $user_mobile = array_rand($final_user_mobiles,1); $f_user_mobile = $final_user_mobiles[$user_mobile]; $recive = MessageRecive::create([ 'client_mobile'=>$send_mobile, 'client_message_id'=>$message->id, 'mobile'=>$f_user_mobile, 'status'=>1, 'is_click'=>0 ]); $user = Counselor::where('mobile',$f_user_mobile)->first(); // $user = User::where('mobile',$f_user_mobile)->first(); if(empty($user)) return $this->success('ok',$data); $url = 'https://love.ufutx.com/h5/#/sincerelyInvite?mobile='.$f_user_mobile; $short_url = \CommonUtilsService::createShortUrlv3($url,$recive->id); if (strstr($message->content, 'ufutx.cn/s/')) { //短链接 //获取链接起始位置 $start = strpos($message->content, 'ufutx.cn/s/'); //获取链接结束位置 $end = strrpos($message->content,'/'); //截取链接 $link = substr($message->content, $start,($end-$start)+4); $link = preg_replace('/([\x80-\xff]*)/i','',$link); } $content = str_replace($link,$short_url,$message->content); $created_at = $recive->created_at->toDateTimeString(); $data = ['id'=>$recive->id,'mobile'=>$user->mobile,'content'=>$content,'name'=>$user->name,'created_at'=>$created_at]; return $this->success('ok',$data); } return $this->success('ok',$data); } public function configClientMobile(Request $request){ $mobile = $request->mobile;//数组 $bool = ConfigS::where('key','client_mobile')->first(); if($bool){ $mobiles = json_decode($bool->value,true); $result = array_merge($mobiles,$mobile); $result = json_encode($result); $bool->update(['value'=>$result]); }else{ Configs::create([ 'key'=>'client_mobile', 'value'=>json_encode($mobile), 'remark'=>'福恋客服发短信号码' ]); } return $this->success('ok'); } public function obtainMobiles(Request $request){ $mobiles = Configs::where('key','client_mobile')->value('value'); $mobiles = json_decode($mobiles,true); return $this->success('ok',$mobiles); } //发送客服短信记录 public function clientMessageHistories(Request $request){ $keyword = $request->keyword; $histories = ClientMessage::with('operator')->select('id','mobile','content','nicknames','created_at','operator'); if($keyword){ $keyword = trim($keyword); $histories = $histories->where('content','like','%'.$keyword.'%'); } $histories = $histories->orderBy('id','desc')->paginate(); foreach ($histories as $key => $history) { $history->mobile = json_decode($history->mobile); $history->nicknames = json_decode($history->nicknames); } return $this->success('ok',$histories); } //客服短信记录详情 public function clientMessageDetail(Request $request,$message_id){ $keyword = $request->keyword; $status = $request->status??2; $result = ClientMessage::where('id',$message_id)->first(); $content = $result->content; $send_time = date('Y-m-d H:i:s',strtotime($result->created_at)); $messages = MessageRecive::with('counselor')->where('client_message_id',$message_id); if($status != 2){ $messages = $messages->where('status',$status); } if($keyword){ $keyword = trim($keyword); $messages = $messages->whereHas('counselor',function($sql) use($keyword){ $sql->where('name','like','%'.$keyword.'%') ->orWhere('mobile','like','%'.$keyword.'%'); }); } // 点击数 $sql = MessageRecive::where('client_message_id',$message_id)->where('is_click',1); $click_count = $sql->count(); $click_mobile = $sql->pluck('mobile')->toArray(); //入驻数 $recurte_count = 0; $recurte_count = MerchantAccount::whereIn('mobile',$click_mobile)->count(); $messages = $messages->orderBy('id','desc')->paginate(); return $this->success('ok',compact('messages','content','send_time','click_count','recurte_count')); } public function smsSendStatus(Request $request,$id){ $status = $request->status??1; MessageRecive::where('id',$id)->update(['status'=>$status]); return $this->success('ok'); } //单个客服发送统计 public function sendSmsStatistics(Request $request,$message_id){ $user = auth()->user(); //总发送数 $send_count = MessageRecive::where('client_mobile',$user->mobile)->where('client_message_id',$message_id)->count(); $success_count = MessageRecive::where('client_mobile',$user->mobile)->where('client_message_id',$message_id)->where('status',1)->count(); $fail_count = MessageRecive::where('client_mobile',$user->mobile)->where('client_message_id',$message_id)->where('status',0)->count(); $message = ClientMessage::where('id',$message_id)->first(); $send_count_total = count(json_decode($message->nicknames)); $has_send = MessageRecive::where('client_message_id',$message_id)->count(); $left_count = $send_count_total-$has_send; $content = $message->content; return $this->success('ok',compact('send_count','send_count_total','success_count','fail_count','content','left_count')); } //单个客服发送记录 public function sendSmsRecords(Request $request){ $user = auth()->user(); // $mobile = $request->mobile; $data = []; $records = MessageRecive::with('counselor')->where('client_message_id',$request->message_id)->where('client_mobile',$user->mobile)->orderBy('id','desc')->paginate(); foreach ($records as $key => $record) { $data[$key]['id'] = $record->id; $data[$key]['status'] = $record->status; $data[$key]['mobile'] = $record->counselor ? $record->counselor->mobile : ''; $data[$key]['name'] = $record->counselor ? $record->counselor->name : ''; $data[$key]['created_at'] = $record->created_at->toDateTimeString(); } return $this->success('ok',$data); } //单个客服任务列表 public function clientTasks(Request $request){ $user = auth()->user(); $ids = []; $messages = ClientMessage::orderBy('id','asc')->select('id','mobile','content','created_at')->get(); foreach ($messages as $key => $message) { $mobile = json_decode($message->mobile); if(in_array($user->mobile,$mobile)){ $ids[] = $message->id; } } $result = ClientMessage::whereIn('id',$ids)->select('id','mobile','content','nicknames','is_completed','created_at')->orderBy('is_completed','asc')->orderBy('id','desc')->paginate(); foreach ($result as $key => $value) { $value->send_count = count(json_decode($value->nicknames)); unset($value->nicknames); unset($value->mobile); } return $this->success('ok',$result); } public function messageUrlGotov3(Request $request){ $uri = $request['uri']; $recive_id = $request['recive_id']; MessageRecive::where('id',$recive_id)->update(['is_click'=>1]); $uri = base64_decode($uri); return redirect($uri); } public function getWechatUser(Request $request) { if(isset($request->openid) && $request->openid) { $user = \WechatService::getOfficialAccountUser($request->openid); } else { $wechat = Wechat::find(8); $user = \WechatService::getOfficialAccountUser($wechat->official_openid); } return $this->success('ok',$user); } //长链接变短链接 public function generateShortUrl(Request $request){ try { $long_url = $request->long_url; if (empty($long_url)) { return $this->failure('链接不能为空'); } $short_url = \CommonUtilsService::shortUrlv3($long_url); return $this->success('ok',$short_url); }catch (\Exception $e){ return $this->failure($e->getMessage()); } } }