From e861e8d8789495d636c7041d57cd568e62c77a81 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 5 Jul 2022 12:06:58 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=90=9C=E7=B4=A2=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=90=9C=E7=B4=A2=E8=BF=9C=E7=A8=8B=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 26 +++++++++-- .../Controllers/Api/ProjectController.php | 30 ++++++------ app/Models/Project.php | 2 +- app/Models/ProjectTask.php | 3 ++ app/Models/WebSocketDialog.php | 1 - ...0_update_web_socket_dialogs_group_name.php | 46 +++++++++++++++++++ .../assets/js/pages/manage/messenger.vue | 2 +- 7 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 database/migrations/2022_07_05_115200_update_web_socket_dialogs_group_name.php diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index b76cb0dd8..8942d0048 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -81,19 +81,35 @@ class DialogController extends AbstractController $user = User::auth(); // $key = trim(Request::input('key')); + if (empty($key)) { + return Base::retError('请输入搜索关键词'); + } // - $list = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread', 'm.id as search_msg_id']) + $list = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread']) ->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id') - ->join('web_socket_dialog_msgs as m', 'web_socket_dialogs.id', '=', 'm.dialog_id') + ->where('web_socket_dialogs.name', 'LIKE', "%{$key}%") ->where('u.userid', $user->userid) - ->where('m.key', 'LIKE', "%{$key}%") - ->orderByDesc('m.id') + ->orderByDesc('u.top_at') + ->orderByDesc('web_socket_dialogs.last_at') ->take(20) ->get(); - // $list->transform(function (WebSocketDialog $item) use ($user) { return $item->formatData($user->userid); }); + if (count($list) < 20) { + $msgs = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread', 'm.id as search_msg_id']) + ->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id') + ->join('web_socket_dialog_msgs as m', 'web_socket_dialogs.id', '=', 'm.dialog_id') + ->where('u.userid', $user->userid) + ->where('m.key', 'LIKE', "%{$key}%") + ->orderByDesc('m.id') + ->take(20 - count($list)) + ->get(); + $msgs->transform(function (WebSocketDialog $item) use ($user) { + return $item->formatData($user->userid); + }); + $list = array_merge($list->toArray(), $msgs->toArray()); + } // return Base::retSuccess('success', $list); } diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 9986622ed..c3c3d4933 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -271,18 +271,22 @@ class ProjectController extends AbstractController } // $project = Project::userProject($project_id, true, true); - // - if ($project->name != $name) { - $project->addLog("修改项目名称", [ - 'change' => [$project->name, $name] - ]); - $project->name = $name; - } - if ($project->desc != $desc) { - $project->desc = $desc; - $project->addLog("修改项目介绍"); - } - $project->save(); + AbstractModel::transaction(function () use ($desc, $name, $project) { + if ($project->name != $name) { + $project->addLog("修改项目名称", [ + 'change' => [$project->name, $name] + ]); + $project->name = $name; + if ($project->dialog_id) { + WebSocketDialog::updateData(['id' => $project->dialog_id], ['name' => $project->name]); + } + } + if ($project->desc != $desc) { + $project->desc = $desc; + $project->addLog("修改项目介绍"); + } + $project->save(); + }); $project->pushMsg('update', $project); // return Base::retSuccess('修改成功', $project); @@ -1543,7 +1547,7 @@ class ProjectController extends AbstractController AbstractModel::transaction(function() use ($task) { if (empty($task->dialog_id)) { $task->lockForUpdate(); - $dialog = WebSocketDialog::createGroup(null, $task->relationUserids(), 'task'); + $dialog = WebSocketDialog::createGroup($task->name, $task->relationUserids(), 'task'); if ($dialog) { $task->dialog_id = $dialog->id; $task->save(); diff --git a/app/Models/Project.php b/app/Models/Project.php index 34e5ee593..450be1ec6 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -537,7 +537,7 @@ class Project extends AbstractModel $column['project_id'] = $project->id; ProjectColumn::createInstance($column)->save(); } - $dialog = WebSocketDialog::createGroup(null, $project->userid, 'project'); + $dialog = WebSocketDialog::createGroup($project->name, $project->userid, 'project'); if (empty($dialog)) { throw new ApiException('创建项目聊天室失败'); } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index ff4b4a1bd..e36cdca48 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -649,6 +649,9 @@ class ProjectTask extends AbstractModel 'change' => [$this->name, $data['name']] ]); $this->name = $data['name']; + if ($this->dialog_id) { + WebSocketDialog::updateData(['id' => $this->dialog_id], ['name' => $this->name]); + } } // 负责人 if (Arr::exists($data, 'owner')) { diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 2accb67af..b7ba9ba8b 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -427,5 +427,4 @@ class WebSocketDialog extends AbstractModel return $dialog; }); } - } diff --git a/database/migrations/2022_07_05_115200_update_web_socket_dialogs_group_name.php b/database/migrations/2022_07_05_115200_update_web_socket_dialogs_group_name.php new file mode 100644 index 000000000..5600bd6e0 --- /dev/null +++ b/database/migrations/2022_07_05_115200_update_web_socket_dialogs_group_name.php @@ -0,0 +1,46 @@ +string('name', 255)->nullable()->default('')->comment('对话名称')->change(); + }); + // + \App\Models\WebSocketDialog::whereGroupType('project') + ->chunk(100, function ($lists) { + /** @var \App\Models\WebSocketDialog $item */ + foreach ($lists as $item) { + $item->name = \App\Models\Project::whereDialogId($item->id)->first()?->name; + $item->save(); + } + }); + \App\Models\WebSocketDialog::whereGroupType('task') + ->chunk(100, function ($lists) { + /** @var \App\Models\WebSocketDialog $item */ + foreach ($lists as $item) { + $item->name = \App\Models\ProjectTask::whereDialogId($item->id)->first()?->name; + $item->save(); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/resources/assets/js/pages/manage/messenger.vue b/resources/assets/js/pages/manage/messenger.vue index 26b7d93a3..9b239c932 100644 --- a/resources/assets/js/pages/manage/messenger.vue +++ b/resources/assets/js/pages/manage/messenger.vue @@ -266,7 +266,7 @@ export default { } }) dialogSearch.forEach(item => { - if (!msgIds.includes(item.last_msg.id)) { + if (!item.last_msg || !msgIds.includes(item.last_msg.id)) { list.push(Object.assign(item, {is_search: true})) } })