zlwu 6 mesiacov pred
rodič
commit
86380cf30d

+ 88 - 32
dashboard/streamlit_growth_dashboard.py

@@ -445,26 +445,46 @@ st.altair_chart(chart, use_container_width=True)
 # ---- Trend (CURR, by day from curr_daily) ----
 st.subheader(t("curr_trend"))
 curr_start = max(min_day, target_day - timedelta(days=29))
-curr_df = read_df(
-    """
-    SELECT activity_date, prev_day_active_count, retained_count, curr_rate_pct, total_active_today
-    FROM curr_daily
-    WHERE activity_date >= %s AND activity_date <= %s
-    ORDER BY activity_date
-    """,
-    (curr_start.isoformat(), target_day.isoformat()),
-)
-if not curr_df.empty:
-    curr_df["activity_date"] = pd.to_datetime(curr_df["activity_date"]).dt.date
+def _compute_curr_from_daily(daily_df: pd.DataFrame, start_day: date, end_day: date) -> pd.DataFrame:
+    """基于已筛选口径的 user_daily_activity 现算 CURR(避免使用全量汇总表导致筛选不联动)。"""
+    df = daily_df.copy()
+    if df.empty:
+        out = pd.DataFrame({"activity_date": pd.date_range(start=start_day, end=end_day, freq="D").date})
+        out["prev_day_active_count"] = 0
+        out["retained_count"] = 0
+        out["total_active_today"] = 0
+        out["curr_rate_pct"] = 0.0
+        return out
+
+    df = df[df["active_flag"] == 1][["activity_date", "user_id"]].copy()
+    df["user_id"] = df["user_id"].astype(str)
+
+    # 构造 day -> active_users(set) 的映射,后续按天 O(1) 取集合
+    active_by_day = df.groupby("activity_date")["user_id"].apply(lambda s: set(s.tolist())).to_dict()
+
+    days = pd.date_range(start=start_day, end=end_day, freq="D").date
+    rows: list[dict] = []
+    for d in days:
+        prev_d = d - timedelta(days=1)
+        prev_active = active_by_day.get(prev_d, set())
+        today_active = active_by_day.get(d, set())
+        prev_cnt = len(prev_active)
+        retained_cnt = len(prev_active & today_active) if prev_cnt else 0
+        total_today = len(today_active)
+        curr_rate = (retained_cnt / prev_cnt * 100.0) if prev_cnt else 0.0
+        rows.append(
+            {
+                "activity_date": d,
+                "prev_day_active_count": prev_cnt,
+                "retained_count": retained_cnt,
+                "curr_rate_pct": curr_rate,
+                "total_active_today": total_today,
+            }
+        )
+    return pd.DataFrame(rows)
 
