Commit Graph

165 Commits

Author SHA1 Message Date
浅念 ddeda3fa22 feat(management): client补员工详情/分段接口+时间预设补今日昨日本周上周
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 11:07:25 +08:00
浅念 10b7e5e534 fix(management): 待回复/风险卡标注时点口径——当前指标不随窗口,防管理者误读(批次C终评I1) 2026-09-10 10:45:16 +08:00
浅念 3cf77ec6d5 feat(management): 管理驾驶舱页——KPI/双趋势/生命周期/维度分布/异常两次点击到事实
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 10:38:05 +08:00
浅念 7343e1c9aa feat(management): 经营管理导航分组+驾驶舱路由 2026-09-10 10:20:13 +08:00
浅念 5196a72ac2 feat(management): 驾驶舱六组件——KPI卡/筛选栏/异常榜/下钻抽屉/口径抽屉/数据截至角标+时长比率格式化共享
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 10:15:10 +08:00
浅念 df8d2b30d5 feat(management): useManagementFilters——URL query 真源/预设窗/渠道哨兵
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 10:02:35 +08:00
浅念 c56f13059d fix(group-stats): 群统计「查看详情」进纯聊天窗——无会话侧栏,操作列单按钮
用户反馈:微信群统计列表点查看聊天记录进入的页面带「好友列表/群列表」
侧栏不合适——云客该入口是专注的群详情聊天页(截图验证:无会话侧栏,
仅系统菜单+群名+工具栏+消息流)。

- ChatTimeline 增 bare 专注模式(?bare=1 隐藏会话侧栏);员工聊天窗口
  入口(不带 bare)侧栏常驻——昨天 WA 侧栏修复的场景不受影响
- GroupList 微信 tab 操作列精简为单按钮「查看详情」(=查看聊天记录,
  跳 bare 模式;导出HTML移除——聊天页头部本有导出),WA tab 不动

本地双路径验证:bare 无好友列表/有群聊标题;无 bare 侧栏在;列表点击
跳转 ?bare=1 正常。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 09:58:22 +08:00
浅念 7b0e1601b7 feat(management): 前端API client——管理端点typed契约(批次B冻结面)
对批次B as-built逐键核对后相对任务稿的修正(以真机响应为准):
- DashboardResp 补 caliber_notes(总述口径说明)
- DrilldownResp 补 page/page_size/scope(各分支均返回)
- FactDrillRow 补 chat_hint(owner+talker 直达聊天记录)
- LifecycleDrillRow.nickname 收窄为非空(后端 friend_id 兜底)
- EmployeeRow.metrics 注明 user_id 键为字符串透传字段

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 09:57:44 +08:00
浅念 b0ebe8a15a feat(group-stats): 微信群列表对齐云客「微信群统计」——getChatroomList 数据源+窗内统计
用户报微信群列表数据/内容不对,应对齐云客「沟通→微信号管理→微信群统计」
(/cms/wechat/wechatgroup)。真机探明(表单登录+页面导航抓 network):

- 数据源=POST /wechatweb/chatroom/getChatroomList(form:departmentId+
  startTime/endTime 窗+分页;信封 data.overviews[]/totalCount 1,854 行)
- 云客窗是任意时间窗实时算:沟通消息数实测同群全史 417/7天 36/单日 6
- **修正存量映射错误**:member_count 原存 friendNum(员工好友数),真群成员
  数是 friendCount/getChatroomList.memberCount
- 新增/退出成员数云客按窗实时算,本地无事件流 → 按天积累

实现:
- ChatGroup 补 group_remark 列(备注仅 friend_list/es 携带,两归一化均
  「有值才写」防互清);迁移含存量 raw_json 回填(须先于基线抓取执行)
- 新表 chat_group_member_stats(渠道×账号×群×天一行 added/lost)
- 新实体 chatroom-stats:全窗刷档案列(真成员数/群备注/员工信息,owner
  经 wechat_account alias 解析)+ --day 单日窗落进出日行;full_sync 5c 步
