diff --git a/pages/customer/customer.vue b/pages/customer/customer.vue
index e824197..3c1d267 100644
--- a/pages/customer/customer.vue
+++ b/pages/customer/customer.vue
@@ -83,7 +83,15 @@
{{ truncateText(item.recordingText, 30) }}
- 暂无录音文本
+
+
+ 转文本
+ 处理中...
+
+
{{ formatDateTime(item.endTime) }}
@@ -466,6 +474,7 @@
currentAudioUrl: null, // 当前音频URL(用于清理Blob URL)
showTextModal: false, // 是否显示文本内容弹框
currentRecordingText: '', // 当前显示的录音文本内容
+ transcribingIds: [], // 正在转文本的录音ID列表
customerList: [
{
name: '李女士',
@@ -1048,6 +1057,106 @@
});
}
},
+ // 转文本
+ async transcribeAudio(item, index) {
+ try {
+ // 获取录音ID(可能是 id 或 segmentId)
+ const audioId = item.id || item.segmentId;
+ if (!audioId) {
+ uni.showToast({
+ title: '无法获取录音ID',
+ icon: 'none'
+ });
+ return;
+ }
+
+ // 如果正在转文本,则不再处理
+ if (this.transcribingIds.includes(audioId)) {
+ return;
+ }
+
+ // 添加到转文本列表
+ this.transcribingIds.push(audioId);
+
+ // 调用转文本接口:/api/audioManagementSegments/transcribe/{id}
+ const url = getApiUrl(`/api/audioManagementSegments/transcribe/${audioId}`);
+
+ // 获取认证信息
+ let tenantId = '';
+ let token = '';
+ try {
+ tenantId = uni.getStorageSync('backend-tenant-id') || '';
+ token = uni.getStorageSync('backend-token') || '';
+ } catch (e) {
+ console.error('获取认证信息失败:', e);
+ }
+
+ // 构建请求头
+ const headers = {
+ 'Content-Type': 'application/json'
+ };
+ if (token) {
+ headers['Authorization'] = `Bearer ${token}`;
+ }
+ if (tenantId) {
+ headers['X-Tenant-Id'] = tenantId;
+ }
+
+ const res = await uni.request({
+ url: url,
+ method: 'POST',
+ header: headers,
+ timeout: 30000 // 转文本可能需要较长时间
+ });
+
+ // 从转文本列表中移除
+ const idIndex = this.transcribingIds.indexOf(audioId);
+ if (idIndex > -1) {
+ this.transcribingIds.splice(idIndex, 1);
+ }
+
+ if (res.statusCode === 200 && res.data && res.data.success) {
+ uni.showToast({
+ title: res.data.message || '转文本请求已提交',
+ icon: 'success',
+ duration: 2000
+ });
+
+ // 如果返回了更新后的数据,更新列表中的该项
+ if (res.data.data) {
+ // 更新列表中的该项
+ this.$set(this.audioSegmentsList, index, {
+ ...item,
+ ...res.data.data
+ });
+ } else {
+ // 如果没有返回数据,可以刷新整个列表
+ // 或者等待用户手动刷新
+ // 这里先不自动刷新,因为转文本是后台处理
+ }
+ } else {
+ uni.showToast({
+ title: res.data?.message || '转文本请求失败',
+ icon: 'none',
+ duration: 2000
+ });
+ }
+ } catch (error) {
+ // 从转文本列表中移除
+ const audioId = item.id || item.segmentId;
+ const idIndex = this.transcribingIds.indexOf(audioId);
+ if (idIndex > -1) {
+ this.transcribingIds.splice(idIndex, 1);
+ }
+
+ console.error('转文本失败:', error);
+ uni.showToast({
+ title: `转文本失败: ${error.errMsg || error.message || '未知错误'}`,
+ icon: 'none',
+ duration: 2000
+ });
+ }
+ },
// 格式化时长(秒转换为时分秒)
formatDuration(seconds) {
if (!seconds) return '00:00:00';
@@ -3254,6 +3363,38 @@
font-style: italic;
}
+ .audio-item-transcribe {
+ display: flex;
+ align-items: center;
+ }
+
+ .transcribe-btn {
+ padding: 12rpx 24rpx;
+ background-color: #007AFF;
+ border-radius: 8rpx;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: background-color 0.2s, opacity 0.2s;
+ }
+
+ .transcribe-btn:active {
+ background-color: #0056CC;
+ }
+
+ .transcribe-btn--loading {
+ opacity: 0.6;
+ background-color: #999;
+ cursor: not-allowed;
+ }
+
+ .transcribe-btn text {
+ font-size: 26rpx;
+ color: #FFFFFF;
+ font-weight: 500;
+ }
+
.audio-item-meta {
display: flex;
flex-wrap: nowrap;