浅念
|
f1b5861b35
|
feat(calls): VoiceClipModal 只读长语音列表+播放,接入 CallList(微信+WA语音)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 18:37:29 +08:00 |
|
浅念
|
d9060b6920
|
feat(api): 长语音 voice_clip 后端(model+migration+scraper+sync+endpoint)
- VoiceClip model (BigInteger PK voice_clip_id, structured cols + raw_json)
- Alembic migration a1b2c3d4e5f6 (chains from 8c4f1d2a9e6b)
- scrape_voice_clips(client, user_id, *, channel, page_size) per-employee scraper
over POST /wechatweb/call/list {pageNum, pageSize, userId}; channel stamped
locally (wechat/whatsapp), startTime/endTime ms-epoch string -> int
- upsert_voice_clip repo + start_time/end_time/mp3_duration int coercion
- sync_voice_clips orchestrator: iterates distinct user_id across
WechatAccount + WhatsappAccount, stamps channel per account table
- scheduler ENTITY_FUNCS['voice_clips'] + added to daily 'all' job
- GET /api/voice-clips (user_id exact beats user_real_name fuzzy; channel;
company_code; start/end window on end_time; ordered end_time desc)
- VoiceClipOut schema + router registered in main.py
- tests: scraper (5) + API (11) = 16 new; full suite 370 green
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 18:12:28 +08:00 |
|
浅念
|
a0db4535f1
|
feat(sync): WA messages 自动同步(per-conversation 增量水位,镜像 sync_wechat_messages)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 17:50:01 +08:00 |
|
浅念
|
e8885efcc6
|
fix(sync): 补 import upsert_whatsapp_account(WA accounts sync NameError)
|
2026-08-10 17:02:28 +08:00 |
|
浅念
|
ceca5bda4c
|
feat(sync): 接 WA 自动同步(accounts+friends wiring to orchestrator/scheduler)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 16:48:44 +08:00 |
|
浅念
|
7330cd1766
|
docs(spec): 接 WA 自动同步(accounts+friends wiring)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 16:27:27 +08:00 |
|
浅念
|
d220fa1a42
|
fix(scraper): 群抓取改用 friend_list/es+friendTypeYunke=2(替换 getChatroomList)
getChatroomList 在云客真机返回 0 行(已 Playwright 2026-08-10 验证)。
群与好友共用 /wechatweb/wxFriends/friend_list/es,仅以 friendTypeYunke 区分
(1=好友 / 2=群),响应信封一致(basicResult),复用 _parse_total/_parse_rows。
- 删除 CHATROOM_LIST_PATH / _parse_chatroom_total / _parse_chatroom_rows
/ _build_chatroom_body / _parse_member_ids(改写后已无引用)
- 新增 _build_group_body(pageNum/pageSize/friendTypeYunke="2")
- 重写 _normalize_chat_group 映射 friend_list/es 字段
(friendWxId->room_id, friendWxNickname->room_name, friendNum->member_count,
wxId/ownerName/userId, phone||wechatPhone, messageCount/sendNum/lastChatTime)
- friend_list/es 不返回成员明细,member_ids/member_ids_list 固定 None/[]
(群列表可用;成员镜像延后)
- 删除 tests/cassettes/chatroom_fixture.py,改复用 wxFriends_fixture 信封
- 重写 test_scrape_wechat_groups:断言新端点 URL + friendTypeYunke="2" body
+ 新字段映射;member_ids 边界用例改为"始终 None/[]"
scrape_wechat_groups 签名不变(client + page_size),orchestrator/scheduler 未改。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 15:33:59 +08:00 |
|
浅念
|
239868531f
|
docs(spec): 修复群抓取(friend_list/es+friendTypeYunke=2,替换 getChatroomList)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-10 13:57:41 +08:00 |
|
浅念
|
4ee19cb9d9
|
chore(ui): 删除冗余 AccountList 页,/accounts 重定向 /staff(总 spec 收尾)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-08 17:16:26 +08:00 |
|
浅念
|
82f7505298
|
docs(spec+plan): 删除 AccountList 页(/accounts→/staff 重定向,总 spec 收尾)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-08 17:15:04 +08:00 |
|
浅念
|
bb328ac59a
|
feat(chat): ChatTimeline 导出按钮 + 修复 downloadBlob 文件名丢失(Content-Disposition)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-08 17:07:58 +08:00 |
|
浅念
|
e487556253
|
docs(plan): 导出会话HTML(③)实现计划(ChatTimeline 按钮 + downloadBlob 文件名修复)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-08 17:04:53 +08:00 |
|
浅念
|
e4f850672c
|
docs(spec): ③ 纠正(仅 ChatTimeline 加导出按钮 + 修 downloadBlob 文件名;CustomerList/GroupList 已实现)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-08 17:03:51 +08:00 |
|
浅念
|
499a6ebd7b
|
docs(spec): 导出会话聊天HTML(③,前端接线;后端 export.py 已就绪)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-08 17:00:49 +08:00 |
|
浅念
|
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 |
|