- /api/groups 扩展:msg_start/msg_end 窗内聚合(window_msg_count=
  msg_daily_stats 按天和、window_added/lost=日表和)、last_start/end
  最新消息窗、group_remark 子串;行补员工微信/员工信息关联列
- GroupList 微信 tab:统计时段(默认近7天)/最新消息时间段/群名称/群备注/
  员工下拉/查询 + 9 列(群信息|群备注|员工微信|员工信息|群成员数量|
  新增成员数|退出成员数|沟通消息数|操作);WA tab 不动

700 测试绿(新增窗聚合/筛选/员工列 3 例)。本地实测:基线 1,854 群=云客
total 一字不差,今日日窗 added 407/lost 166 落表,页面 9 列/员工列渲染正常。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-09 18:09:20 +08:00
浅念 5bfcebf20c fix(wa-chat): 群聊路由侧栏常驻——点群后「好友列表/群列表」不再消失
用户报 WA 聊天页点群列表里的群,跳到聊天框后侧栏(好友列表/群列表)
没了。根因:ChatTimeline 模板里 ChatSidebar 挂了 v-if="!isGroup"——
群路由(roomId 有值)下直接不渲染,是早期群聊独立页的设计遗留;
onSelectSession 本就支持好友/群双类型导航,侧栏组件自带好友/群过滤。

修:去掉 v-if 侧栏常驻,群聊中可随时切换好友/群会话(对齐云客体验)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-09 14:34:03 +08:00
浅念 d42895337d feat(link): customer_account_link 账号↔客户多对多——共享好友员工维度对齐云客
用户报「Lily 好友数 36,点进员工客户页只有 12」。真机探明根因:那 24 个
是共享客户(同一人加多个员工),云客 per-employee 各算一个;而 customer
表 PK=friend_id 全局单行、归属 last-wins,其他员工名下必然「消失」。
抓取器本身每员工都拿全了(日志 declared=36 rows=36),丢在入库模型层。

- 新表 customer_account_link(渠道×账号×客户一行,per-relation 快照:
  昵称/备注/头像/手机号/收发计数/最近沟通/add_time/fromType/isDel)
- 写:repos.upsert_customer 随档案同事务维护(所有好友抓取路径一处挂全);
  新增 prune_customer_links 对账
- 读:/api/customers?owner_account_id= 改读 link(与云客 contacts_num 口径
  一致);该账号 link 为空时回退档案路径(过渡安全);与 dept/user 等
  过滤组合时维持旧行为;CustomerOut 透传 from_type
- 抓取器:friends/wa-friends 逐员工整批 upsert 后按名单对账(取满声明
  total 才删,防半份名单误删)
- 前端:StaffFriends 数据来源列优先 link 的 from_type

611 测试绿(link 新 6 例);本地验证空表回退/造数接管/from_type 透传。
上线后需重跑 friends+wa-friends 回填 link(存量关系无法从档案反推)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-08 17:17:06 +08:00
浅念 2e526cd056 feat(staff-friends): 员工客户列表独立页——对齐云客员工详情,好友数/微信群数下钻
员工列表点「好友数」原先跳全局 /customers?owner_account_id=x,布局与全局
列表无异且计数/分页绑全局声明口径(同日 dfa4fdd 修的显示 bug),与云客
「员工名下客户列表」体验割裂。新页 /staff-friends/:ownerId/:tab:

- 微信客户/微信群两 tab(对齐云客截图);标题=员工显示名(入口直带,
  直链经 /api/accounts 解析),返回箭头回员工列表
- 搜索(昵称/微信号/备注名/手机号,服务端 q)+ 查询/导出 CSV
- 发送/接收条数=Customer.send_num/receive_num 累计值(CustomerOut 补
  两列,同步自云客 friend 记录,与截图同源)
