feat(media): 微信消息媒体 OSS 归档与下载地址回写

- 新增 MediaArchiveJob、MediaOssArchiveService、WechatMediaArchiveService 与回填命令
- Message/DataProcessing 等支持归档调度与持久化下载 URL
- WebSocket 控制器整理;朋友圈与文档/定时任务说明更新

Made-with: Cursor
This commit is contained in:
wong
2026-04-13 17:23:02 +08:00
parent 3bf1b2aee9
commit b1bfcec35b
12 changed files with 970 additions and 134 deletions

View File

@@ -4,7 +4,10 @@ namespace app\api\controller;
use app\api\model\WechatMessageModel;
use app\common\service\FriendTransferService;
use app\common\service\WechatMediaArchiveService;
use app\job\MediaArchiveJob;
use think\Db;
use think\facade\Log;
use think\facade\Request;
class MessageController extends BaseController
@@ -418,6 +421,7 @@ class MessageController extends BaseController
'type' => 1,
'accountId' => $item['accountId'],
'content' => $item['content'],
'originalContent' => $item['content'],
'createTime' => $createTime,
'deleteTime' => $deleteTime,
'isDeleted' => $item['isDeleted'] ?? false,
@@ -463,6 +467,9 @@ class MessageController extends BaseController
}else{
$id = $data['id'];
unset($data['id']);
if (!empty($exists['originalContent'])) {
unset($data['originalContent']);
}
$res = $exists->save($data);
}
@@ -496,6 +503,9 @@ class MessageController extends BaseController
}
}
}
if (in_array((int)($item['msgType'] ?? 0), [3, 34, 43, 47, 49], true) && !empty($id)) {
MediaArchiveJob::dispatch('message', $id, ['source' => 'saveMessage']);
}
return true;
}
@@ -577,6 +587,9 @@ class MessageController extends BaseController
throw new \Exception('更新群聊消息记录失败');
}
}
if (in_array((int)($item['msgType'] ?? 0), [3, 34, 43, 47, 49], true)) {
MediaArchiveJob::dispatch('message', $item['id'], ['source' => 'saveChatroomMessage']);
}
return true;
} catch (\Exception $e) {
// 记录错误日志,便于调试
@@ -588,6 +601,29 @@ class MessageController extends BaseController
}
}
/**
* 持久化视频/文件下载后的真实地址,并重新触发 OSS 归档
* @param array $data
* @return bool
*/
public function updateDownloadedMessageMedia($data)
{
$messageId = (int)($data['friendMessageId'] ?? $data['chatroomMessageId'] ?? 0);
$downloadUrl = trim((string)($data['url'] ?? ''));
if ($messageId <= 0 || empty($downloadUrl)) {
return false;
}
$updated = WechatMediaArchiveService::updateDownloadedMessageMedia($messageId, $downloadUrl);
if (!$updated) {
return false;
}
MediaArchiveJob::dispatch('message', $messageId, ['source' => $data['type'] ?? 'download_result']);
return true;
}
/**
* 处理消息内容提取发送者ID和消息内容
* @param string $content 原始消息内容