ai_member_xiaoban/memory/2026-05-24.md

88 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-05-24 工作日志
## 新建技能: studytime-analysis
[刘庆逊提出] 创建学习时间分析技能,分析角色完课记录的规律。
### 技能结构
- `skills/studytime-analysis/SKILL.md` — 技能定义
- `skills/studytime-analysis/scripts/studytime_analysis.py` — Python 分析脚本
### 分析维度
1. **一周时间分布**排除寒暑假1-2月、7-8月周一~周日各天完课数、时段分布(上午/中午/下午/晚上)、周末是否上课
2. **跨周学习趋势**(包含寒暑假全部数据):总周数、周均完课数、连续性、中断周检测、前后半段趋势对比、突增/骤降检测
3. **完课记录明细表**(全部数据):日期/时间/星期/时段/级别/课程ID
### 数据源
- PostgreSQL Onlinevala 库)
- 核心表:`user_chapter_play_record_0~7`8张分表`bi_` 前缀)
- 筛选:`play_status = 1`
- 注意:表在 PostgreSQL 而非 MySQL表名无 `bi_` 前缀
### 寒暑假规则
- 一周分布分析时排除 1-2 月(寒假)和 7-8 月(暑假)—— 因为寒暑假作息与平时差异大,混在一起会干扰时段分析
- 跨周趋势和明细表包含全部数据(含寒暑假)
- 报告中区分标注数据范围
### 触发方式
用户说「学习时间分析 [角色ID]」即可触发
### 已测试角色
- 2343、2344无完课记录play_status=2未完成
- 2840276条记录秋季集中型用户
- 25976265条246条在W16周一天完成A2批量疑似系统批量标记
- 2895188条长期稳定学习型用户36周几乎不间断非寒暑假晚上为主寒暑假上午为主
### 技术要点
- psycopg2 的 `%(param_name)s` 命名参数必须正确匹配UNION ALL 多个子查询需要不同参数名
- PostgreSQL 返回的 `updated_at` 是 tz-aware datetime
- `datetime.fromisocalendar(year, week, 1)` 获取某周周一的日期
### 同步
- 已推送到 SkillHub`studytime-analysis.xiaoban`
- 已 commit 到 Git 远程仓库
- 已通知 Cris李若松
### 增强: 报告开头加入角色基本信息 (2026-05-24)
[刘庆逊提出] 在 studytime-analysis 输出中加入角色基本信息,包括:
- 角色ID、账号ID、角色名字、性别、年龄、账号手机号后4位
**数据源(新增)**
- MySQL Online `vala_user`
- `vala_app_character`id, account_id, nickname, gender(0=女/1=男), birthday(varchar "YYYY-MM-DD")
- `vala_app_account`id, tel(已脱敏如 186****1625)
- 手机号已脱敏直接取后4位年龄从 birthday 计算
**修改文件**
- `skills/studytime-analysis/scripts/studytime_analysis.py`:新增 MySQL 连接函数 `get_mysql_connection()``fetch_role_info(role_id)`,更新 `format_report()` 输出基本角色信息
- 已验证 2895 正常运行输出
- 已同步 SkillHub + Git
### Unit 显示修复: 季度名称 → 全局单元编号 (2026-05-24)
[刘庆逊提出] HTML 报告中 Unit 列显示错误——显示的是季度名称(如"小镇时光""钢铁之心"而非单元数字0-48
**根因分析**
- `vala_game_chapter`MySQL`unit_index` 字段
- `big_map_chapter`PostgreSQL`unit_index` 字段,但仅包含 A1 数据,且与 `vala_game_chapter` 无直接关联键
- 两者 ID 空间不重叠big_map: ~1720-2070game_chapter: ~55-399UUID 也不匹配
**映射方案**
- 每个 season_package 内,`lesson_type=1` 的章节按 `id` 排序,每 5 个连续章节组成一个单元
- Season 0序章/L1-U0所有章节属于 Unit 0
- Season 1-4每个 season 有 12 个单元60 个 lesson 章节)
- 全局 unit_index = base_offset(season_of_quarter) + unit_within_season
- base_offset: 0→0, 1→1, 2→13, 3→25, 4→37
**关键 Bug**:初版按 `season_of_quarter` 分组时 A1 和 A2 混在一起,因为相同季度值合并了。修复:改为按 `(level, season_of_quarter)` 分组。
**验证结果**
- A1: Unit 0-4849 个单元),与 big_map_chapter 的 unit_index 范围一致
- A2: Unit 0-4950 个单元,比 A1 多 1 个)
**已修改文件**
- `skills/studytime-analysis/scripts/studytime_analysis.py` — 重写 `fetch_chapter_info_map()`,新增全局 unit_index 计算HTML 模板更新为 Level/Unit/Lesson 三列
- 已为角色 32009zyl重新生成 HTML 并发送
- 已同步 Git + SkillHub