feat: 移除PDI和订单号字段,新增设备巡检模块

- 从物料跟踪页面移除订单号列和表单字段
- 从导航菜单移除PDI管理,添加设备巡检
- 新增InspectionLocation和InspectionRecord后端模型和API
- 新增设备巡检前端页面(左侧点位列表,右侧设备和历史记录)
This commit is contained in:
2026-05-27 16:38:40 +08:00
commit 193da0018f
86 changed files with 11379 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
from datetime import datetime
from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from loguru import logger
from app.models.material import Coil, MaterialTracking, CoilStatus
from app.services.message_parser import dispatcher
class MaterialService:
@staticmethod
async def get_coil(db: AsyncSession, coil_no: str) -> Optional[Coil]:
result = await db.execute(select(Coil).where(Coil.coil_no == coil_no))
return result.scalar_one_or_none()
@staticmethod
async def create_tracking(db: AsyncSession, coil: Coil, event_type: str,
position: str = None, **kwargs) -> MaterialTracking:
tracking = MaterialTracking(
coil_id=coil.id,
coil_no=coil.coil_no,
position=position,
event_type=event_type,
event_time=kwargs.get("event_time", datetime.now()),
**{k: v for k, v in kwargs.items() if k != "event_time"},
)
db.add(tracking)
await db.flush()
return tracking
@staticmethod
async def update_coil_status(db: AsyncSession, coil: Coil, status: CoilStatus):
coil.status = status
await db.flush()
material_service = MaterialService()
# 注册L1报文处理器
@dispatcher.register("PC01")
async def handle_coil_entry(data: dict):
"""处理卷材入口报文"""
from app.database import AsyncSessionLocal
async with AsyncSessionLocal() as db:
coil = await material_service.get_coil(db, data["coil_no"])
if coil:
await material_service.update_coil_status(db, coil, CoilStatus.ON_LINE)
await material_service.create_tracking(
db, coil, "entry", position="入口", **data
)
await db.commit()
logger.info(f"卷材入线: {data['coil_no']}")
@dispatcher.register("PC02")
async def handle_coil_exit(data: dict):
"""处理卷材出口报文"""
from app.database import AsyncSessionLocal
async with AsyncSessionLocal() as db:
coil = await material_service.get_coil(db, data["coil_no"])
if coil:
await material_service.update_coil_status(db, coil, CoilStatus.FINISHED)
await material_service.create_tracking(
db, coil, "exit", position="出口", **data
)
await db.commit()
logger.info(f"卷材出线: {data['coil_no']}")