diff --git a/memory/.dreams/short-term-recall.json b/memory/.dreams/short-term-recall.json index 8fa08a3..4ef26d6 100644 --- a/memory/.dreams/short-term-recall.json +++ b/memory/.dreams/short-term-recall.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-05-15T09:14:59.142Z", + "updatedAt": "2026-05-17T05:10:46.252Z", "entries": { "memory:memory/2026-05-06.md:1:20": { "key": "memory:memory/2026-05-06.md:1:20", @@ -42,20 +42,22 @@ "endLine": 30, "source": "memory", "snippet": "- **订单号格式问题:** Excel 科学计数法 → 设置单元格为文本格式解决 - **psycopg2 转义:** LIKE 中 `%` 需写成 `%%`(psycopg2 的 `%s` 占位符冲突) ## 任务2:销售线索用户分析报表 - [李承龙需求] 输入包含462个用户ID的Excel,输出每个用户+角色的完整画像报表 - 脚本路径:`/root/.openclaw/workspace/scripts/lead_user_analysis.py` - **重要口径修正(李承龙确认):** - **体验课定义:** 固定为 L1 U00(L01-L05) + L2 U00(L01-L05) 共10节课,**不通过 expire_time 区分** - L1 chapter_id: 343, 344, 345, 346, 348 - L2 chapter_id: 55, 56, 57, 58, 59 - **完成时间:** 取 `bi_user_chapter_play_record` 中 `play_status=1` 记录的**最早 `updated_at`**(非 `created_at`) - **报表列:** 用户ID、角色ID、用户注册时间、角色创建时间、L1序章5节完成时间、L2序章5节完成时间、购买时间、购买课包名称、支付金额、购买渠道key_from、是否退款、退款金额 - **分表规则:** `bi_user_chapter_play_record_{0..7}`,分表号 = user_id % 8 - **重要关联:** `b", - "recallCount": 2, + "recallCount": 3, "dailyCount": 0, "groundedCount": 0, - "totalScore": 1.983596316357381, + "totalScore": 2.983596316357381, "maxScore": 1, "firstRecalledAt": "2026-05-07T04:41:47.636Z", - "lastRecalledAt": "2026-05-13T08:20:55.037Z", + "lastRecalledAt": "2026-05-17T05:10:46.252Z", "queryHashes": [ "dd105d141c56", - "4cacd0d43440" + "4cacd0d43440", + "1dc41fdf5e74" ], "recallDays": [ "2026-05-07", - "2026-05-13" + "2026-05-13", + "2026-05-17" ], "conceptTags": [ "l01-l05", diff --git a/scripts/l1l2_users_study_breakdown.sql b/scripts/l1l2_users_study_breakdown.sql new file mode 100644 index 0000000..938b3a0 --- /dev/null +++ b/scripts/l1l2_users_study_breakdown.sql @@ -0,0 +1,110 @@ +-- L1+L2用户(821人)上周学习情况:仅学L1 / 仅学L2 / 都学了 + +WITH last_week_active_chars AS ( + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_0 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_1 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_2 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_3 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_4 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_5 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_6 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_7 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' +), +last_week_active_accounts AS ( + SELECT DISTINCT c.account_id + FROM last_week_active_chars lw + JOIN bi_vala_app_character c ON lw.user_id = c.id +), +paying_active AS ( + SELECT DISTINCT lw.account_id + FROM last_week_active_accounts lw + WHERE EXISTS ( + SELECT 1 FROM bi_vala_order o + JOIN bi_vala_app_account a ON o.account_id = a.id AND a.status = 1 + WHERE o.account_id = lw.account_id + AND o.order_status IN (3, 4) + AND o.pay_success_date IS NOT NULL + ) +), +user_goods AS ( + SELECT o.account_id, o.goods_id + FROM bi_vala_order o + JOIN paying_active pa ON o.account_id = pa.account_id + WHERE o.order_status IN (3, 4) AND o.pay_success_date IS NOT NULL +), +l1l2_accounts AS ( + SELECT account_id + FROM user_goods + GROUP BY account_id + HAVING bool_or(goods_id = 61) OR (bool_or(goods_id IN (57, 60, 63)) AND bool_or(goods_id IN (31, 32, 33, 54))) +), +l1l2_chars AS ( + SELECT c.id AS user_id, c.account_id + FROM bi_vala_app_character c + JOIN l1l2_accounts a ON c.account_id = a.account_id +), +last_week_chapters AS ( + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_0 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_1 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_2 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_3 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_4 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_5 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_6 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' + UNION ALL + SELECT p.user_id, p.chapter_id + FROM bi_user_chapter_play_record_7 p + WHERE p.play_status = 1 AND p.created_at >= '2026-05-11' AND p.created_at < '2026-05-18' +), +chapter_with_level AS ( + SELECT DISTINCT c.account_id, bl.course_level + FROM last_week_chapters lw + JOIN l1l2_chars c ON lw.user_id = c.user_id + JOIN bi_level_unit_lesson bl ON lw.chapter_id = bl.id + WHERE bl.course_level IN ('L1', 'L2') +), +user_level_study AS ( + SELECT + account_id, + bool_or(course_level = 'L1') AS studied_l1, + bool_or(course_level = 'L2') AS studied_l2 + FROM chapter_with_level + GROUP BY account_id +) +SELECT + CASE + WHEN studied_l1 AND studied_l2 THEN 'L1和L2都学了' + WHEN studied_l1 THEN '仅学了L1' + WHEN studied_l2 THEN '仅学了L2' + END AS study_type, + COUNT(*) AS user_count +FROM user_level_study +GROUP BY 1 +ORDER BY 1; diff --git a/scripts/weekly_active_paying_users.sql b/scripts/weekly_active_paying_users.sql new file mode 100644 index 0000000..c8d1ab6 --- /dev/null +++ b/scripts/weekly_active_paying_users.sql @@ -0,0 +1,71 @@ +-- 上周(2026-05-11~2026-05-17)有课消的付费用户,按 L1/L2 分类 + +WITH last_week_active_chars AS ( + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_0 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_1 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_2 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_3 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_4 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_5 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_6 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' + UNION + SELECT DISTINCT user_id FROM bi_user_chapter_play_record_7 WHERE play_status = 1 AND created_at >= '2026-05-11' AND created_at < '2026-05-18' +), +last_week_active_accounts AS ( + SELECT DISTINCT c.account_id + FROM last_week_active_chars lw + JOIN bi_vala_app_character c ON lw.user_id = c.id +), +paying_active AS ( + SELECT DISTINCT lw.account_id + FROM last_week_active_accounts lw + WHERE EXISTS ( + SELECT 1 FROM bi_vala_order o + JOIN bi_vala_app_account a ON o.account_id = a.id AND a.status = 1 + WHERE o.account_id = lw.account_id + AND o.order_status IN (3, 4) + AND o.pay_success_date IS NOT NULL + ) +), +user_goods_agg AS ( + SELECT + pa.account_id, + array_agg(DISTINCT o.goods_id) AS goods_ids + FROM paying_active pa + JOIN bi_vala_order o ON pa.account_id = o.account_id + WHERE o.order_status IN (3, 4) + AND o.pay_success_date IS NOT NULL + GROUP BY pa.account_id +), +classified AS ( + SELECT + account_id, + CASE + WHEN 61 = ANY(goods_ids) THEN 'L1+L2' + WHEN (57 = ANY(goods_ids) OR 60 = ANY(goods_ids) OR 63 = ANY(goods_ids)) + AND (31 = ANY(goods_ids) OR 32 = ANY(goods_ids) OR 33 = ANY(goods_ids) OR 54 = ANY(goods_ids)) + THEN 'L1+L2' + WHEN 57 = ANY(goods_ids) OR 60 = ANY(goods_ids) OR 63 = ANY(goods_ids) THEN '仅L1' + WHEN 31 = ANY(goods_ids) OR 32 = ANY(goods_ids) OR 33 = ANY(goods_ids) OR 54 = ANY(goods_ids) THEN '仅L2' + ELSE '其他' + END AS level_type + FROM user_goods_agg +) +SELECT + level_type, + COUNT(*) AS user_count +FROM classified +GROUP BY level_type +ORDER BY + CASE level_type + WHEN '仅L1' THEN 1 + WHEN '仅L2' THEN 2 + WHEN 'L1+L2' THEN 3 + WHEN '其他' THEN 4 + END;