diff --git a/docs/员工端版本功能对比与功能对齐清单-20260717.md b/docs/员工端版本功能对比与功能对齐清单-20260717.md
index 95273074..d0e10236 100644
--- a/docs/员工端版本功能对比与功能对齐清单-20260717.md
+++ b/docs/员工端版本功能对比与功能对齐清单-20260717.md
@@ -91,4 +91,4 @@ Figma 已完成全文件结构和视觉复核,当前实测为 81 个顶层页
| 功能 | 客户要求 | Figma | 当前代码 | 线上状态 | 处理决定 |
| --- | --- | --- | --- | --- | --- |
-| 语音文字交互形态 | 2026-07-18 客户原话:凡语音文字交互处应做成微信聊天式(消息流+按住说话),现表单式操作太复杂 | 表单式布局(输入框+按钮组) | 问页已改会话流:ChatComposer(⊕面板/按住说话松开即发/键盘切换)+气泡消息流,引用/总结卡/反馈/播报收入答案气泡操作行 | 已发布并生产冒烟通过(2026-07-18) | 按客户要求执行,客户原话 > Figma;练页为第二批,web-ai 页随批次二统一 |
+| 语音文字交互形态 | 2026-07-18 客户原话:凡语音文字交互处应做成微信聊天式(消息流+按住说话),现表单式操作太复杂 | 表单式布局(输入框+按钮组) | 问页已改会话流:ChatComposer(⊕面板/按住说话松开即发/键盘切换)+气泡消息流,引用/总结卡/反馈/播报收入答案气泡操作行 | 已发布并生产冒烟通过(2026-07-18) | 按客户要求执行,客户原话 > Figma;2026-07-18 批次二完成:练页对练进行中改为同款会话(业主台词=语音优先气泡+红点+转文字,老师傅提示气泡,风格chips,⊕面板收纳选音频/求助/结束评分,松开即发送),预习/每日三题/评分视图保持;web-ai 页待批次三 |
diff --git a/mobile-uni/src/components/chat/ChatComposer.vue b/mobile-uni/src/components/chat/ChatComposer.vue
index bbda5890..6b743905 100644
--- a/mobile-uni/src/components/chat/ChatComposer.vue
+++ b/mobile-uni/src/components/chat/ChatComposer.vue
@@ -69,20 +69,34 @@
-
-
-
+
+
+
+
+
+
+
+
- 图片≤10MB,视频≤100MB;仅用于本次现场分析
+ 图片≤10MB,视频≤100MB;仅用于本次现场分析
@@ -98,6 +112,7 @@ const props = withDefaults(defineProps<{
mediaName?: string;
mediaKind?: string;
toolLabel?: string;
+ panelItems?: Array<{ key: string; icon: string; label: string; disabled?: boolean }>;
}>(), {
disabled: false,
transcribing: false,
@@ -106,7 +121,8 @@ const props = withDefaults(defineProps<{
quickQuestions: () => [],
mediaName: '',
mediaKind: '',
- toolLabel: ''
+ toolLabel: '',
+ panelItems: () => []
});
const emit = defineEmits<{
@@ -117,6 +133,7 @@ const emit = defineEmits<{
(e: 'clear-media'): void;
(e: 'quick', question: string): void;
(e: 'tool'): void;
+ (e: 'panel', key: string): void;
}>();
const draft = ref('');
@@ -150,6 +167,11 @@ const panelEmit = (event: 'pick-media' | 'pick-audio' | 'tool') => {
emit(event);
};
+const panelAction = (key: string) => {
+ panelOpen.value = false;
+ emit('panel', key);
+};
+
const stopTracks = () => {
stream?.getTracks().forEach((track) => track.stop());
stream = null;
diff --git a/mobile-uni/src/pages/user/practice/index.vue b/mobile-uni/src/pages/user/practice/index.vue
index 3b9ba52c..4a8fb0c1 100644
--- a/mobile-uni/src/pages/user/practice/index.vue
+++ b/mobile-uni/src/pages/user/practice/index.vue
@@ -155,46 +155,98 @@
红线纠偏识别与规避
-
-
-
- 对话
- 保持承接情绪、说明动作、给出反馈节点。
+
+
+
+ {{ activeScenarioName }}
+ 第 {{ Math.min(roundIndex + 1, 3) }}/3 轮
- 第 {{ Math.min(roundIndex + 1, 3) }} 轮
-
-
-
- 情绪 {{ emotionScore }}
-
-
+
+
+ 情绪 {{ emotionScore }}
+
+
+
+ 信任 {{ trustScore }}
+
-
- 信任 {{ trustScore }}
-
-
-
-
- 红线纠偏:先承接诉求,避免推责、绝对承诺或情绪对抗。
+ 红线纠偏:先承接诉求,避免推责、绝对承诺或情绪对抗。
-
-
-
- {{ roleLabel(turn.role) }}
-
+
+
+
+
+
+ 业
+
+
+
+ {{ isTurnPlaying(index) ? '◼' : '🔊' }}
+ {{ turnVoiceLabel(index) }}
+
+
+
+
+
+ {{ turn.text }}
+
+
+
+
+
+ 傅
+
+ 老师傅提示
+ {{ turn.text }}
+
+
+
+
+
+
+
+
+ {{ turn.text }}
+
+
+
+
+
+ 傅
+
+ SOP 提示
+ {{ helpAnswer }}
+
+ 📄 {{ item }}
+
+
- {{ turn.text }}
+
+
+ 业主回应中…
+
+
+ {{ message }}
+
+
+
-
-
+
+
+
-
-
- 你的回应
-
-
-
-
-
-
-
-
- 已附带语音回放
-
- SOP 提示
- {{ helpAnswer }}
-
- {{ item }}
-
-
@@ -307,8 +339,9 @@