From ef2b1dd321b52b1338e5d147ccd83a8d3cca5fd8 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 5 Jul 2022 14:34:23 +0800 Subject: [PATCH] no message --- app/Models/ProjectTask.php | 6 +++--- app/Models/WebSocketDialog.php | 6 ++++-- app/Models/WebSocketDialogMsg.php | 6 +++++- app/Tasks/WebSocketDialogMsgTask.php | 19 +++++++++++++++++-- .../pages/manage/components/DialogWrapper.vue | 2 +- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index e36cdca48..ec6e4dbcc 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -1185,7 +1185,7 @@ class ProjectTask extends AbstractModel public function completeTask($complete_at) { AbstractModel::transaction(function () use ($complete_at) { - $addMsg = empty($this->parent_id) && $this->dialog_id > 0; + $addMsg = $this->parent_id == 0 && $this->dialog_id > 0; if ($complete_at === null) { // 标记未完成 $this->complete_at = null; @@ -1193,7 +1193,7 @@ class ProjectTask extends AbstractModel if ($addMsg) { WebSocketDialogMsg::sendMsg(null, $this->dialog_id, 'notice', [ 'notice' => '标记任务未完成' - ], 0, true); + ], 0, true, true); } } else { // 标记已完成 @@ -1210,7 +1210,7 @@ class ProjectTask extends AbstractModel if ($addMsg) { WebSocketDialogMsg::sendMsg(null, $this->dialog_id, 'notice', [ 'notice' => '标记任务已完成' - ], 0, true); + ], 0, true, true); } } $this->save(); diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index b7ba9ba8b..839c3b23a 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -152,7 +152,7 @@ class WebSocketDialog extends AbstractModel ]); WebSocketDialogMsg::sendMsg(null, $this->id, 'notice', [ 'notice' => User::userid2nickname($value) . " 已加入群组" - ], $inviter, true); + ], $inviter, true, true); } } }); @@ -197,7 +197,9 @@ class WebSocketDialog extends AbstractModel } else { $notice = User::userid2nickname($item->userid) . " 退出群组"; } - WebSocketDialogMsg::sendMsg(null, $this->id, 'notice', ['notice' => $notice], User::userid(), true); + WebSocketDialogMsg::sendMsg(null, $this->id, 'notice', [ + 'notice' => $notice + ], User::userid(), true, true); } }); }); diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 4d73b9ba3..39779c110 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -526,9 +526,10 @@ class WebSocketDialogMsg extends AbstractModel * @param array $msg 发送的消息 * @param int $sender 发送的会员ID(默认自己,0为系统) * @param bool $push_self 是否推送给自己 + * @param bool $push_retry 推送失败后重试1次(有时候在事务里执行,数据还没生成时会出现找不到消息的情况) * @return array */ - public static function sendMsg($action, $dialog_id, $type, $msg, $sender = 0, $push_self = false) + public static function sendMsg($action, $dialog_id, $type, $msg, $sender = 0, $push_self = false, $push_retry = false) { $link = 0; $mtype = $type; @@ -612,6 +613,9 @@ class WebSocketDialogMsg extends AbstractModel if ($push_self) { $task->setIgnoreFd(null); } + if ($push_retry) { + $task->setMsgNotExistRetry(true); + } Task::deliver($task); // return Base::retSuccess('发送成功', $dialogMsg); diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index 7d0e338f8..bfc6083f8 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -21,15 +21,17 @@ class WebSocketDialogMsgTask extends AbstractTask { protected $id; protected $ignoreFd; + protected $msgNotExistRetry = false; /** * WebSocketDialogMsgTask constructor. * @param int $id 消息ID + * @param mixed $ignoreFd */ - public function __construct($id) + public function __construct($id, $ignoreFd = null) { $this->id = $id; - $this->ignoreFd = Request::header('fd'); + $this->ignoreFd = $ignoreFd === null ? Request::header('fd') : $ignoreFd; } /** @@ -40,6 +42,14 @@ class WebSocketDialogMsgTask extends AbstractTask $this->ignoreFd = $ignoreFd; } + /** + * @param bool $msgNotExistRetry + */ + public function setMsgNotExistRetry(bool $msgNotExistRetry): void + { + $this->msgNotExistRetry = $msgNotExistRetry; + } + public function start() { global $_A; @@ -50,6 +60,11 @@ class WebSocketDialogMsgTask extends AbstractTask // $msg = WebSocketDialogMsg::find($this->id); if (empty($msg)) { + if ($this->msgNotExistRetry) { + $task = new WebSocketDialogMsgTask($this->id, $this->ignoreFd || ''); + $task->delay(1); + $this->addTask($task); + } return; } $dialog = WebSocketDialog::find($msg->dialog_id); diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 17ca214cf..9714f4427 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -682,7 +682,7 @@ export default { this.msgNew += tmpList.length } else { if (!this.preventToBottom) { - requestAnimationFrame(this.onToBottom) + this.$nextTick(this.onToBottom) } } },