fix(staffchat): 聊天窗默认时段改全部时间+空态分语(用户报很多聊天记录空的)

defaultRange() 默认近 14 天窗,实测 78% 群(766/979)/89% 单聊(9374/10497)
的最新消息在任意 14 天窗外——这些会话打开即全空(典型:张士蓓「11台长安X5」
1016 条消息全在 7-27 前,默认窗滤成 0 条,云客后台却看得到)。云客默认直接
展示最近消息不限窗,对齐改为默认全部时间;首屏本就跳最后一页看最新+上翻
加载更旧,全量窗下首屏仍只拉一页。空态分语:有窗=「所选时间范围内无消息,
清空日期窗可查看全部」,无窗=「该会话无聊天记录」(真没聊过)。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-27 15:15:41 +08:00
parent b2ccbee1ab
commit 2c5cea1565
+11 -14
View File
@@ -1,6 +1,6 @@
<!-- 员工聊天窗口右列消息流(对齐云客 wechat-window 聊天区): 复制改造自
ChatTimeline.vue 的主区(尾页落地分页/气泡/详情 drawer/导出全套),差异——
① 默认近 14 天窗(清空=全部时间) ② 9 类类型下拉(msg_type 服务端过滤)
① 默认全部时间(可选日期窗) ② 9 类类型下拉(msg_type 服务端过滤)
③ ?msgid= 定位滚动+高亮 ④ 无返回按钮/无 sidebar(左侧由 StaffChatSide+
SessionPane 承担)。
根元素必须保持单 div——父组件 StaffChat 靠 attrs fallthrough 挂 sc-root__chat 列宽。 -->
@@ -101,18 +101,12 @@ const conversationTitle = computed(() => {
return isGroup.value ? `群聊记录 · ${displayName}` : `与 ${displayName} 的聊天记录`
})
// ── 日期窗:云客对齐,默认近 14 天;清空 = 全部时间(null) ─────────────────────
// ── 日期窗:默认全部时间(null);选窗后按窗过滤,清空回到全部 ──────────────────
// route.query 合法 ms start/end 仍优先(带日期窗的跳转入口,如红包明细)。
/** 近 14 天窗:今天往前 13 天的 00:00:00 ~ 今天 23:59:59.999。 */
function defaultRange(): [Date, Date] {
const end = new Date()
end.setHours(23, 59, 59, 999)
const start = new Date()
start.setDate(start.getDate() - 13)
start.setHours(0, 0, 0, 0)
return [start, end]
}
// 2026-08-27 前 defaultRange() 默认近 14 天——实测 78% 群/89% 单聊的最新消息
// 在任意 14 天窗之外,这些会话打开即全空(用户报「很多聊天记录都是空的」);
// 云客默认直接展示最近消息不限窗,故对齐改为默认全部。前端本就「首屏跳到
// 最后一页看最新 + 上翻加载更旧」,全量窗下首屏仍只拉一页,性能无忧。
function rangeFromQuery(): [Date, Date] | null {
const s = route.query.start,
@@ -125,7 +119,7 @@ function rangeFromQuery(): [Date, Date] | null {
return null
}
const dateRange = ref<[Date, Date] | null>(rangeFromQuery() ?? defaultRange())
const dateRange = ref<[Date, Date] | null>(rangeFromQuery() ?? null)
const winStart = computed(() => dateRange.value?.[0].getTime())
const winEnd = computed(() => dateRange.value?.[1].getTime())
const keyword = ref('')
@@ -442,7 +436,10 @@ const drawerTitle = computed(() => {
</div>
<template v-if="messages.length === 0 && !loading">
<div class="yk-empty">暂无聊天记录</div>
<!-- 空态分语:有日期窗=窗滤空(提示可清窗),无窗=真没聊过 -->
<div class="yk-empty">
{{ dateRange ? '所选时间范围内无消息,清空日期窗可查看全部' : '该会话无聊天记录' }}
</div>
</template>
<template v-else-if="visibleMessages.length === 0 && keyword && !loading">
<div class="yk-empty">当前已加载消息中无匹配</div>