录音时长,调整字段映射关系

This commit is contained in:
zhonghua.li
2026-02-07 22:19:52 +08:00
parent cb4603c2a2
commit bf51c2afc4
5 changed files with 60 additions and 59 deletions

View File

@@ -47,8 +47,8 @@
<text class="stat-label">总录音时长</text>
</view>
<view class="stat-item">
<text class="stat-value">{{ todayDuration }}</text>
<text class="stat-label">今日录音时长</text>
<text class="stat-value">{{ recordingCount }}</text>
<text class="stat-label">录音总条数</text>
</view>
</view>
@@ -71,6 +71,7 @@
</view>
<view class="item-right">
<text class="item-duration">{{ item.duration }}</text>
<text class="item-count">{{ item.recordingCount }}</text>
</view>
</view>
</view>
@@ -137,7 +138,7 @@ export default {
timeRangeIndex: 0, // 默认选择1个月
showTimeRangeDropdown: false, // 控制下拉菜单显示
totalDuration: '0 分钟',
todayDuration: '0 分钟',
recordingCount: '0',
dataList: [],
loading: false
}
@@ -406,20 +407,22 @@ export default {
if (!statisticsList || statisticsList.length === 0) {
// 没有数据时重置显示
this.totalDuration = '0 分钟';
this.todayDuration = '0 分钟';
this.recordingCount = '0';
this.dataList = [];
return;
}
// 注意salesTotalDuration 是销售人员在所有门店的总时长(所有记录的值都相同)
// 所以应该使用第一条记录的 salesTotalDuration 作为总时长,而不是累加
// 注意salesTotalDurationStatistic 是销售人员在所有门店的总时长(所有记录的值都相同)
// 所以应该使用第一条记录的 salesTotalDurationStatistic 作为总时长,而不是累加
const firstItem = statisticsList[0];
const totalDurationMinutes = firstItem.salesTotalDuration || 0;
const totalDurationMinutes = firstItem.salesTotalDurationStatistic || firstItem.salesTotalDuration || 0;
// 构建数据列表(展示每个门店的统计数据)
const formattedList = statisticsList.map(item => {
// 使用门店录音总时长作为该条记录的时长
const dealershipDuration = item.dealershipTotalDuration || 0;
// 使用销售人员录音总时长作为该条记录的时长
const salesDuration = item.salesTotalDuration || 0;
// 获取录音条数
const recordingCount = item.salesRecordingCount || 0;
// 格式化日期
const date = this.formatDate(item.statisticsDate);
@@ -437,7 +440,8 @@ export default {
return {
date: date,
description: description,
duration: this.formatDuration(dealershipDuration),
duration: this.formatDuration(salesDuration),
recordingCount: `${recordingCount}`,
// 保存原始数据,方便后续使用
rawData: item
};
@@ -454,24 +458,14 @@ export default {
this.totalDuration = this.formatDuration(totalDurationMinutes);
this.dataList = formattedList;
// 计算今日录音时长(从统计数据中查找今天的记录
const today = new Date();
const todayStr = this.formatDate(today.toISOString());
const todayItem = statisticsList.find(item => {
const itemDate = this.formatDate(item.statisticsDate);
return itemDate === todayStr;
});
if (todayItem) {
// 今日时长使用该日期的门店录音总时长
this.todayDuration = this.formatDuration(todayItem.dealershipTotalDuration || 0);
} else {
this.todayDuration = '0 分钟';
}
// 获取录音总条数(使用第一条记录的 salesRecordingCountStatistic 或 salesRecordingCount
// 注意:如果后端返回的是 salesRecordingCount则使用该字段如果是 salesRecordingCountStatistic则使用该字段
const recordingCount = firstItem.salesRecordingCountStatistic || firstItem.salesRecordingCount || 0;
this.recordingCount = String(recordingCount);
console.log('[RecordingDuration] 数据处理完成:', {
totalDuration: this.totalDuration,
todayDuration: this.todayDuration,
recordingCount: this.recordingCount,
dataListCount: this.dataList.length,
statisticsListLength: statisticsList.length
});
@@ -756,6 +750,13 @@ export default {
font-size: 28rpx;
font-weight: bold;
color: #007aff;
margin-bottom: 4rpx;
}
.item-count {
display: block;
font-size: 24rpx;
color: #666666;
}
</style>

View File

@@ -12,7 +12,7 @@ function getSystemInfo() {
windowHeight: windowInfo.windowHeight
};
} catch (e) {
common_vendor.index.__f__("warn", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:98", "[RecordingDuration] Failed to use wx.getWindowInfo, fallback to getSystemInfoSync:", e);
common_vendor.index.__f__("warn", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:99", "[RecordingDuration] Failed to use wx.getWindowInfo, fallback to getSystemInfoSync:", e);
}
}
try {
@@ -23,7 +23,7 @@ function getSystemInfo() {
windowHeight: systemInfo.windowHeight
};
} catch (e) {
common_vendor.index.__f__("error", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:112", "[RecordingDuration] Failed to get system info:", e);
common_vendor.index.__f__("error", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:113", "[RecordingDuration] Failed to get system info:", e);
return {
statusBarHeight: 20,
windowWidth: 375,
@@ -52,7 +52,7 @@ const _sfc_main = {
showTimeRangeDropdown: false,
// 控制下拉菜单显示
totalDuration: "0 分钟",
todayDuration: "0 分钟",
recordingCount: "0",
dataList: [],
loading: false
};
@@ -71,7 +71,7 @@ const _sfc_main = {
const totalHeight = statusBarHeightRpx + actualHeightRpx;
const adjustedHeight = Math.max(totalHeight - 4, 0);
this.$set(this, "contentTop", adjustedHeight + "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:165", "[RecordingDuration] 使用实际导航栏高度:", actualHeight, "px =", actualHeightRpx, "rpx, 总高度:", totalHeight, "rpx, 调整后:", adjustedHeight, "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:166", "[RecordingDuration] 使用实际导航栏高度:", actualHeight, "px =", actualHeightRpx, "rpx, 总高度:", totalHeight, "rpx, 调整后:", adjustedHeight, "rpx");
} else {
const systemInfo = getSystemInfo();
const statusBarHeight = systemInfo.statusBarHeight;
@@ -90,7 +90,7 @@ const _sfc_main = {
const tabbarHeightRpx = tabbarHeight * 2;
const adjustedBottom = Math.max(tabbarHeightRpx - 4, 0);
this.$set(this, "contentBottom", adjustedBottom + "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:189", "[RecordingDuration] 使用实际tabbar高度:", tabbarHeight, "px =", tabbarHeightRpx, "rpx, 调整后:", adjustedBottom, "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:190", "[RecordingDuration] 使用实际tabbar高度:", tabbarHeight, "px =", tabbarHeightRpx, "rpx, 调整后:", adjustedBottom, "rpx");
} else {
this.$set(this, "contentBottom", "0rpx");
}
@@ -105,7 +105,7 @@ const _sfc_main = {
const totalHeight = statusBarHeightRpx + actualHeightRpx;
const adjustedHeight = Math.max(totalHeight - 4, 0);
this.$set(this, "contentTop", adjustedHeight + "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:208", "[RecordingDuration] 延迟更新导航栏高度:", actualHeight, "px =", actualHeightRpx, "rpx, 总高度:", totalHeight, "rpx, 调整后:", adjustedHeight, "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:209", "[RecordingDuration] 延迟更新导航栏高度:", actualHeight, "px =", actualHeightRpx, "rpx, 总高度:", totalHeight, "rpx, 调整后:", adjustedHeight, "rpx");
}
}).exec();
const queryTabbar2 = common_vendor.index.createSelectorQuery().in(this);
@@ -115,7 +115,7 @@ const _sfc_main = {
const tabbarHeightRpx = tabbarHeight * 2;
const adjustedBottom = Math.max(tabbarHeightRpx - 4, 0);
this.$set(this, "contentBottom", adjustedBottom + "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:220", "[RecordingDuration] 延迟更新tabbar高度:", tabbarHeight, "px =", tabbarHeightRpx, "rpx, 调整后:", adjustedBottom, "rpx");
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:221", "[RecordingDuration] 延迟更新tabbar高度:", tabbarHeight, "px =", tabbarHeightRpx, "rpx, 调整后:", adjustedBottom, "rpx");
}
}).exec();
}, 200);
@@ -150,7 +150,7 @@ const _sfc_main = {
salesPhone: loginResponse.phone || null
};
} catch (e) {
common_vendor.index.__f__("error", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:257", "获取用户信息失败:", e);
common_vendor.index.__f__("error", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:258", "获取用户信息失败:", e);
return { salesId: null, salesPhone: null };
}
},
@@ -211,8 +211,8 @@ const _sfc_main = {
const queryString = Object.keys(queryParams).filter((key) => queryParams[key] !== null && queryParams[key] !== void 0 && queryParams[key] !== "").map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(queryParams[key])}`).join("&");
const baseUrl = common_config.getApiUrl("/api/audio-statistics/sales");
const url = queryString ? `${baseUrl}?${queryString}` : baseUrl;
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:337", "[RecordingDuration] 请求参数:", queryParams);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:338", "[RecordingDuration] 请求URL:", url);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:338", "[RecordingDuration] 请求参数:", queryParams);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:339", "[RecordingDuration] 请求URL:", url);
common_vendor.index.showLoading({
title: "加载中...",
mask: true
@@ -233,8 +233,8 @@ const _sfc_main = {
return;
}
const statisticsList = result.data || [];
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:373", "[RecordingDuration] 返回数据:", statisticsList);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:374", "[RecordingDuration] 返回结果:", result);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:374", "[RecordingDuration] 返回数据:", statisticsList);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:375", "[RecordingDuration] 返回结果:", result);
this.processStatisticsData(statisticsList);
common_vendor.index.showToast({
title: "刷新成功",
@@ -246,7 +246,7 @@ const _sfc_main = {
}
} catch (error) {
common_vendor.index.hideLoading();
common_vendor.index.__f__("error", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:392", "[RecordingDuration] 加载数据失败:", error);
common_vendor.index.__f__("error", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:393", "[RecordingDuration] 加载数据失败:", error);
common_vendor.index.showToast({
title: error.message || "加载失败,请重试",
icon: "none",
@@ -262,14 +262,15 @@ const _sfc_main = {
processStatisticsData(statisticsList) {
if (!statisticsList || statisticsList.length === 0) {
this.totalDuration = "0 分钟";
this.todayDuration = "0 分钟";
this.recordingCount = "0";
this.dataList = [];
return;
}
const firstItem = statisticsList[0];
const totalDurationMinutes = firstItem.salesTotalDuration || 0;
const totalDurationMinutes = firstItem.salesTotalDurationStatistic || firstItem.salesTotalDuration || 0;
const formattedList = statisticsList.map((item) => {
const dealershipDuration = item.dealershipTotalDuration || 0;
const salesDuration = item.salesTotalDuration || 0;
const recordingCount2 = item.salesRecordingCount || 0;
const date = this.formatDate(item.statisticsDate);
let description = "";
if (item.dealershipName) {
@@ -282,7 +283,8 @@ const _sfc_main = {
return {
date,
description,
duration: this.formatDuration(dealershipDuration),
duration: this.formatDuration(salesDuration),
recordingCount: `${recordingCount2}`,
// 保存原始数据,方便后续使用
rawData: item
};
@@ -296,20 +298,11 @@ const _sfc_main = {
});
this.totalDuration = this.formatDuration(totalDurationMinutes);
this.dataList = formattedList;
const today = /* @__PURE__ */ new Date();
const todayStr = this.formatDate(today.toISOString());
const todayItem = statisticsList.find((item) => {
const itemDate = this.formatDate(item.statisticsDate);
return itemDate === todayStr;
});
if (todayItem) {
this.todayDuration = this.formatDuration(todayItem.dealershipTotalDuration || 0);
} else {
this.todayDuration = "0 分钟";
}
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:472", "[RecordingDuration] 数据处理完成:", {
const recordingCount = firstItem.salesRecordingCountStatistic || firstItem.salesRecordingCount || 0;
this.recordingCount = String(recordingCount);
common_vendor.index.__f__("log", "at pages-subpackage/ai_features/recording_duration/recording_duration.vue:466", "[RecordingDuration] 数据处理完成:", {
totalDuration: this.totalDuration,
todayDuration: this.todayDuration,
recordingCount: this.recordingCount,
dataListCount: this.dataList.length,
statisticsListLength: statisticsList.length
});
@@ -357,13 +350,14 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
k: common_vendor.o((...args) => $options.closeTimeRangeDropdown && $options.closeTimeRangeDropdown(...args))
} : {}, {
l: common_vendor.t($data.totalDuration),
m: common_vendor.t($data.todayDuration),
m: common_vendor.t($data.recordingCount),
n: common_vendor.f($data.dataList, (item, index, i0) => {
return {
a: common_vendor.t(item.date),
b: common_vendor.t(item.description),
c: common_vendor.t(item.duration),
d: index
d: common_vendor.t(item.recordingCount),
e: index
};
}),
o: $data.contentTop,

View File

@@ -1 +1 @@
<view class="feature-page data-v-582d7c51"><view class="page-header data-v-582d7c51" style="{{'padding-top:' + b}}"><view class="nav-bar data-v-582d7c51"><view class="nav-left data-v-582d7c51" bindtap="{{a}}"><text class="back-icon data-v-582d7c51">←</text></view><text class="nav-title data-v-582d7c51">录音时长统计</text></view></view><scroll-view class="content-scroll data-v-582d7c51" scroll-y="true" style="{{'top:' + o + ';' + ('bottom:' + p)}}"><view class="search-toolbar data-v-582d7c51"><view class="toolbar-picker-wrapper data-v-582d7c51" bindtap="{{g}}"><view class="toolbar-picker-view data-v-582d7c51"><text class="toolbar-picker-text data-v-582d7c51">{{c}}</text><uni-icons wx:if="{{d}}" class="data-v-582d7c51" u-i="582d7c51-0" bind:__l="__l" u-p="{{d}}"></uni-icons></view><view wx:if="{{e}}" class="time-range-dropdown data-v-582d7c51"><view wx:for="{{f}}" wx:for-item="option" wx:key="b" class="{{['dropdown-item', 'data-v-582d7c51', option.c && 'dropdown-item-active']}}" catchtap="{{option.d}}"><text class="data-v-582d7c51">{{option.a}}</text></view></view></view><view class="toolbar-actions data-v-582d7c51"><view class="toolbar-btn toolbar-btn--refresh data-v-582d7c51" bindtap="{{i}}"><uni-icons wx:if="{{h}}" class="data-v-582d7c51" u-i="582d7c51-1" bind:__l="__l" u-p="{{h}}"></uni-icons><text class="data-v-582d7c51">刷新</text></view></view></view><view wx:if="{{j}}" class="dropdown-mask data-v-582d7c51" bindtap="{{k}}"></view><view class="stats-card data-v-582d7c51"><view class="stat-item data-v-582d7c51"><text class="stat-value data-v-582d7c51">{{l}}</text><text class="stat-label data-v-582d7c51">总录音时长</text></view><view class="stat-item data-v-582d7c51"><text class="stat-value data-v-582d7c51">{{m}}</text><text class="stat-label data-v-582d7c51">今日录音时长</text></view></view><view class="chart-section data-v-582d7c51"><text class="section-title data-v-582d7c51">时长趋势图</text><view class="chart-placeholder data-v-582d7c51"><text class="placeholder-text data-v-582d7c51">📊 图表区域</text><text class="placeholder-desc data-v-582d7c51">此处将显示录音时长趋势图表</text></view></view><view class="data-list data-v-582d7c51"><text class="section-title data-v-582d7c51">详细数据</text><view wx:for="{{n}}" wx:for-item="item" wx:key="d" class="list-item data-v-582d7c51"><view class="item-left data-v-582d7c51"><text class="item-date data-v-582d7c51">{{item.a}}</text><text class="item-desc data-v-582d7c51">{{item.b}}</text></view><view class="item-right data-v-582d7c51"><text class="item-duration data-v-582d7c51">{{item.c}}</text></view></view></view></scroll-view></view>
<view class="feature-page data-v-582d7c51"><view class="page-header data-v-582d7c51" style="{{'padding-top:' + b}}"><view class="nav-bar data-v-582d7c51"><view class="nav-left data-v-582d7c51" bindtap="{{a}}"><text class="back-icon data-v-582d7c51">←</text></view><text class="nav-title data-v-582d7c51">录音时长统计</text></view></view><scroll-view class="content-scroll data-v-582d7c51" scroll-y="true" style="{{'top:' + o + ';' + ('bottom:' + p)}}"><view class="search-toolbar data-v-582d7c51"><view class="toolbar-picker-wrapper data-v-582d7c51" bindtap="{{g}}"><view class="toolbar-picker-view data-v-582d7c51"><text class="toolbar-picker-text data-v-582d7c51">{{c}}</text><uni-icons wx:if="{{d}}" class="data-v-582d7c51" u-i="582d7c51-0" bind:__l="__l" u-p="{{d}}"></uni-icons></view><view wx:if="{{e}}" class="time-range-dropdown data-v-582d7c51"><view wx:for="{{f}}" wx:for-item="option" wx:key="b" class="{{['dropdown-item', 'data-v-582d7c51', option.c && 'dropdown-item-active']}}" catchtap="{{option.d}}"><text class="data-v-582d7c51">{{option.a}}</text></view></view></view><view class="toolbar-actions data-v-582d7c51"><view class="toolbar-btn toolbar-btn--refresh data-v-582d7c51" bindtap="{{i}}"><uni-icons wx:if="{{h}}" class="data-v-582d7c51" u-i="582d7c51-1" bind:__l="__l" u-p="{{h}}"></uni-icons><text class="data-v-582d7c51">刷新</text></view></view></view><view wx:if="{{j}}" class="dropdown-mask data-v-582d7c51" bindtap="{{k}}"></view><view class="stats-card data-v-582d7c51"><view class="stat-item data-v-582d7c51"><text class="stat-value data-v-582d7c51">{{l}}</text><text class="stat-label data-v-582d7c51">总录音时长</text></view><view class="stat-item data-v-582d7c51"><text class="stat-value data-v-582d7c51">{{m}}</text><text class="stat-label data-v-582d7c51">录音总条数</text></view></view><view class="chart-section data-v-582d7c51"><text class="section-title data-v-582d7c51">时长趋势图</text><view class="chart-placeholder data-v-582d7c51"><text class="placeholder-text data-v-582d7c51">📊 图表区域</text><text class="placeholder-desc data-v-582d7c51">此处将显示录音时长趋势图表</text></view></view><view class="data-list data-v-582d7c51"><text class="section-title data-v-582d7c51">详细数据</text><view wx:for="{{n}}" wx:for-item="item" wx:key="e" class="list-item data-v-582d7c51"><view class="item-left data-v-582d7c51"><text class="item-date data-v-582d7c51">{{item.a}}</text><text class="item-desc data-v-582d7c51">{{item.b}}</text></view><view class="item-right data-v-582d7c51"><text class="item-duration data-v-582d7c51">{{item.c}}</text><text class="item-count data-v-582d7c51">{{item.d}}</text></view></view></view></scroll-view></view>

View File

@@ -236,4 +236,10 @@
font-size: 28rpx;
font-weight: bold;
color: #007aff;
margin-bottom: 4rpx;
}
.item-count.data-v-582d7c51 {
display: block;
font-size: 24rpx;
color: #666666;
}