444 lines
18 KiB
PHP
444 lines
18 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use Illuminate\Http\Request;
|
||
use App\Models\BlessingUsers;
|
||
use App\Models\DriftingBottle;
|
||
use App\Models\BottleChatRecord;
|
||
use App\Models\BottleReceivingRecord;
|
||
use App\Http\Controllers\Controller;
|
||
use App\Models\BannedHistory;
|
||
use EasyWeChat\Factory;
|
||
use App\Models\Channels;
|
||
use App\Models\ComplaintHistory;
|
||
use Illuminate\Pagination\LengthAwarePaginator;
|
||
|
||
class DriftingBottlesController extends Controller
|
||
{
|
||
//用户列表
|
||
public function userList(Request $request)
|
||
{
|
||
$keyword = trim($request->keyword);
|
||
if($request->has('channel_id')){
|
||
$result = BlessingUsers::where('channel_id',$request->channel_id);
|
||
if($keyword)
|
||
$result = $result->where('nickname','like','%'.$keyword.'%');
|
||
$result = $result->orderby('id','desc')->paginate();
|
||
}else{
|
||
if($keyword){
|
||
$result = BlessingUsers::where('nickname','like','%'.$keyword.'%')->orderby('id','desc')->paginate();
|
||
}else{
|
||
$result = BlessingUsers::orderby('id','desc')->paginate();
|
||
}
|
||
}
|
||
foreach ($result as $key => $value) {
|
||
$value->receive_num = BottleReceivingRecord::where('receiving_user_id',$value->id)->count();
|
||
$value->send_num =DriftingBottle::where('b_id',$value->id)->count();
|
||
}
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
// 用户发送的漂流瓶
|
||
public function myBottle(Request $request)
|
||
{
|
||
$user_id = $request->user_id;
|
||
$result = DriftingBottle::where('b_id',$user_id)->paginate();
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
// 用户获取的漂流瓶
|
||
|
||
public function getBottle(Request $request)
|
||
{
|
||
$user_id = $request->user_id;
|
||
$result = BottleReceivingRecord::where('receiving_user_id',$user_id)->paginate();
|
||
foreach ($result as $key => $value) {
|
||
$DriftingBottle = DriftingBottle::where('id',$value->bottle_id)->first();
|
||
$value->content = $DriftingBottle->content;
|
||
$value->type = $DriftingBottle->type;
|
||
$value->send_user = $DriftingBottle->user;
|
||
}
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
// 聊天记录
|
||
|
||
public function BottleRecord(Request $request)
|
||
{
|
||
$user_id = $request->user_id;
|
||
$sql = BottleChatRecord::orderBy('id','DESC')->limit(1000);
|
||
$user = BlessingUsers::where('id',$user_id)->first();
|
||
if(!$user){
|
||
return $this->failure('用户ID错误');
|
||
}
|
||
$result= BottleChatRecord::where(function($query) use($user){
|
||
$query->where('b_id',$user->id);
|
||
$query->orwhere('receiver',$user->id);
|
||
})->from(\DB::raw('('.$sql->toSql().') as a'))->groupBy('receiving_id')->get();
|
||
$data = [];
|
||
foreach ($result as $key => $value) {
|
||
$count = BottleChatRecord::where('receiving_id',$value->receiving_id)->count();
|
||
if($count<2&&$value->b_id==$user->id)
|
||
continue;
|
||
$user = BlessingUsers::where('id',$value->b_id)->first();
|
||
$value->nickname = $user->nickname??'';
|
||
$value->pic = $user->pic??'';
|
||
array_push($data,$value);
|
||
}
|
||
$page = $request->page ?? 1;
|
||
$perPage = 15;
|
||
$offset = ($page * $perPage) - $perPage;
|
||
$result = new LengthAwarePaginator(
|
||
array_slice($data, $offset, $perPage),
|
||
count($data),
|
||
$perPage,
|
||
$page,
|
||
['path' => $request->url(), 'query' => $request->query()]
|
||
);
|
||
return $this->success('ok',$result);
|
||
|
||
}
|
||
|
||
|
||
// 聊天详情
|
||
public function RecordDetail(Request $request,$id)
|
||
{
|
||
$user_id = $request->user_id;
|
||
$user = BlessingUsers::where('id',$user_id)->first();
|
||
BottleChatRecord::where('receiving_id',$id)->where('receiver',$user->id)->update(['status'=>1]);
|
||
$result = BottleChatRecord::where('receiving_id',$id)->orderBy('id','desc')->get();
|
||
foreach ($result as $key => $value) {
|
||
$user = BlessingUsers::where('id',$value->b_id)->first();
|
||
$value->user_name = $user->nickname;
|
||
$value->user_pic = $user->pic;
|
||
}
|
||
return $this->success('ok',$result);
|
||
|
||
}
|
||
|
||
//漂流瓶--举报列表
|
||
public function blessComplaintHistories(Request $request){
|
||
try {
|
||
$keyword = $request->keyword;
|
||
$status = $request->status ?? 0;//0未跟进 1完成跟进 2跟进中
|
||
$histories = ComplaintHistory::with('complaintUser','complaintedUser')->where('type','bless');
|
||
if($keyword){
|
||
$keyword = trim($keyword);
|
||
$user_ids = BlessingUsers::where('nickname','like','%'.$keyword.'%')->pluck('id');
|
||
$histories = $histories->whereIn('complaint_id',$user_ids);
|
||
}
|
||
$histories = $histories->where('status',$status)->orderBy('id','desc')->paginate();
|
||
$time = date('Y-m-d H:i:s');
|
||
foreach ($histories as $key => $history) {
|
||
$ban_send = 0;
|
||
$ban_chat = 0;
|
||
$ban_risk = 0;
|
||
$history->label = json_decode($history->label);
|
||
if($history->remark && $history->remark != 'null'){
|
||
$history->remark = json_decode($history->remark,true);
|
||
}
|
||
//判断用户是否被封禁
|
||
$send_history = BannedHistory::where('user_id',$history->complaint_id)->where('type','bless_send')->get();
|
||
foreach ($send_history as $key => $value) {
|
||
if($value->start_time < $time && $value->end_time > $time) $ban_send = 1;
|
||
}
|
||
$chat_history = BannedHistory::where('user_id',$history->complaint_id)->where('type','bless_chat')->get();
|
||
foreach ($chat_history as $key => $value) {
|
||
if($value->start_time < $time && $value->end_time > $time) $ban_chat = 1;
|
||
}
|
||
$risk_history = BannedHistory::where('user_id',$history->complaint_id)->where('type','risk_warning')->get();
|
||
foreach ($risk_history as $key => $value) {
|
||
if($value->start_time < $time && $value->end_time > $time) $ban_risk = 1;
|
||
}
|
||
$history->ban_send = $ban_send;
|
||
$history->ban_chat = $ban_chat;
|
||
$history->ban_risk = $ban_risk;
|
||
}
|
||
return $this->success('ok',$histories);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器开小差,请稍后再试');
|
||
}
|
||
|
||
}
|
||
|
||
//漂流瓶--祝福列表
|
||
public function driftBottles(Request $request){
|
||
try {
|
||
$keyword = $request->keyword;
|
||
$type = $request->type ?? 'all';
|
||
$bottles = DriftingBottle::with('user')->select('id','content','b_id','type','duration','created_at','updated_at');
|
||
if($keyword){
|
||
$keyword = trim($keyword);
|
||
$bottles = $bottles->whereHas('user',function($sql) use($keyword){
|
||
$sql->where('nickname','like','%'.$keyword.'%');
|
||
});
|
||
}
|
||
if($type != 'all'){
|
||
$bottles = $bottles->where('type',$type);
|
||
}
|
||
$bottles = $bottles->orderBy('id','desc')->paginate();
|
||
return $this->success('ok',$bottles);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器开小差,请稍后再试');
|
||
}
|
||
}
|
||
|
||
//漂流瓶--祝福详情
|
||
public function blessBottle(Request $request,$bottle_id){
|
||
try {
|
||
$bottle = DriftingBottle::with('user')->where('id',$bottle_id)->first();
|
||
if(!$bottle) return $this->failure('该祝福不存在或被删除');
|
||
//接收该漂流瓶的人
|
||
$recives = BottleReceivingRecord::with('reciver')->where('bottle_id',$bottle_id)->orderBy('id',"desc")->paginate();
|
||
return $this->success('ok',compact('bottle','recives'));
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器开小差,请稍后再试');
|
||
}
|
||
}
|
||
|
||
//漂流瓶--祝福聊天记录
|
||
public function blessChatRecord(Request $request){
|
||
try {
|
||
$bottle_id = $request->bottle_id;
|
||
$receiving_id = $request->receiving_id;
|
||
//发送祝福人id
|
||
$b_id = DriftingBottle::where('id',$bottle_id)->value('b_id');
|
||
$user = BlessingUsers::where('id',$b_id)->first();
|
||
if(empty($user)) return $this->failure('发送该祝福人不存在或已被删除');
|
||
$records = BottleChatRecord::where(['bottle_id'=>$bottle_id,'receiving_id'=>$receiving_id])->orderBy('id','asc')->paginate();
|
||
foreach ($records as $key => $value) {
|
||
$b_user = BlessingUsers::where('id',$value->b_id)->first();
|
||
$value->user_name = $b_user->nickname;
|
||
$value->user_pic = $b_user->pic;
|
||
$value->identity = 'user';
|
||
$value->duration = 0;
|
||
if($value->type!='chat')
|
||
$value->duration = DriftingBottle::where('id',$value->bottle_id)->value('duration')?:0;
|
||
if($value->b_id!=$user->id)
|
||
$value->identity = 'other_user';
|
||
}
|
||
return $this->success('ok',$records);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器休息,请稍后再试');
|
||
}
|
||
|
||
}
|
||
|
||
//禁止用户发送祝福 聊天
|
||
public function banBlessUser(Request $request,$b_user_id){
|
||
try {
|
||
$user = BlessingUsers::where('id',$b_user_id)->first();
|
||
$start_time = $request->start_time;
|
||
$end_time = $request->end_time;
|
||
if(!$start_time || !$end_time) return $this->failure('请选择封禁时间');
|
||
$content = $request->input('content');
|
||
$pics = $request->pics ??[];
|
||
$ban_type = $request->ban_type??'bless_send';//bless_send 禁止发送祝福 bless_chat禁止聊天 risk_warning风险警告
|
||
if(!$user) return $this->failure('该用户不存在');
|
||
if(!$content) return $this->failure('请输入封禁理由');
|
||
BannedHistory::create([
|
||
'user_id'=>$b_user_id,
|
||
'admin_user_id'=>auth()->id(),
|
||
'type'=>$ban_type,
|
||
'start_time'=>$start_time,
|
||
'end_time'=>$end_time,
|
||
'content'=>$content,
|
||
'pics'=>json_encode($pics),
|
||
]);
|
||
return $this->success('ok');
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器开小差,请稍后再试');
|
||
}
|
||
}
|
||
|
||
//解封用户
|
||
public function cancelBanBlessUser(Request $request,$b_user_id){
|
||
try {
|
||
$content = $request->input('content');
|
||
if(!$content) return $this->failure('请输入解封理由');
|
||
$pics = $request->pics??[];
|
||
$type = $request->type;
|
||
BannedHistory::where('user_id',$b_user_id)->where('type',$type)->delete();
|
||
//创建解封记录
|
||
BannedHistory::create([
|
||
'user_id'=>$b_user_id,
|
||
'admin_user_id'=>auth()->id(),
|
||
'type'=>'cancel_ban_'.$type,
|
||
'start_time'=>date('Y-m-d H:i:s'),
|
||
'end_time'=>date('Y-m-d H:i:s'),
|
||
'content'=>$content,
|
||
'pics'=>json_encode($pics),
|
||
]);
|
||
return $this->success('ok');
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器开小差,请稍后再试');
|
||
}
|
||
}
|
||
|
||
//用户封禁记录
|
||
public function blessUserBanHistories(Request $request,$b_user_id){
|
||
try {
|
||
//bless_send:禁止发祝福,bless_chat:禁止聊天,cancel_ban_bless_chat:解除禁止聊天,cancel_ban_bless_send:解除禁止发祝福 risk_warning风险警告
|
||
$arr = ['bless_send','bless_chat','cancel_ban_bless_chat','cancel_ban_bless_send','risk_warning','cancel_ban_risk_warning'];
|
||
$histories = BannedHistory::withTrashed()->with('operator')->whereIn('type',$arr)->where('user_id',$b_user_id)->orderBy('id','desc')->get();
|
||
foreach ($histories as $key => $history) {
|
||
$history->pics = json_decode($history->pics,true);
|
||
}
|
||
return $this->success('ok',$histories);
|
||
} catch (\Exception $e) {
|
||
$this->getError($e);
|
||
return $this->failure('服务器开小差,请稍后再试');
|
||
}
|
||
|
||
}
|
||
|
||
// 创建渠道
|
||
public function addChannel(Request $request)
|
||
{
|
||
$channel = new Channels();
|
||
$channel->title = $request->title;
|
||
$channel->type= 'bless';
|
||
$channel->save();
|
||
// $share_url = '/pages/tabBar/home';
|
||
// $pre = 'channel='.$channel->id;
|
||
// $channel->share_url = $this->getminiQrcode($share_url,$pre);
|
||
$channel->share_qr_code = $this->ShareBlessMp( $channel);
|
||
$channel->save();
|
||
return $this->success('ok',$channel);
|
||
|
||
}
|
||
|
||
|
||
// 渠道列表
|
||
|
||
public function ChannelList(Request $request)
|
||
{
|
||
$result = Channels::orderBy('id','desc')->paginate();
|
||
foreach ($result as $key => $value) {
|
||
$value->user_num = BlessingUsers::where('channel_id',$value->id)->count();
|
||
}
|
||
return $this->success('ok',$result);
|
||
}
|
||
|
||
|
||
// 用户详情
|
||
|
||
public function User(Request $request,$b_user_id)
|
||
{
|
||
$user = BlessingUsers::where('id',$b_user_id)->first();
|
||
$user->receive_num = BottleReceivingRecord::where('receiving_user_id',$user->id)->count();
|
||
$user->send_num =DriftingBottle::where('b_id',$user->id)->count();
|
||
//检查用户是否处于被封禁状态
|
||
$time = date('Y-m-d H:i:s');
|
||
$ban_send = 0;
|
||
$ban_chat = 0;
|
||
$ban_risk = 0;
|
||
//判断用户是否被封禁
|
||
$send_history = BannedHistory::where('user_id',$b_user_id)->where('type','bless_send')->get();
|
||
foreach ($send_history as $key => $value) {
|
||
if($value->start_time < $time && $value->end_time > $time) $ban_send = 1;
|
||
}
|
||
$chat_history = BannedHistory::where('user_id',$b_user_id)->where('type','bless_chat')->get();
|
||
foreach ($chat_history as $key => $value) {
|
||
if($value->start_time < $time && $value->end_time > $time) $ban_chat = 1;
|
||
}
|
||
$risk_history = BannedHistory::where('user_id',$b_user_id)->where('type','risk_warning')->get();
|
||
foreach ($risk_history as $key => $value) {
|
||
if($value->start_time < $time && $value->end_time > $time) $ban_risk = 1;
|
||
}
|
||
$user->ban_send = $ban_send;
|
||
$user->ban_chat = $ban_chat;
|
||
$user->ban_risk = $ban_risk;
|
||
return $this->success('ok',$user);
|
||
}
|
||
|
||
|
||
// 生成二维码
|
||
public function getminiQrcode($path,$pre)
|
||
{
|
||
$app_id = 'wx1d3301c485402a21';
|
||
$secret = '0bf57514998d4b8cfd602d8ca49c1fd1';
|
||
$config = [
|
||
'app_id' => $app_id,
|
||
'secret' => $secret,
|
||
// 下面为可选项
|
||
// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
|
||
'response_type' => 'array',
|
||
'log' => [
|
||
'level' => 'debug',
|
||
'file' => storage_path('logs/wechat.log'), //这个必须要有,要不调试有问题,你都会找不到原因
|
||
],
|
||
];
|
||
$app = Factory::miniProgram($config)->access_token;
|
||
$token = $app->getToken(true);
|
||
$data = [];
|
||
$data['jump_wxa']['path'] = $path;
|
||
$data['jump_wxa']['query'] = $pre ;
|
||
$data = json_encode($data);
|
||
$wechaturl = 'https://api.weixin.qq.com/wxa/generatescheme?access_token=' . $token['access_token'];
|
||
$curl = curl_init();
|
||
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
|
||
curl_setopt($curl, CURLOPT_URL, $wechaturl);
|
||
// curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
||
curl_setopt($curl, CURLOPT_FAILONERROR, false);
|
||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($curl, CURLOPT_HEADER, false);
|
||
if (1 == strpos("$" . $wechaturl, "https://")) {
|
||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
|
||
}
|
||
curl_setopt($curl, CURLOPT_POST, 1);
|
||
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
|
||
$result = curl_exec($curl);
|
||
$result = json_decode($result, true);
|
||
|
||
$jump_url = '';
|
||
if(array_key_exists('openlink',$result)){
|
||
$jump_url = $result['openlink'];
|
||
}
|
||
return $jump_url;
|
||
}
|
||
|
||
/*
|
||
* 生成用户分享海报 跳转小程序
|
||
*/
|
||
public function ShareBlessMp($channel)
|
||
{
|
||
$app_id = 'wx1d3301c485402a21';
|
||
$secret = '0bf57514998d4b8cfd602d8ca49c1fd1';
|
||
$config = [
|
||
'app_id' => $app_id,
|
||
'secret' => $secret,
|
||
// 下面为可选项
|
||
// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
|
||
'response_type' => 'array',
|
||
'log' => [
|
||
'level' => 'debug',
|
||
'file' => storage_path('logs/wechat.log'), //这个必须要有,要不调试有问题,你都会找不到原因
|
||
],
|
||
];
|
||
$app = Factory::miniProgram($config);
|
||
$data = [];
|
||
$data['is_hyaline'] = true;
|
||
$response = $app->app_code->get('/pages/tabBar/home?channel='.$channel->id, $data);
|
||
$path = time().'activity_qrocde.png';
|
||
$response->saveAs(storage_path('qrcode'), $path);
|
||
$qrcode_path = storage_path("qrcode/".$path);
|
||
$path = date('Y') . date('m') . "/" . date('d');
|
||
$rand = \CommonUtilsService::getTradeNO();
|
||
$object = $path . "/" . $rand.'.png';
|
||
$ossClient = new \OSS\OssClient(config('alioss.id'), config('alioss.secret'), config('alioss.host'));
|
||
$ossClient->uploadFile(config('alioss.buckets.picture'), $object, $qrcode_path);
|
||
$file_url = 'https://' . config('alioss.picture_domain') . '/' . $object;
|
||
return $file_url;
|
||
}
|
||
|
||
}
|