diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index b1ef213d0..9df36cbd6 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -284,7 +284,7 @@ class DialogController extends AbstractController * @apiParam {Number} [prev_id] 此消息ID之前的数据 * @apiParam {Number} [next_id] 此消息ID之后的数据 * - position_id、prev_id、next_id 只有一个有效,优先循序为:position_id > prev_id > next_id - * @apiParam {String} [mtype] 消息类型 + * @apiParam {String} [msg_type] 消息类型 * - tag: 标记 * - link: 链接 * - text: 文本 @@ -309,7 +309,7 @@ class DialogController extends AbstractController $position_id = intval(Request::input('position_id')); $prev_id = intval(Request::input('prev_id')); $next_id = intval(Request::input('next_id')); - $mtype = trim(Request::input('mtype')); + $msg_type = trim(Request::input('msg_type')); $take = Base::getPaginate(100, 50, 'take'); $data = []; // @@ -326,12 +326,17 @@ class DialogController extends AbstractController ->on('read.msg_id', '=', 'web_socket_dialog_msgs.id'); })->where('web_socket_dialog_msgs.dialog_id', $dialog_id); // - if ($mtype === 'tag') { - $builder->where('tag', '>', 0); - } elseif ($mtype === 'link') { - $builder->whereLink(1); - } elseif (in_array($mtype, ['text', 'image', 'file', 'record', 'meeting'])) { - $builder->whereMtype($mtype); + if ($msg_type) { + if ($msg_type === 'tag') { + $builder->where('tag', '>', 0); + } elseif ($msg_type === 'link') { + $builder->whereLink(1); + } elseif (in_array($msg_type, ['text', 'image', 'file', 'record', 'meeting'])) { + $builder->whereMtype($msg_type); + } else { + return Base::retError('参数错误'); + } + $reDialog = false; } if ($msg_id > 0) { $builder->whereReplyId($msg_id); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 94b5725c7..931a14a22 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -1182,10 +1182,16 @@ class ProjectTask extends AbstractModel public function completeTask($complete_at) { AbstractModel::transaction(function () use ($complete_at) { + $addMsg = empty($this->parent_id) && $this->dialog_id > 0; if ($complete_at === null) { // 标记未完成 $this->complete_at = null; $this->addLog("标记{任务}未完成"); + if ($addMsg) { + WebSocketDialogMsg::sendMsg($this->dialog_id, 0, 'notice', [ + 'notice' => '标记任务未完成' + ]); + } } else { // 标记已完成 if ($this->parent_id == 0) { @@ -1198,6 +1204,11 @@ class ProjectTask extends AbstractModel } $this->complete_at = $complete_at; $this->addLog("标记{任务}已完成"); + if ($addMsg) { + WebSocketDialogMsg::sendMsg($this->dialog_id, 0, 'notice', [ + 'notice' => '标记任务已完成' + ]); + } } $this->save(); }); diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index d2e95806f..d12bd1dad 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -146,6 +146,9 @@ class WebSocketDialog extends AbstractModel ], [ 'inviter' => $inviter, ]); + WebSocketDialogMsg::sendMsg($this->id, 0, 'notice', [ + 'notice' => User::userid2nickname($value) . " 已加入群组" + ], $inviter, true); } } }); @@ -158,7 +161,7 @@ class WebSocketDialog extends AbstractModel /** * 退出聊天室 - * @param int|array $userid 加入的会员ID或会员ID组 + * @param int|array $userid 退出的会员ID或会员ID组 * @param $type */ public function exitGroup($userid, $type = 'exit') @@ -184,6 +187,13 @@ class WebSocketDialog extends AbstractModel throw new ApiException('项目人员或任务人员不可' . $typeDesc); } $item->delete(); + // + if ($type === 'remove') { + $notice = User::nickname() . " 将 " . User::userid2nickname($item->userid) . " 移出群组"; + } else { + $notice = User::userid2nickname($item->userid) . " 退出群组"; + } + WebSocketDialogMsg::sendMsg($this->id, 0, 'notice', ['notice' => $notice], User::userid(), true); } }); }); diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 7de4b8a9b..ee420af64 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -393,6 +393,8 @@ class WebSocketDialogMsg extends AbstractModel case 'tag': $action = $data['msg']['action'] === 'remove' ? '取消标注' : '标注'; return "[{$action}] {$this->previewMsg(false, $data['msg']['data'])}"; + case 'notice': + return $data['msg']['notice']; default: return "[未知的消息]"; } @@ -519,9 +521,10 @@ class WebSocketDialogMsg extends AbstractModel * @param string $type 消息类型 * @param array $msg 发送的消息 * @param int $sender 发送的会员ID(默认自己,0为系统) + * @param bool $push_self 是否推送给自己 * @return array */ - public static function sendMsg($dialog_id, $reply_id, $type, $msg, $sender = 0) + public static function sendMsg($dialog_id, $reply_id, $type, $msg, $sender = 0, $push_self = false) { $link = 0; $mtype = $type; @@ -563,7 +566,13 @@ class WebSocketDialogMsg extends AbstractModel $dialogMsg->key = $dialogMsg->generateMsgKey(); $dialogMsg->save(); }); - Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id)); + // + $task = new WebSocketDialogMsgTask($dialogMsg->id); + if ($push_self) { + $task->setIgnoreFd(null); + } + Task::deliver($task); + // return Base::retSuccess('发送成功', $dialogMsg); } } diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index c597b6982..7d0e338f8 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -32,6 +32,14 @@ class WebSocketDialogMsgTask extends AbstractTask $this->ignoreFd = Request::header('fd'); } + /** + * @param $ignoreFd + */ + public function setIgnoreFd($ignoreFd) + { + $this->ignoreFd = $ignoreFd; + } + public function start() { global $_A; diff --git a/public/images/dialog/tag-white.svg b/public/images/dialog/tag-white.svg index 1af06dd26..611826f5d 100644 --- a/public/images/dialog/tag-white.svg +++ b/public/images/dialog/tag-white.svg @@ -5,9 +5,8 @@ - + diff --git a/public/images/dialog/tag.svg b/public/images/dialog/tag.svg index 2e8f1f2aa..ce6d38fda 100644 --- a/public/images/dialog/tag.svg +++ b/public/images/dialog/tag.svg @@ -5,9 +5,8 @@ - + diff --git a/resources/assets/js/functions/web.js b/resources/assets/js/functions/web.js index d9cc47f0d..9f0b4e3ee 100755 --- a/resources/assets/js/functions/web.js +++ b/resources/assets/js/functions/web.js @@ -489,6 +489,8 @@ return `[${$A.L('文件')}] ${data.msg.name}` case 'tag': return `[${$A.L(data.msg.action === 'remove' ? '取消标注' : '标注')}] ${$A.getMsgSimpleDesc(data.msg.data)}` + case 'notice': + return data.msg.notice default: return `[${$A.L('未知的消息')}]` } diff --git a/resources/assets/js/pages/manage/components/DialogItem.vue b/resources/assets/js/pages/manage/components/DialogItem.vue index c22e9b914..cbef233b3 100644 --- a/resources/assets/js/pages/manage/components/DialogItem.vue +++ b/resources/assets/js/pages/manage/components/DialogItem.vue @@ -5,6 +5,9 @@ {{$L(source.msg.action === 'remove' ? '取消标注' : '标注了')}} "{{$A.getMsgSimpleDesc(source.msg.data)}}" +
+ {{source.msg.notice}} +