浅念
3699ec6d3b
fix(ui): 员工详情页接入卡片化美化(选择器扩展到独立页)+WA客户tab每页10条(微信保持5)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-24 10:17:18 +08:00
浅念
0202dbc336
feat(ui): 详情抽屉全面美化(卡片式信息档案风格,覆盖8个页面的全字段抽屉)
...
- 头像区:渐变名片卡+玉绿头像框+身份绿点
- KV网格:双列卡片+行悬停高亮+分区玉绿竖条标题
- 顶栏:毛玻璃悬浮;图片:圆角阴影+悬停放大;背景:点阵纹理
- 零组件改动(纯CSS全局层,!important覆盖各页scoped样式)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-24 10:05:13 +08:00
浅念
a8b8d9d81c
fix(export+calls): 同类owner错位问题全面修复(群导出不按owner过滤+群语音客户点击走群聊路由)
...
- /api/export/chat-html: room 查询忽略 owner(chat_group owner 错位同
ChatTimeline,群列表/聊天页的导出按钮原来会导出空文件)
- CallList viewCallCustomer: talker 以 @chatroom 结尾→group-chat 路由
(原走 1:1 路由按 talker_id 查@chatroom 恒空)
- TDD: 群消息在 ownerB 名下用 ownerA+room 导出仍能拿到;428 测试绿
- 实测:错位 owner 导出 43304 群返回 15002 个消息元素
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 17:00:43 +08:00
浅念
4f375c3d71
fix(chat): 群聊消息查询不带owner(chat_group按room去重owner被末位员工覆盖,与消息归属错位查空)
...
room 全局唯一且消息只在单一owner名下(多owner群=0),按room查即正确;
MessageQuery.owner_account_id 改可选。实测43304群6000条正常显示。
16个活跃群0条消息=增量未覆盖,4h调度自动补
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 16:50:56 +08:00
浅念
d08255696c
fix(ui): 进场动画改纯opacity(transform残留值把fixed抽屉裁成半截)
...
transform:translateY(0)结束后仍是非none transform→创建containing block
→position:fixed的抽屉相对列表卡片定位被裁剪;opacity动画无此副作用
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 16:21:12 +08:00
浅念
b9d250cdc1
fix(chat): 默认时间窗改全部时间(原近2周把老对话过滤成空——7-26的对话打开显示暂无聊天记录)
...
点「查看聊天记录」就该看到记录;需要过滤再手动选日期(已开clearable,
清除即回全部);stat-modal 带窗入口(?start&end)不受影响
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 16:16:01 +08:00
浅念
4056dfb49e
feat(ui): 客户列表默认每页5条(选项加5,用户偏好)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 16:02:07 +08:00
浅念
01842a0abf
feat(ui): 可点击元素统一玉绿示意(链接悬停下划线+行悬停首列染玉绿+会话侧栏玉绿激活;修StaffList灰色覆盖把link按钮染灰的bug)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 15:54:05 +08:00
浅念
12097df9f1
feat(ui): 墨玉控制台主题(深墨侧栏+玉绿主色+暖纸内容区,组件零改动)
...
- 侧栏:深墨渐变底+品牌玉点+玉绿激活竖条(微光)+右缘渐隐线
- 主色:Element 全系覆写为玉绿(#0d9f6e,微信血统精炼)
- 内容区:暖纸底+极淡点阵纹理;页面进场微上浮动画
- 卡片:10px圆角+双层阴影+jade hover;表格:精致表头+玉绿行hover+tabular数字
- 聊天流:纸面质感底;细滚动条;输入/按钮圆角统一
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 15:38:03 +08:00
浅念
a290e39523
feat(customers): 发送/接收列改今日口径(对齐云客;本地消息表Asia/Shanghai今日聚合)
...
- CustomerOut 加 send_today/receive_today(路由赋值,非ORM列)
- /api/customers 每页一次 GROUP BY(owner IN 走复合索引前缀)
- 前端列优先今日值,无消息数据回退原raw字段;列名对齐云客「发送条数/接收条数」
- TDD:今日3发2收+昨日不计入+无消息客户0
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 14:39:17 +08:00
浅念
00ae13b5c2
feat(deploy): 完成数据迁移与MySQL全链路(14表698k消息100%一致+5方言补丁+bind mount)
...
- migrate_sqlite_to_mysql.py: 逐表清空重导(幂等),复用repos强转,JSON列
解析,67万消息按msg_id键集分批,467s跑完14表全一致
- 修4个MySQL实测bug: NULLS LAST语法(compat.py编译补丁)、message.text
TEXT→MEDIUMTEXT(64KB字节上限,实测20.8万字符车源清单)、URL列
String(1024)→Text(分享链接超1KB)、垃圾超长member_id源头清理
- compose: media改bind mount(不占C盘Docker虚拟磁盘,实测2.5GB卷把
C盘撑爆引擎500);mysql不映射宿主机3306
- 前端Dockerfile: npm ci→install(本地/容器npm版本锁漂移)
- 五服务实测:nginx→backend→MySQL全链路返回真实数据(客户6859/A**杰25条
/搜索56条),媒体49536文件bind mount直读
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-22 12:40:44 +08:00
浅念
ce5cada898
feat(chat): 归属账号显示昵称(账号表查询,昵称+ID并列,回退原始ID)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 15:34:17 +08:00
浅念
ff73c056e9
feat(chat): 聊天排版升级微信标准(左右分侧+头像+绿气泡)+is_send数据修复
...
- is_send 根因:云客消息方向在 mine 字段(isSend 全 null),归一化加 fallback
+存量回填 60.7 万行(51万收/16万发)——分侧数据首次完整
- MessageBubble:头像(对方=raw headUrl 在左/自己=默认在右)、自己侧隐藏昵称、
接收白底描边/发送微信绿 #95ec69、气泡列 max-width 78%
- 实测混合对话:13发(绿+头像右)/7收(白+头像左)全部正确
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 15:26:04 +08:00
浅念
811f2bc849
fix(customers): 分页器Total也用云客口径declared(与页脚一致,微信8590/WA 11915)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 14:07:45 +08:00
浅念
edca9b4c77
fix(customers): WA客户破1万上限(逐员工uid过滤,8585→11931全量)+双渠道页脚云客口径+消息同步刷新最近沟通时间
...
- wa-friends 逐员工抓取:全局查询~1万行硬上限(云客11931只翻到10000),
uid=员工WA号过滤(真机验证 declared 1145→1149),total-aware翻页
- declared-total 分渠道:Σ wechat/whatsapp_account.contacts_num(8590/11915)
- 消息增量同步顺带刷新 customer.last_chat_time(云客列表按最近沟通实时
排序,快照每日一次导致顺序滞后;微信1:1+WA都加)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 14:04:06 +08:00
浅念
fd3cf0003b
feat(customers): 微信客户页脚改云客口径(Σ员工好友数声明值8590,用户选B方案)
...
- GET /api/customers/declared-total: Σ wechat_account.contacts_num
- 页脚优先显示云客口径(回退真实total);列表内容保持去重真实行
- 云客列表声明值含其ES索引重复doc(连行id都相同无法物理区分),仅对齐计数
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 13:44:39 +08:00
浅念
4aeed003a4
feat(calls): 微信语音列表加今日统计卡片+通话时间范围筛选+客户跳转带通话时间定位(对齐云客)
...
- GET /api/calls/stats:今日(Asia/Shanghai)好友呼入/外呼量+群量+时长聚合(@chatroom判群)
- CallList:5张统计卡片(仅微信语音tab)+datetimerange筛选(服务端start/end)+viewCallCustomer带?start定位
- TDD新增stats聚合测试,全量绿
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 11:08:13 +08:00
浅念
6c9245a682
fix(groups): /api/groups加room_id精确直查(群聊页群名解析,修page_size=200超限422)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-20 10:58:39 +08:00
浅念
ab5a918a3b
fix(calls+scraper): 语音群scope服务端过滤+对话发现缺口补全+抓取韧性三连修
...
- /api/calls 加 scope=friend|group(@chatroom后缀判群,与isRoom实测等价120=120),CallList去掉「全部」tab改服务端查
- 对话发现:全部customer pair ∪ 语音pair(weChatId,talker),未扫过的排最前——修复纯语音关系客户聊天记录永远空(35%语音客户pair从未扫过)
- voice-calls改浏览器直发(isRoom=0/1双趟+WA callSource=4,拦截方式已两次失效)
- 断连恢复重试30×2min(云客约3h一次断连,已实战扛过多次)
- WA messages upsert改整列表直调(_upsert_all逐条传dict被迭代成key字符串→TypeError)
- 405测试绿含scope新增3个
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-19 16:48:22 +08:00
浅念
2cdbdf7283
fix(ui): 微信群scope换列(群信息)+WA语音加操作列(播放/长语音)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 16:01:56 +08:00
浅念
aa90d9d8f2
feat(ui): 列表页移除tab结构(每渠道独立页面,由侧栏菜单驱动)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 13:41:49 +08:00
浅念
9b21584e9a
feat(ui): 左侧菜单改分组式(微信管理/WhatsApp管理+下拉子菜单,对齐云客布局)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 12:09:55 +08:00
浅念
02f95af279
fix(ui): 所有列表页默认分页改为10条(原20条)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 11:32:33 +08:00
浅念
81f4e7168f
fix(ui): 员工微信号用owner_account_id+添加类型/好友类型加标签映射
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 11:22:20 +08:00
浅念
1d2cf965e2
fix(ui): 员工微信列改为头像+昵称+微信号+手机号(对齐云客复合单元格)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 11:14:10 +08:00
浅念
8a396131c0
feat(ui): 微信客户列表补全16列(手机/描述/地区/签名/标签/员工/时间/添加类型/来源/好友类型)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 11:08:58 +08:00
浅念
d28936cf94
fix(ui): 微信客户列表列布局对齐云客(头像+昵称+微信号复合单元格)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 10:59:27 +08:00
浅念
661ecfc8c9
feat(chat): 聊天标题显示昵称(客户→昵称,群→群名,替代原始ID)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 10:54:21 +08:00
浅念
edd6a27371
feat(ui): 所有列表页加CSV导出按钮(全量拉取+中文BOM兼容Excel)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 10:31:21 +08:00
浅念
9bec4dd7c8
feat(ui): 去掉顶部渠道筛选(与列表tab重复)+标题移到侧栏
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-15 10:19:24 +08:00
浅念
719bbeecce
feat(ui): 左侧改垂直菜单(替换部门树)+顶部只留标题和渠道筛选
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-14 18:05:39 +08:00
浅念
2154d050e5
fix(media): image_legacy渲染+下载覆盖+WA raw_json URL回退
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-13 14:02:42 +08:00
浅念
9e4a5ee536
fix(ui): StaffDetail分页查找+SmsList日期筛选+SyncStatus自动刷新
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-12 14:09:43 +08:00
浅念
9a953553ec
fix(xss+perf): SearchView XSS消除(无v-html)+room_id索引+pool_recycle
...
- SearchView.vue: 用 highlightSegments() 返回 {text,hit} 数组替代 v-html+escapeHtml+regex,模板用 <template v-for> + <mark>/<span> 渲染,从结构上消除 XSS 风险(4 处 v-html 全部移除: 消息片段/客户昵称/realName/手机号)
- models.py: Message 新增 ix_message_channel_owner_room_time(channel,owner_account_id,room_id,timestamp),群聊查询过滤 room_id 而非 talker_id,原 talker 索引无法覆盖
- migrations/d8eee96cd017: 新增 room_id 索引的 upgrade/downgrade (offline SQL 已验证)
- base.py + scheduler.py + cli.py: 所有生产 create_async_engine 增加 pool_recycle=3600,在 MySQL wait_timeout(默认 8h)断连前主动回收
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-12 11:50:45 +08:00
浅念
5ce33232c1
feat(sync): 聊天图片本地化(message media_hash+download_message_images+local-first rendering)
...
- Message 模型新增 media_hash 列 (sha256 FK -> Media.media_hash)
- Alembic 迁移 e5f6a7b8c9d0_message_media_hash (batch_alter_table, SQLite/MySQL 通用)
- app/scraper/media.py:download_message_images 批量下载器,镜像 download_call_recordings
- 候选: media_hash IS NULL AND channel IN ('wechat','whatsapp') AND type IN ('image','video','file') AND 任一 file_*_url LIKE 'http%'
- image 类型优先 file_th_url (缩略图,小快省),video/file 优先 file_url
- per-row try/except + per-run tried set,失败不挂循环
- sync_message_images orchestrator 入口 + ENTITY_MESSAGE_IMAGES 常量 (提交自身 SyncRun,镜像 call_recordings)
- scheduler: _run_message_images + ENTITY_FUNCS['message_images'] + 加入 daily all job (尾部)
- MessageOut schema 暴露 media_hash 字段
- MessageBubble.vue local-first: media_hash 优先 /api/media/{hash},否则回退 OSS file_url/file_th_url/file_hd_url
- types.ts: Message 接口添加 media_hash 字段
- 新增 test_message_images_downloader.py (6 tests, 镜像 test_recording_downloader)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 18:24:11 +08:00
浅念
20cf2c51f0
feat(staff): 员工详情独立页(StaffDetail.vue,替代 drawer 降级,对齐云客 userDetailNew)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 17:05:01 +08:00
浅念
17ee5a1a6c
feat(calls): 微信语音 好友/群 scope 筛选(对齐云客,client-side isRoom 过滤)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 15:25:42 +08:00
浅念
0cc9408371
feat(staff): WA员工 modal 列对齐云客(序号/员工信息/员工WhatsApp/客户WhatsApp/添加时间/最后沟通)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 14:58:38 +08:00
浅念
05d1e41d31
fix(staff): 默认统计窗改近30天(覆盖smoke.db数据范围,数字不再全0)
2026-08-11 13:53:55 +08:00
浅念
538a0dc635
feat(sync): 长语音音频本地化(voice_clip media_hash+download+local-first playback)
...
Mirror download_call_recordings pattern for voice_clips:
- VoiceClip.media_hash column + Alembic migration (c4d5e6f7a8b9)
- VoiceClipOut.media_hash + frontend VoiceClip.media_hash type
- download_voice_clip_audio in app/scraper/media.py (resilient, sha256-dedup,
same download_url/upsert_media helpers as call recordings)
- sync_voice_clip_audio orchestrator wrapper (commits own SyncRun, mirrors
sync_call_recordings semantics)
- scheduler: _run_voice_clip_audio + ENTITY_FUNCS['voice_clip_audio'] +
appended to daily _run_all job (after voice_clips)
- VoiceClipModal playClip local-first: /api/media/{media_hash} with OSS
oss_file_name fallback (mirrors CallList.playRecord)
Tested: 376 pytest pass; vue-tsc clean; migration applied; 1523/1533 clips
localized (10 pending are genuine upstream HTTP 404s — resilient skip).
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 12:06:26 +08:00
浅念
8b19c299bb
feat(calls): WA语音 单元格可点(客户→WA chat,员工→drawer)+ chatChannel helper
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 11:59:56 +08:00
浅念
2b2f863800
feat(calls): VoiceClipModal 录音异常检查(本地元数据标记+仅看异常筛选)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 10:50:49 +08:00
浅念
9da272b992
feat(calls): voice_clip 手动匹配(voice_clip↔customer 本地关联写操作)
...
- VoiceClip: 新增 matched_friend_id 列 (String(128), nullable) + alembic 迁移 b3c4d5e6f7a8
- PATCH /api/voice-clips/{id}/match: friend_id 关联 / null 取消 (本地写, 不回写云客)
- GET /api/voice-clips: 批量解析 matched_friend_name (remark>nickname>real>id)
- VoiceClipModal: 已匹配客户列 + 匹配/取消匹配按钮 + 嵌套客户选择 picker (默认按员工列客户, 名搜索走 /search)
- 测试: 17 passed (新增 7 个 match 用例覆盖 set/clear/name 解析/404)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-11 10:43:34 +08:00
浅念
f1b5861b35
feat(calls): VoiceClipModal 只读长语音列表+播放,接入 CallList(微信+WA语音)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-10 18:37:29 +08:00
浅念
4ee19cb9d9
chore(ui): 删除冗余 AccountList 页,/accounts 重定向 /staff(总 spec 收尾)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-08 17:16:26 +08:00
浅念
bb328ac59a
feat(chat): ChatTimeline 导出按钮 + 修复 downloadBlob 文件名丢失(Content-Disposition)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-08 17:07:58 +08:00
浅念
5bf5e25bad
feat(calls): CallList 微信语音 客户/员工/姓名 单元格可点(复用聊天导航,对齐云客)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-08 16:19:21 +08:00
浅念
239f07e7a1
feat(chat): 页内日期选择器(跨会话持久)+ 关键词搜索(已加载页过滤)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-08 15:29:19 +08:00
浅念
8f166a9c18
feat(chat): ChatTimeline 双栏化(左会话列表)+ 路由可选参 + badge 账号级入口
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-08 15:23:26 +08:00
浅念
394bfa8a7c
feat(chat): getSessions + ChatSidebar 会话列表组件
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-08 15:13:30 +08:00