love_php/app/Http/Controllers/Admin/AssistantController.php

628 lines
26 KiB
PHP
Raw Normal View History

2026-04-02 09:20:51 +08:00
<?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());
}
}
}