浅念
|
5fb19dd3ac
|
feat(analytics): 前端板块骨架——echarts按需/useChart/路由/侧栏组/API模块
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 21:25:48 +08:00 |
|
浅念
|
f839a6db20
|
docs(analytics): tick docstring锁竞争与时区措辞修正+测试名对齐4job
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 21:14:52 +08:00 |
|
浅念
|
6b99202e9b
|
feat(analytics): 4h 调度分析链+CLI 回填+full_sync 夜间自愈步
- scheduler: yunke_analytics_tick job(与消息增量同节奏 IntervalTrigger),
_analytics_tick 纯 DB——stat_daily_staff 滚动3天刷新 + 敏感词增量扫描,
不抢 _page_lock 无子进程,异常只记日志不断链;today 用 time.time()
UTC epoch 喂 day_key,规避服务器非上海时区的 naive now 误判
- cli: staff-daily-stats(全量重建 rollup,幂等)+ sensitive-scan
(默认增量水位扫描,--full 首跑建水位/新词回填历史;description 明示
加词不回填历史)+ 幂等补种起步词库
- full_sync_all.sh: daily-stats 后追加 staff-daily-stats(rollup 随
msg_daily_stats 重建同步自愈)
- 测试: tick 行为测试(今日 seed→stat_daily_staff 出行)+ 异常吞噬
(monkeypatch 抛错不外抛);同步更新注册断言(3→4 jobs)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 21:02:41 +08:00 |
|
浅念
|
6a1c904018
|
fix(analytics): 命中处置ids上限+disposition枚举校验+排序断言
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 20:51:32 +08:00 |
|
浅念
|
6e67e9e631
|
feat(analytics): C1 命中列表默认过滤+批量处置
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 20:37:44 +08:00 |
|
浅念
|
956f243fce
|
fix(analytics): 扫描器水位>=/无水位自卫/迟到测试判别力/分片flush
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 20:30:34 +08:00 |
|
浅念
|
aa59461b03
|
feat(analytics): C1 扫描器——fetched_at 水位增量/迟到免疫/幂等/全量回填
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 20:02:53 +08:00 |
|
浅念
|
c7b3ce9d1c
|
fix(analytics): 词库单字MySQL预览拒扫+IntegrityError 409+MATCH短语净化
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 19:48:30 +08:00 |
|
浅念
|
0c14be0777
|
feat(analytics): C1 敏感词库 CRUD+加词预览——防一加就淹没
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 19:32:35 +08:00 |
|
浅念
|
1e0db3913c
|
fix(analytics): unreplied is_send守卫防漂移假行+真预算注释+501候选分支测试
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 19:22:22 +08:00 |
|
浅念
|
52af531598
|
feat(analytics): B2 该回未回——尾部判定/有效类型/通话豁免/已删剔除
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 19:00:15 +08:00 |
|
浅念
|
247bfc7277
|
fix(analytics): churn 排序决胜列+active_days去重日+边界测试
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 18:45:34 +08:00 |
|
浅念
|
3b4254639d
|
feat(analytics): A3 流失预警三分法——真流失/从未激活/待交接
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 18:25:08 +08:00 |
|
浅念
|
6790710965
|
test(analytics): overview channel 非法值 422 断言补齐
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 18:16:44 +08:00 |
|
浅念
|
b067d690f1
|
feat(analytics): /overview 端点+unmapped_accounts 标注字段
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 18:04:05 +08:00 |
|
浅念
|
ad153aa2f7
|
fix(analytics): 环比同期对齐口径+趋势窗校验+异常新员工明细
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 17:34:14 +08:00 |
|
浅念
|
02e100849b
|
fix(analytics): anomaly回退同人多账号累加+今日无环比断言修正
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 17:17:24 +08:00 |
|
浅念
|
49f2ffe8ea
|
feat(analytics): A1 总览指标——卡片/首沟通口径/周月环比/异常警示/空表回退
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 17:05:57 +08:00 |
|
浅念
|
af05e58976
|
perf(analytics): 5表 updated_at 窄索引——health MAX 消除全表扫(128MB buffer pool)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 16:40:01 +08:00 |
|
浅念
|
5b6a9bd35b
|
fix(analytics): recompute_all 全表清空自愈+whatsapp/多日/空日测试+映射缓存
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 16:28:39 +08:00 |
|
浅念
|
e3bb97bdf3
|
feat(analytics): stat_daily_staff 员工日汇总维护层——rollup派生/幂等/判别法
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 16:06:18 +08:00 |
|
浅念
|
4cfc2fa6a9
|
test(analytics): health 契约加深——ISO 序列化断言/空库6实体/诊断端点500有意注释
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 16:00:38 +08:00 |
|
浅念
|
0b1d377db7
|
feat(analytics): E0-lite 数据健康端点——数据截至+实体新鲜度
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 15:37:13 +08:00 |
|
浅念
|
8b29326b2e
|
fix(analytics): 命中表索引幂等守卫独立+created_at 去掉 onupdate 语义
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 15:30:14 +08:00 |
|
浅念
|
565006239b
|
feat(analytics): 数据分析板块四新表+迁移——stat_daily_staff/敏感词三表/fetched_at 索引
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 15:04:33 +08:00 |
|
浅念
|
81af615738
|
docs(plan): 复核残留修订——exportListToCsv真实签名落地代码块/调度测试改相对日期
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 14:48:45 +08:00 |
|
浅念
|
0bc1250476
|
docs(plan): 评审修订——修5处seed/签名矛盾+起步词库补种+四页角标
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 14:42:56 +08:00 |
|
浅念
|
aecb556efd
|
docs(plan): 数据分析板块 v1 实施计划——17 任务 TDD 全链(模型/指标/C1/调度/四页)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 14:25:20 +08:00 |
|
浅念
|
33c5596543
|
docs(spec): 数据分析板块 spec 评审修订——min_msgs 参数/周一起始/alembic 取代上游过时说法
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 13:51:11 +08:00 |
|
浅念
|
d1b636abdc
|
docs(spec): 数据分析板块 v1 设计存档——A1/A3/B2/C1 骑日汇总层+打底架构
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 13:45:13 +08:00 |
|
浅念
|
c31d1cc450
|
fix(nginx): /api 反代按 TTL 重解析 backend DNS——根治 IP 漂移后 502
nginx 对 hostname 的 proxy_pass 只在启动时解析一次并永久缓存,backend
重建或网络栈劣化后持续 502(2026-09-03/04 两次实战,重启 frontend 才恢复)。
改用 docker 内嵌 DNS 127.0.0.11 + resolver valid=10s + variable
proxy_pass(不带 URI,仍转发原始 /api/... 完整路径,行为不变)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-04 09:55:54 +08:00 |
|
浅念
|
5cfc09121a
|
feat(scraper): cookie 过期自动续期——浏览器表单重登+缓存+整实体重跑
撞 CookieExpiredError → PageScraper 表单登录(密码登录tab+placeholder选择器,
2026-09-03 实测一次成功)→ 新 cookie 落 MEDIA_DIR/.yk_cookie_cache(优先于
compose 注入的 env,永远比它新)→ 实体重跑一次(幂等+水位,安全);二次过期
直接抛出防循环;重登失败(无账密/云客改版)报可读原因退出码 3。
main 瘦身:cookie 加载收敛 _load_cookie(缓存>env>settings),分发链移
_dispatch_entity。测试 8 新增,全量 525 绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 18:11:26 +08:00 |
|
浅念
|
e365108244
|
fix(scraper): 云客鉴权失败信封统一拦截——cookie 过期响亮报错不再静默
事故(2026-09-03 手动同步实测):cookie 过期时 WA 路径对 str data 调 .get
崩 AttributeError,微信路径更糟——auth 错误信封被当空数据,55 员工全部
rows=0 无任何告警,整轮同步一无所获。
守卫:_browser_fetch 收口统一走 _check_auth_envelope,识别 success=false
且 code=±20020(实测信封)抛 CookieExpiredError;main 入口捕获后输出
一句话可读信息 + 退出码 3(不再天书堆栈)。业务错误(-90000 等)不受影响
照旧放行。测试 5 新增,全量 517 绿。
后续(等确认真实密码):CookieExpiredError 触发自动重新登录换 cookie,
过期彻底自愈。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 17:52:09 +08:00 |
|
浅念
|
0ade58a750
|
fix(summary): 空表守卫容错——表未建(漏迁移的升级)也回退旧聚合,不 500
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 16:39:26 +08:00 |
|
浅念
|
421998be54
|
perf(api): 会话/5数字弹窗超时修复——日粒度汇总层 msg_daily_stats
根因(服务器实测):sessions 对 owner 全量 message GROUP BY,重账号 5.2万条
3~5s;staff-chat-stats 全时段窗 6.9s——128MB buffer pool 下被推过前端
15s 超时(ECONNABORTED)。EXPLAIN ANALYZE 证实最优 covering 索引也要
18.9s,瓶颈是磁盘不是查询形状。
修复(预聚合,云客同款思路):
- msg_daily_stats 表:每「渠道×账号×会话×上海自然日」一行(收发计数/
当日最后时间与方向);迁移 a7d3e9f1c2b4(幂等建表)
- 写路径:repos.upsert_messages 落库自动重算本批触及的会话×天(所有
抓取路径汇到该函数,一处挂全;失败不阻塞写入)
- 读路径:sessions/staff-chat-stats 表有行时读汇总(namedtuple 同形,
端点主体零改动),空表守卫回退旧聚合(部署回填前不空白)
- 自愈:CLI daily-stats 全量重建(幂等);full_sync_all.sh 夜间追加第 11
步——顺带修掉尾部 sqlite3 直连 smoke.db 的硬编码(服务器 MySQL 上会炸)
- 口径统一:day 一律 Asia/Shanghai Python 计算(旧 from_unixtime 跟随
DB 会话时区与今日数割裂);统计窗口对齐自然日(文档化语义变化)
测试:12 新增(汇总层 8 + 端点判别/对拍 4,判别手法=回填后删光 message
仍出完整数据),全量 512 绿。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 16:37:36 +08:00 |
|
浅念
|
e3f7aa1304
|
fix(auth): 登录页不再套 MainLayout(public 路由全屏裸渲染)
App.vue 按 route.meta.public 切换:登录页直接出 router-view,其余才带
侧栏布局 — 否则登录页嵌在侧栏旁边,布局错乱。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 15:26:48 +08:00 |
|
浅念
|
6880ff1b97
|
feat(auth): 登录页(用户名/密码换 API token)+ 前端全链路登录态
后端:
- POST /api/auth/login:admin 账密(Settings 默认 admin/admin123,
ADMIN_USER/ADMIN_PASSWORD 可覆盖)换取共享 api_token,免 token 中间件
- 防爆破:同 IP 15min 窗口内 5 次失败锁 15min(429),成功登录清零
- 错误信息统一「用户名或密码错误」(防用户名枚举)
- 测试 7 个新增(TDD),全量 500 绿
前端:
- LoginView + 路由守卫(未登录跳 /login,回跳 redirect)
- axios 请求拦截器自动带 Bearer;401 清登录态回登录页
- 媒体直链统一 mediaUrl() 带 ?token=(img/audio 标签发不了 header),
替换 4 处裸拼;downloadBlob 手动带头
- isLoggedIn 按 key 存在判定 — 后端鉴权关闭时空 token 不锁死登录页
- MainLayout 侧栏底部退出登录
compose:两份编排透传 ADMIN_USER/ADMIN_PASSWORD(默认 admin/admin123)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 15:03:20 +08:00 |
|
浅念
|
0a5eb49359
|
docs(deploy): DEPLOY.md 对齐 2026-09-03 实测落地(NAT 端口模式)
- 拓扑现实:服务器在路由器 NAT 后,公网 80 被其他设备占用
- 对外访问实测:1Panel 域名管理加 公网IP:32002 + 路由器转发,零配置直访
- 修媒体解压路径 bug:包内根是 media/,须 -C yunke-server
- HTTPS 改为将来项:域名 + 1Panel DNS 验证(绕开被占的 80)
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 14:35:00 +08:00 |
|
浅念
|
284cecfcd9
|
fix(deploy): server 编排接入 1panel-network 直连 1Panel MySQL
MySQL 容器只绑 127.0.0.1:3306,宿主机网段不可达;backend/scheduler
挂 external 网络 1panel-network 用容器名直连,不改 1Panel 任何配置。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-03 12:02:12 +08:00 |
|
浅念
|
974929e091
|
feat(deploy): 阿里云ECS+1Panel 服务器部署方案落地
- docker-compose.server.yml:生产编排(复用 1Panel MySQL、去 mysql/redis、
端口仅绑 127.0.0.1、TZ=Asia/Shanghai、MYSQL_HOST 必填守卫)
- 两份 Dockerfile 内置国内构建源:apt/pip→阿里云,npm/playwright→npmmirror
(ECS 上直连官方源慢/超时;对本地构建同样可用)
- DEPLOY.md 重写为 v2 runbook:单站点反代架构、mysqldump+media 搬迁管道
(ngram 索引导入重建 ~12min)、验收清单、运维表、本地停 scheduler 收尾
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-01 16:38:05 +08:00 |
|
浅念
|
9ba8063ca8
|
feat(chat): 跳转入口全部改为全时段进入(用户定调:聊天记录不做时间限制)
排查全部聊天展示路径后清掉最后的两处带窗跳转:CallList 通话行的「通话
当天」定位窗(当日早些时候为对齐云客 ?start= 加的)与 StaffList 统计弹窗
的统计时段窗;WA 分支的 ?start= 本就被 ChatTimeline 的 start+end 成对
校验忽略,属死代码一并移除。现状:所有聊天视图默认全部时间(会话列表/
消息接口本就无时间下限),日期过滤只保留聊天窗内的手动日期选择器。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-27 16:30:52 +08:00 |
|
浅念
|
0b03c9fb0d
|
perf(customers): message 补 (channel,owner,timestamp) 索引,列表 7.6s→0.03s
客户列表行内「今日收发」聚合按 channel=?+owner IN+timestamp>= GROUP BY,
两个既有索引把 timestamp 排在 talker/room 后无法 seek——asyncmy 服务端
预编译时优化器弃索引全表扫 86 万含大文本宽行,实测 7.7s/次,前端每次翻页
都撞(用户报微信客户列表加载慢)。补三列窄索引后 owner 前缀直接落入当天
几百行:GROUP BY 0.14s、API 全链 0.032s(78 倍,翻页/WA/员工过滤同测)。
模型+迁移同步声明(防 autogenerate 反向 DROP),inspect 幂等。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-27 16:23:04 +08:00 |
|
浅念
|
e82e2ebea1
|
fix(migrate): message.text 建 MySQL ngram FULLTEXT 索引(搜索16s回归)
_search_messages_mysql 一直在用 MATCH..AGAINST,但 migrate 按模型建表不含
FULLTEXT、迁移链也从没建过——索引缺失时 MATCH 报错回退 LIKE 全扫:860k 行
LIKE '%q%' 实测 16.3s,axios 15s 超时 ECONNABORTED,搜索页全空(切 Docker
MySQL 单库后暴露;8-22 部署验证时已知 LIKE 慢但索引创建环节漏了)。补迁移:
仅 MySQL 方言,原生 DDL(本版 SQLAlchemy Index 不认 WITH PARSER 方言参数),
inspect 幂等。实测建成后 документ 0.73s / 报关 0.40s(22~40 倍提速),
ngram 对中文俄文按 bigram 切词,子串语义贴近原 LIKE 路径。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-27 16:07:54 +08:00 |
|
浅念
|
6de1662131
|
feat(staffchat): CallList/SearchView 微信行切新员工聊天窗口(入口改造收尾)
与 StaffList/CustomerList 同口径:微信行→staff-chat 新窗(单聊=single tab,
群语音/@chatroom 消息=group tab),WA 行保留旧 ChatTimeline(ChatTimeline
保留给 WA)。通话行跳转带「通话当天」整天下窗——语音通话本身是消息流里的
voice_call 行,当天窗必含该通通话,等价实现旧页 ?start= 滚动定位(新窗
rangeFromQuery 需 start+end 成对)。SearchView 客户抽屉同 CustomerList。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-27 16:07:54 +08:00 |
|
浅念
|
2c5cea1565
|
fix(staffchat): 聊天窗默认时段改全部时间+空态分语(用户报很多聊天记录空的)
defaultRange() 默认近 14 天窗,实测 78% 群(766/979)/89% 单聊(9374/10497)
的最新消息在任意 14 天窗外——这些会话打开即全空(典型:张士蓓「11台长安X5」
1016 条消息全在 7-27 前,默认窗滤成 0 条,云客后台却看得到)。云客默认直接
展示最近消息不限窗,对齐改为默认全部时间;首屏本就跳最后一页看最新+上翻
加载更旧,全量窗下首屏仍只拉一页。空态分语:有窗=「所选时间范围内无消息,
清空日期窗可查看全部」,无窗=「该会话无聊天记录」(真没聊过)。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-27 15:15:41 +08:00 |
|
浅念
|
b2ccbee1ab
|
fix(scripts): backfill_group_members 窗口函数化过 MySQL only_full_group_by(单库收敛)
max(timestamp)+裸 sender_name 的 GROUP BY 是 SQLite 方言行为,MySQL 8 默认
only_full_group_by 直接 1055 拒绝——2026-08-27 单库收敛(本地+调度器同连
Docker MySQL)时在 MySQL 上实跑触发。改 row_number() OVER 取每 (room_id,
talker_id) 最新一行的 sender_name + count() OVER 计数:两库通用,且语义从
「碰巧取 max 行」变为严格最新一条。另 gitignore 补 *.db.retired
(smoke.db 退役改名后 *.db 规则罩不住)。
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-27 14:51:05 +08:00 |
|
浅念
|
7e8624674e
|
fix(staffchat): SessionPane 补请求序号防竞态(对齐全 pane 惯例)+置顶卡不显今日红点(spec §5)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 21:03:36 +08:00 |
|
浅念
|
ef7f6d8a23
|
fix(migrate): 类型迁移SQLite内联修复FTS触发器+多owner群room_id测试+DEPLOY补stamp依据与锁表提示
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 20:55:18 +08:00 |
|
浅念
|
35bfebd3e3
|
chore(backend): list_order迁移补齐+Task14类型修正落链+moments每页日志+MsgTypeParam派生+3处文档修正+Dockerfile打包migrations+DEPLOY补迁移步骤
- 9b0d0c133035: wechat_account.list_order 进迁移链(此前仅模型声明,
干净库 /api/accounts 即 500);sa.inspect 幂等守卫兼容已手动加列的
smoke.db
- fe63c6789e94(验证中发现的预存缺口,超出原清单): Task 14 的 5 列模型
类型修正(4×URL String(1024)→Text, db_size Integer→BigInteger)从未落
链——纯 alembic 新库会复活 >1KB 链接截断;对齐后干净库 alembic check
全绿。SQLite message 表 batch 重建会掉 FTS 触发器+rowid 脱节(docstring
记明 ensure_fts+rebuild_fts 修复,smoke.db 已修复验证)
- scrape_via_page: _iter_moments_pages 每页一行进度日志(镜像 _fetch_pages)
- messages: MsgTypeParam=Literal[tuple(_MSG_TYPE_FILTER)] 派生,杜绝
双处罗列漂移(openapi enum 验证一致,492 绿含 422 行为)
- 文档: ChatGroup 复合PK docstring/groups room_id 多行表述/测试名去
单行假设;Dockerfile 补 alembic.ini+migrations;DEPLOY 增「数据库
迁移」节(新库/旧库stamp路径/回填脚本显式DB_URL)+运维表升级行
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 20:32:25 +08:00 |
|
浅念
|
e602822dfb
|
fix(staffchat): useStaffProfile 在途Promise去重(防重复请求+缓存投毒)+load(force)真重载
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-08-25 20:13:46 +08:00 |
|