Commit Graph

170 Commits

Author SHA1 Message Date
浅念 5bf5e25bad feat(calls): CallList 微信语音 客户/员工/姓名 单元格可点(复用聊天导航,对齐云客)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 16:19:21 +08:00
浅念 4d18a0e755 docs(plan): ④ 移除未用 chatChannel(避免 noUnusedLocals,WA 时再加)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 16:17:53 +08:00
浅念 18919f3401 docs(plan): CallList ④ 微信语音 单元格可点 实现计划
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 16:15:50 +08:00
浅念 3a30a41ca1 docs(spec): ④ 收窄至微信语音(WA 未核实云客+列结构不同→后续,遵循浏览器优先)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 16:14:51 +08:00
浅念 f4f0855439 docs(spec): CallList 列内可点(④)设计(微信/WA语音单元格→聊天/详情,电话不动)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 16:12:07 +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
浅念 a418830a90 feat(api): /api/sessions 账号会话列表(好友+群,今日消息数+最近联系时间,全本地聚合)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 14:58:23 +08:00
浅念 4cb6cf50c4 docs(plan): step5 plan 评审修复(删 getMessages import + Task4 显式替换说明)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 14:53:39 +08:00
浅念 c6dbda3bec docs(plan): ChatTimeline 会话列表 step5 实现计划(后端 /api/sessions + 双栏 + 选择器)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 14:47:49 +08:00
浅念 73fd9d0975 docs(spec): 修正 today_count 时区(钉死 UTC+8) + 日期选择器持久 ref 澄清
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 14:44:58 +08:00
浅念 9311607bda docs(spec): ChatTimeline 会话列表对齐云客(step 5)设计
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 14:37:11 +08:00
浅念 cdbfe3e5da fix(chat): 日期窗 start/end 成对透传(避免单边过滤)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 13:56:14 +08:00
浅念 765f80dd02 feat(chat): ChatTimeline 支持 start/end query 日期窗过滤(从 stat modal 带窗跳入)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 13:53:02 +08:00
浅念 7405ac5fc9 feat(staff): stat modal 列对齐云客(序号/员工信息/员工微信) + 客户微信可点带窗跳聊天
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 13:46:59 +08:00
浅念 abe86489b9 docs(plan): stat modal Phase B 实现计划(列对齐 + 客户微信带窗跳聊天)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 13:41:53 +08:00
浅念 2a33f944ec docs(spec): 微信员工 stat modal Phase B 设计(列对齐云客 + 客户微信→带窗聊天)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 13:12:13 +08:00
浅念 5fd9878c38 fix(staff): on-demand modal 拉取仅在日期窗未变时回写缓存
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:58:30 +08:00
浅念 f51623d652 feat(staff): 微信 5 数字 modal 换本地数据源(metric 过滤 + 合成分页)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:52:07 +08:00
浅念 cab8ab95dc fix(staff): loadWechatStats 加载竞态守卫(token)+ 重查时清空旧窗数字
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:50:02 +08:00
浅念 876767cd68 feat(staff): StaffList 微信 5 数字改读本地 summary + 日期选择器(Phase A 接线)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:42:19 +08:00
浅念 628659b849 refactor(api): staff-chat-stats 确定性排序 + last_is_send=None 分支测试 + 类型标注
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:37:26 +08:00
浅念 d2b2c0f5b3 feat(api): staff-chat-stats 聚合端点(微信员工 5 数字 + 客户明细,全本地 message)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:26:25 +08:00
浅念 f6c45e983a docs(plan): 微信员工 5 数字 modal Phase A 实现计划(全本地 message 聚合)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 18:20:42 +08:00
浅念 c73d845874 docs(spec): 5 数字 modal spec——§8 索引表述与无 Alembic 对齐
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 17:40:56 +08:00
浅念 faed2f586d docs(spec): 5 数字 modal spec 修订——room_id 私聊过滤 + 分页适配 + handler 换源 + 无需 Alembic
spec review 反馈:群消息误算(加 room_id 过滤)、YkStaffDetailModal fetcher 分页适配
(合成分页)、5 handler 已存在(换数据源非接线)、索引已存在(不加 Alembic)、NULL 语义、
日期选择器放 StaffList、路径前缀。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 17:39:37 +08:00
浅念 78eea7f08f docs(spec): 微信员工 5 数字 modal (Phase A) 设计——全本地消息聚合
数据源真机核实(wxStatsByTypes/wxChatInfo);从 message 表聚合 5 数字+客户明细;
复用 YkStaffDetailModal;口径近似(跟进等)。姓名drawer/主badge = Phase B。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 17:36:05 +08:00
浅念 05cc1dfcc4 feat(calls): 前端录音播放本地优先(/api/media/{hash}) + OSS 回退 + drawer
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:55:49 +08:00
浅念 1578db3467 feat(api): PhoneCallOut 暴露 record_media_hash
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:52:41 +08:00
浅念 b59e3cd9fe chore(sync): Task 3 review fixes——删未用 import + module docstring 诚实化 + repr(exc) 一致 + 批处理 guard
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:51:10 +08:00
浅念 38071e40ba feat(sync): sync_call_recordings + ENTITY_FUNCS['call_recordings'] 独立下载 pass
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:40:06 +08:00
浅念 1e399ff8c0 feat(scraper): download_call_recordings 下载通话录音到本地 Media + 回写 record_media_hash
复用 download_url/put_by_hash/upsert_media;幂等+resilient(tried 集合防死循环);media_type='audio'。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:30:29 +08:00
浅念 8f70ac5220 feat(db): phone_call.record_media_hash 列 + 迁移(录音本地化 FK→Media)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:20:18 +08:00
浅念 90e614e2d7 docs(plan): 录音本地化 plan 修订——修复下载死循环 + 测试 session + WA v-if
plan review 反馈:while 循环加 tried 集合排除已试 call_id(持续失败行不死循环);
_make_engine 只返回 engine 需自建 sessionmaker;WA 录音按钮 v-if 用 ossFileName。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 16:06:56 +08:00
浅念 a2f6b023fa docs(plan): 录音批量本地化实现计划(6 task,TDD,复用 media 管道)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 15:59:46 +08:00
浅念 d3fd0a5425 docs(spec): 录音本地化 spec——drawer 播放也切本地 + media URL 约定 + sync 前提
用户 review:把详情 drawer 录音播放纳入本地化范围(一致性+全本地);
补 media URL 前缀对齐现有渲染、sync pass 须实跑的运维前提。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 15:55:12 +08:00
浅念 f8a6acd009 docs(spec): 录音本地化 spec 修订——media_type='audio' 新label + store/session 接缝澄清
spec review(Approved)3 条 advisory:media_type 约定、ObjectStore 来源、
session 而非 engine。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 15:22:08 +08:00
浅念 cd4ac5feb3 docs(spec): 录音批量本地化设计——复用现有 media 管道接线
phone_call.record_media_hash + download_call_recordings + sync_call_recordings
独立 pass + PhoneCallOut 字段 + CallList 本地优先/OSS 回退。范围仅通话录音;
语音消息/voice_clip/转写后续。路线图第 1 个 plan(4c 长语音只读已搁置)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 15:13:34 +08:00
浅念 334adcb712 docs(spec): 4c 设计修订——补 user_real_name API 参数 + 员工姓名筛选语义/播放/scaper 文件定稿
spec review 反馈:API↔modal 员工姓名筛选对齐 + 打开语义澄清 +
channel 移出 body + scraper 文件/播放方式 pin。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 14:36:50 +08:00
浅念 fd33e82d62 docs(spec): Plan 4c 设计——长语音列表(voice_clip)本地化 + 只读展示
数据来源真机确认(POST /wechatweb/call/list 请求/响应);voice_clip 表 +
scraper/sync + /api/voice-clips + 只读 VoiceClipModal + CallList 接入。
匹配/转写/统计卡片等留 4d+。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 14:32:23 +08:00
浅念 81f5a31864 fix(calls): drawer callStatusLabel channel-aware + isRoom 按 是/否 渲染
drawer 本地 callStatusLabel 此前为 phone-only 极性,与 list(Task 5 已 channel-aware)
在 voice/wa 的 call_status=2 上矛盾。改为按 channel 分支并补 1=接通;isRoom 加入
BOOLEAN_KEYS 以 是/否 渲染。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 12:02:14 +08:00
浅念 7a5bb9927e feat(calls): callStatusLabel channel-aware + callTypeLabel WA + 补 WA/微信语音字段 label
call_status 极性随 channel 不同(phone 0未接/2接通;voice/WA 1接通/2未接通),
仅值 2 按 channel 分支。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 11:54:38 +08:00
浅念 28d8448f62 feat(calls): 电话 tab 保留通用 8 列(按 channel 分离列集)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 11:09:47 +08:00
浅念 f8705cb741 feat(calls): WA 语音 tab 对齐云客列(状态/客户/员工/通话时间和录音)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 11:03:22 +08:00
浅念 f4dc115129 feat(calls): 微信语音 tab 对齐云客列(通话信息/客户/员工微信/员工信息/录音/时长)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 10:57:17 +08:00
浅念 ca3a2a2d3d feat(calls): CallList 改 el-tabs(微信语音/WA 语音/电话)+ CallChannel 加 wa_voice_call
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 10:50:38 +08:00
浅念 21c555a7e4 test: orchestrator voice sync skip/passthrough 路径覆盖
照 sync_wechat_accounts 的现有测试模式给 WA + 微信 voice 各加 2 个测试:
skip-when-no-root-department(断言 status=skipped + scraper 未调用 + 无 SyncRun)
+ passes-resolved-root-to-scraper(断言 resolved department_id 透传到 scraper)。
顺手补 SyncResult.status 的 'skipped' 第三态文档。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 09:57:34 +08:00
浅念 79b89bc919 fix(scraper): voice body 加 departmentId/isRoom/时间窗 + sync 解析 root department_id
实测 queryWeChatVoiceList 必须带 callSource+departmentId+isRoom+startTime+endTime,
否则 200 但 data 空(0 数据)。WA callSource=4 / 微信 callSource=0,宽窗抓全量。
sync_*_voice_calls 照 sync_wechat_accounts 模式解析 _find_root_department_id。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 09:49:31 +08:00
浅念 18620870c6 feat(sync): sync_wa_voice_calls + scheduler ENTITY_FUNCS wa_voice_calls
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 09:36:14 +08:00