-# 补齐日期轴到 target_day:无数据的日期显示 0
-curr_days = pd.DataFrame(
-    {"activity_date": pd.date_range(start=curr_start, end=target_day, freq="D").date}
-)
-curr_plot = curr_days.merge(curr_df, on="activity_date", how="left")
-for col in ["prev_day_active_count", "retained_count", "curr_rate_pct", "total_active_today"]:
-    if col in curr_plot.columns:
-        curr_plot[col] = curr_plot[col].fillna(0)
+
+curr_plot = _compute_curr_from_daily(daily, curr_start, target_day)
 curr_plot["day"] = curr_plot["activity_date"].astype(str)
 
 curr_chart = (
@@ -490,31 +510,67 @@ st.altair_chart(curr_chart, use_container_width=True)
 # - page.lumi_outfits__enter: Lumi 装扮页面浏览(次)
 # - conversation.chatbot__end + properties.duration_seconds: 对话时长(秒)
 trend3_start = curr_start
+trend3_params: list = [trend3_start.isoformat(), target_day.isoformat()]
+trend3_user_filters: list[str] = []
+
+# users.is_test_user
+if exclude_test:
+    trend3_user_filters.append("COALESCE(u.is_test_user, 0) = 0")
+
+# phone/email 至少一个非空(与上方 users 口径一致)
+trend3_user_filters.append("(TRIM(COALESCE(u.phone, '')) <> '' OR TRIM(COALESCE(u.email, '')) <> '')")
+
+# users.user_segment(来自 users 表)
+if segment_sel:
+    seg_placeholders = ",".join(["%s"] * len(segment_sel))
+    trend3_user_filters.append(f"u.user_segment IN ({seg_placeholders})")
+    trend3_params += list(segment_sel)
+
+# org filter:与 cohort_universe 的“用户曾出现在该 org”口径一致
+if org_sel:
+    org_placeholders = ",".join(["%s"] * len(org_sel))
+    trend3_user_filters.append(
+        f"""
+        EXISTS (
+            SELECT 1
+            FROM user_daily_activity uda2
+            WHERE uda2.user_id = e.user_id
+              AND uda2.org_id_snapshot IN ({org_placeholders})
+        )
+        """
+    )
+    trend3_params += list(org_sel)
+
+trend3_user_where = " AND " + " AND ".join(f"({c})" for c in trend3_user_filters) if trend3_user_filters else ""
+
 trend3_df = read_df(
-    """
+    f"""
     SELECT
-        DATE(event_time) AS activity_date,
-        SUM(CASE WHEN event_name = 'page.lumi_shop__enter' THEN 1 ELSE 0 END) AS lumi_shop_pv,
-        SUM(CASE WHEN event_name = 'page.lumi_outfits__enter' THEN 1 ELSE 0 END) AS lumi_outfits_pv,
+        DATE(e.event_time) AS activity_date,
+        SUM(CASE WHEN e.event_name = 'page.lumi_shop__enter' THEN 1 ELSE 0 END) AS lumi_shop_pv,
+        SUM(CASE WHEN e.event_name = 'page.lumi_outfits__enter' THEN 1 ELSE 0 END) AS lumi_outfits_pv,
         SUM(
             CASE
-                WHEN event_name <> 'conversation.chatbot__end' THEN 0
-                WHEN JSON_EXTRACT(properties, '$.duration_seconds') IS NULL THEN 0
-                ELSE CAST(JSON_EXTRACT(properties, '$.duration_seconds') AS DECIMAL(18, 3))
+                WHEN e.event_name <> 'conversation.chatbot__end' THEN 0
+                WHEN JSON_EXTRACT(e.properties, '$.duration_seconds') IS NULL THEN 0
+                ELSE CAST(JSON_EXTRACT(e.properties, '$.duration_seconds') AS DECIMAL(18, 3))
             END
         ) AS total_conversation_duration_seconds
-    FROM user_events
-    WHERE event_time >= %s
-      AND event_time < DATE_ADD(%s, INTERVAL 1 DAY)
-      AND event_name IN (
+    FROM user_events e
+    INNER JOIN users u
+        ON u.user_id = e.user_id
+    WHERE e.event_time >= %s
+      AND e.event_time < DATE_ADD(%s, INTERVAL 1 DAY)
+      AND e.event_name IN (
         'page.lumi_shop__enter',
         'page.lumi_outfits__enter',
         'conversation.chatbot__end'
       )
-    GROUP BY DATE(event_time)
+      {trend3_user_where}
+    GROUP BY DATE(e.event_time)
     ORDER BY activity_date
     """,
-    (trend3_start.isoformat(), target_day.isoformat()),
+    tuple(trend3_params),
 )
 
 if not trend3_df.empty:

+ 124 - 19
energyStoneStats/stat_student_energy_stones.py

@@ -23,6 +23,56 @@ from typing import Iterable
 import pymysql
 
 
+def parse_env_file(env_path: Path) -> dict[str, str]:
+    """轻量解析 .env 文件(忽略注释与无效行)。"""
+    env_map: dict[str, str] = {}
+    if not env_path.exists():
+        return env_map
+
+    for raw in env_path.read_text(encoding="utf-8").splitlines():
+        line = raw.strip()
+        if not line or line.startswith("#"):
+            continue
+        if line.startswith("export "):
+            line = line[len("export ") :].strip()
+        if "=" not in line:
+            continue
+        key, val = line.split("=", 1)
+        key = key.strip()
+        val = val.strip()
+        if not key:
+            continue
+        if len(val) >= 2 and ((val[0] == '"' and val[-1] == '"') or (val[0] == "'" and val[-1] == "'")):
+            val = val[1:-1]
+        env_map[key] = val
+    return env_map
+
+
+def load_db_env(project_root: Path, explicit_env_file: str | None = None) -> dict[str, str]:
+    """
+    加载数据库相关环境变量(优先级:系统环境变量 > 指定 env 文件 > backend/.env.lyrria > backend/.env)。
+    """
+    candidates: list[Path] = []
+    if explicit_env_file:
+        env_path = Path(explicit_env_file)
+        if not env_path.is_absolute():
+            env_path = (project_root / env_path).resolve()
+        candidates.append(env_path)
+    else:
+        candidates.append((project_root / "backend/.env.lyrria").resolve())
+        candidates.append((project_root / "backend/.env").resolve())
+
+    merged: dict[str, str] = {}
+    for env_path in candidates:
+        merged.update(parse_env_file(env_path))
+
+    # 系统环境变量最后覆盖
+    for key in ("MYSQL_HOST", "MYSQL_PORT", "MYSQL_USER", "MYSQL_PASSWORD", "MYSQL_DATABASE"):
+        if os.getenv(key) is not None:
+            merged[key] = os.getenv(key, "")
+    return merged
+
+
 STUDENTS_RAW = """
 罗美琦	女	19711326711
 龚思彤	女	15159576276
@@ -173,13 +223,13 @@ def parse_students(raw: str) -> list[Student]:
     return rows
 
 
-def get_db_config() -> dict:
+def get_db_config(env_values: dict[str, str]) -> dict:
     return {
-        "host": os.getenv("MYSQL_HOST", "127.0.0.1"),
-        "port": int(os.getenv("MYSQL_PORT", "3306")),
-        "user": os.getenv("MYSQL_USER", "root"),
-        "password": os.getenv("MYSQL_PASSWORD", ""),
-        "database": os.getenv("MYSQL_DATABASE", "Lyrria"),
+        "host": env_values.get("MYSQL_HOST", "127.0.0.1"),
+        "port": int(env_values.get("MYSQL_PORT", "3306")),
+        "user": env_values.get("MYSQL_USER", "root"),
+        "password": env_values.get("MYSQL_PASSWORD", ""),
+        "database": env_values.get("MYSQL_DATABASE", "Lyrria"),
         "charset": "utf8mb4",
         "cursorclass": pymysql.cursors.DictCursor,
         "autocommit": True,
@@ -195,8 +245,7 @@ def fetch_user_rows(cur, students: Iterable[Student]) -> dict[str, dict]:
     if phones:
         placeholders = ", ".join(["%s"] * len(phones))
         sql = (
-            "SELECT id, user_id, username, phone, email, "
-            "conversation_energy_stone_total, crystal_stone_total "
+            "SELECT id, user_id, username, phone, email, conversation_energy_stone_total "
             f"FROM users WHERE phone IN ({placeholders})"
         )
         cur.execute(sql, phones)
@@ -207,8 +256,7 @@ def fetch_user_rows(cur, students: Iterable[Student]) -> dict[str, dict]:
     if emails:
         placeholders = ", ".join(["%s"] * len(emails))
         sql = (
-            "SELECT id, user_id, username, phone, email, "
-            "conversation_energy_stone_total, crystal_stone_total "
+            "SELECT id, user_id, username, phone, email, conversation_energy_stone_total "
             f"FROM users WHERE LOWER(email) IN ({placeholders})"
         )
         cur.execute(sql, emails)
@@ -228,11 +276,26 @@ def fetch_spent_map(cur, user_ids: list[str], user_pk_ids: list[int]) -> dict[st
     uid_placeholders = ", ".join(["%s"] * len(user_ids))
     id_placeholders = ", ".join(["%s"] * len(user_pk_ids)) if user_pk_ids else ""
 
+    # 兼容两种 user_id 存法:
+    # - purchase_orders.user_id / asset_purchase_logs.user_id 存 users.id(BIGINT,自增)
+    # - 或直接存 users.user_id(UUID 字符串)
+    #
+    # 对于 BIGINT 存法,按用户 UUID 反查 users.id 来筛选(等价于:
+    #   WHERE po.user_id IN (SELECT id FROM users WHERE user_id IN (...uuid...))
+    # )
+    internal_id_subquery = f"(SELECT id FROM users WHERE user_id IN ({uid_placeholders}))"
+
     # 1) 优先流水表 asset_purchase_logs
+    # ⚠️ 注意:即使该表存在但查询结果为空,也不能提前 return,
+    # 因为部分环境只落 purchase_orders / purchase_order_items。
     try:
-        where_clauses = [f"CAST(apl.user_id AS CHAR) IN ({uid_placeholders})"]
-        params: list[object] = list(user_ids)
+        where_clauses = [
+            f"CAST(apl.user_id AS CHAR) IN ({uid_placeholders})",
+            f"apl.user_id IN {internal_id_subquery}",
+        ]
+        params: list[object] = list(user_ids) + list(user_ids)
         if user_pk_ids:
+            # 兜底:如果调用方已传入 users.id,也一起兼容
             where_clauses.append(f"apl.user_id IN ({id_placeholders})")
             params.extend(user_pk_ids)
         sql = (
@@ -247,15 +310,47 @@ def fetch_spent_map(cur, user_ids: list[str], user_pk_ids: list[int]) -> dict[st
         rows = cur.fetchall()
         for row in rows:
             uid = str(row["uid"])
-            spent_map[uid] = floor_non_negative(row.get("spent_energy"))
-        return spent_map
+            spent_map[uid] = max(spent_map.get(uid, 0), floor_non_negative(row.get("spent_energy")))
     except Exception:
+        # 表不存在 / 无权限 / 字段差异都直接忽略,继续走订单兜底
         pass
 
     # 2) 回退订单表 purchase_orders(仅 completed)
     try:
-        where_clauses = [f"CAST(po.user_id AS CHAR) IN ({uid_placeholders})"]
-        params = list(user_ids)
+        where_clauses = [
+            f"CAST(po.user_id AS CHAR) IN ({uid_placeholders})",
+            f"po.user_id IN {internal_id_subquery}",
+        ]
+        params = list(user_ids) + list(user_ids)
+        if user_pk_ids:
+            # 兜底:如果调用方已传入 users.id,也一起兼容
+            where_clauses.append(f"po.user_id IN ({id_placeholders})")
+            params.extend(user_pk_ids)
+        sql = (
+            "SELECT CAST(u.user_id AS CHAR) AS uid, "
+            "FLOOR(COALESCE(SUM(poi.cost_energy), 0)) AS spent_energy "
+            "FROM purchase_order_items poi "
+            "JOIN purchase_orders po ON poi.order_id = po.id "
+            "JOIN users u ON (CAST(po.user_id AS CHAR) = CAST(u.user_id AS CHAR) OR po.user_id = u.id) "
+            "WHERE po.status = 'completed' "
+            f"AND ({' OR '.join(where_clauses)}) "
+            "GROUP BY u.user_id"
+        )
+        cur.execute(sql, params)
+        rows = cur.fetchall()
+        for row in rows:
+            uid = str(row["uid"])
+            spent_map[uid] = max(spent_map.get(uid, 0), floor_non_negative(row.get("spent_energy")))
+    except Exception:
+        pass
+
+    # 3) 再回退订单主表 purchase_orders(仅 completed)
+    try:
+        where_clauses = [
+            f"CAST(po.user_id AS CHAR) IN ({uid_placeholders})",
+            f"po.user_id IN {internal_id_subquery}",
+        ]
+        params = list(user_ids) + list(user_ids)
         if user_pk_ids:
             where_clauses.append(f"po.user_id IN ({id_placeholders})")
             params.extend(user_pk_ids)
@@ -272,7 +367,7 @@ def fetch_spent_map(cur, user_ids: list[str], user_pk_ids: list[int]) -> dict[st
         rows = cur.fetchall()
         for row in rows:
             uid = str(row["uid"])
-            spent_map[uid] = floor_non_negative(row.get("spent_energy"))
+            spent_map[uid] = max(spent_map.get(uid, 0), floor_non_negative(row.get("spent_energy")))
         return spent_map
     except Exception:
         return spent_map
@@ -285,13 +380,20 @@ def main() -> int:
         default="energyStoneStats/student_energy_stones_report.csv",
         help="输出 CSV 路径",
     )
+    parser.add_argument(
+        "--env-file",
+        default="",
+        help="可选:指定 env 文件路径(默认自动尝试 backend/.env.lyrria 和 backend/.env)",
+    )
     args = parser.parse_args()
 
     students = parse_students(STUDENTS_RAW)
+    project_root = Path(__file__).resolve().parents[1]
     out_path = Path(args.output).resolve()
     out_path.parent.mkdir(parents=True, exist_ok=True)
 
-    db_conf = get_db_config()
+    env_values = load_db_env(project_root, args.env_file or None)
+    db_conf = get_db_config(env_values)
 
     try:
         conn = pymysql.connect(**db_conf)
@@ -318,6 +420,7 @@ def main() -> int:
         "user_id",
         "当前对话能量石",
         "累计消费对话能量石",
+        "总数(当前+累计消费)",
     ]
 
     matched_count = 0
@@ -328,13 +431,14 @@ def main() -> int:
         for s in students:
             row = user_map.get(s.contact_norm)
             if not row:
-                writer.writerow([s.name, s.gender, s.contact, "否", "", "", 0, 0])
+                writer.writerow([s.name, s.gender, s.contact, "否", "", "", 0, 0, 0])
                 continue
 
             matched_count += 1
             conv = int(row.get("conversation_energy_stone_total") or 0)
             uid = str(row["user_id"])
             spent_energy = int(spent_map.get(uid, 0))
+            total = conv + spent_energy
 
             writer.writerow(
                 [
@@ -346,6 +450,7 @@ def main() -> int:
                     uid,
                     conv,
                     spent_energy,
+                    total,
                 ]
             )
 

+ 110 - 0
energyStoneStats/student_energy_stones_report_all_plus4.csv

@@ -0,0 +1,110 @@
+姓名,性别,注册联系方式,是否匹配到账号,平台用户名,user_id,当前对话能量石,累计消费对话能量石,总数(当前+累计消费)
+罗美琦,女,19711326711,是,罗美琦,b5386be9-0681-47db-bc6b-ae9cdeb2f11b,151,0,151
+龚思彤,女,15159576276,是,stone,5d717a7c-b738-4fbb-b42e-1cc0b42c2484,153,0,153
+田野,女,19902066958,是,田野,c1b7a4a1-8dc5-45cb-aadf-63c1c5d0d083,170,0,170
+刘可心,女,13212206251,是,Jean,027441f7-ea34-44ab-ac6d-d1d93af4f4a1,50,150,200
+田萌萌,女,17516593368,是,Rony,4bd88f52-eb42-4f3a-8910-cb478f0313cb,0,0,0
+罗婷婷,女,19314452610,是,User5404741,532b3a4f-dd13-4f9d-a483-58332f991fcc,150,0,150
+张晋恺,女,13224873003,是,User1048888,05bad61c-ef15-4f8c-a758-4d0299bec3a1,150,0,150
+徐锦杰,男,13071721013,是,病娇徐,2cbbad0d-a31f-44c7-8d77-06393fccc888,150,0,150
+王玉丽,女,3909084415@qq.com,是,Elina,be8cb610-d8e8-49d5-9c90-c64a47edf471,0,0,0
+李雯雯,女,15294449145,是,Seraph,07fdc2f4-9d19-48cb-a55a-9b7caca3b65d,152,0,152
+谢思娴,女,tdhf_1314@qq.com,是,Shaylyn,a51730bd-18be-42d1-b075-47f75dfcc2e1,195,0,195
+杨曌星,男,13523271668,是,zhao xing,9b878dc5-e71c-4194-9c29-5c6a78a1ec9b,150,0,150
+冯钰鑫,女,19139663395,是,冯钰鑫,5e921a5f-ee2d-40b0-86f3-aa5f1a0b5ede,160,0,160
+李佳静,女,15538870181,是,Jasmine,07a88ff7-3853-405c-9309-fa62ad73d829,151,0,151
+刘晨,女,15638942669,否,,,0,0,0
+周春婷,女,19711317977,是,mm,b63ee7c5-9183-41f2-bd8c-daa54ba35f4a,150,0,150
+邢恩希,女,15039696935,是,star.,593d42ca-e10d-46ee-9326-98f33173d724,163,0,163
+雷雯雯,女,17537570801,是,문훈,ce90f334-bd76-43c3-bb45-ee67e6845287,150,0,150
+梁晨,女,17839964962,是,Eva,1c727513-59fc-4520-92fe-a45343c39116,464,0,464
+白佳雯,女,18239732780,是,失恋超人,f6feb4ed-bc4d-4478-ab4e-7be4694f152d,150,0,150
+鲁玉,女,16692035616,是,Nori,1f96cf20-fd6e-4aa8-8a6f-84a9cfd3c218,154,0,154
+崔阿米,女,16637083310,是,崔阿米,a21bb333-2d0a-4957-82a1-dc091d6db06d,200,0,200
+谢梦雅,女,13525607570,是,Iris,94707bf1-2446-41cc-a2ef-1e5d18a9c75f,300,0,300
+张聪,女,19299697400,是,User4635153,c1a7226c-15db-490d-88f2-237a607635c7,150,0,150
+徐悦,女,17508968915,是,xiayue,6510a0db-2793-4c7b-a762-3f77ff2e3686,151,0,151
+伍昱霖,女,19723753500,是,510,c5dce1f6-17a4-4289-8bf0-1f68d2ea0066,150,0,150
+朱鹏宇,男,18116970476,是,朱鹏宇,a5e95e26-b04d-4ea4-94d1-417aa4db62cb,150,0,150
+冯明慧,女,18526514698,是,月野兔,f0eeede3-40ed-43d1-916b-a9cb738da1a1,152,0,152
+白雨洁,女,13941827995,是,Iris,b66287b7-70f6-42ab-b23b-647e2478a898,151,0,151
+王路路,女,18424092630,是,王路路,b2ff28f8-8ba9-4046-a650-1fc958e4f752,150,0,150
+黄嘉,女,19310998940,否,,,0,0,0
+吕晶,女,15034931966,是,浮祐,c9fdc14a-9388-48cf-b4dd-591ee8800480,151,0,151
+周杰,男,19817605116,是,Skolman,b75df4ea-5f18-4fe1-b8b7-0bb16a8dfab5,165,0,165
+赵文蔚,女,17752217635,是,User7250481,18a85cef-c906-4cbc-97fd-baa88020766f,0,0,0
+陈特战,男,18876506787,是,131425208ctz,2e9c1ee4-faaf-41fe-bcfd-bd673e1bd8a5,150,0,150
+郭子越,女,15959440103,是,Cecilia,d09aa5f5-f2ca-4b09-94ec-b863dffcd025,150,0,150
+刘若愚,女,19713770150,是,Vesper,fc2e72d1-0e1c-4352-8103-754707780352,150,0,150
+刘淑元,女,15565391720,是,Eden,d97efc2d-4669-42bb-9b55-dc8809d4f8dd,150,0,150
+任安媛,女,13938486612,是,131425213任安媛,2e0bfb46-0c9c-4e5f-8174-3e805da986e5,167,0,167
+张雨欣,女,18568987876,是,Lucia,30701381-beb8-4e4a-bdba-9f4177bf6867,50,100,150
+翟耀慈,女,17694823859,是,Cici,207da477-1987-4f2c-a5d9-618881452e73,150,50,200
+刘叶,女,18837785921,是,Lynn,d2801786-db9b-436a-8887-454b55f14d24,190,0,190
+曹东英,女,15638680120,是,Ingrid,797b7188-d593-4ea5-b32f-59cadba90139,212,0,212
+王婧睿,女,19836798129,是,Chanel,e9f285f5-8599-4ebc-8e8d-b6917ad912c7,151,0,151
+建灿灿,女,18836955657,是,解除错,c4963da5-b20a-4b3b-93bb-80acaaf0061e,150,0,150
+李伟杰,男,13027567593,是,jie,2e4b94ea-859b-4632-ae33-294d44b705d6,150,0,150
+杨紫婷,女,2596304351@qq.com,是,Mia,68ef39a3-a8e9-43f7-9963-b5c9afd685b5,158,0,158
+乔妙,女,18614940378,是,Vertin,49a6d8c0-a9b8-4d78-ab62-3d5fd34a2302,151,0,151
+蔡缘缘,女,15348856989,是,yuanyuan,414d65db-565c-4bb7-9144-f55963b93d63,164,0,164
+邱琳,女,18682809921,是,ql,b8d77029-9648-4166-9852-75f64a765ee9,150,0,150
+裴俐宁,女,17699021801,是,Crystal,acb79d5a-bdd7-407d-afa3-f5886e261dad,124,0,124
+郝运,女,18522832899,是,郝运,256d9a93-2ce2-482a-bb7c-e977261f0b68,195,0,195
+王靖涵,女,19841716861,是,soya,49998aea-1c4f-4e1b-8b86-28d3a03eae0a,172,0,172
+邓祁,男,19577245616,是,Eric,d598f9c8-f315-4d09-9462-649df01b941c,150,0,150
+李玉,女,17537572086,是,Liyu,ad3a5a7c-fc56-4dd9-b490-b2ebdcb536e2,237,0,237
+张彦慧,女,13947518663,是,Karry,1cbc13a6-05b5-4fcc-b9f0-c9b28a2e1e31,187,0,187
+吴晓萌,女,19883397179,是,萌霸天,7c5d995e-3291-4316-91aa-f504e9a613ef,156,0,156
+赵籽菲,女,17752190527,是,Felicia,96e85c34-ecf8-4ad0-844b-7d939419c87c,154,0,154
+唐静茹,女,13459073038,是,Ruby,d799bf09-fff1-4540-a101-b07deecd1a9c,151,0,151
+张震宇,男,18537388175,是,大帅哥,eeb9cdf0-05d9-469c-9556-29fd909b5e66,150,0,150
+邢艺凡,女,18821550722,是,stellaooecho,31342fdc-aebd-4404-bb10-d5526c7e9567,150,0,150
+李笑笑,女,13137518291,是,User2016165,d8ce6f86-eaee-4561-b735-a5dc7466dd4c,160,0,160
+曹梦涵,女,17395985731,是,Nora,d44511ca-887e-4257-8561-f825aec4b66a,152,0,152
+杨梦丹,女,17603814211,是,小羊baby,b8ef7f38-ed6d-48d8-9c0e-34ba70d054b6,159,0,159
+涂梦媛,女,13071720579,是,Aliza,09405906-a35a-4a14-8435-912050975d8e,150,0,150
+程丽阳,女,15837790081,是,Yolo,d854ce53-42d6-4b24-8ca2-8b4a92c71280,175,0,175
+孙嘉菡,女,13193759767,是,时间海,a5b6a88a-b4ee-4704-a496-18d377e705e2,220,0,220
+何佩佩,女,13213821903,是,Sweet corn,8ff86a70-30f6-40ae-ab64-814ca3799b52,150,0,150
+高嘉瑶,女,13017648500,是,高嘉瑶131425319,59908faf-6664-4e6d-af1d-28043ca7d01a,151,0,151
+范鹏宁,女,17516920283,是,Grace,7f35e10f-d2e3-4d09-bd01-a22dd6754cb8,182,0,182
+平旭冉,男,18739936558,否,,,0,0,0
+王梵,女,17329396296,是,Amily,08818e6e-0ff7-4255-bcf6-77d42a7f2e5b,161,0,161
+娄湘雯,女,15537306219,是,Elowen,841a2cb2-0f5b-4f2f-ba98-f50f148d4b33,400,0,400
+董璐雅,女,15836245275,是,董美丽,530ba605-6601-4435-8477-bdbc102e3cbd,164,0,164
+赵艺斐,女,13307572716,是,赵艺斐,ad8b7003-5dd2-4700-bad4-cfd0bafea7b2,156,0,156
+黄小倍,女,17781490609,是,TunManJi,7ed1652e-66a2-4296-82f8-cd7b1df0a6d7,151,0,151
+杨鑫,女,17311592921,是,User5786554,19c6d2ca-1f5b-462f-98be-da4d62315c9e,0,0,0
+马晓轩,女,17399518133,是,kerry,436a0fd8-ebd4-4ba6-9744-e69f0faa869e,150,0,150
+孙靖然,女,18602625361,是,User9049366,554c5c5d-6e02-47f0-9d45-f95db66b2aed,151,0,151
+姜瑞萌,女,19711325377,是,Luna,7fec882c-ee74-40fe-8d89-b3baad712a61,203,0,203
+高静,女,17516628069,是,Nunu,d222fc19-7778-4a33-b354-51351efca1c3,193,0,193
+贾少华,男,15704905434,是,小花学英语,06d36c77-2226-4644-988f-943aa891aa0b,369,0,369
+张若瑜,女,13030474653,是,张若瑜,77af653c-40ff-4916-ac2c-b9d483571bb7,161,0,161
+陈紫怡,女,13967285960,是,orange,e4a7b648-90c2-40a9-873c-98bd2099e15b,234,0,234
+王毅丽,女,15309499161,是,Wangyili,22884960-03e6-4e76-acb0-c8ec540bac6c,210,0,210
+黄馨滢,女,18350762010,是,Ying,a8f00298-84fc-43c5-b743-fe1fffef1561,170,0,170
+郭柏硕,男,19943880018,是,Alen,05f44da6-32b8-4ec4-885a-8527e1c28ea9,245,0,245
+张佳慧,女,19032356204,是,Kaia,0ed35005-49aa-492b-b484-25237d1f267e,189,0,189
+栗紫阳,女,15083066053,是,Mia,7c43cac6-2eea-4bf6-a8f9-24a25aecc3e7,0,0,0
+李静茹,女,19339813022,是,Jingru,bd935362-5ae9-4892-8273-663d48da8301,161,0,161
+杨思雨,女,17537572029,是,不高冷呆呆鱼,76ac4b47-caaf-41bc-8088-05e57d5b2fd5,167,0,167
+郭佳畅,女,13383879187,是,Zoe,5c68e380-f9d5-4a43-9cba-f9087c925dae,185,0,185
+尚子箴,女,19561500219,是,User1714273,18a31fe2-079f-4023-877c-3ac7362c619c,166,0,166
+王寒雪,女,18437094969,是,whx,c5e5d766-6f0d-43b8-bce4-5be40a5e6215,220,0,220
+陈彦茹,女,18790613283,是,User9664415,f320c9e6-a98f-48c7-a822-995314202c37,190,0,190
+陈佳欣,女,14748649659,是,User1483237,8ed6c6c1-4867-4ea9-91a2-34c1e17682a9,150,0,150
+刘海玲,女,19562672662,是,Henlen,4e419196-5b1a-487a-bfba-33a0291a1fe1,215,0,215
+刘天恩,男,15203867407,是,星灵运转,945d0917-ed47-4a71-b3d0-ecf49bcf0e66,151,0,151
+吕佳欣,女,18238638738,是,Edith,0b359abe-4018-443c-b6ec-451cf67c5518,195,0,195
+郭盈盈,女,17337520895,是,Yumi,3ebb02c0-e1a4-46a5-800f-d0f42057157d,206,0,206
+洪优雅,女,19839039137,是,Elegance,5b0ee03a-e51d-437a-a169-40fcb89f7e90,232,0,232
+苏晓涵,女,17733164846,是,User5828512,1bfc6e13-6d85-4fc0-97f6-2f37dc7fbc96,201,0,201
+辜文清,女,15181056902,是,Lvy,7dd40a67-e6af-4b27-a0cf-2464ff9874e3,256,0,256
+张文艺,男,18121555161,否,,,0,0,0
+陈亮颖,女,18999217921,是,aim,a243a92b-0b6a-4c84-973c-eb88b1a3a64f,205,0,205
+刘晨,女,15639942669,是,刘晨,d172e1dc-46ea-4df3-9eda-394ced15e213,151,0,151
+平旭冉,男,1779117328@qq.com,是,Sakura,f615c607-9b3d-41a0-81ff-32bbcbe0de78,152,0,152
+张文艺,男,18821555161,是,kien,aced6ecc-587c-4fe4-8e43-f18ab1593aba,160,0,160
+黄嘉,女,19310798940,是,Carys,a5df5a9a-7db2-4bad-a8c7-08f49c05af1b,151,0,151