浅念
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
浅念
169a64ee29
feat(scraper): WA 语音通话抓取 scrape_wa_voice_calls(callSource=4)
...
复用云客统一语音接口 queryWeChatVoiceList + callSource=4;channel=wa_voice_call
区分;WA 特有字段落 raw_json;复用 PhoneCall 表 + upsert_voice_call。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-07 09:26:16 +08:00
浅念
a66c3be00a
chore: final Minor polish — export filename/test断言, downloadBlob 类型/清理, plan docs
...
address review Minors: drop redundant filename replace, assert 暂无消息,
tighten downloadBlob return type + try/finally, fix plan group time-picker wording.
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 18:06:17 +08:00
浅念
6dfed36c05
feat(groups): 微信群操作列加「导出HTML聊天记录」(补 Plan3 漏的操作)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:57:58 +08:00
浅念
d1475e8f42
feat(customers): 微信客户操作列加「导出HTML聊天记录」+ 时间选择
...
对齐云客:先弹「请选择时间」→ 确定后调 /api/export/chat-html 下载。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:55:10 +08:00
浅念
b63b71bf68
feat(staff): 微信员工明细 modal 内客户微信 → 聊天记录(二级操作)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:47:02 +08:00
浅念
6a30bef21b
feat(staff): 微信员工 主badge→聊天 + 员工姓名→drawer(纠正手机号误判)
...
云客跳详情页的是员工姓名(button+history),非手机号;手机号不可点。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:43:45 +08:00
浅念
b9055b5714
feat(staff): 微信员工及时回复 2 数字 → 明细 modal(回复率不可点)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:40:24 +08:00
浅念
c00522fc07
feat(staff): 微信员工沟通数 3 数字 → 明细 modal(补 Plan1 误判漏做的操作)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:37:08 +08:00
浅念
1368e3a471
feat(modal): YkStaffDetailModal Col 支持可选 onClick(单元格可点)
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:32:05 +08:00
浅念
ebac26822b
feat(api): add downloadBlob helper for blob attachment download
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:27:16 +08:00
浅念
d85bf64dde
feat(api): GET /api/export/chat-html — 导出 1:1/群聊天为 HTML
...
支持 DM(talker_id) 与 群(room_id),可选 start/end 时间范围;
is_send 决定气泡左右。对齐云客微信客户/群列表「导出HTML聊天记录」。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 17:19:46 +08:00
浅念
bfdb5852bb
feat(groups): align GroupList to 云客 — per-channel tabs, view-chat action
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 11:14:00 +08:00
浅念
de08bd09c7
docs: Plan 3 — GroupList 对齐云客(采集 + TDD plan)
...
phase0 采集云客「沟通」板块群列表(微信 wechatdetail/2 + WA friendlist 群列表 tab),
写 Plan 3(分 channel tab 各自列 + viewChat),经 plan-reviewer 评审 Approved。
已知 gap:smoke.db 0 群(空表验证)+ WA 群抓取缺失(字段推断)。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 11:11:37 +08:00
浅念
5d4a0c5901
feat(customers): align CustomerList to 云客 — per-channel tabs, 7 cols each, view-chat action
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 10:28:39 +08:00
浅念
3507de55fa
feat(customerFields): add fromTypeLabel helper
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 10:13:40 +08:00
浅念
c31d79f1e2
docs: Plan 2 — CustomerList 对齐云客(采集 + TDD plan)
...
phase0 采集云客「沟通」板块客户列表(wechat wechatdetail/1 + waBusiness/friendlist),
dump raw_json 字段覆盖,产出列+交互+字段映射;写 Plan 2(分 channel tab 各 7 列 +
查看聊天记录→ChatTimeline),经 plan-reviewer 评审 Approved。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-06 10:12:36 +08:00