feat: initial commit and ignore qwen files

This commit is contained in:
dxc
2026-04-30 10:06:32 +08:00
commit def4f7d71f
55 changed files with 5252 additions and 0 deletions

View 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",
]

View 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

View 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]

View 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]

View 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