diff --git a/src/api/review/meeting.ts b/src/api/review/meeting.ts
index 2b12a40a4..b9e320b30 100644
--- a/src/api/review/meeting.ts
+++ b/src/api/review/meeting.ts
@@ -152,6 +152,10 @@ export const sendMailInvitation = (id: number) =>
export const retrySmsLog = (smsLogId: number) =>
request.post({ url: '/project/review-meeting/retry-sms', params: { smsLogId } })
+/** 手动重发失败邮件 */
+export const retryMailLog = (mailLogId: number) =>
+ request.post({ url: '/project/review-meeting/retry-mail', params: { mailLogId } })
+
/** 获取短信发送状态列表 */
export const getSmsLogList = (reviewMeetingId: number) =>
request.get({ url: '/project/review-meeting/sms-log-list', params: { reviewMeetingId } })
diff --git a/src/views/review/meeting/MailStatusDialog.vue b/src/views/review/meeting/MailStatusDialog.vue
index 94cb94572..a83b932ea 100644
--- a/src/views/review/meeting/MailStatusDialog.vue
+++ b/src/views/review/meeting/MailStatusDialog.vue
@@ -11,13 +11,33 @@
+
+
+
+ 重新发送
+
+ -
+
+
diff --git a/src/views/review/meeting/ProjectList.vue b/src/views/review/meeting/ProjectList.vue
index 130097e9b..84dd3bc78 100644
--- a/src/views/review/meeting/ProjectList.vue
+++ b/src/views/review/meeting/ProjectList.vue
@@ -4,55 +4,37 @@
项目列表
-
- 所属会议:
- {{ meetingInfo.name || '-' }}
- |
- 会议时间:
-
- {{ meetingInfo.startTime ? formatDate(meetingInfo.startTime, 'YYYY-MM-DD HH:mm') : '-' }}
- ~
- {{ meetingInfo.endTime ? formatDate(meetingInfo.endTime, 'YYYY-MM-DD HH:mm') : '-' }}
-
- |
- 会议地点:
- {{ meetingInfo.location || '-' }}
- |
- 状态:
- {{ STATUS_LABEL[meetingInfo.status] }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -215,7 +220,7 @@
AI
思考中…
-
{{ streamingText }}
+
@@ -274,6 +279,7 @@
import { computed, nextTick, ref, watch } from 'vue'
import { Document, Folder, InfoFilled, Link, Loading, Refresh, WarningFilled } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
+import MarkdownIt from 'markdown-it'
import { formatDate } from '@/utils/formatTime'
import {
getFileOpenUrl,
@@ -776,9 +782,23 @@ const scheduleOfficeWarmup = (files: ReviewMeetingFileRespVO[]) => {
})
}
-const renderMsgContent = (text: string) =>
- text.replace(/\n/g, '
').replace(/&/g, '&').replace(//g, '>')
- .replace(/<br\/>/g, '
')
+const markdown = new MarkdownIt({
+ html: false,
+ linkify: true,
+ breaks: true
+})
+
+const escapeHtml = (text: string) =>
+ text
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+
+const renderUserMsgContent = (text: string) =>
+ escapeHtml(text || '').replace(/\n/g, '
')
+
+const renderAiMsgContent = (text: string) =>
+ markdown.render(text || '')
loadCatalog()
@@ -1003,9 +1023,52 @@ loadCatalog()
word-break: break-word;
}
.user-msg .msg-content { background: #2563eb; color: #fff; border-bottom-right-radius: 3px; }
-.ai-msg .msg-content { background: #f3f4f6; color: #1f2937; border-bottom-left-radius: 3px; }
+.ai-msg .msg-content { background: #f3f4f6; color: #1f2937; border-bottom-left-radius: 3px; overflow-x: auto; }
.streaming-dot { color: #9ca3af; }
+.msg-content :deep(.md-content > *:first-child) { margin-top: 0; }
+.msg-content :deep(.md-content > *:last-child) { margin-bottom: 0; }
+.msg-content :deep(p) { margin: 0 0 6px; }
+.msg-content :deep(ul),
+.msg-content :deep(ol) { margin: 0 0 6px 18px; padding: 0; }
+.msg-content :deep(li) { margin: 0 0 4px; }
+.msg-content :deep(code) {
+ padding: 1px 4px;
+ border-radius: 4px;
+ font-size: 12px;
+ background: rgba(15, 23, 42, 0.08);
+}
+.msg-content :deep(pre) {
+ margin: 6px 0;
+ padding: 8px;
+ border-radius: 8px;
+ overflow-x: auto;
+ background: rgba(15, 23, 42, 0.06);
+}
+.msg-content :deep(pre code) {
+ padding: 0;
+ border-radius: 0;
+ background: transparent;
+}
+.msg-content :deep(table) {
+ width: 100%;
+ min-width: 560px;
+ border-collapse: collapse;
+ margin: 6px 0;
+ background: #fff;
+}
+.msg-content :deep(th),
+.msg-content :deep(td) {
+ padding: 6px 8px;
+ text-align: left;
+ border: 1px solid #d1d5db;
+ vertical-align: top;
+}
+.msg-content :deep(th) { background: #f8fafc; font-weight: 600; }
+.user-msg .msg-content :deep(code) { background: rgba(255, 255, 255, 0.18); }
+.user-msg .msg-content :deep(a) { color: #dbeafe; }
+.ai-msg .msg-content :deep(a) { color: #1d4ed8; }
+
/* 快捷问题 */
.quick-questions {
flex-shrink: 0;