- 勾选批量「导出聊天记录」:新端点 GET /api/export/chat-html-zip,复用
  chat-html 渲染器每会话一个 HTML 打 zip(文件名=备注>昵称>friend_id,
  非法字符清洗;单会话 5000 行截断告警;一次上限 50 会话防误选打爆)
- 行内:查看聊天记录→staff-chat;导出HTML聊天记录(时间范围弹窗)
- WA 行保持原入口(该页暂仅微信)

后端 605 测试绿(zip 新 4 例);本地浏览器端到端验证:过滤 9 条/勾选
激活/群 tab/返回箭头;zip 产物 application/zip 双会话双气泡。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-08 16:14:44 +08:00
浅念 dfa4fdd420 fix(customers): 好友数跳转分页用真实过滤数——声明口径仅无过滤时展示
员工列表点「好友数」跳 /customers?owner_account_id=x 后,头部计数与
el-pagination 的 :total 都绑 declaredTotals(云客口径全局声明值,Σ员工
好友数,不吃任何过滤)——列表只有该员工 9 条,分页却按全部客户 8956 条/
1792 页展示,用户报「不是员工下面的好友列表」。

修:新增 displayTotal()——无过滤时保持声明口径(页脚对齐云客的产品
定调不变),department/owner 任一过滤生效时回到 tabState 真实 total。
头部计数与微信/WA 两处分页器三处统一走它。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-08 14:27:25 +08:00
浅念 9d3cc8e76e fix(messages): 聊天记录大对话超时——DESC首屏+keyset游标+群聊直达索引
用户报:聊天记录多时「聊天记录加载失败:请求失败 (ECONNABORTED)」(2026-09-07)。
服务器 EXPLAIN ANALYZE 实测两级根因:
- 单聊 1 万条:ASC 末页 OFFSET 10486 逐条回表 2515ms(DESC LIMIT 15ms,167 倍);
- 群聊 16,290 条:查询刻意不带 owner(chat_group 去重后 owner 错位),现有
  (channel,owner,room,timestamp) 索引被 owner 挡住,退化到 room 单列索引+
  filter+filesort——count 4.7s/首页 5.1s/末页 10.7s;真凶群 53132846289@chatroom
  40,863 条,三段串行 ~40s 必撞前端 axios 15s 超时。

修法(不动共享 MySQL 配置,沿用既往修复模式):
1. 迁移 e6f7a8b9c0d1:message 补 (channel, room_id, timestamp) 索引,群查询
   seek+排序直达+覆盖 count;模型侧双声明防 autogenerate 反 DROP。
2. /api/messages 加 order=asc|desc(默认 asc 不变)与 before_ts/before_id
   keyset 游标(成对,单传 422)——排序列 (timestamp,msg_id) 全序,平手按
   msg_id 决胜,游标页恒 O(page_size)。
3. 前端 ChatMain/ChatTimeline 首屏改「order=desc 取最新 50 反转」单请求
   (原 page1 拿 total+深 OFFSET 末页两请求),「加载更多」改游标上翻;
   hasMoreOlder=已加载<总数。SessionPane 搜索等 order=asc 默认路径不受影响。

本地实测(37,532 条群):desc 首页 0.39s、游标上翻 0.24s,浏览器真机
渲染+上翻 150 条无错。测试 8 增(desc/游标/平手边界/422/窗口叠加/
前端流程不变式),全量 601 绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 16:59:04 +08:00
浅念 085a9b4fd3 feat(analytics): 管理层指标呈现——首响回复率上墙/客户资产总览/自定义日期/排行五新列
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 14:41:08 +08:00
浅念 39791b2a49 fix(analytics): 排行条形图按当前指标重排——切活跃客户/通话量不再沿用消息量序
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 13:54:13 +08:00
浅念 bbfad520f2 feat(analytics): 员工排行条形图对比+近30天范围——幅度一眼可读/本地停更窗口也可用
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 13:43:23 +08:00
浅念 1aadc80d6b feat(analytics): 看板v2全平台口径——默认双渠道合计/拆分小字/双线趋势/跳转带query预选
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 12:20:18 +08:00
浅念 9f2dff08d9 fix(analytics): 趋势图可读性——摘要行/轴刻度稀疏与大数万化/实线细网格/峰值标注/均值参考线
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 11:56:48 +08:00
浅念 487f45b074 feat(analytics): 看板管理化补强——员工活跃排行表+预警行动入口卡片
管理者反馈「纯汇总数字看不到有用信息」:overview 载荷扩
staff_ranking(全员行:msg_total rollup 优先/空表回退 msg_daily_stats
聚合,active_* 两路径统一走 msg_daily_stats 窗内 distinct peer——
stat_daily_staff 的 active_* 是当日快照,跨日 SUM/MAX 语义皆错;
call_cnt 按 user_id 落窗直查;环比同期对齐)+ actions(该回未回 2h/
真流失 30d/敏感词 pending,复用已测试查询路径各取 total)。

