diff --git a/Server/application/chukebao/config/route.php b/Server/application/chukebao/config/route.php index 56e17f51..ce1a477b 100644 --- a/Server/application/chukebao/config/route.php +++ b/Server/application/chukebao/config/route.php @@ -42,7 +42,13 @@ Route::group('v1/', function () { }); //微信分组 - Route::get('wechatGroup/list', 'app\chukebao\controller\WechatGroupController@getList'); // 微信分组 + Route::group('wechatGroup/', function () { + Route::get('list', 'app\chukebao\controller\WechatGroupController@getList'); // 获取分组列表 + Route::post('add', 'app\chukebao\controller\WechatGroupController@create'); // 新增分组 + Route::post('update', 'app\chukebao\controller\WechatGroupController@update'); // 更新分组 + Route::delete('delete', 'app\chukebao\controller\WechatGroupController@delete'); // 删除分组(假删除) + Route::post('move', 'app\chukebao\controller\WechatGroupController@move'); // 移动分组(好友/群移动到指定分组) + }); diff --git a/Server/application/chukebao/controller/DataProcessing.php b/Server/application/chukebao/controller/DataProcessing.php index fdde86b7..af8070ca 100644 --- a/Server/application/chukebao/controller/DataProcessing.php +++ b/Server/application/chukebao/controller/DataProcessing.php @@ -36,6 +36,7 @@ class DataProcessing extends BaseController 'CmdChatroomOperate', //修改群信息 {chatroomName(群名)、announce(公告)、extra(公告)、wechatAccountId、wechatChatroomId} 'CmdNewMessage', //接收消息 'CmdSendMessageResult', //更新消息状态 + 'CmdPinToTop', //置顶 ]; if (empty($type) || empty($wechatAccountId)) { @@ -164,6 +165,41 @@ class DataProcessing extends BaseController $msg = '更新消息状态成功'; break; + case 'CmdPinToTop': //置顶 + $wechatFriendId = $this->request->param('wechatFriendId', 0); + $wechatChatroomId = $this->request->param('wechatChatroomId', 0); + $isTop = $this->request->param('isTop', null); + + if ($isTop === null) { + return ResponseHelper::error('isTop不能为空'); + } + + if (empty($wechatFriendId) && empty($wechatChatroomId)) { + return ResponseHelper::error('wechatFriendId或chatroomId至少提供一个'); + } + + + if (!empty($wechatFriendId)){ + $data = WechatFriendModel::where(['id' => $wechatFriendId,'wechatAccountId' => $wechatAccountId])->find(); + $msg = $isTop == 1 ? '已置顶' : '取消置顶'; + if(empty($data)){ + return ResponseHelper::error('好友不存在'); + } + } + + + if (!empty($wechatChatroomId)){ + $data = WechatChatroomModel::where(['id' => $wechatChatroomId,'wechatAccountId' => $wechatAccountId])->find(); + $msg = $isTop == 1 ? '已置顶' : '取消置顶'; + if(empty($data)){ + return ResponseHelper::error('群聊不存在'); + } + } + + $data->updateTime = time(); + $data->isTop = $isTop; + $data->save(); + break; } return ResponseHelper::success('',$msg,$codee); } diff --git a/Server/application/chukebao/controller/MessageController.php b/Server/application/chukebao/controller/MessageController.php index 93f491a9..5f59e1e0 100644 --- a/Server/application/chukebao/controller/MessageController.php +++ b/Server/application/chukebao/controller/MessageController.php @@ -20,7 +20,7 @@ class MessageController extends BaseController $friends = Db::table('s2_wechat_friend') ->where(['accountId' => $accountId, 'isDeleted' => 0]) - ->column('id,nickname,avatar,conRemark,labels,groupId,wechatAccountId,wechatId,extendFields,phone,region'); + ->column('id,nickname,avatar,conRemark,labels,groupId,wechatAccountId,wechatId,extendFields,phone,region,isTop'); // 构建好友子查询 @@ -31,7 +31,7 @@ class MessageController extends BaseController // 优化后的查询:使用MySQL兼容的查询方式 $unionQuery = " - (SELECT m.id, m.content, m.wechatFriendId, m.wechatChatroomId, m.createTime, m.wechatTime,m.wechatAccountId, 2 as msgType, wc.nickname, wc.chatroomAvatar as avatar, wc.chatroomId + (SELECT m.id, m.content, m.wechatFriendId, m.wechatChatroomId, m.createTime, m.wechatTime,m.wechatAccountId, 2 as msgType, wc.nickname, wc.chatroomAvatar as avatar, wc.chatroomId, wc.isTop FROM s2_wechat_chatroom wc INNER JOIN s2_wechat_message m ON wc.id = m.wechatChatroomId AND m.type = 2 INNER JOIN ( @@ -43,7 +43,7 @@ class MessageController extends BaseController WHERE wc.accountId = {$accountId} AND wc.isDeleted = 0 ) UNION ALL - (SELECT m.id, m.content, m.wechatFriendId, m.wechatChatroomId, m.createTime, m.wechatTime, 1 as msgType, 1 as nickname, 1 as avatar, 1 as chatroomId, 1 as wechatAccountId + (SELECT m.id, m.content, m.wechatFriendId, m.wechatChatroomId, m.createTime, m.wechatTime, 1 as msgType, 1 as nickname, 1 as avatar, 1 as chatroomId, 1 as wechatAccountId, 0 as isTop FROM s2_wechat_message m INNER JOIN ( SELECT wechatFriendId, MAX(wechatTime) as maxTime, MAX(id) as maxId @@ -122,6 +122,7 @@ class MessageController extends BaseController $v['extendFields'] = !empty($friends[$v['wechatFriendId']]) ? $friends[$v['wechatFriendId']]['extendFields'] : []; $v['region'] = !empty($friends[$v['wechatFriendId']]) ? $friends[$v['wechatFriendId']]['region'] : ''; $v['phone'] = !empty($friends[$v['wechatFriendId']]) ? $friends[$v['wechatFriendId']]['phone'] : ''; + $v['isTop'] = !empty($friends[$v['wechatFriendId']]) ? $friends[$v['wechatFriendId']]['isTop'] : 0; $v['labels'] = !empty($friends[$v['wechatFriendId']]) ? json_decode($friends[$v['wechatFriendId']]['labels'], true) : []; $unreadCount = isset($friendUnreadMap[$v['wechatFriendId']]) ? (int)$friendUnreadMap[$v['wechatFriendId']] : 0; @@ -136,7 +137,7 @@ class MessageController extends BaseController $v['id'] = !empty($v['wechatFriendId']) ? $v['wechatFriendId'] : $v['wechatChatroomId']; $v['config'] = [ - 'top' => false, + 'top' => !empty($v['isTop']) ? true : false, 'unreadCount' => $unreadCount, 'chat' => true, 'msgTime' => $v['wechatTime'], @@ -150,7 +151,7 @@ class MessageController extends BaseController 'wechatTime' => $wechatTime ]; - unset($v['wechatFriendId'], $v['wechatChatroomId']); + unset($v['wechatFriendId'], $v['wechatChatroomId'],$v['isTop']); } unset($v); diff --git a/Server/application/chukebao/controller/WechatGroupController.php b/Server/application/chukebao/controller/WechatGroupController.php index 0ee08b91..8ff0b75f 100644 --- a/Server/application/chukebao/controller/WechatGroupController.php +++ b/Server/application/chukebao/controller/WechatGroupController.php @@ -4,27 +4,32 @@ namespace app\chukebao\controller; use library\ResponseHelper; use think\Db; +use app\chukebao\model\ChatGroups; class WechatGroupController extends BaseController { - public function getList(){ - - $accountId = $this->getUserInfo('s2_accountId'); - $userId = $this->getUserInfo('id'); + /** + * 获取分组列表 + * @return \think\response\Json + * @throws \Exception + */ + public function getList() + { + // 公司维度分组,不强制校验 userId $companyId = $this->getUserInfo('companyId'); - $query = Db::table('s2_wechat_group') - ->where(function ($query) use ($accountId,$companyId) { - $query->where('accountId', $accountId)->whereOr('departmentId', $companyId); - }) - ->whereIn('groupType',[1,2]) - ->order('groupType desc,sortIndex desc,id desc'); - $list = $query->select(); + $query = ChatGroups::where([ + 'companyId' => $companyId, + 'isDel' => 0, + ]) + ->order('groupType desc,sort desc,id desc'); + $total = $query->count(); + $list = $query->select(); - - // 处理每个好友的数据 + // 处理每个分组的数据 + $list = is_array($list) ? $list : $list->toArray(); foreach ($list as $k => &$v) { $v['createTime'] = !empty($v['createTime']) ? date('Y-m-d H:i:s', $v['createTime']) : ''; } @@ -32,4 +37,237 @@ class WechatGroupController extends BaseController return ResponseHelper::success(['list'=>$list,'total'=>$total]); } + + /** + * 新增分组 + * @return \think\response\Json + * @throws \Exception + */ + public function create() + { + $groupName = $this->request->param('groupName', ''); + $groupMemo = $this->request->param('groupMemo', ''); + $groupType = $this->request->param('groupType', 1); + $sort = $this->request->param('sort', 0); + $companyId = $this->getUserInfo('companyId'); + + // 只校验公司维度 + if (empty($companyId)) { + return ResponseHelper::error('请先登录'); + } + + if (empty($groupName)) { + return ResponseHelper::error('分组名称不能为空'); + } + + // 验证分组类型 + if (!in_array($groupType, [1, 2])) { + return ResponseHelper::error('无效的分组类型'); + } + + Db::startTrans(); + try { + $chatGroup = new ChatGroups(); + $chatGroup->groupName = $groupName; + $chatGroup->groupMemo = $groupMemo; + $chatGroup->groupType = $groupType; + $chatGroup->sort = $sort; + $chatGroup->userId = $this->getUserInfo('id'); + $chatGroup->companyId = $companyId; + $chatGroup->createTime = time(); + $chatGroup->isDel = 0; + $chatGroup->save(); + + Db::commit(); + return ResponseHelper::success(['id' => $chatGroup->id], '创建成功'); + } catch (\Exception $e) { + Db::rollback(); + return ResponseHelper::error('创建失败:' . $e->getMessage()); + } + } + + /** + * 更新分组 + * @return \think\response\Json + * @throws \Exception + */ + public function update() + { + $id = $this->request->param('id', 0); + $groupName = $this->request->param('groupName', ''); + $groupMemo = $this->request->param('groupMemo', ''); + $groupType = $this->request->param('groupType', 1); + $sort = $this->request->param('sort', 0); + $companyId = $this->getUserInfo('companyId'); + + if (empty($companyId)) { + return ResponseHelper::error('请先登录'); + } + + if (empty($id)) { + return ResponseHelper::error('参数缺失'); + } + + if (empty($groupName)) { + return ResponseHelper::error('分组名称不能为空'); + } + + // 验证分组类型 + if (!in_array($groupType, [1, 2])) { + return ResponseHelper::error('无效的分组类型'); + } + + // 检查分组是否存在 + $chatGroup = ChatGroups::where([ + 'id' => $id, + 'companyId' => $companyId, + 'isDel' => 0, + ])->find(); + + if (empty($chatGroup)) { + return ResponseHelper::error('该分组不存在或已删除'); + } + + Db::startTrans(); + try { + $chatGroup->groupName = $groupName; + $chatGroup->groupMemo = $groupMemo; + $chatGroup->groupType = $groupType; + $chatGroup->sort = $sort; + $chatGroup->save(); + + Db::commit(); + return ResponseHelper::success('', '更新成功'); + } catch (\Exception $e) { + Db::rollback(); + return ResponseHelper::error('更新失败:' . $e->getMessage()); + } + } + + /** + * 删除分组(假删除) + * @return \think\response\Json + * @throws \Exception + */ + public function delete() + { + $id = $this->request->param('id', 0); + $companyId = $this->getUserInfo('companyId'); + + if (empty($companyId)) { + return ResponseHelper::error('请先登录'); + } + + if (empty($id)) { + return ResponseHelper::error('参数缺失'); + } + + // 检查分组是否存在 + $chatGroup = ChatGroups::where([ + 'id' => $id, + 'companyId' => $companyId, + 'isDel' => 0, + ])->find(); + + if (empty($chatGroup)) { + return ResponseHelper::error('该分组不存在或已删除'); + } + + Db::startTrans(); + try { + // 1. 假删除当前分组 + $chatGroup->isDel = 1; + $chatGroup->deleteTime = time(); + $chatGroup->save(); + + // 2. 重置该分组下所有好友的分组ID(s2_wechat_friend.groupIds -> 0) + Db::table('s2_wechat_friend') + ->where('groupIds', $id) + ->update(['groupIds' => 0]); + + // 3. 重置该分组下所有微信群的分组ID(s2_wechat_chatroom.groupIds -> 0) + Db::table('s2_wechat_chatroom') + ->where('groupIds', $id) + ->update(['groupIds' => 0]); + + Db::commit(); + return ResponseHelper::success('', '删除成功'); + } catch (\Exception $e) { + Db::rollback(); + return ResponseHelper::error('删除失败:' . $e->getMessage()); + } + } + + /** + * 移动分组(将好友或群移动到指定分组) + * @return \think\response\Json + * @throws \Exception + */ + public function move() + { + // type: friend 好友, chatroom 群 + $type = $this->request->param('type', 'friend'); + $targetId = (int)$this->request->param('groupId', 0); + // 仅支持单个ID移动 + $idParam = $this->request->param('id', 0); + $companyId = $this->getUserInfo('companyId'); + + if (empty($companyId)) { + return ResponseHelper::error('请先登录'); + } + + if (empty($targetId)) { + return ResponseHelper::error('目标分组ID不能为空'); + } + + // 仅允许单个 ID,禁止批量 + $moveId = (int)$idParam; + if (empty($moveId)) { + return ResponseHelper::error('需要移动的ID不能为空'); + } + + // 校验目标分组是否存在且属于当前公司 + $targetGroup = ChatGroups::where([ + 'id' => $targetId, + 'companyId' => $companyId, + 'isDel' => 0, + ])->find(); + + if (empty($targetGroup)) { + return ResponseHelper::error('目标分组不存在或已删除'); + } + + // 校验分组类型与移动对象类型是否匹配 + // groupType: 1=好友分组, 2=群分组 + if ($type === 'friend' && (int)$targetGroup->groupType !== 1) { + return ResponseHelper::error('目标分组类型错误(需要好友分组)'); + } + if ($type === 'chatroom' && (int)$targetGroup->groupType !== 2) { + return ResponseHelper::error('目标分组类型错误(需要群分组)'); + } + + Db::startTrans(); + try { + if ($type === 'friend') { + // 移动单个好友到指定分组:更新 s2_wechat_friend.groupIds + Db::table('s2_wechat_friend') + ->where('id', $moveId) + ->update(['groupIds' => $targetId]); + } elseif ($type === 'chatroom') { + // 移动单个群到指定分组:更新 s2_wechat_chatroom.groupIds + Db::table('s2_wechat_chatroom') + ->where('id', $moveId) + ->update(['groupIds' => $targetId]); + } else { + Db::rollback(); + return ResponseHelper::error('无效的类型参数'); + } + + Db::commit(); + return ResponseHelper::success('', '移动成功'); + } catch (\Exception $e) { + Db::rollback(); + return ResponseHelper::error('移动失败:' . $e->getMessage()); + } + } } \ No newline at end of file diff --git a/Server/application/chukebao/model/ChatGroups.php b/Server/application/chukebao/model/ChatGroups.php new file mode 100644 index 00000000..b9a84fba --- /dev/null +++ b/Server/application/chukebao/model/ChatGroups.php @@ -0,0 +1,16 @@ +