feat: initial commit and ignore qwen files
This commit is contained in:
27
backend/app/schemas/__init__.py
Normal file
27
backend/app/schemas/__init__.py
Normal file
@ -0,0 +1,27 @@
|
||||
"""Pydantic Schema 导出模块"""
|
||||
from app.schemas.deduce_bom import DeduceBomResponse, MaterialRequirementItem
|
||||
from app.schemas.work_order import (
|
||||
WorkOrderCreate,
|
||||
WorkOrderUpdate,
|
||||
WorkOrderStatusUpdate,
|
||||
WorkOrderResponse,
|
||||
)
|
||||
from app.schemas.approval import (
|
||||
ApprovalCreate,
|
||||
ApprovalStatusUpdate,
|
||||
ApprovalResponse,
|
||||
ApprovalDetailResponse,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"DeduceBomResponse",
|
||||
"MaterialRequirementItem",
|
||||
"WorkOrderCreate",
|
||||
"WorkOrderUpdate",
|
||||
"WorkOrderStatusUpdate",
|
||||
"WorkOrderResponse",
|
||||
"ApprovalCreate",
|
||||
"ApprovalStatusUpdate",
|
||||
"ApprovalResponse",
|
||||
"ApprovalDetailResponse",
|
||||
]
|
||||
62
backend/app/schemas/approval.py
Normal file
62
backend/app/schemas/approval.py
Normal file
@ -0,0 +1,62 @@
|
||||
"""缺料审批 Schema
|
||||
|
||||
核心原则:
|
||||
- 所有写操作仅在 pms_db 中进行
|
||||
- 绝对禁止对 inventory_db 进行任何写操作
|
||||
- 物料信息仅从 inventory_db 查询获取,不进行写操作
|
||||
"""
|
||||
from pydantic import BaseModel, Field
|
||||
from datetime import datetime
|
||||
from app.models.production import ApprovalStatus
|
||||
|
||||
|
||||
class ApprovalCreate(BaseModel):
|
||||
"""创建缺料审批申请"""
|
||||
work_order_id: int = Field(..., description="工单ID")
|
||||
missing_material_id: int = Field(..., description="缺失物料ID")
|
||||
required_qty: int = Field(gt=0, description="需要补充的数量")
|
||||
reason: str | None = Field(None, max_length=500, description="申请原因")
|
||||
|
||||
|
||||
class ApprovalStatusUpdate(BaseModel):
|
||||
"""审批状态更新"""
|
||||
status: ApprovalStatus = Field(
|
||||
...,
|
||||
description="新状态(APPROVED 或 REJECTED)"
|
||||
)
|
||||
|
||||
|
||||
class ApprovalResponse(BaseModel):
|
||||
"""基础缺料审批响应"""
|
||||
id: int
|
||||
work_order_id: int
|
||||
missing_material_id: int
|
||||
required_qty: int
|
||||
reason: str | None
|
||||
status: ApprovalStatus
|
||||
created_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class ApprovalDetailResponse(BaseModel):
|
||||
"""带详情的缺料审批响应
|
||||
|
||||
包含:
|
||||
- 工单编号
|
||||
- 物料名称
|
||||
- 其他基本信息
|
||||
"""
|
||||
id: int
|
||||
work_order_id: int
|
||||
work_order_no: str = Field(..., description="工单编号")
|
||||
missing_material_id: int
|
||||
material_name: str = Field(..., description="物料名称")
|
||||
required_qty: int
|
||||
reason: str | None
|
||||
status: ApprovalStatus
|
||||
created_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
28
backend/app/schemas/deduce_bom.py
Normal file
28
backend/app/schemas/deduce_bom.py
Normal file
@ -0,0 +1,28 @@
|
||||
"""齐套性推演接口 Schema"""
|
||||
from pydantic import BaseModel, Field
|
||||
from decimal import Decimal
|
||||
|
||||
|
||||
class MaterialRequirementItem(BaseModel):
|
||||
"""物料需求项"""
|
||||
material_id: int = Field(alias="base_id")
|
||||
material_name: str
|
||||
spec_model: str | None
|
||||
unit: str | None
|
||||
required_quantity: Decimal = Field(ge=0)
|
||||
current_stock: Decimal = Field(default=Decimal("0"))
|
||||
shortage_quantity: Decimal = Field(ge=0)
|
||||
is_shortage: bool
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
populate_by_name = True
|
||||
|
||||
|
||||
class DeduceBomResponse(BaseModel):
|
||||
"""齐套性推演响应"""
|
||||
target_base_id: int
|
||||
target_quantity: int
|
||||
is_shortage: bool
|
||||
total_shortage_count: int
|
||||
material_requirements: list[MaterialRequirementItem]
|
||||
85
backend/app/schemas/project.py
Normal file
85
backend/app/schemas/project.py
Normal file
@ -0,0 +1,85 @@
|
||||
"""项目相关 Schema"""
|
||||
from pydantic import BaseModel
|
||||
from datetime import date, datetime
|
||||
from app.models.production import ProjectStatus
|
||||
|
||||
|
||||
class ProjectBase(BaseModel):
|
||||
"""项目基础 Schema"""
|
||||
project_no: str
|
||||
name: str
|
||||
start_date: date | None = None
|
||||
end_date: date | None = None
|
||||
status: ProjectStatus = ProjectStatus.DRAFT
|
||||
|
||||
|
||||
class ProjectCreate(ProjectBase):
|
||||
"""创建项目"""
|
||||
pass
|
||||
|
||||
|
||||
class ProjectUpdate(BaseModel):
|
||||
"""更新项目"""
|
||||
name: str | None = None
|
||||
start_date: date | None = None
|
||||
end_date: date | None = None
|
||||
status: ProjectStatus | None = None
|
||||
|
||||
|
||||
class ProjectResponse(ProjectBase):
|
||||
"""项目响应"""
|
||||
id: int
|
||||
created_at: datetime
|
||||
updated_at: datetime | None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class ProjectStats(BaseModel):
|
||||
"""项目统计信息"""
|
||||
project_id: int
|
||||
project_no: str
|
||||
project_name: str
|
||||
status: ProjectStatus
|
||||
start_date: date | None
|
||||
end_date: date | None
|
||||
|
||||
# 进度相关
|
||||
total_work_orders: int
|
||||
completed_work_orders: int
|
||||
in_progress_work_orders: int
|
||||
pending_work_orders: int
|
||||
progress_percentage: float # 完成百分比
|
||||
|
||||
# 物料到位率(基于缺料审批)
|
||||
total_approvals: int
|
||||
pending_approvals: int
|
||||
approved_approvals: int
|
||||
rejected_approvals: int
|
||||
material_ready_rate: float # 物料到位率 (approved / total_approvals * 100)
|
||||
|
||||
# 延期预警
|
||||
is_overdue: bool # 当前日期超过 end_date 且状态未完成
|
||||
overdue_days: int | None # 延期天数(正数表示延期,负数表示提前)
|
||||
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class ProjectSummary(BaseModel):
|
||||
"""项目总览汇总"""
|
||||
total_projects: int
|
||||
active_projects: int
|
||||
completed_projects: int
|
||||
overdue_projects: int
|
||||
|
||||
# 全局统计
|
||||
total_work_orders: int
|
||||
completed_work_orders: int
|
||||
overall_progress: float # 全局进度
|
||||
|
||||
total_pending_approvals: int
|
||||
overall_material_ready_rate: float
|
||||
|
||||
# 项目列表
|
||||
projects: list[ProjectStats]
|
||||
40
backend/app/schemas/work_order.py
Normal file
40
backend/app/schemas/work_order.py
Normal file
@ -0,0 +1,40 @@
|
||||
"""工单 Schema"""
|
||||
from pydantic import BaseModel, Field
|
||||
from datetime import datetime
|
||||
from app.models.production import WorkOrderStatus
|
||||
|
||||
|
||||
class WorkOrderBase(BaseModel):
|
||||
"""工单基础 Schema"""
|
||||
project_id: int
|
||||
target_base_id: int
|
||||
target_quantity: int = Field(gt=0)
|
||||
assignee_name: str | None = None
|
||||
|
||||
|
||||
class WorkOrderCreate(WorkOrderBase):
|
||||
"""创建工单"""
|
||||
work_order_no: str
|
||||
|
||||
|
||||
class WorkOrderUpdate(BaseModel):
|
||||
"""更新工单"""
|
||||
target_quantity: int | None = None
|
||||
assignee_name: str | None = None
|
||||
|
||||
|
||||
class WorkOrderStatusUpdate(BaseModel):
|
||||
"""状态流转"""
|
||||
status: WorkOrderStatus
|
||||
|
||||
|
||||
class WorkOrderResponse(WorkOrderBase):
|
||||
"""工单响应"""
|
||||
id: int
|
||||
work_order_no: str
|
||||
status: WorkOrderStatus
|
||||
created_at: datetime
|
||||
updated_at: datetime | None
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
Reference in New Issue
Block a user