love_php/app/Http/Controllers/Admin/AssistantController.php
2026-04-02 09:20:51 +08:00

628 lines
26 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers\Admin;
use App\Models\Wechat;
use EasyWechat;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Jobs\SendIMPushMsg;
use App\Jobs\SendSubTemplateMsg;
use App\Jobs\SendTemplateMsg;
use App\Models\Answers;
use App\Models\AreaUser;
use App\Models\AssistantUser;
use App\Models\Message;
use App\Models\UrlLink;
use App\Models\User;
use App\Models\AssistantLinkman;
use App\Models\ClassArea;
use App\Models\ClassAreaSetting;
use App\Models\ClientMessage;
use App\Models\CommunityActivity;
use App\Models\Configs;
use App\Models\FeedbackHistory;
use App\Models\Followable;
use App\Models\LinkingRequest;
use App\Models\Live\Live;
use App\Models\MessageRecive;
use App\Models\ProfileCourtship;
use App\Models\ProfilePhoto;
use App\Models\RankHistory;
use App\Models\Server\CollageGroup;
use App\Models\Server\CollageGroupBatch;
use App\Models\Server\CollageGroupHistories;
use App\Models\Server\Counselor;
use App\Models\Server\MerchantAccount;
use App\Models\Server\MerchantReport;
use App\Models\Server\ReportQuestion;
use App\Models\Server\TouristOrder;
use App\Models\SystemBlacklist;
use App\Services\IMService;
use EasyWeChat\Factory;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redis;
ini_set('max_execution_time', '300');
class AssistantController extends Controller
{
protected $app;
protected $config;
public function __construct(){
$this->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());
}
}
}