ForgeFlow-ERP/backend/app/services/mock_data.py
2026-06-12 16:00:56 +08:00

281 lines
11 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from __future__ import annotations
from app.schemas.dashboard import AlertItem, BoardSection, DashboardPayload, FlowStep, OverviewMetric
from app.schemas.domain import CostInsight, InventoryLotSummary, MiniAppField, OperationCostLine, ProductSummary
def get_dashboard_payload() -> DashboardPayload:
return DashboardPayload(
company="宁波嘉恒智能科技有限公司",
overview=[
OverviewMetric(
code="sales_open",
label="未交订单",
value="8",
unit="",
note="其中 3 单未来 7 天交期",
),
OverviewMetric(
code="mrp_gap",
label="待采购材料缺口",
value="59",
unit="",
highlight="warning",
note="SAP440 500*600*2.5 需按 2 吨倍数采购",
),
OverviewMetric(
code="wip_orders",
label="在制工单",
value="6",
unit="",
note="2 张存在工序卡滞",
),
OverviewMetric(
code="scrap_alerts",
label="异常报废工序",
value="2",
unit="",
highlight="danger",
note="冲压与焊接工序超阈值",
),
OverviewMetric(
code="waiting_ship",
label="待发货成品",
value="3200",
unit="",
note="本体产品优先发货",
),
OverviewMetric(
code="maintenance_due",
label="设备待保养",
value="3",
unit="",
highlight="warning",
note="含 1 台核心冲床",
),
],
alerts=[
AlertItem(
level="danger",
title="冲压工序报废率 4.8%",
description="工单 MO-202604-003 的冲压工序高于允许报废率 2.0%,建议立即复核模具与板材批次。",
owner="车间主管",
action="检查模具并冻结异常批次",
),
AlertItem(
level="warning",
title="SAP440 材料仅剩 8 吨可用",
description="按已排产工单计算,当前库存只能支撑 1.3 天,建议优先下达补料采购。",
owner="采购员",
action="生成补料采购单",
),
AlertItem(
level="warning",
title="冲床 JH-CY-03 保养到期",
description="设备已连续运行 286 小时,超过设定保养上限 280 小时。",
owner="设备管理员",
action="创建保养工单",
),
],
flow_board=[
BoardSection(
title="订单到采购",
items=[
FlowStep(
step_code="sales",
title="订单 SO-202604-001",
status="done",
summary="产品 本体,下单数量 10000 件,客户交期 2026-04-28。",
quantity="10000 件",
),
FlowStep(
step_code="mrp",
title="MRP 物料需求",
status="active",
summary="计算出 SAP440 钢板理论需求 59000kg按采购倍数建议下单 60000kg。",
quantity="60 吨",
),
FlowStep(
step_code="purchase",
title="采购到货",
status="queued",
summary="已到货 60000kg待入库复核与批次挂账。",
quantity="60 吨",
),
],
),
BoardSection(
title="领料到完工",
items=[
FlowStep(
step_code="issue",
title="生产出库",
status="active",
summary="第一批已领料 22000kg第二批计划明日发料。",
quantity="22 吨",
),
FlowStep(
step_code="production",
title="6 道工序报工",
status="active",
summary="冲压工序存在异常报废,焊接工序节拍偏慢。",
quantity="在制 3800 件",
),
FlowStep(
step_code="receipt",
title="成品待入库",
status="queued",
summary="首批完工 3200 件,待质检确认后转成品库。",
quantity="3200 件",
),
],
),
],
)
def get_product_overview_summary() -> ProductSummary:
return ProductSummary(
product_code="FG-BT-001",
product_name="本体",
material_name="SAP440 500*600*2.5 钢板",
order_qty=10000,
unit_weight_kg=5.2,
gross_material_kg_per_piece=5.9,
planned_material_weight_kg=59000,
suggested_purchase_weight_kg=60000,
purchase_multiple_weight_kg=2000,
)
def get_operation_costs() -> list[OperationCostLine]:
return [
OperationCostLine(
seq_no=10,
operation_name="开平",
work_center="板材预处理区",
std_labor_cost=0.12,
std_machine_cost=0.18,
allowed_scrap_rate=0.5,
reported_good_qty=10000,
reported_scrap_qty=12,
abnormal=False,
),
OperationCostLine(
seq_no=20,
operation_name="冲压",
work_center="冲压一区",
std_labor_cost=0.35,
std_machine_cost=0.42,
allowed_scrap_rate=2.0,
reported_good_qty=9580,
reported_scrap_qty=420,
abnormal=True,
),
OperationCostLine(
seq_no=30,
operation_name="去毛刺",
work_center="后处理区",
std_labor_cost=0.08,
std_machine_cost=0.06,
allowed_scrap_rate=0.8,
reported_good_qty=9520,
reported_scrap_qty=25,
abnormal=False,
),
OperationCostLine(
seq_no=40,
operation_name="折弯",
work_center="折弯一区",
std_labor_cost=0.22,
std_machine_cost=0.20,
allowed_scrap_rate=1.0,
reported_good_qty=9475,
reported_scrap_qty=18,
abnormal=False,
),
OperationCostLine(
seq_no=50,
operation_name="焊接",
work_center="焊接二区",
std_labor_cost=0.48,
std_machine_cost=0.26,
allowed_scrap_rate=1.5,
reported_good_qty=9380,
reported_scrap_qty=85,
abnormal=True,
),
OperationCostLine(
seq_no=60,
operation_name="检验包装",
work_center="成检包装区",
std_labor_cost=0.15,
std_machine_cost=0.04,
allowed_scrap_rate=0.2,
reported_good_qty=9320,
reported_scrap_qty=8,
abnormal=False,
),
]
def get_inventory_lots() -> list[InventoryLotSummary]:
return [
InventoryLotSummary(
lot_no="RM-20260418-01",
item_name="SAP440 500*600*2.5 钢板",
warehouse="原材料仓",
location="A-01-03",
inbound_weight_kg=30000,
remaining_weight_kg=12000,
status="PARTIAL",
),
InventoryLotSummary(
lot_no="RM-20260418-02",
item_name="SAP440 500*600*2.5 钢板",
warehouse="原材料仓",
location="A-01-04",
inbound_weight_kg=30000,
remaining_weight_kg=26000,
status="AVAILABLE",
),
InventoryLotSummary(
lot_no="FG-20260420-01",
item_name="本体",
warehouse="成品仓",
location="FG-02-01",
inbound_weight_kg=16640,
remaining_weight_kg=16640,
status="WAIT_SHIP",
),
]
def get_mini_app_fields() -> list[MiniAppField]:
return [
MiniAppField(field_name="report_no", label="报工单号", required=True, description="报工流水唯一编号"),
MiniAppField(field_name="work_order_no", label="工单号", required=True, description="与 ERP 工单主表关联"),
MiniAppField(field_name="operation_seq", label="工序序号", required=True, description="对应工艺路线工序"),
MiniAppField(field_name="employee_code", label="员工编码", required=True, description="报工人员账号"),
MiniAppField(field_name="equipment_code", label="设备编码", required=False, description="采集实际作业设备"),
MiniAppField(field_name="start_time", label="开始时间", required=True, description="工序开始加工时间"),
MiniAppField(field_name="end_time", label="结束时间", required=True, description="工序结束加工时间"),
MiniAppField(field_name="report_qty", label="报工数量", required=True, description="本次加工总数量"),
MiniAppField(field_name="good_qty", label="合格数量", required=True, description="用于流转到下道工序"),
MiniAppField(field_name="scrap_qty", label="报废数量", required=True, description="系统用于异常判定"),
MiniAppField(field_name="rework_qty", label="返工数量", required=False, description="返工件单独计成本"),
MiniAppField(field_name="scrap_reason", label="报废原因", required=False, description="用于工序和设备异常归因"),
MiniAppField(field_name="downtime_minutes", label="停机分钟数", required=False, description="用于设备稼动率分析"),
MiniAppField(field_name="remark", label="备注", required=False, description="现场异常补充说明"),
]
def get_cost_insights() -> list[CostInsight]:
return [
CostInsight(category="材料成本", amount=486000.0, ratio=72.4, note="含板材采购与运输"),
CostInsight(category="人工成本", amount=82100.0, ratio=12.2, note="按工序报工工时归集"),
CostInsight(category="设备成本", amount=46300.0, ratio=6.9, note="按设备开机工时分摊"),
CostInsight(category="制造费用", amount=37200.0, ratio=5.5, note="房租、水电、后勤、管理"),
CostInsight(category="异常损失", amount=20350.0, ratio=3.0, note="报废与返工"),
]