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>
120 lines
2.4 KiB
Python
120 lines
2.4 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
|
|
|
|
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
|