From efe9c5039cdd427719f07e05fb348659778bab25 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 18 Jun 2021 18:14:37 +0800 Subject: [PATCH] no message --- app/Http/Controllers/Api/DialogController.php | 5 ++- app/Models/AbstractModel.php | 2 + app/Models/Project.php | 26 ++++++------- app/Models/ProjectTask.php | 38 +++++++++---------- app/Models/User.php | 4 +- app/Models/WebSocketDialogMsg.php | 21 +++++----- app/Tasks/WebSocketDialogMsgTask.php | 32 ++++++++++++++-- resources/assets/js/store/actions.js | 13 ++++--- 8 files changed, 89 insertions(+), 52 deletions(-) diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 876c8b70..41416cb7 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -90,7 +90,7 @@ class DialogController extends AbstractController } /** - * 消息列表 + * 获取消息列表 * * @apiParam {Number} dialog_id 对话ID * @@ -114,6 +114,9 @@ class DialogController extends AbstractController $data = $list->toArray(); $data['dialog'] = WebSocketDialog::formatData($dialog, $user->userid); // + $user->dialog_id = $dialog->id; + $user->save(); + // return Base::retSuccess('success', $data); } diff --git a/app/Models/AbstractModel.php b/app/Models/AbstractModel.php index 01287c51..15c2597e 100644 --- a/app/Models/AbstractModel.php +++ b/app/Models/AbstractModel.php @@ -33,6 +33,8 @@ class AbstractModel extends Model 'deleted_at', ]; + protected $appendattrs = []; + /** * 保存数据忽略错误 * @return bool diff --git a/app/Models/Project.php b/app/Models/Project.php index 292de424..09ec03f3 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -72,16 +72,16 @@ class Project extends AbstractModel */ private function generateTaskData() { - if (!isset($this->attributes['task_num'])) { + if (!isset($this->appendattrs['task_num'])) { $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->whereNull('archived_at'); - $this->attributes['task_num'] = $builder->count(); - $this->attributes['task_complete'] = $builder->whereNotNull('complete_at')->count(); - $this->attributes['task_percent'] = $this->attributes['task_num'] ? intval($this->attributes['task_complete'] / $this->attributes['task_num'] * 100) : 0; + $this->appendattrs['task_num'] = $builder->count(); + $this->appendattrs['task_complete'] = $builder->whereNotNull('complete_at')->count(); + $this->appendattrs['task_percent'] = $this->appendattrs['task_num'] ? intval($this->appendattrs['task_complete'] / $this->appendattrs['task_num'] * 100) : 0; // $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->whereNull('archived_at'); - $this->attributes['task_my_num'] = $builder->whereUserid(User::token2userid())->count(); - $this->attributes['task_my_complete'] = $builder->whereUserid(User::token2userid())->whereNotNull('complete_at')->count(); - $this->attributes['task_my_percent'] = $this->attributes['task_my_num'] ? intval($this->attributes['task_my_complete'] / $this->attributes['task_my_num'] * 100) : 0; + $this->appendattrs['task_my_num'] = $builder->whereUserid(User::token2userid())->count(); + $this->appendattrs['task_my_complete'] = $builder->whereUserid(User::token2userid())->whereNotNull('complete_at')->count(); + $this->appendattrs['task_my_percent'] = $this->appendattrs['task_my_num'] ? intval($this->appendattrs['task_my_complete'] / $this->appendattrs['task_my_num'] * 100) : 0; } } @@ -92,7 +92,7 @@ class Project extends AbstractModel public function getTaskNumAttribute() { $this->generateTaskData(); - return $this->attributes['task_num']; + return $this->appendattrs['task_num']; } /** @@ -102,7 +102,7 @@ class Project extends AbstractModel public function getTaskCompleteAttribute() { $this->generateTaskData(); - return $this->attributes['task_complete']; + return $this->appendattrs['task_complete']; } /** @@ -112,7 +112,7 @@ class Project extends AbstractModel public function getTaskPercentAttribute() { $this->generateTaskData(); - return $this->attributes['task_percent']; + return $this->appendattrs['task_percent']; } /** @@ -122,7 +122,7 @@ class Project extends AbstractModel public function getTaskMyNumAttribute() { $this->generateTaskData(); - return $this->attributes['task_my_num']; + return $this->appendattrs['task_my_num']; } /** @@ -132,7 +132,7 @@ class Project extends AbstractModel public function getTaskMyCompleteAttribute() { $this->generateTaskData(); - return $this->attributes['task_my_complete']; + return $this->appendattrs['task_my_complete']; } /** @@ -142,7 +142,7 @@ class Project extends AbstractModel public function getTaskMyPercentAttribute() { $this->generateTaskData(); - return $this->attributes['task_my_percent']; + return $this->appendattrs['task_my_percent']; } /** diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 9b60a45a..3792630f 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -103,10 +103,10 @@ class ProjectTask extends AbstractModel */ public function getFileNumAttribute() { - if (!isset($this->attributes['file_num'])) { - $this->attributes['file_num'] = ProjectTaskFile::whereTaskId($this->id)->count(); + if (!isset($this->appendattrs['file_num'])) { + $this->appendattrs['file_num'] = ProjectTaskFile::whereTaskId($this->id)->count(); } - return $this->attributes['file_num']; + return $this->appendattrs['file_num']; } /** @@ -115,10 +115,10 @@ class ProjectTask extends AbstractModel */ public function getMsgNumAttribute() { - if (!isset($this->attributes['msg_num'])) { - $this->attributes['msg_num'] = $this->dialog_id ? WebSocketDialogMsg::whereDialogId($this->dialog_id)->count() : 0; + if (!isset($this->appendattrs['msg_num'])) { + $this->appendattrs['msg_num'] = $this->dialog_id ? WebSocketDialogMsg::whereDialogId($this->dialog_id)->count() : 0; } - return $this->attributes['msg_num']; + return $this->appendattrs['msg_num']; } /** @@ -127,22 +127,22 @@ class ProjectTask extends AbstractModel private function generateSubTaskData() { if ($this->parent_id > 0) { - $this->attributes['sub_num'] = 0; - $this->attributes['sub_complete'] = 0; - $this->attributes['percent'] = $this->complete_at ? 100 : 0; + $this->appendattrs['sub_num'] = 0; + $this->appendattrs['sub_complete'] = 0; + $this->appendattrs['percent'] = $this->complete_at ? 100 : 0; return; } - if (!isset($this->attributes['sub_num'])) { + if (!isset($this->appendattrs['sub_num'])) { $builder = self::whereParentId($this->id)->whereNull('archived_at'); - $this->attributes['sub_num'] = $builder->count(); - $this->attributes['sub_complete'] = $builder->whereNotNull('complete_at')->count(); + $this->appendattrs['sub_num'] = $builder->count(); + $this->appendattrs['sub_complete'] = $builder->whereNotNull('complete_at')->count(); // if ($this->complete_at) { - $this->attributes['percent'] = 100; - } elseif ($this->attributes['sub_complete'] == 0) { - $this->attributes['percent'] = 0; + $this->appendattrs['percent'] = 100; + } elseif ($this->appendattrs['sub_complete'] == 0) { + $this->appendattrs['percent'] = 0; } else { - $this->attributes['percent'] = intval($this->attributes['sub_complete'] / $this->attributes['sub_num'] * 100); + $this->appendattrs['percent'] = intval($this->appendattrs['sub_complete'] / $this->appendattrs['sub_num'] * 100); } } } @@ -154,7 +154,7 @@ class ProjectTask extends AbstractModel public function getSubNumAttribute() { $this->generateSubTaskData(); - return $this->attributes['sub_num']; + return $this->appendattrs['sub_num']; } /** @@ -164,7 +164,7 @@ class ProjectTask extends AbstractModel public function getSubCompleteAttribute() { $this->generateSubTaskData(); - return $this->attributes['sub_complete']; + return $this->appendattrs['sub_complete']; } /** @@ -174,7 +174,7 @@ class ProjectTask extends AbstractModel public function getPercentAttribute() { $this->generateSubTaskData(); - return $this->attributes['percent']; + return $this->appendattrs['percent']; } /** diff --git a/app/Models/User.php b/app/Models/User.php index 9aee35d8..c0e88a2a 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -27,6 +27,7 @@ use Carbon\Carbon; * @property string|null $last_at 最后登录时间 * @property string|null $line_ip 最后在线IP(接口) * @property string|null $line_at 最后在线时间(接口) + * @property int|null $dialog_id 最后打开的会话ID * @property string|null $created_ip 注册IP * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at @@ -37,6 +38,7 @@ use Carbon\Carbon; * @method static \Illuminate\Database\Eloquent\Builder|User whereChangepass($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedIp($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereDialogId($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereEmail($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereEncrypt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereIdentity($value) @@ -46,11 +48,11 @@ use Carbon\Carbon; * @method static \Illuminate\Database\Eloquent\Builder|User whereLineIp($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereLoginNum($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereNickname($value) + * @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereProfession($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUserid($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUserimg($value) - * @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value) * @mixin \Eloquent */ class User extends AbstractModel diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 3a14cd27..1e2011be 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -52,14 +52,14 @@ class WebSocketDialogMsg extends AbstractModel */ public function getPercentageAttribute() { - if (!isset($this->attributes['percentage'])) { + if (!isset($this->appendattrs['percentage'])) { if ($this->read > $this->send || empty($this->send)) { - $this->attributes['percentage'] = 100; + $this->appendattrs['percentage'] = 100; } else { - $this->attributes['percentage'] = intval($this->read / $this->send * 100); + $this->appendattrs['percentage'] = intval($this->read / $this->send * 100); } } - return $this->attributes['percentage']; + return $this->appendattrs['percentage']; } /** @@ -101,7 +101,8 @@ class WebSocketDialogMsg extends AbstractModel 'after' => 1, ]); if ($msgRead->saveOrIgnore()) { - $this->increment('send'); + $this->send = WebSocketDialogMsgRead::whereMsgId($this->id)->count(); + $this->save(); } else { return; } @@ -139,20 +140,22 @@ class WebSocketDialogMsg extends AbstractModel 'msg' => $msg, 'read' => 0, ]); - return AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) { + $result = AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) { $dialog = WebSocketDialog::find($dialog_id); if (empty($dialog)) { return Base::retError('获取会话失败'); } $dialog->last_at = Carbon::now(); $dialog->save(); + $dialogMsg->send = 1; $dialogMsg->dialog_id = $dialog->id; $dialogMsg->save(); // - Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id)); - // return Base::retSuccess('发送成功', $dialogMsg->toArray()); }); + if (Base::isSuccess($result)) { + Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id)); + } + return $result; } - } diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index 7b996867..f15c6081 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -2,13 +2,14 @@ namespace App\Tasks; +@error_reporting(E_ALL & ~E_NOTICE); + +use App\Models\User; use App\Models\WebSocketDialog; use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsgRead; use Request; -@error_reporting(E_ALL & ~E_NOTICE); - /** * 推送回话消息 @@ -40,7 +41,8 @@ class WebSocketDialogMsgTask extends AbstractTask if (empty($dialog)) { return; } - // 推送目标 + + // 推送目标①:群成员 $userids = $dialog->dialogUser->pluck('userid')->toArray(); foreach ($userids AS $userid) { if ($userid == $msg->userid) { @@ -61,9 +63,31 @@ class WebSocketDialogMsgTask extends AbstractTask 'ignoreFd' => $this->ignoreFd, 'msg' => [ 'type' => 'dialog', - 'mode' => 'add', + 'mode' => 'add1', 'data' => $msg->toArray(), ] ]); + + // 推送目标②:正在打开这个会话的会员 + $list = User::whereDialogId($dialog->id)->pluck('userid')->toArray(); + if ($list) { + $array = []; + foreach ($list as $uid) { + if (!in_array($uid, $userids)) { + $array[] = $uid; + } + } + if ($array) { + PushTask::push([ + 'userid' => $array, + 'ignoreFd' => $this->ignoreFd, + 'msg' => [ + 'type' => 'dialog', + 'mode' => 'add2', + 'data' => $msg->toArray(), + ] + ]); + } + } } } diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 1fe0b642..ca36959a 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -779,10 +779,10 @@ export default { result.data.data.forEach((dialog) => { let index = state.dialogList.findIndex(({id}) => id == dialog.id); if (index > -1) { - state.dialogList.splice(index, 1, Object.assign(state.dialogList[index], dialog)) - } else { - state.dialogList.unshift(dialog); + dialog = Object.assign(state.dialogList[index], dialog) + state.dialogList.splice(index, 1); } + state.dialogList.push(dialog); }); } resolve(result); @@ -1089,6 +1089,9 @@ export default { state.dialogMsgList.splice(index, 1, data); } } + if (mode === "add2") { + return; + } // 更新最后消息 let dialog = state.dialogList.find(({id}) => id == dialog_id); if (dialog) { @@ -1096,7 +1099,7 @@ export default { } else { dispatch("getDialogBasic", dialog_id); } - if (mode === "add") { + if (mode === "add1") { // 更新对话列表 if (dialog) { // 新增未读数 @@ -1104,7 +1107,7 @@ export default { // 移动到首位 const index = state.dialogList.findIndex(({id}) => id == dialog_id); if (index > -1) { - const tmp = state.dialogList[index]; + const tmp = state.method.cloneJSON(state.dialogList[index]); state.dialogList.splice(index, 1); state.dialogList.unshift(tmp); }