835 lines
34 KiB
PHP
835 lines
34 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Events\OperationLoggedEvent;
|
|
use App\Facades\WechatService;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Collaborator;
|
|
use App\Models\DmaServiceUserRole;
|
|
use App\Models\Group;
|
|
use App\Models\GroupMessage;
|
|
use App\Models\GroupUser;
|
|
use App\Models\Order;
|
|
use App\Models\ServiceRole;
|
|
use App\Models\ServiceRoleUser;
|
|
use App\Models\User;
|
|
use App\Models\WangYiYun;
|
|
use cccdl\yunxin_sdk\Im\Msg;
|
|
use cccdl\yunxin_sdk\Im\Team;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use mysql_xdevapi\Exception;
|
|
|
|
class ChatController extends Controller
|
|
{
|
|
public function chatMessages(Request $request, Order $order)
|
|
{
|
|
$group = $order->group;
|
|
$group_users = GroupUser::where('group_id', $group->id)->get();
|
|
$messages = GroupMessage::with('user')->where('group_id', $group->id)->orderByDesc('id')->paginate();
|
|
foreach ($messages as $message) {
|
|
$role = $group_users->where('user_id', $message->user_id)->first();
|
|
$message->role_name = $role ? $role->role_name : '';
|
|
}
|
|
return $this->success('ok', compact('group', 'messages'));
|
|
}
|
|
|
|
/**
|
|
* 绑定订单和企业群
|
|
* @param Request $request
|
|
* @param Order $order
|
|
*/
|
|
public function bindOrderChat(Request $request, Order $order)
|
|
{
|
|
$chat_id = $request->input('chat_id');
|
|
$chat_name = $request->input('chat_name');
|
|
if (empty($chat_id))
|
|
throw new \Exception('缺少企业微信群id');
|
|
$bind_group = Group::where('chat_id', $chat_id)->first();
|
|
$group = $order->group;
|
|
if ($bind_group && $bind_group->id != $group->id)
|
|
return $this->failure("该企业群已绑定订单");
|
|
$group->chat_id = $chat_id;
|
|
$group->chat_name = $chat_name;
|
|
$group->save();
|
|
|
|
//操作记录
|
|
OperationLoggedEvent::dispatch("给订单:$order->id 绑定了企业微信群: $chat_id");
|
|
return $this->success('ok');
|
|
}
|
|
|
|
public function workChats(Request $request)
|
|
{
|
|
$limit = $request->input('limit', 15);
|
|
$cursor = $request->input('course', '');
|
|
$res = WechatService::groupChats($cursor, $limit);
|
|
$chats = $res->group_chat_list;
|
|
$next_cursor = $res->next_cursor ?? '';
|
|
$group_chats = [];
|
|
foreach ($chats as $chat) {
|
|
$group_chats[] = WechatService::groupChat($chat->chat_id);
|
|
}
|
|
return $this->success('ok', compact('group_chats', 'next_cursor'));
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取网易云用户
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getWangYiYunUser(Request $request)
|
|
{
|
|
try {
|
|
$keyword = $request->get('keyword');
|
|
$no_page = $request->get('no_page');
|
|
$is_service = $request->get('is_service');
|
|
if ($is_service) {
|
|
$query = User::query()->whereHas("damServiceUserRole", function ($sql) {
|
|
$sql/*->whereIn("role", [1, 2, 3])*/ ->where('status', 1);
|
|
})->when($keyword, function ($query) use ($keyword) {
|
|
$query->where(function ($query) use ($keyword) {
|
|
$query->where('name', 'like', "%{$keyword}%")->orWhere('mobile', 'like', "%{$keyword}%");
|
|
$mobileStr = aesEncryptCBC($keyword);
|
|
if ($mobileStr) {
|
|
$query->orWhere("mobile", $mobileStr);
|
|
}
|
|
});
|
|
})
|
|
->orderByDesc('id');
|
|
} else {
|
|
$query = User::query()->whereIn('source', [1, 4])->when($keyword, function ($query) use ($keyword) {
|
|
$query->where(function ($query) use ($keyword) {
|
|
$query->where('name', 'like', "%{$keyword}%")->orWhere('mobile', 'like', "%{$keyword}%");
|
|
$mobileStr = aesEncryptCBC($keyword);
|
|
if ($mobileStr) {
|
|
$query->orWhere("mobile", $mobileStr);
|
|
}
|
|
});
|
|
})
|
|
->orderByDesc('id');
|
|
}
|
|
if ($no_page) {
|
|
$list = $query->get();
|
|
} else {
|
|
$list = $query->paginate();
|
|
}
|
|
return $this->success('ok', $list);
|
|
} catch (\Exception $e) {
|
|
Log::error('getWangYiYunUser:' . $e->getMessage());
|
|
return $this->jsonResponse(1, $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 后台创建群聊
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse|void
|
|
*/
|
|
public function createGroup(Request $request)
|
|
{
|
|
DB::beginTransaction();
|
|
try {
|
|
$data = $request->all();
|
|
$validated = Validator::make($data, [
|
|
'name' => 'required', // 数组群名称必填
|
|
'msg' => 'required', // 邀请发送的文字必填
|
|
'agree' => 'required',
|
|
'owner_id' => 'required', // 群主必填
|
|
'icon' => 'required', // 群头像必填
|
|
'intro' => 'required', // 群描述必填
|
|
'announcement' => 'required', // 群公告必填
|
|
'join_mode' => 'required', // 加入方式必填
|
|
// 'user_ids' => 'required', // 群成员必填
|
|
'order_id' => 'required', // 订单必填
|
|
], [
|
|
'name.required' => '请填写群名称',
|
|
'agree.required' => '请选择进群方式',
|
|
'msg.required' => '请填写邀请文字',
|
|
'owner_id.required' => '请选择群主',
|
|
'icon.required' => '请上传群头像',
|
|
'intro.required' => '请输入群描述',
|
|
'announcement.required' => '请输入群公告',
|
|
'join_mode.required' => '请选择加入方式',
|
|
// 'user_ids.required' => '请选择群成员',
|
|
'order_id.required' => '请选择订单',
|
|
]);
|
|
|
|
// $exists = Group::where('order_id',$data['order_id'])->exists();
|
|
// if($exists){
|
|
// return $this->failure('订单已绑定群组,请勿重复绑定');
|
|
// }
|
|
|
|
if ($validated->fails()) {
|
|
// 验证失败,返回错误信息
|
|
$errors = $validated->errors()->all();
|
|
$error = count($errors) ? $errors[0] : null;
|
|
// 处理错误信息的逻辑
|
|
return $this->failure($error);
|
|
}
|
|
|
|
//生成规则都是一样的,这里就不查数据库了
|
|
$owner_ac_cid = make_wangyiyun_accid($data['owner_id']);
|
|
|
|
|
|
$options = [];
|
|
$options['icon'] = $data['icon'];
|
|
$options['intro'] = $data['intro'];
|
|
$options['announcement'] = $data['announcement'];
|
|
//创建群,并插入群成员
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$group_info = $imTeam->create($data['name'], $owner_ac_cid, [], $data['msg'], $data['agree'], $data['join_mode'], $options);
|
|
|
|
//如果该订单号存在群组,则修改群信息
|
|
$group_exists = Group::where('order_id', $data['order_id'])->first();
|
|
$group_model = [];
|
|
if ($group_exists) {
|
|
if (!$group_exists->im_chat_id) {
|
|
//修改群信息
|
|
$group_exists->name = $data['name'];
|
|
$group_exists->avatar = $data['icon'];
|
|
$group_exists->intro = $data['intro'];
|
|
$group_exists->announcement = $data['announcement'];
|
|
$group_exists->owner_id = $data['owner_id'];
|
|
$group_exists->chat_name = $data['name'];
|
|
$group_exists->im_chat_id = $group_info['tid'];
|
|
$group_exists->save();
|
|
|
|
//插入群主到群成员表
|
|
GroupUser::create(['user_id' => $data['owner_id'], 'group_id' => $group_exists->id, 'type' => GroupUser::TYPE_OWNER]);
|
|
}
|
|
} else {
|
|
//创建群
|
|
$map = [];
|
|
$map['name'] = $data['name'];
|
|
$map['order_id'] = $data['order_id'];
|
|
$map['avatar'] = $data['icon'];
|
|
$map['intro'] = $data['intro'];
|
|
$map['announcement'] = $data['announcement'];
|
|
$map['owner_id'] = $data['owner_id'];
|
|
$map['chat_name'] = $data['name'];
|
|
$map['im_chat_id'] = $group_info['tid'];
|
|
$map['type'] = Group::TYPE_WANGYIYUN;
|
|
$group_model = Group::create($map);
|
|
|
|
//插入群主到群成员表
|
|
GroupUser::create(['user_id' => $data['owner_id'], 'group_id' => $group_model->id, 'type' => GroupUser::TYPE_OWNER]);
|
|
|
|
//发送群消息
|
|
$owner_ac_cid = make_wangyiyun_accid($data['owner_id']);
|
|
$imMsg = new Msg(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
|
|
$imMsg->sendMsg($owner_ac_cid, 1, $group_info['tid'], 0, json_encode(['msg' => '友福健康,诚心为您服务']));
|
|
}
|
|
|
|
//插入群成员
|
|
// $group_user_map = [];
|
|
// $group_user_map['group_id'] = $group_model->id;
|
|
// foreach ($data['user_ids'] as $val){
|
|
// $group_user_map['user_id'] = $val;
|
|
// GroupUser::create($group_user_map);
|
|
// }
|
|
DB::commit();
|
|
return $this->success('ok', $group_model);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('createGroup:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 修改群信息
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function updateGroupInfo(Request $request)
|
|
{
|
|
DB::beginTransaction();
|
|
try {
|
|
$data = $request->all();
|
|
$validated = Validator::make($data, [
|
|
'group_id' => 'required', // 数组群名称必填
|
|
'name' => 'required', // 数组群名称必填
|
|
// 'icon' => 'required', // 群头像必填
|
|
'intro' => 'required', // 群描述必填
|
|
'announcement' => 'required', // 群公告必填
|
|
'order_id' => 'required', // 订单必填
|
|
'owner_id' => 'required', // 群主id
|
|
], [
|
|
'group_id.required' => '请选择群组',
|
|
'name.required' => '请填写群名称',
|
|
// 'icon.required' => '请上传群头像',
|
|
'intro.required' => '请输入群描述',
|
|
'announcement.required' => '请输入群公告',
|
|
'order_id.required' => '请选择订单',
|
|
'owner_id.required' => '请选择群主',
|
|
]);
|
|
|
|
$group = Group::where('id', $data['group_id'])->first();
|
|
if (!$group) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
|
|
$exists = Group::where('order_id', $data['order_id'])->exists();
|
|
|
|
if ($exists && $group->order_id != $data['order_id']) {
|
|
return $this->failure('订单已绑定群组,请勿重复绑定');
|
|
}
|
|
|
|
if ($validated->fails()) {
|
|
// 验证失败,返回错误信息
|
|
$errors = $validated->errors()->all();
|
|
$error = count($errors) ? $errors[0] : null;
|
|
// 处理错误信息的逻辑
|
|
return $this->failure($error);
|
|
}
|
|
|
|
|
|
//生成规则都是一样的,这里就不查数据库了
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
|
|
//修改群资料
|
|
$options = [];
|
|
$options['tname'] = $data['name'];
|
|
$options['icon'] = $data['icon'];
|
|
$options['announcement'] = $data['announcement'];
|
|
$options['intro'] = $data['intro'];
|
|
|
|
//创建群,并插入群成员
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->update($group->im_chat_id, $owner_ac_cid, $options);
|
|
|
|
if ($group->owner_id != $data['owner_id']) {
|
|
$old_owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
$new_owner_id = make_wangyiyun_accid($data['owner_id']);
|
|
|
|
//是否在群
|
|
$stay_group = GroupUser::where('group_id', $data['group_id'])
|
|
->where('user_id', $data['owner_id'])
|
|
->first();
|
|
if (!$stay_group) {
|
|
//拉人入群
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->add($group->im_chat_id, $owner_ac_cid, [$new_owner_id], 0, '邀请进群');
|
|
//插入群成员
|
|
$group_user_map = [];
|
|
$group_user_map['group_id'] = $data['group_id'];
|
|
$group_user_map['user_id'] = $data['owner_id'];
|
|
$group_user_map['type'] = GroupUser::TYPE_NORMAL;
|
|
GroupUser::create($group_user_map);
|
|
}
|
|
|
|
//更改群主
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->changeOwner($group->im_chat_id, $old_owner_ac_cid, $new_owner_id, 2);
|
|
//将原先群主修改为普通成员
|
|
GroupUser::where('group_id', $group->id)->where('user_id', $group->owner_id)->update(['type' => GroupUser::TYPE_NORMAL]);
|
|
//将新人修改为群主
|
|
GroupUser::where('group_id', $group->id)->where('user_id', $data['owner_id'])->update(['type' => GroupUser::TYPE_OWNER]);
|
|
}
|
|
|
|
$group->name = $data['name'];
|
|
$group->chat_name = $data['name'];
|
|
$group->avatar = $data['icon'];
|
|
$group->announcement = $data['announcement'];
|
|
$group->intro = $data['intro'];
|
|
$group->order_id = $data['order_id'];
|
|
$group->owner_id = $data['owner_id'];
|
|
$group->save();
|
|
|
|
DB::commit();
|
|
return $this->success('ok', $group);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('createGroup:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 拉人进群
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function addGroupUser(Request $request)
|
|
{
|
|
try {
|
|
$is_service = $request->input('is_service');
|
|
$user_ids = $request->input('user_ids');
|
|
if (empty($user_ids))
|
|
return $this->failure('请选择用户');
|
|
|
|
$msg = $request->input('msg');
|
|
|
|
$group_id = $request->input('group_id');
|
|
if (empty($group_id))
|
|
return $this->failure('请选择群组');
|
|
|
|
$group_info = Group::where('id', $group_id)->first();
|
|
if (empty($group_info)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
|
|
$check = GroupUser::where('group_id', $group_id)->whereIn('user_id', $user_ids)->first();
|
|
if ($check) {
|
|
return $this->failure('该用户已在群聊中');
|
|
}
|
|
|
|
$owner_ac_cid = make_wangyiyun_accid($group_info->owner_id);
|
|
|
|
//生成群成员accid
|
|
$new_user_ids = [];
|
|
foreach ($user_ids as $user_id) {
|
|
$new_user_ids[] = make_wangyiyun_accid($user_id);
|
|
}
|
|
//拉人入群
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->add($group_info->im_chat_id, $owner_ac_cid, $new_user_ids, 0, '邀请进群');
|
|
|
|
//插入群成员
|
|
$group_user_map = [];
|
|
$group_user_map['group_id'] = $group_info->id;
|
|
foreach ($user_ids as $val) {
|
|
if ($is_service) {
|
|
$service_info = ServiceRoleUser::with('serviceUser')->where('user_id', $val)->orderByDesc('id')->first();
|
|
if ($service_info) {
|
|
$role = ServiceRole::where('id', $service_info->role_id)->first();
|
|
}
|
|
}
|
|
$group_user_map['user_id'] = $val;
|
|
$group_user_map['role_id'] = $role->id ?? null;
|
|
$group_user_map['role_name'] = $role->name ?? null;
|
|
$group_user_map['nickname'] = $service_info->name ?? null;
|
|
$group_user_map['type'] = GroupUser::TYPE_NORMAL;
|
|
GroupUser::create($group_user_map);
|
|
}
|
|
return $this->success('ok', $user_ids);
|
|
} catch (\Exception $e) {
|
|
Log::error('addGroupUser:' . $e->getMessage());
|
|
return $this->failure('line:' . $e->getLine() . '|msg:' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取网易云群组列表
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getGroupList(Request $request)
|
|
{
|
|
try {
|
|
$keyword = $request->get('keyword');
|
|
$no_page = $request->get('no_page');
|
|
$group = Group::query()->with("order")
|
|
->when($keyword, function ($query) use ($keyword) {
|
|
$query->where(DB::raw('concat(name,im_chat_id)'), 'like', "%{$keyword}%");
|
|
})
|
|
->whereNotNull('im_chat_id')
|
|
// ->where('type',Group::TYPE_WANGYIYUN)
|
|
->orderByDesc('id');
|
|
|
|
if ($no_page) {
|
|
$list = $group->get();
|
|
} else {
|
|
$list = $group->paginate();
|
|
}
|
|
//获取群主名称
|
|
foreach ($list as $item) {
|
|
// $item->owner_name = WangYiYun::where('user_id',$item->owner_id)->value('name');
|
|
$item->owner_name = User::where('id', $item->owner_id)->value('name');
|
|
$item->user_count = GroupUser::where('group_id', $item->id)->count();
|
|
}
|
|
return $this->success('ok', $list);
|
|
} catch (\Exception $e) {
|
|
Log::error('getGroupList:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取群详细信息
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getGroupDetail(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::with('order')
|
|
->where('id', $group_id)
|
|
// ->where('type',Group::TYPE_WANGYIYUN)
|
|
->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群不存在');
|
|
}
|
|
$group->owner_name = WangYiYun::where('user_id', $group->owner_id)->value('name');
|
|
$group->user_count = GroupUser::where('group_id', $group->id)->count();
|
|
return $this->success('ok', $group);
|
|
} catch (\Exception $e) {
|
|
Log::error('getGroupDetail:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 删除群聊
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse|void
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function deleteGroup(Request $request)
|
|
{
|
|
DB::beginTransaction();
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
//解散群
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->remove($group->im_chat_id, $owner_ac_cid);
|
|
|
|
Group::where('id', $group_id)->delete();
|
|
|
|
//删除群成员
|
|
GroupUser::where('group_id', $group_id)->delete();
|
|
|
|
DB::commit();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('deleteGroup:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 修改群昵称
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function updateGroupName(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
$name = $request->get('name');
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
//修改群
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->updateTeamNick($group->im_chat_id, $owner_ac_cid, $owner_ac_cid, ['nick' => $name]);
|
|
|
|
$group->name = $name;
|
|
$group->chat_name = $name;
|
|
$group->save();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
Log::error('updateGroupName:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 修改群主id
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse|void
|
|
*/
|
|
public function updateGroupOwner(Request $request)
|
|
{
|
|
DB::beginTransaction();
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$owner_id = $request->get('owner_id');
|
|
$leave = $request->get('leave', 2);
|
|
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
$old_owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
$new_owner_id = make_wangyiyun_accid($owner_id);
|
|
//更改群主
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->changeOwner($group->im_chat_id, $old_owner_ac_cid, $new_owner_id, $leave);
|
|
|
|
//将原先群主修改为普通成员
|
|
GroupUser::where('group_id', $group->id)->where('user_id', $group->owner_id)->update(['type' => GroupUser::TYPE_NORMAL]);
|
|
//将新人修改为群主
|
|
GroupUser::where('group_id', $group->id)->where('user_id', $owner_id)->update(['type' => GroupUser::TYPE_OWNER]);
|
|
|
|
//修改群拥有者
|
|
$group->owner_id = $owner_id;
|
|
$group->save();
|
|
|
|
DB::commit();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('updateGroupOwner:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取某个群用户列表
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getGroupUserList(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$keyword = $request->get('keyword');
|
|
$no_page = $request->get('no_page');
|
|
$query = GroupUser::query()->with('chatUser')->when($keyword, function ($query) use ($keyword) {
|
|
$query->whereHas("chatUser", function ($query) use ($keyword) {
|
|
$query->where('name', 'like', "%{$keyword}%")->orWhere("mobile", "like", "%{$keyword}%");
|
|
});
|
|
})
|
|
->where('group_id', $group_id)
|
|
->orderByRaw(DB::raw('FIELD(ufutx_group_users.type, 1,2,0) asc, ufutx_group_users.id desc'));
|
|
|
|
if ($no_page) {
|
|
$list = $query->get();
|
|
} else {
|
|
$list = $query->paginate();
|
|
}
|
|
|
|
foreach ($list as $group) {
|
|
if (!isset($group->chatUser)) {
|
|
continue;
|
|
}
|
|
$user = User::where('id', $group->chatUser->user_id)->first();
|
|
$group->chatUser->name = !empty($group->chatUser->name) ? $group->chatUser->name : $user->name;
|
|
$group->chatUser->icon = !empty($group->chatUser->icon) ? $group->chatUser->icon : $user->avatar;
|
|
$group->chatUser->mobile = !empty($group->chatUser->mobile) ? $group->chatUser->mobile : $user->mobile;
|
|
// $collaborator = Collaborator::where('user_id',$group->user_id)->first();
|
|
// if(!empty($collaborator)){
|
|
// $group->chatUser->name = $collaborator->name;
|
|
// $group->chatUser->icon = $collaborator->avatar;
|
|
// $group->chatUser->mobile = $collaborator->mobile;
|
|
// }
|
|
}
|
|
return $this->success('ok', $list);
|
|
} catch (\Exception $e) {
|
|
Log::error('getGroupUserList:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 踢出群聊
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function kickGroupUser(Request $request)
|
|
{
|
|
// try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
$user_id = $request->get('user_id');
|
|
if (empty($user_id)) {
|
|
return $this->failure('请选择用户');
|
|
}
|
|
if ($user_id == $group->owner_id) {
|
|
return $this->failure('群主暂时不支持踢出');
|
|
}
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
$delete_user_ac_cid = make_wangyiyun_accid($user_id);
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
try {
|
|
$imTeam->kick($group->im_chat_id, $owner_ac_cid, $delete_user_ac_cid);
|
|
} catch (\Exception $e) {
|
|
Log::error('deleteGroupUser:' . $e->getMessage());
|
|
}
|
|
|
|
//删除群成员
|
|
GroupUser::where('group_id', $group->id)->where('user_id', $user_id)->delete();
|
|
return $this->success('ok');
|
|
// }catch (\Exception $e){
|
|
// Log::error('deleteGroupUser:'.$e->getMessage());
|
|
// return $this->failure($e->getMessage());
|
|
// }
|
|
}
|
|
|
|
/**
|
|
* 添加管理员
|
|
* @param Request $request
|
|
* @return \Illuminate\Http\JsonResponse|void
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function addManage(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
|
|
$user_id = $request->get('user_id');
|
|
if (empty($user_id)) {
|
|
return $this->failure('请选择用户');
|
|
}
|
|
|
|
$group_user = GroupUser::where('group_id', $group_id)->where('user_id', $user_id)->first();
|
|
if (!$group_user) {
|
|
return $this->failure('所选用户不在群组');
|
|
}
|
|
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
$add_user_ac_cid = make_wangyiyun_accid($user_id);
|
|
//增加群管理员
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->addManager($group->im_chat_id, $owner_ac_cid, [$add_user_ac_cid]);
|
|
|
|
//修改管理员
|
|
$group_user->type = GroupUser::TYPE_MANAGE;
|
|
$group_user->save();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
Log::error('addManage:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 移除管理员
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function removeManage(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
|
|
$user_id = $request->get('user_id');
|
|
if (empty($user_id)) {
|
|
return $this->failure('请选择用户');
|
|
}
|
|
|
|
$group_user = GroupUser::where('group_id', $group_id)->where('user_id', $user_id)->first();
|
|
if (!$group_user) {
|
|
return $this->failure('所选用户不在群组');
|
|
}
|
|
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
$add_user_ac_cid = make_wangyiyun_accid($user_id);
|
|
//增加群管理员
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->removeManager($group->im_chat_id, $owner_ac_cid, [$add_user_ac_cid]);
|
|
//修改管理员
|
|
$group_user->type = GroupUser::TYPE_NORMAL;
|
|
$group_user->save();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
Log::error('removeManage:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 修改群用户状态
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function updateGroupUserStatus(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$group = Group::where('id', $group_id)->first();
|
|
$status = $request->get('status');
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
|
|
$user_id = $request->get('user_id');
|
|
if (empty($user_id)) {
|
|
return $this->failure('请选择用户');
|
|
}
|
|
|
|
$group_user = GroupUser::where('group_id', $group_id)->where('user_id', $user_id)->first();
|
|
if (!$group_user) {
|
|
return $this->failure('所选用户不在群组');
|
|
}
|
|
|
|
$owner_ac_cid = make_wangyiyun_accid($group->owner_id);
|
|
$user_ac_cid = make_wangyiyun_accid($user_id);
|
|
//增加群管理员
|
|
$imTeam = new Team(config('chat.im.app_id'), config('chat.im.app_secret'));
|
|
$imTeam->muteTlist($group->im_chat_id, $owner_ac_cid, $user_ac_cid, $status);
|
|
//修改管理员
|
|
$group_user->status = $status;
|
|
$group_user->save();
|
|
return $this->success('ok');
|
|
} catch (\Exception $e) {
|
|
Log::error('removeManage:' . $e->getMessage());
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取群聊记录
|
|
* @param Request $request
|
|
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getGroupMessage(Request $request)
|
|
{
|
|
try {
|
|
$group_id = $request->get('group_id');
|
|
$keyword = $request->input('keyword');
|
|
$group = Group::where('id', $group_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('群组不存在');
|
|
}
|
|
$data = GroupMessage::with('user')
|
|
->whereHas('user', function ($query) use ($keyword) {
|
|
if ($keyword) {
|
|
$query->where('name', 'like', "%{$keyword}%");
|
|
}
|
|
})
|
|
->where('group_id', $group_id)
|
|
->orderByDesc('id')
|
|
->paginate();
|
|
return $this->success('ok', $data);
|
|
} catch (\Exception $e) {
|
|
return $this->failure($e->getMessage());
|
|
}
|
|
}
|
|
|
|
public function updateGroup(Request $request)
|
|
{
|
|
$data = $request->only(['chat_qr_code']);
|
|
$order_id = $request->input('order_id');
|
|
$group = Group::where('order_id', $order_id)->first();
|
|
if (empty($group)) {
|
|
return $this->failure('请先绑定群聊');
|
|
}
|
|
Group::where('order_id', $order_id)->update($data);
|
|
return $this->success('ok');
|
|
}
|
|
}
|