浅念
|
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 |
|
浅念
|
1b66be6a53
|
feat(api): /api/customers 加 q 文本搜索(昵称/备注/ID/手机号,LIKE转义) + /api/groups 加 q 群名搜索
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 18:55:53 +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 |
|
浅念
|
3f867718ff
|
docs(analytics): 方案v1.1评审修订——价值图谱(8能力域/三层价值)+权限模型/性能承载横切章节+E0数据健康+B5 RFM+10处口径漏洞修复(首沟通口径/流失三分法/迟到回写/尾部判定/误报治理/zip导出/一人多号聚合/图表库选型)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 17:21:39 +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 |
|
浅念
|
4baa8639ba
|
fix(api): staff-stats评审修复(GROUP BY显式列防ONLY_FULL_GROUP_BY/金额千分位/detail死参数/2边缘测试)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 16:36:07 +08:00 |
|
浅念
|
b95fc5fa6f
|
feat(api): GET /api/staff-stats 7类计数+分型明细(voice走user_id join,新客户add_time兜底,红包金额提取)
计数模式(无kind)返回 new_customers/new_groups/red_transfer/del_customers/
blocked_customers/voice_calls/sensitive_words(恒0,spec占位);明细模式
(?kind=)返回{kind,rows},每kind字段不同,前端按kind配列。start/end
缺省近7天。
口径(spec §4.5,全本地聚合):
- new_customers: add_time窗内;IS NULL行用该对话首条消息min(timestamp)兜底
- new_groups: chat_group.create_time窗内(复合PK按owner过滤)
- red_transfer: wechat type IN (red_packet,transfer)窗内;金额三路正则
(红包XML feedesc/转账纯文本/totalamount),实测真库转账399/399全提取
- del/blocked_customers: 现存量口径忽略窗口,明细time=updated_at毫秒
- voice_calls: phone_call.user_id存员工userId(32HEX)非wxId——先经
wechat_account.user_id换算,账号无uid返回空防跨员工串数
- voice明细字段语义对齐CallList.vue(connected=call_status==1,
media_url本地/api/media/{hash}优先OSS兜底)
真机smoke(yunke-mysql):voice 61条/新客67/删除29/拉黑1均通过;
转账金额100%提取。真库chat_group列与message.type回填滞后(运维项,另报)。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 16:22:44 +08:00 |
|
浅念
|
2baa6d0814
|
test(moments): 同create_time并列时按id升序tiebreak测试(锁分页稳定契约,任务6评审遗留)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 16:22:44 +08:00 |
|
浅念
|
b289aa2650
|
fix(api): sessions is_del 越界422校验+省略不过滤显式契约测试
is_del 加 Query(ge=0, le=1)——越界值(如2)422 拒绝而非静默空列表;
test_sessions_is_del_filter 追加第三个请求:不带 is_del 时全部 4 个
talker 都返回(f1/f2/filehelper/gh0st),补上省略=完全不过滤的显式契约。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 15:57:59 +08:00 |
|
浅念
|
2837500bc0
|
feat(api): GET /api/moments 朋友圈列表(desc分页+账号头部)
对齐云客员工聊天窗口朋友圈tab:帖子 create_time desc 分页 +
wechat_account 头部(昵称/头像/别名);员工不存在不404(header全None
前端兜底)。头像提取抽共享 helper account_avatar 放 organization.py,
accounts 列表与 moments 头部复用。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 15:57:53 +08:00 |
|
浅念
|
d3d7146887
|
feat(api): sessions加is_del过滤+filehelper置顶标记,accounts加avatar(raw_json提取)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 15:44:54 +08:00 |
|
浅念
|
c21758dfb2
|
docs(plan): 填写Task4判别记录(双编码发现+逐码证据+回填终态+前端兜底注意)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 15:32:07 +08:00 |
|
浅念
|
64577a1b02
|
feat(msg): 类型归一化扩展(spike判别+49拆红包/转账)+存量回填+API msg_type/q过滤
- _normalize_msg_type 升级 (raw_type, row): messageType 经典码优先 →
49/appmsg 行级拆分(红包/转账/聊天记录) → 云客码兜底
- spike 修正: 云客 type=3 实为语音(messageType=34, 8754/8955 行),
原 image_legacy 是误标; type_raw=3 的 201 行旧数据才是真图片
- 新映射: 5红包 6/7通话 9文件 10/18/20链接 11转账 13名片 14位置
15/10000系统 21引用回复→text 22/19 证据不足留 unknown
- 回填 smoke.db: 620279 行重扫, 94268 行修正, unknown 87198→1885, 幂等
- GET /api/messages 加 msg_type(Literal 422)+q(LIKE 转义)参数
- 新增 test_scrape_msg_type.py(11) + test_api_messages 追加(8), 全量 466 绿
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 15:17:21 +08:00 |
|
浅念
|
f6ddd0263a
|
fix(repos): int 强转跳过 String 声明列(列类型优先于 _INT_FIELDS 按名集合)
Task 1 评审遗留:_INT_FIELDS 含 type_raw(为 Message int code 加),但
MomentsPost.type_raw 是 String(16)——按名强转会把非数字 code(如
'text')置 None,违背列声明。_build_column_values 现在检查目标列
声明类型:isinstance(col.type, sa.String)(含 Text)则跳过强转,
Message.type_raw(Integer) 照旧。另修正 upsert_chat_group 文档串里
过时的 'PK = room_id'(复合键自 8a99940)。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 14:32:19 +08:00 |
|
浅念
|
6ff288f1d3
|
feat(groups): chat_group 补 6 群主/建群列 + 复合PK迁移修复 + 存量回填
对齐云客员工聊天窗口·微信群 tab(2026-08-25 真机验证 raw_json 键):
- ChatGroup 加列 owner_name/owner_wxid/owner_alias/owner_avatar/
friend_count/create_time(全 nullable)
- scraper _normalize_chat_group 同名提取;createTime 兼容 ms-int 与
'YYYY-MM-DD HH:mm:ss'(smoke.db 实测 1105 行全为后者),复用
_parse_add_time 归一 ms-epoch
- 迁移 099ac2097fa2:加 6 列 + 修复 Task1 评审遗留 drift——PK 由单列
room_id 变更为复合 (room_id, channel, owner_account_id) 且
owner_account_id NOT NULL(对齐模型 8a99940;smoke.db 1105 行无 NULL,
未兜底编造数据);SQLite 走 batch 重建(copy_from 显式旧结构),
MySQL 渲染为直接 ALTER(离线 --sql 已验证)
- 回填脚本 scripts/backfill_chat_group_fields.py(幂等,逐列只补空);
smoke.db 实跑 backfilled 1105/1105,重跑 0/1105
- GroupOut 加 6 字段(model_validate 自动输出,路由无改)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 14:32:12 +08:00 |
|
浅念
|
90c28f4c7b
|
feat(scraper): moments 实体(浏览器fetch getFriendsterInfo,秒→ms,hashNext翻页,接入full_sync+4h调度+图片media)
- scrape_via_page:_normalize_moments(createTime秒×1000,缺id丢弃)+
_iter_moments_pages 翻页内核(fetch回调注入,sleep可注入,hashNext假/
信封异常/max_pages 上限即止)+ scrape_moments(逐员工遍历wechat_account,
form小驼峰,首页code≠10000告警cookie失效,换页重试惯例)+CLI注册moments
- media:download_moments_images(image_urls JSON数组展开去重,MomentsPost无
回链列→用Media.original_url做已下载标记,分片IN防SQLite变量上限,批间commit)
接入scrape_media第4源
- full_sync_all.sh:9c步moments(media前,同轮图片即可本地化)+汇总加moments计数
- scheduler:4h messages job 末尾追加 moments --max-pages 3 浅扫(全量翻页
由每日full承担);测试断言7条命令序列
- tests/test_scrape_moments.py:归一化(秒→ms/空安全/坏createTime)+翻页内核
(两页累积停止/hashNext假单页/max_pages防死循环/丢id行/坏信封)+图片本地化
(一帖两图/幂等跳过/非http跳过+500容错);全套440测试通过
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 14:07:39 +08:00 |
|
浅念
|
b7669199f8
|
feat(db): moments_post 表+upsert(朋友圈实体,PK=云客data.id,create_time统一ms)
- MomentsPost 模型:moments_post 表,PK=id(云客 getFriendsterInfo data.id),
wechat_id/create_time 建索引,praise/comment/image 存 JSON 列
- 迁移 524da8d2d597(手写 create_table,已应用到 smoke.db 并在临时 SQLite
全链路 upgrade/downgrade 验证)
- repos.upsert_moments_posts:批量幂等 upsert;附带修 _build_column_values
对 JSON 列表的误 join(标量列 join 保持不变,dept_route 旧测试仍过)
- 修复 3 个 chat_group 旧测试缺 owner_account_id(2026-08-24 复合主键遗留)
- 全套 430 测试通过
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 13:44:54 +08:00 |
|
浅念
|
2f73d79a6d
|
docs(plan): 吸收评审4条(groups路由实为model_validate免改/客户搜索需加q参数/moments调度+图片本地化补step/行号校正)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 12:35:41 +08:00 |
|
浅念
|
05a31022db
|
docs(plan): 员工聊天窗口五视图实施计划(15任务:后端7+前端8,TDD+真机判别spike)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 12:31:53 +08:00 |
|
浅念
|
00180ef479
|
docs(spec): 二次审计修订8项(微信群表列真机结构/统计明细分tab列型/phone_call userId转换坑/类型归一化回填任务/通讯录批量操作/msgid定位/chat_group补列/左栏折叠)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 12:10:16 +08:00 |
|
浅念
|
2d93f31be7
|
docs(spec): 吸收评审建议(时间s→ms转换/msg_type映射推导注明/moments头部来源/统计全tab明细/WIP还原明确/空态描述)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 11:59:30 +08:00 |
|
浅念
|
614680a4eb
|
docs(spec): 员工聊天窗口对齐设计(StaffChat五视图:单聊/群聊/朋友圈/通讯录/统计分析,基于2026-08-25云客真机抓包)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 11:57:29 +08:00 |
|
浅念
|
65ddcf988f
|
fix(staff): \u5f39\u6846\u8865\u56de\u5458\u5de5\u4fe1\u606f\u5217(\u8bef\u5220)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 10:57:47 +08:00 |
|
浅念
|
c96f638bab
|
fix(staff): 弹框富单元格TS修(Col加type字段+删unused staffInfo)+后端staff-chat-stats补head_image_url/real_name
|
2026-08-25 10:27:29 +08:00 |
|
浅念
|
b6eea3070a
|
feat(staff): 弹框客户微信/员工微信列改富单元格(头像+昵称+ID+真实姓名,对齐云客)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 10:24:07 +08:00 |
|
浅念
|
0d19289fba
|
feat(staff): 沟通数弹框加汇总说明(对齐云客:总X人次,重复Y,剩余Z条,玉绿左边框)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 10:08:44 +08:00 |
|
浅念
|
d4deb769e5
|
feat(chat): 会话侧栏全面美化(墨玉主题:药丸tab+圆角会话卡+今日红点+玉绿高亮)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 09:43:56 +08:00 |
|
浅念
|
85057e65dc
|
feat(chat): 侧栏筛选改tab按钮式(好友列表|群列表带计数,对齐云客聊天窗口)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 18:34:16 +08:00 |
|
浅念
|
a7ef8632a0
|
feat(chat): 群聊隐藏左侧会话列表(对齐云客)+会话名WA去@s.whatsapp.net后缀显号码
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 18:29:27 +08:00 |
|
浅念
|
e5ebb918fc
|
docs(analytics): 数据分析与增值功能全景方案(22项/5系列,基于2026-08-24实测数据审计,首批E1+A1+A3+B2+C1)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 18:28:52 +08:00 |
|
浅念
|
d86a70382d
|
feat(wa): 群列表列对齐云客7列(序号/员工信息/员工WhatsApp/群信息/添加时间/最后沟通时间/操作)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 18:19:53 +08:00 |
|
浅念
|
b66363e377
|
fix(wa): 直接以tab=groups进入时onMounted加载群数据(mount不触发route watch)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 18:18:32 +08:00 |
|
浅念
|
e84e89b029
|
fix(wa): 好友分页在群tab时隐藏(原两个分页同时显示)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 15:55:39 +08:00 |
|
浅念
|
8ee7399836
|
fix(wa): 子tab去掉v-if(只在groups时显示的bug→应始终显示)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 15:52:27 +08:00 |
|
浅念
|
b0923409fb
|
fix(wa): viewCustomers带channel query(原缺whatsapp致WA客户页默认微信tab)+tab query watch
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 15:42:20 +08:00 |
|
浅念
|
dcd1c2d178
|
feat(wa): WA客户列表加群列表子tab(好友/群两tab对齐云客)+员工列表群聊按钮跳子tab
- CustomerList whatsapp tab 加子tab切换(好友列表|群列表)
- 群列表内嵌 WA 群表格(序号/员工/群名/消息数/查看聊天)
- StaffList WA viewGroups 跳 /customers?tab=groups(不再跳 /groups)
- WA 群数据 317 个(wa-groups 重扫)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 15:28:39 +08:00 |
|
浅念
|
31d22ddd45
|
fix(media): 修复 Windows 反斜杠路径致 Linux 容器 404(49536 行 local_path 全量改为 /data/media 前缀)
SQLite 迁移时保留了 Windows 路径(media\xx\),Linux 后端 Path.resolve()
失败 → 404。一次性修复全部 media 行 + API 恢复 200。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 15:16:18 +08:00 |
|
浅念
|
ed564e4885
|
fix(calls): 语音通话列布局对齐云客(头像/标签式/结束时间/时长格式)+修SFC构建3处阻断
- 客户信息/员工微信加头像+脱敏微信号+备注名
- 通话信息改多行标签式,员工信息改纯文本,通话时长显示endTime+MM'SS"
- 修SFC构建:模板字面量混合引号→字符串拼接;空三元表达式补全;onMounted误删
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 15:01:20 +08:00 |
|
浅念
|
d945a1e4ce
|
feat(calls): 语音通话列表列布局全面对齐云客(头像/多行标签/结束时间/时长格式)
- 客户信息/员工微信列:加头像+微信号用脱敏alias+客户加备注名
- 通话信息:改多行标签式(状态/微信语音/来源),去「xx:」前缀
- 员工信息:改纯文本(云客不可点)
- 通话录音:接通时显示时长+播放
- 通话时长列:显示endTime+MM'SS"格式
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 14:43:03 +08:00 |
|
浅念
|
a9a30d49e7
|
fix(compose): MySQL映射宿主机3307(容器内存不足致浏览器崩溃,改宿主机直跑扫描)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 14:32:08 +08:00 |
|
浅念
|
5effaac00b
|
fix(scraper): 补_room_watermarks函数定义(增量同步时引用但定义在编辑中丢失,导致群消息扫描崩溃)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 14:15:37 +08:00 |
|
浅念
|
8a99940554
|
feat(groups): chat_group改复合主键(channel,owner,room)——多员工同群不再去重(云客张士蓓64群vs原42)
原 room_id 单列 PK 把多员工同群合并成一行(末位覆盖owner),其他员工
群列表缺数据。改复合主键后同群每个员工各一行,对齐云客按员工查看。
重扫后 1590 行/865 去重群/张士蓓 64 群(与云客一致)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-24 12:01:25 +08:00 |
|