deeafe239f
前端: - 新增 Pinia theme store,localStorage 持久化,data-theme 切换 - App.vue: :root 新增 --font-*/--sidebar-* CSS 变量;新增 :root[data-theme=light] 完整配色(极简黑白金 + Noto Sans SC) - DesktopLayout: 侧边栏 15 个变量化 + 顶栏主题切换按钮 - MobileLayout: 装饰色变量化 - Settings: 新增「界面主题」卡片 - 21 个组件 font-family 统一替换为 var(--font-*) - 新增 utils/managerColor.ts — 12 色调色板 + 自适应文字色 + 后端自定义色优先 - WorkPlans/MiniBusiness/KeyVisits/CustomerManage: 客户经理标签色统一走共享工具 - UserManage: 编辑弹窗新增颜色选择器(仅 manager) - LightBoard: 去标题星标图标 - ManagerWorkspace/WorkPlans/MiniBusiness/KeyVisits: 删除按钮改为实心红底白字 后端: - User 模型新增 color 列 + lifespan 自动迁移 - users API 支持 color 字段读写 - UserOut schema 新增 color Co-Authored-By: Claude <noreply@anthropic.com>
122 lines
2.5 KiB
Python
122 lines
2.5 KiB
Python
from pydantic import BaseModel, Field
|
|
from typing import Optional
|
|
import uuid
|
|
from datetime import date, datetime
|
|
|
|
|
|
# ── User ──
|
|
class UserCreate(BaseModel):
|
|
name: str
|
|
role: str = "manager"
|
|
department: str = ""
|
|
wecom_userid: Optional[str] = None
|
|
|
|
|
|
class UserOut(BaseModel):
|
|
id: uuid.UUID
|
|
casdoor_id: str
|
|
name: str
|
|
role: str
|
|
department: str
|
|
wecom_userid: Optional[str] = None
|
|
require_report: bool = True
|
|
color: Optional[str] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
# ── CustomerContact ──
|
|
class ContactCreate(BaseModel):
|
|
name: str
|
|
phone: str = ""
|
|
role_desc: str = ""
|
|
|
|
|
|
class ContactOut(BaseModel):
|
|
id: uuid.UUID
|
|
customer_id: uuid.UUID
|
|
name: str
|
|
phone: str
|
|
role_desc: str
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
# ── Customer ──
|
|
class CustomerCreate(BaseModel):
|
|
name: str
|
|
industry: str = ""
|
|
address: str = ""
|
|
in_use_services: str = ""
|
|
monthly_fee: str = ""
|
|
remarks: str = ""
|
|
contacts: list[ContactCreate] = []
|
|
assignee_id: Optional[uuid.UUID] = None
|
|
|
|
|
|
class CustomerUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
industry: Optional[str] = None
|
|
address: Optional[str] = None
|
|
in_use_services: Optional[str] = None
|
|
monthly_fee: Optional[str] = None
|
|
remarks: Optional[str] = None
|
|
assignee_id: Optional[uuid.UUID] = None
|
|
|
|
|
|
class CustomerOut(BaseModel):
|
|
id: uuid.UUID
|
|
name: str
|
|
industry: str
|
|
address: str
|
|
in_use_services: str
|
|
monthly_fee: str
|
|
remarks: str = ""
|
|
created_by: uuid.UUID
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
contacts: list[ContactOut] = []
|
|
primary_manager_name: Optional[str] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class CustomerListOut(BaseModel):
|
|
id: uuid.UUID
|
|
name: str
|
|
industry: str
|
|
in_use_services: str
|
|
primary_manager_name: Optional[str] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class CustomerListResponse(BaseModel):
|
|
items: list[CustomerListOut]
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
# ── CustomerAssignment ──
|
|
class AssignmentCreate(BaseModel):
|
|
customer_id: uuid.UUID
|
|
manager_id: uuid.UUID
|
|
role: str = "primary"
|
|
|
|
|
|
class AssignmentOut(BaseModel):
|
|
id: uuid.UUID
|
|
customer_id: uuid.UUID
|
|
manager_id: uuid.UUID
|
|
role: str
|
|
assigned_at: datetime
|
|
assigned_by: uuid.UUID
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class BatchAssignRequest(BaseModel):
|
|
customer_ids: list[uuid.UUID]
|
|
manager_id: uuid.UUID
|