前端看板:toolbar 下三张可点行动卡(0 灰显仍可点,直达处置页,
随 channel 切换刷新)+ 趋势卡下员工排行表(max-height 420 滚动,
未映射小 tag,环比色同卡片惯例 None 显 '-')。

测试 574→577 全绿(rollup 聚合/回退/行动计数三新);build 过。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-07 11:48:24 +08:00
浅念 c2d6d6feba fix(analytics): 敏感词页单字预览提示+文案耦合注释+处置按钮状态统一
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 23:11:47 +08:00
浅念 518d02bc8f feat(analytics): C1 敏感词页——词库CRUD/预览警示/批量处置/上下文跳转
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 23:03:35 +08:00
浅念 7f32f1a43c fix(analytics): 该回未回默认2h对齐spec口径+提示class统一
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 22:42:29 +08:00
浅念 1ba6768a46 feat(analytics): B2 该回未回页——时长筛选/等待着色/msgid定位跳转
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 22:33:32 +08:00
浅念 54ed7e745b fix(analytics): 流失页导出成功提示与空检+排序仅当前页提示
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 22:24:08 +08:00
浅念 1650a050e6 feat(analytics): A3 流失预警页——三分法/分层/CSV导出/跳聊天
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 22:14:30 +08:00
浅念 4ac73fff49 fix(analytics): 看板异常明细诊断优先排序+角标复用formatTimeShort+health解耦
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 22:02:41 +08:00
浅念 4cec162f53 feat(analytics): A1 数据看板页——卡片/异常警示/趋势折线/数据截至角标
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 21:48:55 +08:00
浅念 5fb19dd3ac feat(analytics): 前端板块骨架——echarts按需/useChart/路由/侧栏组/API模块
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 21:25:48 +08:00
浅念 c31d1cc450 fix(nginx): /api 反代按 TTL 重解析 backend DNS——根治 IP 漂移后 502
nginx 对 hostname 的 proxy_pass 只在启动时解析一次并永久缓存,backend
重建或网络栈劣化后持续 502(2026-09-03/04 两次实战,重启 frontend 才恢复)。
改用 docker 内嵌 DNS 127.0.0.11 + resolver valid=10s + variable
proxy_pass(不带 URI,仍转发原始 /api/... 完整路径,行为不变)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-04 09:55:54 +08:00
浅念 e3f7aa1304 fix(auth): 登录页不再套 MainLayout(public 路由全屏裸渲染)
App.vue 按 route.meta.public 切换:登录页直接出 router-view,其余才带
侧栏布局 — 否则登录页嵌在侧栏旁边,布局错乱。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-03 15:26:48 +08:00
浅念 6880ff1b97 feat(auth): 登录页(用户名/密码换 API token)+ 前端全链路登录态
后端:
- POST /api/auth/login:admin 账密(Settings 默认 admin/admin123,
  ADMIN_USER/ADMIN_PASSWORD 可覆盖)换取共享 api_token,免 token 中间件
- 防爆破:同 IP 15min 窗口内 5 次失败锁 15min(429),成功登录清零
- 错误信息统一「用户名或密码错误」(防用户名枚举)
- 测试 7 个新增(TDD),全量 500 绿

