edit
This commit is contained in:
@@ -5,60 +5,64 @@ use app\chat\model\ChatGroup;
|
||||
use app\chat\model\ChatGroupMember;
|
||||
use app\chat\model\ChatGroupMute;
|
||||
use app\chat\model\ChatDoNotDisturb;
|
||||
use app\common\controller\ApiController;
|
||||
use app\utils\Session;
|
||||
use support\Request;
|
||||
use support\Response;
|
||||
use support\think\Db;
|
||||
|
||||
class GroupController
|
||||
class GroupController extends ApiController
|
||||
{
|
||||
/**
|
||||
* 创建群(仅商家可创建)
|
||||
*/
|
||||
public function create(Request $request): Response
|
||||
{
|
||||
$uid = $request->uid;
|
||||
$userType = $request->user_type;
|
||||
|
||||
if ($userType != 2) { // 2=商家
|
||||
return json(['code' => 403, 'msg' => '仅商家可创建群聊']);
|
||||
if ($this->user_type == 1) { // 2=商家
|
||||
return $this->error('仅商家可创建群聊');
|
||||
}
|
||||
|
||||
$name = $request->post('name', '');
|
||||
$avatar = $request->post('avatar', '');
|
||||
$shop_id = $request->post('shop_id', 0);
|
||||
if(empty($shop_id)) {
|
||||
return $this->error('参数不完整');
|
||||
}
|
||||
$shop = Db::name('tb_shop_info')->where(['id' => $shop_id])->find();
|
||||
if(empty($shop)) {
|
||||
return $this->error('店铺不存在');
|
||||
}
|
||||
// 查找群数量
|
||||
$count = Db::name('chat_group')->where(['shop_id' => $shop_id])->count();
|
||||
$name = $request->post('name')?:$shop['shop_name'] . '粉丝福利' . $count + 1 . '群';
|
||||
$avatar = $request->post('avatar')?:$shop['logo'];
|
||||
$announcement = $request->post('announcement', '');
|
||||
$isPublic = $request->post('is_public', 0);
|
||||
|
||||
if (empty($name)) {
|
||||
return json(['code' => 400, 'msg' => '群名称不能为空']);
|
||||
$now = d();
|
||||
try {
|
||||
Db::startTrans();
|
||||
// 创建群
|
||||
$group_id = Db::name('chat_group')->insertGetId([
|
||||
'name' => $name,
|
||||
'shop_id' => $shop_id,
|
||||
'avatar' => $avatar,
|
||||
'owner_id' => $this->uid,
|
||||
'announcement' => $announcement,
|
||||
'is_public' => $isPublic,
|
||||
'created_time' => $now,
|
||||
]);
|
||||
// 群主加入群
|
||||
Db::name('chat_group_member')->insert([
|
||||
'group_id' => $group_id,
|
||||
'user_id' => $this->uid,
|
||||
'role' => 1, // 1=群主
|
||||
'join_time' => $now,
|
||||
]);
|
||||
Db::commit();
|
||||
return $this->success(['group_id' => $group_id]);
|
||||
}catch (\Throwable $exception) {
|
||||
Db::rollback();
|
||||
return $this->error($exception->getMessage());
|
||||
}
|
||||
|
||||
$now = time();
|
||||
// 创建群
|
||||
$group = ChatGroup::create([
|
||||
'name' => $name,
|
||||
'avatar' => $avatar,
|
||||
'owner_id' => $uid,
|
||||
'announcement' => $announcement,
|
||||
'is_public' => $isPublic,
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now
|
||||
]);
|
||||
|
||||
// 群主加入群
|
||||
ChatGroupMember::create([
|
||||
'group_id' => $group->id,
|
||||
'user_id' => $uid,
|
||||
'role' => 1, // 1=群主
|
||||
'join_time' => $now,
|
||||
'quit_time' => null,
|
||||
'is_kicked' => 0
|
||||
]);
|
||||
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '群创建成功',
|
||||
'data' => ['group_id' => $group->id]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,93 +70,130 @@ class GroupController
|
||||
*/
|
||||
public function join(Request $request): Response
|
||||
{
|
||||
$uid = $request->uid;
|
||||
$groupId = $request->post('group_id', 0);
|
||||
|
||||
if (!$groupId) {
|
||||
return json(['code' => 400, 'msg' => '缺少group_id']);
|
||||
$group_id = $request->post('group_id');
|
||||
$invite = $request->post('invite');
|
||||
if (!$group_id) {
|
||||
return $this->error('缺少group_id');
|
||||
}
|
||||
|
||||
// 验证群是否存在
|
||||
$group = ChatGroup::find($groupId);
|
||||
$group = Db::name('chat_group')->where(['id' => $group_id])->find();
|
||||
if (!$group) {
|
||||
return json(['code' => 404, 'msg' => '群不存在']);
|
||||
return $this->error('群不存在');
|
||||
}
|
||||
|
||||
// 验证是否已在群内
|
||||
$exists = ChatGroupMember::where([
|
||||
'group_id' => $groupId,
|
||||
'user_id' => $uid,
|
||||
$exists = Db::name('chat_group_member')->where([
|
||||
'group_id' => $group_id,
|
||||
'user_id' => $this->uid,
|
||||
'quit_time' => null,
|
||||
'is_kicked' => 0
|
||||
])->exists();
|
||||
])->find();
|
||||
|
||||
if ($exists) {
|
||||
return json(['code' => 400, 'msg' => '已在群内']);
|
||||
return $this->error('已在群内');
|
||||
}
|
||||
|
||||
// 被踢用户不能重新加入(需群主邀请)
|
||||
$isKicked = ChatGroupMember::where([
|
||||
'group_id' => $groupId,
|
||||
'user_id' => $uid,
|
||||
$isKicked = Db::name('chat_group_member')->where([
|
||||
'group_id' => $group_id,
|
||||
'user_id' => $this->uid,
|
||||
'is_kicked' => 1
|
||||
])->exists();
|
||||
if ($isKicked) {
|
||||
return json(['code' => 403, 'msg' => '你已被移出该群,无法重新加入']);
|
||||
])->find();
|
||||
|
||||
// 如果不是邀请
|
||||
if(empty($invite) && $isKicked) {
|
||||
return $this->error('你已被移出该群,无法重新加入');
|
||||
}
|
||||
$insert_arr = [
|
||||
'group_id' => $group_id,
|
||||
'user_id' => $this->uid,
|
||||
'role' => 3,
|
||||
'join_time' => d(),
|
||||
];
|
||||
$is_insert = true;
|
||||
if($invite) {
|
||||
// 验证邀请参数是否正常
|
||||
$decryptedText = simple_decrypt($invite, config('cons.sercer_key'));
|
||||
$decryptedText_arr = json_decode($decryptedText, true);
|
||||
if($isKicked) {
|
||||
$is_insert = false;
|
||||
$insert_arr['is_kicked'] = 0;
|
||||
}
|
||||
$insert_arr['pid'] = $decryptedText_arr['pid'];
|
||||
$insert_arr['group_id'] = $decryptedText_arr['group_id'];
|
||||
$group_id = $decryptedText_arr['group_id'];
|
||||
}
|
||||
|
||||
// 加入群
|
||||
ChatGroupMember::create([
|
||||
'group_id' => $groupId,
|
||||
'user_id' => $uid,
|
||||
'role' => 3, // 3=普通成员
|
||||
'join_time' => time(),
|
||||
'quit_time' => null,
|
||||
'is_kicked' => 0
|
||||
]);
|
||||
|
||||
return json(['code' => 200, 'msg' => '加群成功']);
|
||||
if($is_insert) {
|
||||
$res = Db::name('chat_group_member')->insert($insert_arr);
|
||||
}else {
|
||||
$res = Db::name('chat_group_member')->where(['user_id' => $this->uid, 'group_id' => $group_id])->update($insert_arr);
|
||||
}
|
||||
if($res) {
|
||||
return $this->success();
|
||||
}else {
|
||||
return $this->error();
|
||||
}
|
||||
}
|
||||
|
||||
// 获取群邀请链接参数
|
||||
public function getgrepurl(Request $request): Response
|
||||
{
|
||||
$group_id = $request->post('group_id');
|
||||
if (!$group_id) {
|
||||
return $this->error('缺少group_id');
|
||||
}
|
||||
if($this->user_type == 1) {
|
||||
return $this->error('角色有误');
|
||||
}
|
||||
$data = [
|
||||
'pid' => $this->uid,
|
||||
'group_id' => $group_id
|
||||
];
|
||||
return $this->success(simple_encrypt(json_encode($data), config('cons.sercer_key')));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 退群
|
||||
*/
|
||||
public function quit(Request $request): Response
|
||||
{
|
||||
$uid = $request->uid;
|
||||
$groupId = $request->post('group_id', 0);
|
||||
|
||||
$groupId = $request->post('group_id')?:0;
|
||||
if (!$groupId) {
|
||||
return json(['code' => 400, 'msg' => '缺少group_id']);
|
||||
return $this->error('缺少group_id');
|
||||
}
|
||||
|
||||
// 验证是否是群主(群主不能退群,需转让)
|
||||
$isOwner = ChatGroupMember::where([
|
||||
$owner = Db::name('chat_group_member')->where([
|
||||
'group_id' => $groupId,
|
||||
'user_id' => $uid,
|
||||
'role' => 1,
|
||||
'user_id' => $this->uid,
|
||||
'quit_time' => null
|
||||
])->exists();
|
||||
if ($isOwner) {
|
||||
return json(['code' => 403, 'msg' => '群主不能退群,请先转让群主']);
|
||||
}
|
||||
|
||||
// 标记退出时间
|
||||
$member = ChatGroupMember::where([
|
||||
'group_id' => $groupId,
|
||||
'user_id' => $uid,
|
||||
'quit_time' => null,
|
||||
'is_kicked' => 0
|
||||
])->find();
|
||||
if (!$member) {
|
||||
return json(['code' => 400, 'msg' => '不在群内']);
|
||||
if ($owner) {
|
||||
if($owner['role'] == 1) {
|
||||
return $this->error('群主不能退群,请先转让群');
|
||||
}
|
||||
}else {
|
||||
return $this->error('不在群内');
|
||||
}
|
||||
|
||||
$member->quit_time = time();
|
||||
$member->save();
|
||||
|
||||
return json(['code' => 200, 'msg' => '退群成功']);
|
||||
$res = Db::name('chat_group_member')->where([
|
||||
'group_id' => $groupId,
|
||||
'user_id' => $this->uid,
|
||||
])->update(['quit_time' => d()]);
|
||||
if($res) {
|
||||
return $this->success();
|
||||
}
|
||||
return $this->error();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 设置群公告(仅群主/管理员)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user