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