From 144fb5afbabdc9d021c53540a6d6d9a878c3ee0b Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 7 Mar 2023 14:33:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B7=B2=E8=AF=BB/=E6=9C=AA?= =?UTF-8?q?=E8=AF=BB=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 26 ++++++-------- app/Models/WebSocketDialog.php | 20 +++++------ app/Models/WebSocketDialogMsg.php | 2 +- app/Models/WebSocketDialogUser.php | 15 ++------ app/Tasks/WebSocketDialogMsgTask.php | 9 +++-- ...ate_web_socket_dialog_users_updated_at.php | 34 +++++++++++++++++++ resources/assets/js/store/actions.js | 4 +-- 7 files changed, 62 insertions(+), 48 deletions(-) create mode 100644 database/migrations/2023_03_07_131018_update_web_socket_dialog_users_updated_at.php diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index d485490fc..0ab93c9e3 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -567,9 +567,8 @@ class DialogController extends AbstractController 'id' => $dialogUser->webSocketDialog->id, 'unread' => $dialogUser->webSocketDialog->unread, 'mention' => $dialogUser->webSocketDialog->mention, - 'position_msgs' => $dialogUser->webSocketDialog->position_msgs, - 'user_at' => Carbon::parse($dialogUser->updated_at)->toDateTimeString(), - 'user_ms' => WebSocketDialogUser::userMs($dialogUser->updated_at) + 'user_at' => Carbon::parse($dialogUser->updated_at)->toDateTimeString('millisecond'), + 'user_ms' => Carbon::parse($dialogUser->updated_at)->valueOf() ]; } return Base::retSuccess('success', $data); @@ -593,8 +592,7 @@ class DialogController extends AbstractController "id": 43, "unread": 308, "mention": 11, - "position_msgs": [], - "user_at": "2020-12-12 00:00:00", + "user_at": "2020-12-12 00:00:00.000", "user_ms": 1677558147167, } */ @@ -612,9 +610,8 @@ class DialogController extends AbstractController 'id' => $dialogUser->webSocketDialog->id, 'unread' => $dialogUser->webSocketDialog->unread, 'mention' => $dialogUser->webSocketDialog->mention, - 'position_msgs' => $dialogUser->webSocketDialog->position_msgs, - 'user_at' => Carbon::parse($dialogUser->updated_at)->toDateTimeString(), - 'user_ms' => WebSocketDialogUser::userMs($dialogUser->updated_at) + 'user_at' => Carbon::parse($dialogUser->updated_at)->toDateTimeString('millisecond'), + 'user_ms' => Carbon::parse($dialogUser->updated_at)->valueOf() ]); } @@ -1153,9 +1150,6 @@ class DialogController extends AbstractController 'id' => $dialogUser->webSocketDialog->id, 'unread' => $dialogUser->webSocketDialog->unread, 'mention' => $dialogUser->webSocketDialog->mention, - 'position_msgs' => $dialogUser->webSocketDialog->position_msgs, - 'user_at' => Carbon::now()->toDateTimeString(), - 'user_ms' => WebSocketDialogUser::userMs(), 'mark_unread' => 0, ]; break; @@ -1163,8 +1157,6 @@ class DialogController extends AbstractController case 'unread': $data = [ 'id' => $dialogUser->webSocketDialog->id, - 'user_at' => Carbon::now()->toDateTimeString(), - 'user_ms' => WebSocketDialogUser::userMs(), 'mark_unread' => 1, ]; break; @@ -1172,10 +1164,12 @@ class DialogController extends AbstractController default: return Base::retError("参数错误"); } - $dialogUser->updated_at = $data['user_at']; $dialogUser->mark_unread = $data['mark_unread']; $dialogUser->save(); - return Base::retSuccess("success", $data); + return Base::retSuccess("success", array_merge($data, [ + 'user_at' => Carbon::parse($dialogUser->updated_at)->toDateTimeString('millisecond'), + 'user_ms' => Carbon::parse($dialogUser->updated_at)->valueOf(), + ])); } /** @@ -1579,7 +1573,7 @@ class DialogController extends AbstractController if ($array) { $dialog->updateInstance($array); $dialog->save(); - WebSocketDialogUser::whereDialogId($dialog->id)->update(['updated_at' => Carbon::now()]); + WebSocketDialogUser::whereDialogId($dialog->id)->update(['updated_at' => Carbon::now()->toDateTimeString('millisecond')]); } // return Base::retSuccess('修改成功', $data); diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index b8850fa0b..48780722a 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -80,19 +80,16 @@ class WebSocketDialog extends AbstractModel return $data[$key] ?? $default; }; // - $this->pinyin = Base::cn2pinyin($this->name); + $time = Carbon::parse($this->user_at ?? $dialogUserFun('updated_at')); $this->top_at = $this->top_at ?? $dialogUserFun('top_at'); - $this->user_at = $this->user_at ?? $dialogUserFun('updated_at'); - $this->user_ms = WebSocketDialogUser::userMs($this->user_at); - $this->quick_msgs = []; + $this->user_at = $time->toDateTimeString('millisecond'); + $this->user_ms = $time->valueOf(); // if (isset($this->search_msg_id)) { // 最后消息 (搜索预览消息) $this->last_msg = WebSocketDialogMsg::whereDialogId($this->id)->find($this->search_msg_id); $this->last_at = $this->last_msg?->created_at; } else { - // 最后消息 - $this->last_msg = WebSocketDialogMsg::whereDialogId($this->id)->orderByDesc('id')->first(); // 未读信息 $this->generateUnread($userid, $hasData); // 未读标记 @@ -103,8 +100,12 @@ class WebSocketDialog extends AbstractModel $this->people = WebSocketDialogUser::whereDialogId($this->id)->count(); // 有待办 $this->todo_num = WebSocketDialogMsgTodo::whereDialogId($this->id)->whereUserid($userid)->whereDoneAt(null)->count(); + // 最后消息 + $this->last_msg = WebSocketDialogMsg::whereDialogId($this->id)->orderByDesc('id')->first(); } // 对方信息 + $this->pinyin = Base::cn2pinyin($this->name); + $this->quick_msgs = []; $this->dialog_user = null; $this->group_info = null; $this->bot = 0; @@ -175,14 +176,11 @@ class WebSocketDialog extends AbstractModel * @param $positionData * @return $this */ - public function generateUnread($userid, $positionData = true) + public function generateUnread($userid, $positionData = false) { $builder = WebSocketDialogMsgRead::whereDialogId($this->id)->whereUserid($userid)->whereReadAt(null); $this->unread = $builder->count(); - $this->mention = 0; - if ($this->unread > 0) { - $this->mention = $builder->clone()->whereMention(1)->count(); - } + $this->mention = $this->unread > 0 ? $builder->clone()->whereMention(1)->count() : 0; if ($positionData) { $array = []; // @我的消息 diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 7c7a21d83..58c9da94c 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -855,7 +855,7 @@ class WebSocketDialogMsg extends AbstractModel $dialogMsg->send = 1; $dialogMsg->key = $dialogMsg->generateMsgKey(); $dialogMsg->save(); - WebSocketDialogUser::whereDialogId($dialog->id)->update(['updated_at' => $dialog->updated_at]); + WebSocketDialogUser::whereDialogId($dialog->id)->update(['updated_at' => Carbon::now()->toDateTimeString('millisecond')]); }); // $task = new WebSocketDialogMsgTask($dialogMsg->id); diff --git a/app/Models/WebSocketDialogUser.php b/app/Models/WebSocketDialogUser.php index d44be8e54..d003e7d33 100644 --- a/app/Models/WebSocketDialogUser.php +++ b/app/Models/WebSocketDialogUser.php @@ -35,6 +35,8 @@ use Carbon\Carbon; */ class WebSocketDialogUser extends AbstractModel { + protected $dateFormat = 'Y-m-d H:i:s.v'; + /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ @@ -42,17 +44,4 @@ class WebSocketDialogUser extends AbstractModel { return $this->hasOne(WebSocketDialog::class, 'id', 'dialog_id'); } - - /** - * 转时间戳加上现在的毫秒 - * @param $time - * @return int - */ - public static function userMs($time = 0) - { - if (empty($time)) { - return Carbon::now()->getPreciseTimestamp(3); - } - return intval(Carbon::parse($time)->timestamp . substr(Carbon::now()->getPreciseTimestamp(3), -3)); - } } diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index d4d5b81f6..4433496cd 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -8,7 +8,6 @@ use App\Models\User; use App\Models\WebSocketDialog; use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsgRead; -use App\Models\WebSocketDialogUser; use App\Module\Base; use Carbon\Carbon; use Hhxsv5\LaravelS\Swoole\Task\Task; @@ -164,8 +163,8 @@ class WebSocketDialogMsgTask extends AbstractTask 'silence' => $item['silence'] ? 1 : 0, 'data' => array_merge($msg->toArray(), [ 'mention' => $item['mention'], - 'user_at' => Carbon::parse($item['updated'])->toDateTimeString(), - 'user_ms' => WebSocketDialogUser::userMs($item['updated']), + 'user_at' => Carbon::parse($item['updated'])->toDateTimeString('millisecond'), + 'user_ms' => Carbon::parse($item['updated'])->valueOf(), ]), ] ]; @@ -210,8 +209,8 @@ class WebSocketDialogMsgTask extends AbstractTask 'mode' => 'chat', 'silence' => $this->silence ? 1 : 0, 'data' => array_merge($msg->toArray(), [ - 'user_at' => Carbon::parse($msg->created_at)->toDateTimeString(), - 'user_ms' => WebSocketDialogUser::userMs($msg->created_at), + 'user_at' => Carbon::parse($msg->created_at)->toDateTimeString('millisecond'), + 'user_ms' => Carbon::parse($msg->created_at)->valueOf(), ]), ] ]; diff --git a/database/migrations/2023_03_07_131018_update_web_socket_dialog_users_updated_at.php b/database/migrations/2023_03_07_131018_update_web_socket_dialog_users_updated_at.php new file mode 100644 index 000000000..8d4b53dc8 --- /dev/null +++ b/database/migrations/2023_03_07_131018_update_web_socket_dialog_users_updated_at.php @@ -0,0 +1,34 @@ +getTablePrefix(); + DB::statement("ALTER TABLE `{$pre}web_socket_dialog_users` MODIFY COLUMN `created_at` timestamp(3) NULL DEFAULT NULL AFTER `important`"); + DB::statement("ALTER TABLE `{$pre}web_socket_dialog_users` MODIFY COLUMN `updated_at` timestamp(3) NULL DEFAULT NULL AFTER `created_at`"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('web_socket_dialog_users', function (Blueprint $table) { + // + }); + } +} diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 51a87b959..96a6494ac 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -2077,7 +2077,7 @@ export default { const original = state.cacheDialogs[index] const nowTime = data.user_ms const originalTime = original.user_ms || 0 - if (nowTime < originalTime) { + if (nowTime <= originalTime) { typeof data.unread !== "undefined" && delete data.unread typeof data.mention !== "undefined" && delete data.mention typeof data.position_msgs !== "undefined" && delete data.position_msgs @@ -2574,7 +2574,7 @@ export default { saveBefore() const resData = result.data; if ($A.isJson(resData.dialog)) { - setTimeout(_ => dispatch("saveDialog", resData.dialog), 300) // 延迟更新对话详情是因为等消息处理完 + setTimeout(_ => dispatch("saveDialog", resData.dialog), 10) // 延迟更新对话详情是因为等消息处理完 // const ids = resData.list.map(({id}) => id) state.dialogMsgs = state.dialogMsgs.filter(item => {