e7af0e15ab
新增: - 今日纪要 (6分类+彩色标签+时间选择器) - 客户经理PC端工作台 (我的数据,5模块CRUD) - 用户管理页 (支局长修改角色) - 客户备注/收支费用(金额+单位)/联系人管理 - 拜访人姓名+电话字段 - 客户导入导出/旧周报导入模板下载 - 序号列+分页(25/50/100) 修复/优化: - Hash路由→HTML5 History, Casdoor回调正常 - 时区统一为Asia/Shanghai (today_cst) - 数据库懒加载→selectinload预加载 - 日期解析兼容ISO datetime字符串 - 文件上传定位修复 (position:relative) - 表单button type='button'防止误提交 - 分管领导权限(只读客户档案,不可编辑) - 侧边栏折叠+SVG图标 - 拜访方式/紧急度统一chip风格 - 时间范围统一为el-time-picker(is-range) - 全局CSS设计变量+box-sizing修复滚动条 Co-Authored-By: Claude <noreply@anthropic.com>
26 lines
1.5 KiB
Python
26 lines
1.5 KiB
Python
import uuid
|
|
from datetime import datetime, date
|
|
from sqlalchemy import String, Text, Date, DateTime, ForeignKey, func
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
from sqlalchemy.dialects.postgresql import UUID, ARRAY
|
|
from app.database import Base
|
|
|
|
|
|
class Visit(Base):
|
|
__tablename__ = "visits"
|
|
|
|
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
customer_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("customers.id"), index=True)
|
|
visit_date: Mapped[date] = mapped_column(Date, index=True)
|
|
visit_method: Mapped[str] = mapped_column(String(20), default="上门") # 上门/电话/微信/出差
|
|
time_range: Mapped[str] = mapped_column(String(30), default="")
|
|
communication_content: Mapped[str] = mapped_column(Text, default="")
|
|
customer_demand: Mapped[str] = mapped_column(Text, default="")
|
|
visitor_name: Mapped[str] = mapped_column(String(50), default="")
|
|
visitor_phone: Mapped[str] = mapped_column(String(20), default="")
|
|
companions: Mapped[list | None] = mapped_column(ARRAY(UUID(as_uuid=True)), nullable=True)
|
|
photos: Mapped[list | None] = mapped_column(ARRAY(Text), nullable=True)
|
|
manager_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"), index=True)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|