no message

This commit is contained in:
kuaifan 2021-06-18 18:14:37 +08:00
parent 12031aca33
commit efe9c5039c
8 changed files with 89 additions and 52 deletions

View File

@ -90,7 +90,7 @@ class DialogController extends AbstractController
} }
/** /**
* 消息列表 * 获取消息列表
* *
* @apiParam {Number} dialog_id 对话ID * @apiParam {Number} dialog_id 对话ID
* *
@ -114,6 +114,9 @@ class DialogController extends AbstractController
$data = $list->toArray(); $data = $list->toArray();
$data['dialog'] = WebSocketDialog::formatData($dialog, $user->userid); $data['dialog'] = WebSocketDialog::formatData($dialog, $user->userid);
// //
$user->dialog_id = $dialog->id;
$user->save();
//
return Base::retSuccess('success', $data); return Base::retSuccess('success', $data);
} }

View File

@ -33,6 +33,8 @@ class AbstractModel extends Model
'deleted_at', 'deleted_at',
]; ];
protected $appendattrs = [];
/** /**
* 保存数据忽略错误 * 保存数据忽略错误
* @return bool * @return bool

View File

@ -72,16 +72,16 @@ class Project extends AbstractModel
*/ */
private function generateTaskData() 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'); $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->whereNull('archived_at');
$this->attributes['task_num'] = $builder->count(); $this->appendattrs['task_num'] = $builder->count();
$this->attributes['task_complete'] = $builder->whereNotNull('complete_at')->count(); $this->appendattrs['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_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'); $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->whereNull('archived_at');
$this->attributes['task_my_num'] = $builder->whereUserid(User::token2userid())->count(); $this->appendattrs['task_my_num'] = $builder->whereUserid(User::token2userid())->count();
$this->attributes['task_my_complete'] = $builder->whereUserid(User::token2userid())->whereNotNull('complete_at')->count(); $this->appendattrs['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_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() public function getTaskNumAttribute()
{ {
$this->generateTaskData(); $this->generateTaskData();
return $this->attributes['task_num']; return $this->appendattrs['task_num'];
} }
/** /**
@ -102,7 +102,7 @@ class Project extends AbstractModel
public function getTaskCompleteAttribute() public function getTaskCompleteAttribute()
{ {
$this->generateTaskData(); $this->generateTaskData();
return $this->attributes['task_complete']; return $this->appendattrs['task_complete'];
} }
/** /**
@ -112,7 +112,7 @@ class Project extends AbstractModel
public function getTaskPercentAttribute() public function getTaskPercentAttribute()
{ {
$this->generateTaskData(); $this->generateTaskData();
return $this->attributes['task_percent']; return $this->appendattrs['task_percent'];
} }
/** /**
@ -122,7 +122,7 @@ class Project extends AbstractModel
public function getTaskMyNumAttribute() public function getTaskMyNumAttribute()
{ {
$this->generateTaskData(); $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() public function getTaskMyCompleteAttribute()
{ {
$this->generateTaskData(); $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() public function getTaskMyPercentAttribute()
{ {
$this->generateTaskData(); $this->generateTaskData();
return $this->attributes['task_my_percent']; return $this->appendattrs['task_my_percent'];
} }
/** /**

View File

@ -103,10 +103,10 @@ class ProjectTask extends AbstractModel
*/ */
public function getFileNumAttribute() public function getFileNumAttribute()
{ {
if (!isset($this->attributes['file_num'])) { if (!isset($this->appendattrs['file_num'])) {
$this->attributes['file_num'] = ProjectTaskFile::whereTaskId($this->id)->count(); $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() public function getMsgNumAttribute()
{ {
if (!isset($this->attributes['msg_num'])) { if (!isset($this->appendattrs['msg_num'])) {
$this->attributes['msg_num'] = $this->dialog_id ? WebSocketDialogMsg::whereDialogId($this->dialog_id)->count() : 0; $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() private function generateSubTaskData()
{ {
if ($this->parent_id > 0) { if ($this->parent_id > 0) {
$this->attributes['sub_num'] = 0; $this->appendattrs['sub_num'] = 0;
$this->attributes['sub_complete'] = 0; $this->appendattrs['sub_complete'] = 0;
$this->attributes['percent'] = $this->complete_at ? 100 : 0; $this->appendattrs['percent'] = $this->complete_at ? 100 : 0;
return; return;
} }
if (!isset($this->attributes['sub_num'])) { if (!isset($this->appendattrs['sub_num'])) {
$builder = self::whereParentId($this->id)->whereNull('archived_at'); $builder = self::whereParentId($this->id)->whereNull('archived_at');
$this->attributes['sub_num'] = $builder->count(); $this->appendattrs['sub_num'] = $builder->count();
$this->attributes['sub_complete'] = $builder->whereNotNull('complete_at')->count(); $this->appendattrs['sub_complete'] = $builder->whereNotNull('complete_at')->count();
// //
if ($this->complete_at) { if ($this->complete_at) {
$this->attributes['percent'] = 100; $this->appendattrs['percent'] = 100;
} elseif ($this->attributes['sub_complete'] == 0) { } elseif ($this->appendattrs['sub_complete'] == 0) {
$this->attributes['percent'] = 0; $this->appendattrs['percent'] = 0;
} else { } 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() public function getSubNumAttribute()
{ {
$this->generateSubTaskData(); $this->generateSubTaskData();
return $this->attributes['sub_num']; return $this->appendattrs['sub_num'];
} }
/** /**
@ -164,7 +164,7 @@ class ProjectTask extends AbstractModel
public function getSubCompleteAttribute() public function getSubCompleteAttribute()
{ {
$this->generateSubTaskData(); $this->generateSubTaskData();
return $this->attributes['sub_complete']; return $this->appendattrs['sub_complete'];
} }
/** /**
@ -174,7 +174,7 @@ class ProjectTask extends AbstractModel
public function getPercentAttribute() public function getPercentAttribute()
{ {
$this->generateSubTaskData(); $this->generateSubTaskData();
return $this->attributes['percent']; return $this->appendattrs['percent'];
} }
/** /**

View File

@ -27,6 +27,7 @@ use Carbon\Carbon;
* @property string|null $last_at 最后登录时间 * @property string|null $last_at 最后登录时间
* @property string|null $line_ip 最后在线IP接口 * @property string|null $line_ip 最后在线IP接口
* @property string|null $line_at 最后在线时间(接口) * @property string|null $line_at 最后在线时间(接口)
* @property int|null $dialog_id 最后打开的会话ID
* @property string|null $created_ip 注册IP * @property string|null $created_ip 注册IP
* @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_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 whereChangepass($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($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 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 whereEmail($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereEncrypt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereEncrypt($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereIdentity($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 whereLineIp($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereLoginNum($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 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 whereProfession($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($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 whereUserid($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereUserimg($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUserimg($value)
* @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value)
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class User extends AbstractModel class User extends AbstractModel

View File

@ -52,14 +52,14 @@ class WebSocketDialogMsg extends AbstractModel
*/ */
public function getPercentageAttribute() public function getPercentageAttribute()
{ {
if (!isset($this->attributes['percentage'])) { if (!isset($this->appendattrs['percentage'])) {
if ($this->read > $this->send || empty($this->send)) { if ($this->read > $this->send || empty($this->send)) {
$this->attributes['percentage'] = 100; $this->appendattrs['percentage'] = 100;
} else { } 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, 'after' => 1,
]); ]);
if ($msgRead->saveOrIgnore()) { if ($msgRead->saveOrIgnore()) {
$this->increment('send'); $this->send = WebSocketDialogMsgRead::whereMsgId($this->id)->count();
$this->save();
} else { } else {
return; return;
} }
@ -139,20 +140,22 @@ class WebSocketDialogMsg extends AbstractModel
'msg' => $msg, 'msg' => $msg,
'read' => 0, '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); $dialog = WebSocketDialog::find($dialog_id);
if (empty($dialog)) { if (empty($dialog)) {
return Base::retError('获取会话失败'); return Base::retError('获取会话失败');
} }
$dialog->last_at = Carbon::now(); $dialog->last_at = Carbon::now();
$dialog->save(); $dialog->save();
$dialogMsg->send = 1;
$dialogMsg->dialog_id = $dialog->id; $dialogMsg->dialog_id = $dialog->id;
$dialogMsg->save(); $dialogMsg->save();
// //
Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id));
//
return Base::retSuccess('发送成功', $dialogMsg->toArray()); return Base::retSuccess('发送成功', $dialogMsg->toArray());
}); });
if (Base::isSuccess($result)) {
Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id));
}
return $result;
} }
} }

View File

@ -2,13 +2,14 @@
namespace App\Tasks; namespace App\Tasks;
@error_reporting(E_ALL & ~E_NOTICE);
use App\Models\User;
use App\Models\WebSocketDialog; use App\Models\WebSocketDialog;
use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsg;
use App\Models\WebSocketDialogMsgRead; use App\Models\WebSocketDialogMsgRead;
use Request; use Request;
@error_reporting(E_ALL & ~E_NOTICE);
/** /**
* 推送回话消息 * 推送回话消息
@ -40,7 +41,8 @@ class WebSocketDialogMsgTask extends AbstractTask
if (empty($dialog)) { if (empty($dialog)) {
return; return;
} }
// 推送目标
// 推送目标①:群成员
$userids = $dialog->dialogUser->pluck('userid')->toArray(); $userids = $dialog->dialogUser->pluck('userid')->toArray();
foreach ($userids AS $userid) { foreach ($userids AS $userid) {
if ($userid == $msg->userid) { if ($userid == $msg->userid) {
@ -61,9 +63,31 @@ class WebSocketDialogMsgTask extends AbstractTask
'ignoreFd' => $this->ignoreFd, 'ignoreFd' => $this->ignoreFd,
'msg' => [ 'msg' => [
'type' => 'dialog', '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(), 'data' => $msg->toArray(),
] ]
]); ]);
} }
} }
}
}

View File

@ -779,10 +779,10 @@ export default {
result.data.data.forEach((dialog) => { result.data.data.forEach((dialog) => {
let index = state.dialogList.findIndex(({id}) => id == dialog.id); let index = state.dialogList.findIndex(({id}) => id == dialog.id);
if (index > -1) { if (index > -1) {
state.dialogList.splice(index, 1, Object.assign(state.dialogList[index], dialog)) dialog = Object.assign(state.dialogList[index], dialog)
} else { state.dialogList.splice(index, 1);
state.dialogList.unshift(dialog);
} }
state.dialogList.push(dialog);
}); });
} }
resolve(result); resolve(result);
@ -1089,6 +1089,9 @@ export default {
state.dialogMsgList.splice(index, 1, data); state.dialogMsgList.splice(index, 1, data);
} }
} }
if (mode === "add2") {
return;
}
// 更新最后消息 // 更新最后消息
let dialog = state.dialogList.find(({id}) => id == dialog_id); let dialog = state.dialogList.find(({id}) => id == dialog_id);
if (dialog) { if (dialog) {
@ -1096,7 +1099,7 @@ export default {
} else { } else {
dispatch("getDialogBasic", dialog_id); dispatch("getDialogBasic", dialog_id);
} }
if (mode === "add") { if (mode === "add1") {
// 更新对话列表 // 更新对话列表
if (dialog) { if (dialog) {
// 新增未读数 // 新增未读数
@ -1104,7 +1107,7 @@ export default {
// 移动到首位 // 移动到首位
const index = state.dialogList.findIndex(({id}) => id == dialog_id); const index = state.dialogList.findIndex(({id}) => id == dialog_id);
if (index > -1) { if (index > -1) {
const tmp = state.dialogList[index]; const tmp = state.method.cloneJSON(state.dialogList[index]);
state.dialogList.splice(index, 1); state.dialogList.splice(index, 1);
state.dialogList.unshift(tmp); state.dialogList.unshift(tmp);
} }