Files
hankin 815cbf9d8c v0.2.0: CRM/ERP 系统升级 - 清理 .gitignore 并移除误提交的 venv/env/db 文件
- 更新 .gitignore:全面覆盖环境变量、数据库、日志、缓存、上传文件
- 移除误跟踪的 server/venv/、crm_data.db、.env 文件
- 新增 server/.env.example 模板
- 新增合同管理、利润核算、AI教练等功能模块
- 新增 Playwright e2e 测试套件
- 前后端多项功能升级和 bug 修复
2026-05-11 07:24:19 +00:00

80 lines
3.3 KiB
Python

"""
CRM 客户域 Pydantic V2 Schemas
"""
from __future__ import annotations
import uuid
from datetime import datetime
from typing import Any
from pydantic import BaseModel, Field
# ── 开票信息子结构 ─────────────────────────────────────────
class BillingInfoSchema(BaseModel):
company_name: str | None = Field(default=None, max_length=200, description="开票公司全称")
tax_id: str | None = Field(default=None, max_length=50, description="纳税人识别号")
address: str | None = Field(default=None, max_length=300, description="地址")
phone: str | None = Field(default=None, max_length=30, description="电话")
bank_name: str | None = Field(default=None, max_length=200, description="开户行")
bank_account: str | None = Field(default=None, max_length=50, description="银行账号")
# ── 创建 ──────────────────────────────────────────────────
class CustomerCreate(BaseModel):
name: str = Field(..., min_length=1, max_length=200, examples=["中石化润滑油公司"])
level: str = Field(default="C", pattern=r"^[ABC]$")
industry: str | None = Field(default=None, max_length=100)
contact: str | None = Field(default=None, max_length=50)
phone: str | None = Field(default=None, max_length=30)
email: str | None = Field(default=None, max_length=100)
address: str | None = None
billing_info: BillingInfoSchema | None = None
status: int = Field(default=1, ge=0, le=1)
# ── 更新 ──────────────────────────────────────────────────
class CustomerUpdate(BaseModel):
name: str | None = Field(default=None, min_length=1, max_length=200)
level: str | None = Field(default=None, pattern=r"^[ABC]$")
industry: str | None = Field(default=None, max_length=100)
contact: str | None = Field(default=None, max_length=50)
phone: str | None = Field(default=None, max_length=30)
email: str | None = Field(default=None, max_length=100)
address: str | None = None
billing_info: BillingInfoSchema | None = None
status: int | None = Field(default=None, ge=0, le=1)
# ── 响应 ──────────────────────────────────────────────────
class CustomerResponse(BaseModel):
id: uuid.UUID
name: str
level: str
industry: str | None = None
contact: str | None = None
phone: str | None = None
email: str | None = None
address: str | None = None
ai_score: float = 0
ai_persona: dict[str, Any] | None = None
billing_info: dict[str, Any] | None = None
owner_id: uuid.UUID | None = None
owner_name: str | None = None
status: int = 1
is_deleted: bool = False
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
# ── 分页列表 ─────────────────────────────────────────────
class CustomerListResponse(BaseModel):
total: int
items: list[CustomerResponse]
page: int
size: int