前端:
- LoginView + 路由守卫(未登录跳 /login,回跳 redirect)
- axios 请求拦截器自动带 Bearer;401 清登录态回登录页
- 媒体直链统一 mediaUrl() 带 ?token=(img/audio 标签发不了 header),
  替换 4 处裸拼;downloadBlob 手动带头
- isLoggedIn 按 key 存在判定 — 后端鉴权关闭时空 token 不锁死登录页
- MainLayout 侧栏底部退出登录

compose:两份编排透传 ADMIN_USER/ADMIN_PASSWORD(默认 admin/admin123)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-03 15:03:20 +08:00
浅念 974929e091 feat(deploy): 阿里云ECS+1Panel 服务器部署方案落地
- docker-compose.server.yml:生产编排(复用 1Panel MySQL、去 mysql/redis、
  端口仅绑 127.0.0.1、TZ=Asia/Shanghai、MYSQL_HOST 必填守卫)
- 两份 Dockerfile 内置国内构建源:apt/pip→阿里云,npm/playwright→npmmirror
  (ECS 上直连官方源慢/超时;对本地构建同样可用)
- DEPLOY.md 重写为 v2 runbook:单站点反代架构、mysqldump+media 搬迁管道
  (ngram 索引导入重建 ~12min)、验收清单、运维表、本地停 scheduler 收尾

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-01 16:38:05 +08:00
浅念 9ba8063ca8 feat(chat): 跳转入口全部改为全时段进入(用户定调:聊天记录不做时间限制)
排查全部聊天展示路径后清掉最后的两处带窗跳转:CallList 通话行的「通话
当天」定位窗(当日早些时候为对齐云客 ?start= 加的)与 StaffList 统计弹窗
的统计时段窗;WA 分支的 ?start= 本就被 ChatTimeline 的 start+end 成对
校验忽略,属死代码一并移除。现状:所有聊天视图默认全部时间(会话列表/
消息接口本就无时间下限),日期过滤只保留聊天窗内的手动日期选择器。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-27 16:30:52 +08:00
浅念 6de1662131 feat(staffchat): CallList/SearchView 微信行切新员工聊天窗口(入口改造收尾)
与 StaffList/CustomerList 同口径:微信行→staff-chat 新窗(单聊=single tab,
群语音/@chatroom 消息=group tab),WA 行保留旧 ChatTimeline(ChatTimeline
保留给 WA)。通话行跳转带「通话当天」整天下窗——语音通话本身是消息流里的
voice_call 行,当天窗必含该通通话,等价实现旧页 ?start= 滚动定位(新窗
rangeFromQuery 需 start+end 成对)。SearchView 客户抽屉同 CustomerList。

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

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-27 15:15:41 +08:00
浅念 7e8624674e fix(staffchat): SessionPane 补请求序号防竞态(对齐全 pane 惯例)+置顶卡不显今日红点(spec §5)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 21:03:36 +08:00
浅念 e602822dfb fix(staffchat): useStaffProfile 在途Promise去重(防重复请求+缓存投毒)+load(force)真重载
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 20:13:46 +08:00
浅念 50635d0df8 feat(staffchat): 入口改造(StaffList/CustomerList微信行切新页)+useStaffProfile缓存+StatsPane固定列/金额格式+vitest依赖化
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 19:56:22 +08:00
浅念 4c3bc3ee93 feat(staffchat): 统计分析7tab(分型明细列+计数徽标+近7天窗+msgid定位,对齐云客)
- StatsPane 占位替换: 7 tab(label 带 (N) 计数)+daterange 默认近7天(清空后端兜底)
- 明细列配置驱动(KIND_COLS);link 列跳 single/group 聊天;红包/转账行带 ?msgid 定位
- 语音通话列对齐 CallList(通话人/类型/呼入呼出/接通状态/时长/录音播放 dialog/时间/操作)
- 敏感词 tab 空态卡(词库未配置,待 C1 接入,零请求)
- 员工微信列用资料卡信息(明细行无 staff 字段,数据本属该员工)
- counts 与明细解耦;双 seq 竞态守卫(兄弟组件惯例)
- api: getStaffStatsDetail kind 收紧为 StaffStatsKind 联合(后端 Literal 6 值)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 19:32:14 +08:00
浅念 8dba4a6104 fix(staffchat): ContactsPane 加请求序号防 ownerId/翻页切换竞态(对齐 ChatMain/MomentsPane 惯例)+修正跨tab关键词注释
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 19:06:55 +08:00
浅念 0371484dad feat(staffchat): 通讯录(客户表+群表列对齐云客+批量勾选导出+分页)+朋友圈翻页失败内联重试
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 18:56:02 +08:00
浅念 328aec80bc feat(staffchat): 朋友圈feed(作者卡+九宫格预览+点赞列表+滚动翻页,对齐云客)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 18:30:45 +08:00
浅念 91639b28d8 fix(chat): loadInitial/loadTalkerName 加请求序号防会话切换竞态(ChatMain+ChatTimeline同修)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 18:20:14 +08:00
浅念 3aaf4ec8fa feat(staffchat): 消息右列(近14天默认窗+9类类型过滤+msgid定位+导出,复制改造自ChatTimeline)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 18:10:30 +08:00
浅念 98fb4b8248 fix(staffchat): 回list模式重载会话列表(修复search期间切tab后列表与高亮标签矛盾的残留边缘)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 17:45:55 +08:00
浅念 026381f6e6 fix(staffchat): 搜索聚合取最新命中(ASC页1陷阱)+tab切换不清搜索结果+is_send守卫兜底名+截断提示+TAB_KEYS单源
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 17:42:43 +08:00
浅念 0f7dee9693 feat(staffchat): 会话中列(双模式搜索+已删除好友tab+置顶区+相对时间,样式沿用墨玉主题)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 17:28:45 +08:00
浅念 eb0388c8b0 feat(staffchat): 页面骨架+左侧资料卡/5导航/折叠(三栏布局对齐云客)
- StaffChat.vue: 路由驱动 tab(single/group/moments/contacts/stats)+折叠态,
  三栏 flex(左栏240/中列280/右列flex:1,高calc(100vh-120px));资料卡走
  getAccounts(channel=wechat) 按 account_id 匹配,失败退 ownerId 兜底
