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
*
@ -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);
}

View File

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

View File

@ -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'];
}
/**

View File

@ -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'];
}
/**

View File

@ -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

View File

@ -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;
}
}

View File

@ -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(),
]
]);
}
}
}
}

View File

@ -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);
}