mirror of
https://github.com/kuaifan/dootask.git
synced 2026-03-07 09:57:37 +00:00
优化已读/未读消息
This commit is contained in:
parent
318effd1ec
commit
144fb5afba
@ -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);
|
||||
|
||||
@ -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 = [];
|
||||
// @我的消息
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
]),
|
||||
]
|
||||
];
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class UpdateWebSocketDialogUsersUpdatedAt extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('web_socket_dialog_users', function (Blueprint $table) {
|
||||
$pre = DB::connection()->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) {
|
||||
//
|
||||
});
|
||||
}
|
||||
}
|
||||
4
resources/assets/js/store/actions.js
vendored
4
resources/assets/js/store/actions.js
vendored
@ -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 => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user