- StaffChatSide.vue: 员工资料卡(头像/昵称/真名·电话/微信号)+竖排5导航+
  底部收起;墨玉主题沿用 ChatSidebar 手法(点阵底/玉绿渐变分隔线/药丸按钮)
- 5 占位组件(SessionPane/ChatMain/MomentsPane/ContactsPane/StatsPane),
  defineProps/defineEmits 签名按 Task 10-14 锁定
- relativeChatTime 签名可空友好(ms?: number|null,null→''),spec+1例

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 17:03:19 +08:00
浅念 f2bcac0a4d feat(staffchat): 路由+API client+类型+relativeChatTime(还原旧页WIP+占位StaffChat)
- 还原 ChatTimeline.vue/api/index.ts 未提交 WIP(新页自建,旧文件回 HEAD)
- /staff-chat/:ownerId/:tab?/:talkerId? 路由 + 占位 StaffChat.vue(Task 9 替换)
- types: MomentsPost/MomentsList/StaffStatsCounts/StaffStatsDetail +
  ChatSession.pinned + Account.avatar
- api: getMoments/getStaffStatsCounts/getStaffStatsDetail + sessions
  is_del + messages msg_type/q 过滤
- format: relativeChatTime(今天HH:mm/昨天/M月D日/YYYY年M月D日) + 4 例
  vitest spec(全过,vitest 未入 devDependencies,npx 拉取运行)
- tsconfig.app.json exclude __tests__(vitest 未装,保持 vue-tsc 通过)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 16:45:30 +08:00