feat(dialog): 重构合并转发功能

- 合并转发消息体改为存储 msg_ids + preview,不再存储完整消息列表
- 新增 mergedetail API 按需加载合并转发详情
- 详情展示从 Modal 改为 DrawerOverlay,支持完整消息渲染
- 统一不可转发消息类型过滤(tag/top/todo/notice/word-chain/vote/template)
- 合并转发标题改为前端国际化拼接
- DialogWrapper 支持 staticMsgs 静态模式用于详情渲染
- 优化多选操作栏和转发确认界面样式
This commit is contained in:
kuaifan
2026-04-05 09:31:41 +00:00
parent 00a2ea3d2f
commit 6a71964592
13 changed files with 277 additions and 152 deletions
+57 -3
View File
@@ -2334,6 +2334,9 @@ class DialogController extends AbstractController
}
WebSocketDialog::checkDialog($msgs->first()->dialog_id);
foreach ($msgs as $msg) {
if (in_array($msg->type, WebSocketDialogMsg::$unforwardableTypes)) {
continue;
}
$res = $msg->forwardMsg($dialogids, $userids, $user, $show_source, $leave_message);
if (Base::isSuccess($res)) {
$allMsgs = array_merge($allMsgs, $res['data']['msgs']);
@@ -2356,12 +2359,12 @@ class DialogController extends AbstractController
}
/**
* @api {get} api/dialog/msg/merge-forward 合并转发消息
* @api {get} api/dialog/msg/mergeforward 合并转发消息
*
* @apiDescription 需要token身份
* @apiVersion 1.0.0
* @apiGroup dialog
* @apiName msg__merge_forward
* @apiName msg__mergeforward
*
* @apiParam {Array} msg_ids 消息ID数组(最多100条)
* @apiParam {Array} dialogids 转发给的对话ID
@@ -2373,7 +2376,7 @@ class DialogController extends AbstractController
* @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据
*/
public function msg__merge_forward()
public function msg__mergeforward()
{
$user = User::auth();
//
@@ -2396,6 +2399,57 @@ class DialogController extends AbstractController
return WebSocketDialogMsg::mergeForwardMsg($msg_ids, $dialogids, $userids, $user, $show_source, $leave_message);
}
/**
* @api {get} api/dialog/msg/mergedetail 合并转发消息详情
*
* @apiDescription 需要token身份
* @apiVersion 1.0.0
* @apiGroup dialog
* @apiName msg__mergedetail
*
* @apiParam {Number} msg_id 合并转发消息ID
*
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
* @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据
*/
public function msg__mergedetail()
{
User::auth();
//
$msg_id = intval(Request::input('msg_id'));
if ($msg_id <= 0) {
return Base::retError('参数错误');
}
$dialogMsg = WebSocketDialogMsg::find($msg_id);
if (!$dialogMsg || $dialogMsg->type !== 'merge-forward') {
return Base::retError('消息不存在或已被删除');
}
WebSocketDialog::checkDialog($dialogMsg->dialog_id);
//
$msgData = Base::json2array($dialogMsg->getRawOriginal('msg'));
$msgIds = $msgData['msg_ids'] ?? [];
if (empty($msgIds)) {
return Base::retError('消息不存在或已被删除');
}
$msgs = WebSocketDialogMsg::withTrashed()
->whereIn('id', $msgIds)
->orderBy('created_at')
->get()
->map(function ($msg) {
return [
'id' => $msg->id,
'userid' => $msg->userid,
'type' => $msg->type,
'msg' => $msg->msg,
'created_at' => $msg->created_at->toDateTimeString(),
];
});
return Base::retSuccess('success', [
'msgs' => $msgs,
]);
}
/**
* @api {get} api/dialog/msg/emoji emoji回复
*