From 8dbed4c8e61ded9f27ac45e8c247199cb7434472 Mon Sep 17 00:00:00 2001 From: chenhao Date: Fri, 27 Mar 2026 10:52:01 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96MeetingDetail?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=92=8C=E5=90=8E=E7=AB=AF=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化 `MeetingDetail` 页面的待办事项和侧边栏样式 - 更新 `AiTaskServiceImpl` 和 `MeetingSummaryFileServiceImpl` --- .../service/biz/impl/AiTaskServiceImpl.java | 4 +- .../impl/MeetingSummaryFileServiceImpl.java | 36 ++++++++- frontend/src/pages/business/MeetingDetail.tsx | 78 +++++++++++++++++-- 3 files changed, 107 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/com/imeeting/service/biz/impl/AiTaskServiceImpl.java b/backend/src/main/java/com/imeeting/service/biz/impl/AiTaskServiceImpl.java index 76f676a..ad26cc1 100644 --- a/backend/src/main/java/com/imeeting/service/biz/impl/AiTaskServiceImpl.java +++ b/backend/src/main/java/com/imeeting/service/biz/impl/AiTaskServiceImpl.java @@ -588,7 +588,7 @@ public class AiTaskServiceImpl extends ServiceImpl impleme " \"keywords\": [\"关键词1\", \"关键词2\"],", " \"chapters\": [{\"time\":\"00:00\",\"title\":\"章节标题\",\"summary\":\"章节摘要\"}],", " \"speakerSummaries\": [{\"speaker\":\"发言人 1\",\"summary\":\"该发言人在整场会议中的主要观点总结\"}],", - " \"keyPoints\": [{\"title\":\"重点问题或结论\",\"summary\":\"具体说明\",\"speaker\":\"发言人 1\",\"time\":\"00:00\"}],", + " \"keyPoints\": [{\"title\":\"重点问题或结论\",\"summary\":\"具体说明\",\"speaker\":\"发言人 1\"}],", " \"todos\": [\"待办事项1\", \"待办事项2\"]", " }", "}", @@ -599,7 +599,7 @@ public class AiTaskServiceImpl extends ServiceImpl impleme "4. analysis 是给页面结构化展示使用的单独结果。", "5. analysis.overview 必须基于所有会话内容,控制在 300 字内。", "6. analysis.speakerSummaries 必须按发言人聚合,每个发言人只出现一次。", - "7. analysis.chapters 按时间顺序输出,time 使用 mm:ss 或 hh:mm:ss。", + "7. analysis.chapters 按时间顺序输出,time 使用 mm:ss 或 hh:mm:ss。time需要与讨论内容相对应", "8. analysis.keyPoints 提炼关键问题、决定、结论或争议点。", "9. analysis.todos 尽量写成可执行动作;没有就返回空数组。", "10. 只返回 JSON。", diff --git a/backend/src/main/java/com/imeeting/service/biz/impl/MeetingSummaryFileServiceImpl.java b/backend/src/main/java/com/imeeting/service/biz/impl/MeetingSummaryFileServiceImpl.java index ee8f78a..7c8f3f5 100644 --- a/backend/src/main/java/com/imeeting/service/biz/impl/MeetingSummaryFileServiceImpl.java +++ b/backend/src/main/java/com/imeeting/service/biz/impl/MeetingSummaryFileServiceImpl.java @@ -349,7 +349,7 @@ public class MeetingSummaryFileServiceImpl implements MeetingSummaryFileService continue; } Map normalized = new LinkedHashMap<>(); - normalized.put("time", asText(item.get("time"))); + normalized.put("time", normalizeTimeText(item.get("time"))); normalized.put("title", title); normalized.put("summary", summary); result.add(normalized); @@ -385,7 +385,7 @@ public class MeetingSummaryFileServiceImpl implements MeetingSummaryFileService normalized.put("title", title); normalized.put("summary", summary); normalized.put("speaker", asText(item.get("speaker"))); - normalized.put("time", asText(item.get("time"))); + normalized.put("time", normalizeTimeText(item.get("time"))); result.add(normalized); } return result; @@ -407,6 +407,38 @@ public class MeetingSummaryFileServiceImpl implements MeetingSummaryFileService return value == null ? "" : String.valueOf(value).trim(); } + private String normalizeTimeText(Object value) { + String text = asText(value); + if (text.isBlank()) { + return ""; + } + if (text.contains(":")) { + return text; + } + if (!text.matches("^\\d+(\\.\\d+)?$")) { + return text; + } + + double numeric = Double.parseDouble(text); + long totalSeconds; + if (numeric >= 1000) { + totalSeconds = Math.round(numeric / 1000D); + } else { + totalSeconds = Math.round(numeric); + } + if (totalSeconds < 0) { + totalSeconds = 0; + } + + long hours = totalSeconds / 3600; + long minutes = (totalSeconds % 3600) / 60; + long seconds = totalSeconds % 60; + if (hours > 0) { + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } + return String.format("%02d:%02d", minutes, seconds); + } + private String clipText(String text, int limit) { if (text == null) { return ""; diff --git a/frontend/src/pages/business/MeetingDetail.tsx b/frontend/src/pages/business/MeetingDetail.tsx index f1c4972..9166a0e 100644 --- a/frontend/src/pages/business/MeetingDetail.tsx +++ b/frontend/src/pages/business/MeetingDetail.tsx @@ -914,10 +914,10 @@ const MeetingDetail: React.FC = () => {
{analysis.todos.length ? ( analysis.todos.map((item, index) => ( -