no message
@ -284,7 +284,7 @@ class DialogController extends AbstractController
|
|||||||
* @apiParam {Number} [prev_id] 此消息ID之前的数据
|
* @apiParam {Number} [prev_id] 此消息ID之前的数据
|
||||||
* @apiParam {Number} [next_id] 此消息ID之后的数据
|
* @apiParam {Number} [next_id] 此消息ID之后的数据
|
||||||
* - position_id、prev_id、next_id 只有一个有效,优先循序为:position_id > prev_id > next_id
|
* - position_id、prev_id、next_id 只有一个有效,优先循序为:position_id > prev_id > next_id
|
||||||
* @apiParam {String} [mtype] 消息类型
|
* @apiParam {String} [msg_type] 消息类型
|
||||||
* - tag: 标记
|
* - tag: 标记
|
||||||
* - link: 链接
|
* - link: 链接
|
||||||
* - text: 文本
|
* - text: 文本
|
||||||
@ -309,7 +309,7 @@ class DialogController extends AbstractController
|
|||||||
$position_id = intval(Request::input('position_id'));
|
$position_id = intval(Request::input('position_id'));
|
||||||
$prev_id = intval(Request::input('prev_id'));
|
$prev_id = intval(Request::input('prev_id'));
|
||||||
$next_id = intval(Request::input('next_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');
|
$take = Base::getPaginate(100, 50, 'take');
|
||||||
$data = [];
|
$data = [];
|
||||||
//
|
//
|
||||||
@ -326,12 +326,17 @@ class DialogController extends AbstractController
|
|||||||
->on('read.msg_id', '=', 'web_socket_dialog_msgs.id');
|
->on('read.msg_id', '=', 'web_socket_dialog_msgs.id');
|
||||||
})->where('web_socket_dialog_msgs.dialog_id', $dialog_id);
|
})->where('web_socket_dialog_msgs.dialog_id', $dialog_id);
|
||||||
//
|
//
|
||||||
if ($mtype === 'tag') {
|
if ($msg_type) {
|
||||||
$builder->where('tag', '>', 0);
|
if ($msg_type === 'tag') {
|
||||||
} elseif ($mtype === 'link') {
|
$builder->where('tag', '>', 0);
|
||||||
$builder->whereLink(1);
|
} elseif ($msg_type === 'link') {
|
||||||
} elseif (in_array($mtype, ['text', 'image', 'file', 'record', 'meeting'])) {
|
$builder->whereLink(1);
|
||||||
$builder->whereMtype($mtype);
|
} elseif (in_array($msg_type, ['text', 'image', 'file', 'record', 'meeting'])) {
|
||||||
|
$builder->whereMtype($msg_type);
|
||||||
|
} else {
|
||||||
|
return Base::retError('参数错误');
|
||||||
|
}
|
||||||
|
$reDialog = false;
|
||||||
}
|
}
|
||||||
if ($msg_id > 0) {
|
if ($msg_id > 0) {
|
||||||
$builder->whereReplyId($msg_id);
|
$builder->whereReplyId($msg_id);
|
||||||
|
|||||||
@ -1182,10 +1182,16 @@ class ProjectTask extends AbstractModel
|
|||||||
public function completeTask($complete_at)
|
public function completeTask($complete_at)
|
||||||
{
|
{
|
||||||
AbstractModel::transaction(function () use ($complete_at) {
|
AbstractModel::transaction(function () use ($complete_at) {
|
||||||
|
$addMsg = empty($this->parent_id) && $this->dialog_id > 0;
|
||||||
if ($complete_at === null) {
|
if ($complete_at === null) {
|
||||||
// 标记未完成
|
// 标记未完成
|
||||||
$this->complete_at = null;
|
$this->complete_at = null;
|
||||||
$this->addLog("标记{任务}未完成");
|
$this->addLog("标记{任务}未完成");
|
||||||
|
if ($addMsg) {
|
||||||
|
WebSocketDialogMsg::sendMsg($this->dialog_id, 0, 'notice', [
|
||||||
|
'notice' => '标记任务未完成'
|
||||||
|
]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// 标记已完成
|
// 标记已完成
|
||||||
if ($this->parent_id == 0) {
|
if ($this->parent_id == 0) {
|
||||||
@ -1198,6 +1204,11 @@ class ProjectTask extends AbstractModel
|
|||||||
}
|
}
|
||||||
$this->complete_at = $complete_at;
|
$this->complete_at = $complete_at;
|
||||||
$this->addLog("标记{任务}已完成");
|
$this->addLog("标记{任务}已完成");
|
||||||
|
if ($addMsg) {
|
||||||
|
WebSocketDialogMsg::sendMsg($this->dialog_id, 0, 'notice', [
|
||||||
|
'notice' => '标记任务已完成'
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$this->save();
|
$this->save();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -146,6 +146,9 @@ class WebSocketDialog extends AbstractModel
|
|||||||
], [
|
], [
|
||||||
'inviter' => $inviter,
|
'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
|
* @param $type
|
||||||
*/
|
*/
|
||||||
public function exitGroup($userid, $type = 'exit')
|
public function exitGroup($userid, $type = 'exit')
|
||||||
@ -184,6 +187,13 @@ class WebSocketDialog extends AbstractModel
|
|||||||
throw new ApiException('项目人员或任务人员不可' . $typeDesc);
|
throw new ApiException('项目人员或任务人员不可' . $typeDesc);
|
||||||
}
|
}
|
||||||
$item->delete();
|
$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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -393,6 +393,8 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
case 'tag':
|
case 'tag':
|
||||||
$action = $data['msg']['action'] === 'remove' ? '取消标注' : '标注';
|
$action = $data['msg']['action'] === 'remove' ? '取消标注' : '标注';
|
||||||
return "[{$action}] {$this->previewMsg(false, $data['msg']['data'])}";
|
return "[{$action}] {$this->previewMsg(false, $data['msg']['data'])}";
|
||||||
|
case 'notice':
|
||||||
|
return $data['msg']['notice'];
|
||||||
default:
|
default:
|
||||||
return "[未知的消息]";
|
return "[未知的消息]";
|
||||||
}
|
}
|
||||||
@ -519,9 +521,10 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
* @param string $type 消息类型
|
* @param string $type 消息类型
|
||||||
* @param array $msg 发送的消息
|
* @param array $msg 发送的消息
|
||||||
* @param int $sender 发送的会员ID(默认自己,0为系统)
|
* @param int $sender 发送的会员ID(默认自己,0为系统)
|
||||||
|
* @param bool $push_self 是否推送给自己
|
||||||
* @return array
|
* @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;
|
$link = 0;
|
||||||
$mtype = $type;
|
$mtype = $type;
|
||||||
@ -563,7 +566,13 @@ class WebSocketDialogMsg extends AbstractModel
|
|||||||
$dialogMsg->key = $dialogMsg->generateMsgKey();
|
$dialogMsg->key = $dialogMsg->generateMsgKey();
|
||||||
$dialogMsg->save();
|
$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);
|
return Base::retSuccess('发送成功', $dialogMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,6 +32,14 @@ class WebSocketDialogMsgTask extends AbstractTask
|
|||||||
$this->ignoreFd = Request::header('fd');
|
$this->ignoreFd = Request::header('fd');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $ignoreFd
|
||||||
|
*/
|
||||||
|
public function setIgnoreFd($ignoreFd)
|
||||||
|
{
|
||||||
|
$this->ignoreFd = $ignoreFd;
|
||||||
|
}
|
||||||
|
|
||||||
public function start()
|
public function start()
|
||||||
{
|
{
|
||||||
global $_A;
|
global $_A;
|
||||||
|
|||||||
@ -5,9 +5,8 @@
|
|||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.st0{fill:#FFFFFF;}
|
.st0{fill:#FFFFFF;}
|
||||||
</style>
|
</style>
|
||||||
<path class="st0" d="M905,334.3c-66-66-198.5-198.5-198.5-198.5c-53.8-53.8-112.3-61.2-152-29.4c-21.3,17-33.3,40.7-36.1,65.2
|
<path class="st0" d="M913.8,405.3L618.7,110.2c-31.1-31.1-81.9-31.1-113.1,0L110.2,505.6l0,0c-15.9,15.9-24.4,37.9-23.3,60.3
|
||||||
c-2.8,24.4-17.4,45.8-36.9,60.7l-6.5,5c-90.5,69.2-193.4,126.4-306.2,142.9c-25.2,3.7-49.2,17.1-65.7,40.3
|
l13.4,281.7c2,41.4,34.7,74,76.1,76l281.7,13.4c1.2,0,2.5,0.1,3.7,0.1c21.1,0,41.6-8.4,56.6-23.4l395.4-395.4
|
||||||
c-28.3,39.7-19.4,95.2,15,129.7l153.3,153.3L133.2,841.8c-13.3,13.3-13.3,34.7,0,48c6.6,6.6,15.3,9.9,24,9.9c8.7,0,17.4-3.3,24-9.9
|
C945,487.2,945,436.5,913.8,405.3z M390,736.1c-56.3,0-102.1-45.8-102.1-102.1S333.7,531.9,390,531.9c56.3,0,102,45.8,102,102.1
|
||||||
l138.3-138.3l129.1,129.1c58.8,58.8,113.7,67.5,153.3,39.7c20.1-14.1,33-33.8,38.6-55c27.5-104.2,62.3-206.4,127.2-292.4l23.3-31
|
S446.3,736.1,390,736.1z"/>
|
||||||
c14.8-19.6,36.1-34.5,60.4-37.2c24.6-2.8,48.3-14.8,65.3-36.2C948.4,428.7,940.9,370.2,905,334.3z"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 995 B After Width: | Height: | Size: 797 B |
@ -5,9 +5,8 @@
|
|||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.st0{fill:#9D95E5;}
|
.st0{fill:#9D95E5;}
|
||||||
</style>
|
</style>
|
||||||
<path class="st0" d="M905,334.3c-66-66-198.5-198.5-198.5-198.5c-53.8-53.8-112.3-61.2-152-29.4c-21.3,17-33.3,40.7-36.1,65.2
|
<path class="st0" d="M909.9,408.7L614.8,113.6c-31.1-31.1-81.9-31.1-113.1,0L106.3,509l0,0c-15.9,15.9-24.4,37.9-23.3,60.3
|
||||||
c-2.8,24.4-17.4,45.8-36.9,60.7l-6.5,5c-90.5,69.2-193.4,126.4-306.2,142.9c-25.2,3.7-49.2,17.1-65.7,40.3
|
l13.4,281.7c2,41.4,34.7,74,76.1,76l281.7,13.4c1.2,0,2.5,0.1,3.7,0.1c21.1,0,41.6-8.4,56.6-23.4l395.4-395.4
|
||||||
c-28.3,39.7-19.4,95.2,15,129.7l153.3,153.3L133.2,841.8c-13.3,13.3-13.3,34.7,0,48c6.6,6.6,15.3,9.9,24,9.9c8.7,0,17.4-3.3,24-9.9
|
C941.1,490.6,941.1,439.9,909.9,408.7z M386.1,739.4c-56.3,0-102.1-45.8-102.1-102.1s45.8-102.1,102.1-102.1
|
||||||
l138.3-138.3l129.1,129.1c58.8,58.8,113.7,67.5,153.3,39.7c20.1-14.1,33-33.8,38.6-55c27.5-104.2,62.3-206.4,127.2-292.4l23.3-31
|
c56.3,0,102,45.8,102,102.1S442.3,739.4,386.1,739.4z"/>
|
||||||
c14.8-19.6,36.1-34.5,60.4-37.2c24.6-2.8,48.3-14.8,65.3-36.2C948.4,428.7,940.9,370.2,905,334.3z"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 995 B After Width: | Height: | Size: 804 B |
2
resources/assets/js/functions/web.js
vendored
@ -489,6 +489,8 @@
|
|||||||
return `[${$A.L('文件')}] ${data.msg.name}`
|
return `[${$A.L('文件')}] ${data.msg.name}`
|
||||||
case 'tag':
|
case 'tag':
|
||||||
return `[${$A.L(data.msg.action === 'remove' ? '取消标注' : '标注')}] ${$A.getMsgSimpleDesc(data.msg.data)}`
|
return `[${$A.L(data.msg.action === 'remove' ? '取消标注' : '标注')}] ${$A.getMsgSimpleDesc(data.msg.data)}`
|
||||||
|
case 'notice':
|
||||||
|
return data.msg.notice
|
||||||
default:
|
default:
|
||||||
return `[${$A.L('未知的消息')}]`
|
return `[${$A.L('未知的消息')}]`
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,9 @@
|
|||||||
{{$L(source.msg.action === 'remove' ? '取消标注' : '标注了')}}
|
{{$L(source.msg.action === 'remove' ? '取消标注' : '标注了')}}
|
||||||
"{{$A.getMsgSimpleDesc(source.msg.data)}}"
|
"{{$A.getMsgSimpleDesc(source.msg.data)}}"
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="source.type === 'notice'" class="dialog-notice">
|
||||||
|
{{source.msg.notice}}
|
||||||
|
</div>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="dialog-avatar">
|
<div class="dialog-avatar">
|
||||||
<UserAvatar :userid="source.userid" :tooltipDisabled="source.userid == userId" :size="30"/>
|
<UserAvatar :userid="source.userid" :tooltipDisabled="source.userid == userId" :size="30"/>
|
||||||
|
|||||||
@ -210,7 +210,7 @@
|
|||||||
|
|
||||||
.nav-tags {
|
.nav-tags {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 70px;
|
top: 74px;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
@ -326,11 +326,14 @@
|
|||||||
list-style: none;
|
list-style: none;
|
||||||
padding-bottom: 16px;
|
padding-bottom: 16px;
|
||||||
|
|
||||||
.dialog-tag {
|
.dialog-tag,
|
||||||
|
.dialog-notice {
|
||||||
|
font-size: 12px;
|
||||||
max-width: 80%;
|
max-width: 80%;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
color: $primary-desc-color;
|
||||||
background-color: #efefef;
|
background-color: #efefef;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@ -5,9 +5,8 @@
|
|||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.st0{fill:#FFFFFF;}
|
.st0{fill:#FFFFFF;}
|
||||||
</style>
|
</style>
|
||||||
<path class="st0" d="M905,334.3c-66-66-198.5-198.5-198.5-198.5c-53.8-53.8-112.3-61.2-152-29.4c-21.3,17-33.3,40.7-36.1,65.2
|
<path class="st0" d="M913.8,405.3L618.7,110.2c-31.1-31.1-81.9-31.1-113.1,0L110.2,505.6l0,0c-15.9,15.9-24.4,37.9-23.3,60.3
|
||||||
c-2.8,24.4-17.4,45.8-36.9,60.7l-6.5,5c-90.5,69.2-193.4,126.4-306.2,142.9c-25.2,3.7-49.2,17.1-65.7,40.3
|
l13.4,281.7c2,41.4,34.7,74,76.1,76l281.7,13.4c1.2,0,2.5,0.1,3.7,0.1c21.1,0,41.6-8.4,56.6-23.4l395.4-395.4
|
||||||
c-28.3,39.7-19.4,95.2,15,129.7l153.3,153.3L133.2,841.8c-13.3,13.3-13.3,34.7,0,48c6.6,6.6,15.3,9.9,24,9.9c8.7,0,17.4-3.3,24-9.9
|
C945,487.2,945,436.5,913.8,405.3z M390,736.1c-56.3,0-102.1-45.8-102.1-102.1S333.7,531.9,390,531.9c56.3,0,102,45.8,102,102.1
|
||||||
l138.3-138.3l129.1,129.1c58.8,58.8,113.7,67.5,153.3,39.7c20.1-14.1,33-33.8,38.6-55c27.5-104.2,62.3-206.4,127.2-292.4l23.3-31
|
S446.3,736.1,390,736.1z"/>
|
||||||
c14.8-19.6,36.1-34.5,60.4-37.2c24.6-2.8,48.3-14.8,65.3-36.2C948.4,428.7,940.9,370.2,905,334.3z"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 995 B After Width: | Height: | Size: 797 B |
@ -5,9 +5,8 @@
|
|||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.st0{fill:#9D95E5;}
|
.st0{fill:#9D95E5;}
|
||||||
</style>
|
</style>
|
||||||
<path class="st0" d="M905,334.3c-66-66-198.5-198.5-198.5-198.5c-53.8-53.8-112.3-61.2-152-29.4c-21.3,17-33.3,40.7-36.1,65.2
|
<path class="st0" d="M909.9,408.7L614.8,113.6c-31.1-31.1-81.9-31.1-113.1,0L106.3,509l0,0c-15.9,15.9-24.4,37.9-23.3,60.3
|
||||||
c-2.8,24.4-17.4,45.8-36.9,60.7l-6.5,5c-90.5,69.2-193.4,126.4-306.2,142.9c-25.2,3.7-49.2,17.1-65.7,40.3
|
l13.4,281.7c2,41.4,34.7,74,76.1,76l281.7,13.4c1.2,0,2.5,0.1,3.7,0.1c21.1,0,41.6-8.4,56.6-23.4l395.4-395.4
|
||||||
c-28.3,39.7-19.4,95.2,15,129.7l153.3,153.3L133.2,841.8c-13.3,13.3-13.3,34.7,0,48c6.6,6.6,15.3,9.9,24,9.9c8.7,0,17.4-3.3,24-9.9
|
C941.1,490.6,941.1,439.9,909.9,408.7z M386.1,739.4c-56.3,0-102.1-45.8-102.1-102.1s45.8-102.1,102.1-102.1
|
||||||
l138.3-138.3l129.1,129.1c58.8,58.8,113.7,67.5,153.3,39.7c20.1-14.1,33-33.8,38.6-55c27.5-104.2,62.3-206.4,127.2-292.4l23.3-31
|
c56.3,0,102,45.8,102,102.1S442.3,739.4,386.1,739.4z"/>
|
||||||
c14.8-19.6,36.1-34.5,60.4-37.2c24.6-2.8,48.3-14.8,65.3-36.2C948.4,428.7,940.9,370.2,905,334.3z"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 995 B After Width: | Height: | Size: 804 B |