完善系统拓展与原材料生命周期视图
This commit is contained in:
@@ -43,6 +43,7 @@ from app.schemas.dashboard import (
|
||||
SalesOrderLifecycleRead,
|
||||
)
|
||||
from app.services.auth import require_authenticated_user
|
||||
from app.services.material_lifecycle_dag import build_material_lot_lifecycle_graph
|
||||
from app.services.mock_data import get_dashboard_payload
|
||||
|
||||
router = APIRouter(dependencies=[Depends(require_authenticated_user)])
|
||||
@@ -358,7 +359,7 @@ def _material_lot_rows(limit: int = 100):
|
||||
.outerjoin(issue_subquery, issue_subquery.c.source_lot_id == StockLot.id)
|
||||
.outerjoin(finished_subquery, finished_subquery.c.source_material_lot_id == StockLot.id)
|
||||
.outerjoin(delivery_subquery, delivery_subquery.c.source_material_lot_id == StockLot.id)
|
||||
.where(Item.item_type == "RAW_MATERIAL")
|
||||
.where(Item.item_type == "RAW_MATERIAL", Warehouse.warehouse_type == "RAW")
|
||||
.order_by(StockLot.created_at.desc(), StockLot.id.desc())
|
||||
.limit(limit)
|
||||
)
|
||||
@@ -387,13 +388,10 @@ def list_dashboard_material_lots(
|
||||
return [DashboardMaterialLotRead.model_validate(dict(row)) for row in rows]
|
||||
|
||||
|
||||
@router.get("/material-lots/{lot_id}/lifecycle", response_model=MaterialLotLifecycleRead)
|
||||
def get_material_lot_lifecycle(lot_id: int, db: Session = Depends(get_db)) -> MaterialLotLifecycleRead:
|
||||
lot_row = db.execute(_material_lot_rows(limit=1).where(StockLot.id == lot_id)).mappings().first()
|
||||
if not lot_row:
|
||||
raise HTTPException(status_code=404, detail="原材料批次不存在")
|
||||
|
||||
lot = DashboardMaterialLotRead.model_validate(dict(lot_row))
|
||||
def _build_legacy_material_lot_lifecycle_graph(
|
||||
db: Session,
|
||||
lot: DashboardMaterialLotRead,
|
||||
) -> tuple[list[LifecycleNode], list[LifecycleEdge]]:
|
||||
nodes: list[LifecycleNode] = []
|
||||
edges: list[LifecycleEdge] = []
|
||||
node_ids: set[str] = set()
|
||||
@@ -465,7 +463,7 @@ def get_material_lot_lifecycle(lot_id: int, db: Session = Depends(get_db)) -> Ma
|
||||
.join(WorkOrder, WorkOrder.id == WorkOrderMaterialIssue.work_order_id)
|
||||
.join(Item, Item.id == WorkOrder.product_item_id)
|
||||
.outerjoin(StockLot, StockLot.id == WorkOrderMaterialIssue.source_lot_id)
|
||||
.where(WorkOrderMaterialIssue.source_lot_id == lot_id)
|
||||
.where(WorkOrderMaterialIssue.source_lot_id == lot.lot_id)
|
||||
.order_by(WorkOrderMaterialIssue.issue_time, WorkOrderMaterialIssue.id)
|
||||
).mappings().all()
|
||||
work_order_ids = sorted({row["work_order_id"] for row in issues})
|
||||
@@ -741,6 +739,19 @@ def get_material_lot_lifecycle(lot_id: int, db: Session = Depends(get_db)) -> Ma
|
||||
)
|
||||
add_edge(_edge(f"fg-{row['completion_item_id']}", node_id, "库存发货"))
|
||||
|
||||
return nodes, edges
|
||||
|
||||
|
||||
@router.get("/material-lots/{lot_id}/lifecycle", response_model=MaterialLotLifecycleRead)
|
||||
def get_material_lot_lifecycle(lot_id: int, db: Session = Depends(get_db)) -> MaterialLotLifecycleRead:
|
||||
lot_row = db.execute(_material_lot_rows(limit=1).where(StockLot.id == lot_id)).mappings().first()
|
||||
if not lot_row:
|
||||
raise HTTPException(status_code=404, detail="原材料批次不存在")
|
||||
|
||||
lot = DashboardMaterialLotRead.model_validate(dict(lot_row))
|
||||
nodes, edges = build_material_lot_lifecycle_graph(db, lot)
|
||||
if not any(node.type == "production_ledger" for node in nodes):
|
||||
nodes, edges = _build_legacy_material_lot_lifecycle_graph(db, lot)
|
||||
return MaterialLotLifecycleRead(lot=lot, nodes=nodes, edges=edges)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user