merge: integrate ZSY customer service and profile capabilities

This commit is contained in:
张胜宇
2026-09-11 22:31:51 +08:00
94 changed files with 7933 additions and 77 deletions
+6 -3
View File
@@ -6,13 +6,13 @@
1. `user_facts.id` 在库里**没有 auto_increment**,插入时必须由应用显式提供主键;
2. `profile_snapshots.current_customer_id` 是**生成列**(`IF(is_current=1, customer_id, NULL)`),
与唯一键 `uk_profile_snapshot_current` 共同保证「每个客户最多一条当前快照」。生成列由数据库
维护,因此这里**故意不映射**——映射了反而会在写入时与之冲突。
维护,因此这里只映射为只读计算列,写入时不会提供该字段。
"""
from datetime import datetime
from typing import Any
from sqlalchemy import CHAR, JSON, BigInteger, Boolean, DateTime, Float, String
from sqlalchemy import CHAR, JSON, BigInteger, Boolean, Computed, DateTime, Float, String
from sqlalchemy.orm import Mapped, mapped_column
from app.model.base import Base
@@ -59,4 +59,7 @@ class ProfileSnapshot(Base):
generated_at: Mapped[datetime | None] = mapped_column(DateTime)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
# current_customer_id 为生成列,由数据库维护,故意不映射(见模块 docstring)
# 生成列由数据库维护;映射为只读计算列,便于按当前快照查询,不参与 INSERT/UPDATE。
current_customer_id: Mapped[int | None] = mapped_column(
BigInteger, Computed("IF(is_current = 1, customer_id, NULL)")
)