perf: 优化已读回执

This commit is contained in:
kuaifan 2022-03-03 11:41:54 +08:00
parent 7107409b1b
commit f4e4252227
4 changed files with 40 additions and 14 deletions

View File

@ -70,11 +70,7 @@ class WebSocketDialogMsg extends AbstractModel
public function getPercentageAttribute() public function getPercentageAttribute()
{ {
if (!isset($this->appendattrs['percentage'])) { if (!isset($this->appendattrs['percentage'])) {
if ($this->read > $this->send || empty($this->send)) { $this->generatePercentage();
$this->appendattrs['percentage'] = 100;
} else {
$this->appendattrs['percentage'] = intval($this->read / $this->send * 100);
}
} }
return $this->appendattrs['percentage']; return $this->appendattrs['percentage'];
} }
@ -98,6 +94,22 @@ class WebSocketDialogMsg extends AbstractModel
return $value; return $value;
} }
/**
* 获取占比
* @param bool $increment 是否新增阅读数
* @return int
*/
public function generatePercentage($increment = false) {
if ($increment) {
$this->increment('read');
}
if ($this->read > $this->send || empty($this->send)) {
return $this->appendattrs['percentage'] = 100;
} else {
return $this->appendattrs['percentage'] = intval($this->read / $this->send * 100);
}
}
/** /**
* 标记已送达 同时 告诉发送人已送达 * 标记已送达 同时 告诉发送人已送达
* @param $userid * @param $userid
@ -127,13 +139,17 @@ class WebSocketDialogMsg extends AbstractModel
if (!$msgRead->read_at) { if (!$msgRead->read_at) {
$msgRead->read_at = Carbon::now(); $msgRead->read_at = Carbon::now();
$msgRead->save(); $msgRead->save();
$this->increment('read'); $this->generatePercentage(true);
PushTask::push([ PushTask::push([
'userid' => $this->userid, 'userid' => $this->userid,
'msg' => [ 'msg' => [
'type' => 'dialog', 'type' => 'dialog',
'mode' => 'update', 'mode' => 'readed',
'data' => $this->toArray(), 'data' => [
'id' => $this->id,
'read' => $this->read,
'percentage' => $this->percentage,
],
] ]
]); ]);
} }

View File

@ -127,9 +127,11 @@ class WebSocketService implements WebSocketHandlerInterface
case 'readMsg': case 'readMsg':
$ids = is_array($data['id']) ? $data['id'] : [$data['id']]; $ids = is_array($data['id']) ? $data['id'] : [$data['id']];
$userid = $this->getUserid($frame->fd); $userid = $this->getUserid($frame->fd);
$list = WebSocketDialogMsg::whereIn('id', $ids)->get(); WebSocketDialogMsg::whereIn('id', $ids)->chunkById(20, function($list) use ($userid) {
$list->transform(function(WebSocketDialogMsg $item) use ($userid) { /** @var WebSocketDialogMsg $item */
$item->readSuccess($userid); foreach ($list as $item) {
$item->readSuccess($userid);
}
}); });
return; return;

View File

@ -46,6 +46,7 @@
<div class="time" :title="msgData.created_at">{{$A.formatTime(msgData.created_at)}}</div> <div class="time" :title="msgData.created_at">{{$A.formatTime(msgData.created_at)}}</div>
<Poptip <Poptip
v-if="msgData.send > 1 || dialogType == 'group'" v-if="msgData.send > 1 || dialogType == 'group'"
ref="percent"
class="percent" class="percent"
placement="left-end" placement="left-end"
transfer transfer
@ -134,13 +135,13 @@ export default {
} }
this.msgData._r = true; this.msgData._r = true;
// //
this.$nextTick(() => { setTimeout(() => {
if (!this.$el.offsetParent) { if (!this.$el.offsetParent) {
this.msgData._r = false; this.msgData._r = false;
return return
} }
this.$store.dispatch("dialogMsgRead", this.msgData); this.$store.dispatch("dialogMsgRead", this.msgData);
}) }, 50)
}, },
popperShow() { popperShow() {
@ -151,6 +152,7 @@ export default {
}, },
}).then(({data}) => { }).then(({data}) => {
this.read_list = data; this.read_list = data;
this.$refs.percent.updatePopper();
}).catch(() => { }).catch(() => {
this.read_list = []; this.read_list = [];
}); });

View File

@ -2046,7 +2046,7 @@ export default {
} }
}); });
state.wsReadWaitList = []; state.wsReadWaitList = [];
}, 20); }, 50);
}, },
/** /**
@ -2174,6 +2174,12 @@ export default {
// 更新最后消息 // 更新最后消息
dispatch("updateDialogLastMsg", data); dispatch("updateDialogLastMsg", data);
break; break;
case 'readed':
// 已读回执
if (state.dialogMsgs.find(({id}) => id == data.id)) {
dispatch("saveDialogMsg", data)
}
break;
} }
})(msgDetail); })(msgDetail);
break; break;