This commit is contained in:
2026-06-06 23:54:11 +08:00
commit 33639129b1
58 changed files with 10309 additions and 0 deletions
+160
View File
@@ -0,0 +1,160 @@
from __future__ import annotations
from typing import Any, Literal
from pydantic import BaseModel, Field
Role = Literal["student", "admin"]
OrderStatus = Literal["已提交", "待处理", "处理中", "待上门", "已完成", "已确认", "返工申请中", "已取消"]
Urgency = Literal["", "", "", "紧急"]
class LoginRequest(BaseModel):
username: str = Field(min_length=1, max_length=50)
password: str = Field(min_length=1, max_length=100)
class UserProfile(BaseModel):
id: int
username: str
display_name: str
role: Role
class LoginResponse(BaseModel):
token: str
user: UserProfile
class DiagnosisStartRequest(BaseModel):
message: str = Field(min_length=2, max_length=300)
class DiagnosisQuestionAnswer(BaseModel):
question_id: str
answer: str = Field(min_length=1, max_length=200)
class DiagnosisAnswerRequest(BaseModel):
session_id: str
answers: list[DiagnosisQuestionAnswer]
class DiagnosisQuestion(BaseModel):
id: str
prompt: str
class DiagnosisDraft(BaseModel):
category: str
urgency: Urgency
summary: str
safety_risk: bool
suggested_worker: str
notes: list[str]
class DiagnosisResponse(BaseModel):
session_id: str
stage: Literal["questions", "draft"]
initial_message: str
suggested_categories: list[str]
questions: list[DiagnosisQuestion]
draft: DiagnosisDraft | None = None
class SavedAddressOut(BaseModel):
id: int
campus: str
building: str
room: str
last_used_at: str
class OrderCreateRequest(BaseModel):
campus: str = Field(min_length=1, max_length=50)
building: str = Field(min_length=1, max_length=50)
room: str = Field(min_length=1, max_length=50)
category: str = Field(min_length=1, max_length=50)
raw_description: str = Field(min_length=2, max_length=300)
structured_summary: str = Field(min_length=2, max_length=400)
urgency: Urgency
expected_date: str | None = Field(default=None, max_length=20)
expected_time_segment: str | None = Field(default=None, max_length=50)
diagnosis_session_id: str | None = Field(default=None, max_length=80)
allow_room_entry: bool = False
class FeedbackRequest(BaseModel):
rating: int = Field(ge=1, le=5)
comment: str = Field(min_length=1, max_length=300)
class ReworkRequest(BaseModel):
reason: str = Field(min_length=2, max_length=300)
class AdminOrderUpdateRequest(BaseModel):
status: OrderStatus | None = None
assignee_name: str | None = Field(default=None, max_length=50)
expected_arrival_at: str | None = Field(default=None, max_length=50)
admin_note: str | None = Field(default=None, max_length=300)
class OrderEventOut(BaseModel):
id: int
actor_role: str
actor_name: str
event_type: str
title: str
detail: str | None
from_status: str | None
to_status: str | None
created_at: str
class AttachmentOut(BaseModel):
id: int
file_name: str
file_path: str
mime_type: str
created_at: str
class OrderSummaryOut(BaseModel):
id: int
order_no: str
campus: str
building: str
room: str
category: str
status: str
urgency: str
submission_time: str
expected_repair_time: str | None
assignee_name: str | None
class OrderDetailOut(BaseModel):
id: int
order_no: str
campus: str
building: str
room: str
category: str
status: str
urgency: str
raw_description: str
structured_summary: str
allow_room_entry: bool
expected_date: str | None
expected_time_segment: str | None
assignee_name: str | None
expected_arrival_at: str | None
admin_note: str | None
rework_reason: str | None
created_at: str
updated_at: str
attachments: list[AttachmentOut]
events: list[OrderEventOut]
feedback: dict[str, Any] | None