feat: 订单模块 v0.1 实现与样板二维平面图全量采集

- 后端分层架构: api(Controller)/services(业务)/repositories(数据)/models(ORM)
- 订单模块: 创建(契约对齐目标站{contract_id,drawing_data,pic_url})、搜索、
  详情、更新、删除、状态机(意向单→正式单→生产中→完工/取消,非法迁移拒绝)、
  7节点生产进度、审计日志
- 认证模块: JWT签发(HS256/24h)、PBKDF2密码、注册登录
- 样板库API: 分类树/模板搜索/模板详情, drawing_data 与采集样本同构
- 254张样板二维平面图全部采集并静态挂载 /static/windoor-images/
- 种子脚本: 管理员+分类树+254套样板入库
- 统一响应envelope与付费墙(code=10086)/权限(code=210)语义
- 端到端冒烟测试7/7通过, 更新API.md §12自研接口规范
This commit is contained in:
HHY
2026-09-20 08:16:03 -07:00
parent 7554f2e3c7
commit d3e6de585c
288 changed files with 1835 additions and 9 deletions
+1
View File
@@ -0,0 +1 @@
"""华门窗包。"""
+13
View File
@@ -0,0 +1,13 @@
"""认证模块 schemas。"""
from pydantic import BaseModel, Field
class LoginRequest(BaseModel):
phone_number: str = Field(min_length=5, max_length=20)
password: str = Field(min_length=4, max_length=64)
class LoginResponse(BaseModel):
token: str
expires_hours: int
user: dict
+86
View File
@@ -0,0 +1,86 @@
"""订单模块 Pydantic 请求/响应模型。"""
import datetime
from typing import Any
from pydantic import BaseModel, Field
from huamenchuang.models.order import DEFAULT_PROCESSES
class OrderCreate(BaseModel):
"""创建订单(对齐目标站契约:contract_id + drawing_data + pic_url)。"""
contract_id: int | None = None
drawing_data: str = Field(default="", description="shapeManager 序列化 JSON 字符串")
pic_url: str = ""
customer_id: int | None = None
note: str = ""
money: float = 0
count: int = 0
area: float = 0
status: int = Field(default=0, ge=0, le=4, description="0意向单 1正式单 2生产中 3完工 4取消")
class OrderUpdate(BaseModel):
"""订单更新:基础字段 + 状态迁移(action=change_status)。"""
sort: int | None = None
note: str | None = None
money: float | None = None
count: int | None = None
area: float | None = None
pic_url: str | None = None
drawing_data: str | None = None
cut_status: int | None = Field(default=None, ge=0, le=2)
action: str | None = Field(default=None, description="change_status=执行状态迁移")
target_status: int | None = Field(default=None, ge=0, le=4)
class OrderProcessUpdate(BaseModel):
name: str = Field(description=f"进度节点名,默认流程: {'/'.join(DEFAULT_PROCESSES)}")
status: int = Field(ge=0, le=2, description="0未开始 1进行中 2完成")
class OrderOut(BaseModel):
"""订单列表项(不含大字段 drawing_data)。"""
model_config = {"from_attributes": True}
id: int
order_no: str
contract_id: int | None
pic_url: str
customer_id: int | None
customer_name: str
phone: str
address: str
area: float
count: int
money: float
status: int
status_label: str
cut_status: int
sort: int
note: str
created_at: datetime.datetime
updated_at: datetime.datetime
class OrderDetail(OrderOut):
"""订单详情:附带 drawing_data 与生产进度。"""
drawing_data: str = ""
processes: list[dict[str, Any]] = []
class OrderSearch(BaseModel):
"""订单搜索(对齐目标站 POST 搜索语义)。"""
page: int = Field(default=1, ge=1)
page_size: int = Field(default=15, ge=1, le=100)
keyword: str = Field(default="", description="订单号/客户名/手机号 模糊")
status: int | None = Field(default=None, ge=0, le=4)
contract_id: int | None = None
start_date: str | None = ""
end_date: str | None = ""
order_by: str = Field(default="created_desc", description="created_desc/sort_asc/money_desc")