數字化生產管理系統設計

下面提供一個基于Python的數字化管理系統框架,使用現代技術棧實現。這個系統將包含設備監控、故障管理、裝配配套表生成、生產計劃管理等功能。

系統架構

數字化生產管理系統
├── 設備監控模塊
├── 故障管理模塊
├── 產品裝配管理模塊
├── 生產計劃管理模塊
├── 數據集成接口
└── 報表導出模塊

?

技術棧

  • 后端: Python + FastAPI (RESTful API)

  • 前端: Vue.js (可選) 或直接提供API供上層系統調用

  • 數據庫: PostgreSQL (關系型) + Redis (緩存)

  • 任務隊列: Celery (異步任務處理)

  • 文件處理: openpyxl (Excel操作)

  • 監控: Prometheus + Grafana (可選)

核心代碼實現

1. 主應用框架 (main.py)

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from .routers import devices, faults, products, productionapp = FastAPI(title="數字化生產管理系統", version="1.0.0")# 允許跨域
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)# 包含各模塊路由
app.include_router(devices.router)
app.include_router(faults.router)
app.include_router(products.router)
app.include_router(production.router)@app.get("/")
async def root():return {"message": "數字化生產管理系統 API"}

2. 設備監控模塊 (devices.py)

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List
from datetime import datetime
import psycopg2
import redisrouter = APIRouter(prefix="/devices", tags=["設備管理"])# Redis連接
r = redis.Redis(host='localhost', port=6379, db=0)# 數據庫連接配置
DB_CONFIG = {"host": "localhost","database": "production_db","user": "postgres","password": "password"
}class Device(BaseModel):id: strname: strstatus: strlast_heartbeat: datetimeip_address: str@router.get("/", response_model=List[Device])
async def get_online_devices():"""獲取所有在線設備狀態"""conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()cursor.execute("SELECT * FROM devices WHERE status = 'online'")devices = cursor.fetchall()cursor.close()conn.close()return [Device(id=d[0], name=d[1], status=d[2], last_heartbeat=d[3], ip_address=d[4]) for d in devices]@router.get("/{device_id}/status")
async def get_device_status(device_id: str):"""獲取特定設備狀態"""# 先從Redis緩存獲取status = r.get(f"device:{device_id}:status")if status:return {"device_id": device_id, "status": status.decode()}# 緩存沒有則查數據庫conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()cursor.execute("SELECT status FROM devices WHERE id = %s", (device_id,))result = cursor.fetchone()cursor.close()conn.close()if not result:raise HTTPException(status_code=404, detail="Device not found")# 更新緩存r.setex(f"device:{device_id}:status", 30, result[0])return {"device_id": device_id, "status": result[0]}

3. 故障管理模塊 (faults.py)

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List
from datetime import datetime
import psycopg2router = APIRouter(prefix="/faults", tags=["故障管理"])class Fault(BaseModel):id: intdevice_id: strfault_code: strdescription: strtimestamp: datetimeresolved: boolclass FaultCreate(BaseModel):device_id: strfault_code: strdescription: str@router.post("/", response_model=Fault)
async def report_fault(fault: FaultCreate):"""報告設備故障"""conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()cursor.execute("INSERT INTO faults (device_id, fault_code, description, timestamp, resolved) ""VALUES (%s, %s, %s, %s, %s) RETURNING id",(fault.device_id, fault.fault_code, fault.description, datetime.now(), False))fault_id = cursor.fetchone()[0]conn.commit()# 更新設備狀態為故障cursor.execute("UPDATE devices SET status = 'fault' WHERE id = %s",(fault.device_id,))conn.commit()cursor.close()conn.close()return {"id": fault_id,**fault.dict(),"timestamp": datetime.now(),"resolved": False}@router.get("/unresolved", response_model=List[Fault])
async def get_unresolved_faults():"""獲取未解決的故障列表"""conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()cursor.execute("SELECT * FROM faults WHERE resolved = FALSE")faults = cursor.fetchall()cursor.close()conn.close()return [Fault(id=f[0], device_id=f[1], fault_code=f[2], description=f[3], timestamp=f[4], resolved=f[5]) for f in faults]

4. 產品裝配管理模塊 (products.py)

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List
import psycopg2
from openpyxl import Workbook
from io import BytesIO
from fastapi.responses import StreamingResponserouter = APIRouter(prefix="/products", tags=["產品裝配管理"])class Component(BaseModel):code: strname: strquantity: intclass ProductAssembly(BaseModel):product_id: strproduct_name: strcomponents: List[Component]@router.get("/{product_id}/assembly", response_model=ProductAssembly)
async def get_product_assembly(product_id: str):"""獲取產品裝配配套表"""conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()# 獲取產品信息cursor.execute("SELECT name FROM products WHERE id = %s", (product_id,))product = cursor.fetchone()if not product:raise HTTPException(status_code=404, detail="Product not found")# 獲取零部件列表cursor.execute("SELECT c.code, c.name, pc.quantity ""FROM product_components pc ""JOIN components c ON pc.component_id = c.id ""WHERE pc.product_id = %s", (product_id,))components = cursor.fetchall()cursor.close()conn.close()return ProductAssembly(product_id=product_id,product_name=product[0],components=[Component(code=c[0], name=c[1], quantity=c[2]) for c in components])@router.get("/{product_id}/assembly/excel")
async def export_product_assembly_excel(product_id: str):"""導出產品裝配配套表為Excel"""assembly = await get_product_assembly(product_id)# 創建Excel文件wb = Workbook()ws = wb.activews.title = "裝配配套表"# 寫入標題ws.append(["產品編號", assembly.product_id])ws.append(["產品名稱", assembly.product_name])ws.append([])ws.append(["零部件代號", "零部件名稱", "數量"])# 寫入零部件數據for comp in assembly.components:ws.append([comp.code, comp.name, comp.quantity])# 保存到內存excel_file = BytesIO()wb.save(excel_file)excel_file.seek(0)# 返回文件下載return StreamingResponse(excel_file,media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",headers={"Content-Disposition": f"attachment; filename=assembly_{product_id}.xlsx"})

5. 生產計劃管理模塊 (production.py)

from fastapi import APIRouter, HTTPException, UploadFile, File
from pydantic import BaseModel
from typing import List
from datetime import date
import psycopg2
import openpyxl
import csv
import iorouter = APIRouter(prefix="/production", tags=["生產計劃管理"])class MasterPlan(BaseModel):id: strproduct_id: strquantity: intstart_date: dateend_date: datepriority: intclass WorkshopPlan(BaseModel):id: strmaster_plan_id: strworkshop_id: strproduct_id: strquantity: intplanned_start: dateplanned_end: dateactual_start: date = Noneactual_end: date = Nonestatus: str = "pending"  # pending, in_progress, completed@router.post("/generate-workshop-plans")
async def generate_workshop_plans(master_plan_id: str):"""根據主生產計劃生成車間級生產計劃"""conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()# 獲取主生產計劃cursor.execute("SELECT * FROM master_production_plans WHERE id = %s", (master_plan_id,))master_plan = cursor.fetchone()if not master_plan:raise HTTPException(status_code=404, detail="Master plan not found")# 這里應該有更復雜的邏輯來分配車間任務# 簡化為直接為每個車間創建相同的任務cursor.execute("SELECT id FROM workshops")workshops = cursor.fetchall()plans = []for workshop in workshops:cursor.execute("INSERT INTO workshop_plans ""(master_plan_id, workshop_id, product_id, quantity, planned_start, planned_end, status) ""VALUES (%s, %s, %s, %s, %s, %s, %s) RETURNING id",(master_plan_id,workshop[0],master_plan[1],  # product_idmaster_plan[2],  # quantitymaster_plan[3],  # start_datemaster_plan[4],  # end_date"pending"))plan_id = cursor.fetchone()[0]plans.append(plan_id)conn.commit()cursor.close()conn.close()return {"message": f"Generated {len(plans)} workshop plans", "plan_ids": plans}@router.post("/import-workshop-plans/excel")
async def import_workshop_plans_excel(file: UploadFile = File(...)):"""通過Excel批量導入車間生產計劃"""contents = await file.read()wb = openpyxl.load_workbook(io.BytesIO(contents))ws = wb.activeplans = []for row in ws.iter_rows(min_row=2, values_only=True):  # 假設第一行是標題if not row[0]:  # 跳過空行continueplan = {"master_plan_id": row[0],"workshop_id": row[1],"product_id": row[2],"quantity": row[3],"planned_start": row[4],"planned_end": row[5]}plans.append(plan)# 保存到數據庫conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()for plan in plans:cursor.execute("INSERT INTO workshop_plans ""(master_plan_id, workshop_id, product_id, quantity, planned_start, planned_end, status) ""VALUES (%s, %s, %s, %s, %s, %s, %s)",(plan["master_plan_id"],plan["workshop_id"],plan["product_id"],plan["quantity"],plan["planned_start"],plan["planned_end"],"pending"))conn.commit()cursor.close()conn.close()return {"message": f"Imported {len(plans)} workshop plans successfully"}@router.get("/workshop-plans/{workshop_id}", response_model=List[WorkshopPlan])
async def get_workshop_plans(workshop_id: str):"""獲取車間生產計劃及執行情況"""conn = psycopg2.connect(**DB_CONFIG)cursor = conn.cursor()cursor.execute("SELECT id, master_plan_id, workshop_id, product_id, quantity, ""planned_start, planned_end, actual_start, actual_end, status ""FROM workshop_plans WHERE workshop_id = %s",(workshop_id,))plans = cursor.fetchall()cursor.close()conn.close()return [WorkshopPlan(id=p[0],master_plan_id=p[1],workshop_id=p[2],product_id=p[3],quantity=p[4],planned_start=p[5],planned_end=p[6],actual_start=p[7],actual_end=p[8],status=p[9]) for p in plans]

6. 數據庫模型 (SQL)

-- 設備表
CREATE TABLE devices (id VARCHAR(50) PRIMARY KEY,name VARCHAR(100) NOT NULL,status VARCHAR(20) NOT NULL CHECK (status IN ('online', 'offline', 'fault', 'maintenance')),last_heartbeat TIMESTAMP,ip_address VARCHAR(50)
);-- 故障表
CREATE TABLE faults (id SERIAL PRIMARY KEY,device_id VARCHAR(50) REFERENCES devices(id),fault_code VARCHAR(50) NOT NULL,description TEXT,timestamp TIMESTAMP NOT NULL,resolved BOOLEAN NOT NULL DEFAULT FALSE
);-- 產品表
CREATE TABLE products (id VARCHAR(50) PRIMARY KEY,name VARCHAR(100) NOT NULL
);-- 零部件表
CREATE TABLE components (id VARCHAR(50) PRIMARY KEY,code VARCHAR(50) NOT NULL,name VARCHAR(100) NOT NULL
);-- 產品-零部件關聯表
CREATE TABLE product_components (product_id VARCHAR(50) REFERENCES products(id),component_id VARCHAR(50) REFERENCES components(id),quantity INTEGER NOT NULL,PRIMARY KEY (product_id, component_id)
);-- 主生產計劃表
CREATE TABLE master_production_plans (id VARCHAR(50) PRIMARY KEY,product_id VARCHAR(50) REFERENCES products(id),quantity INTEGER NOT NULL,start_date DATE NOT NULL,end_date DATE NOT NULL,priority INTEGER NOT NULL
);-- 車間表
CREATE TABLE workshops (id VARCHAR(50) PRIMARY KEY,name VARCHAR(100) NOT NULL
);-- 車間生產計劃表
CREATE TABLE workshop_plans (id VARCHAR(50) PRIMARY KEY,master_plan_id VARCHAR(50) REFERENCES master_production_plans(id),workshop_id VARCHAR(50) REFERENCES workshops(id),product_id VARCHAR(50) REFERENCES products(id),quantity INTEGER NOT NULL,planned_start DATE NOT NULL,planned_end DATE NOT NULL,actual_start DATE,actual_end DATE,status VARCHAR(20) NOT NULL CHECK (status IN ('pending', 'in_progress', 'completed', 'delayed'))
);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94089.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【vue】創建響應式數據ref和reactive的區別

目錄 1、所謂響應式數據 2、ref創建基本類型響應式數據 3、reactive創建對象類型響應式數據 4、ref定義對象類型響應式數據 5、總結:ref和reactive對比 6、補充:toRefs與toRef 1、所謂響應式數據 所謂響應式數據就是,在vue頁面中&#…

YOLO12 改進、魔改|直方圖 Transformerm模塊HTB ,通過動態范圍特征分組、針對性注意力與多尺度融合,提高對遮擋以及多尺度目標的關注能力

在惡劣天氣(如雨、雪、霧)下的圖像恢復任務中,傳統 Transformer 模型為降低計算量,常將自注意力限制在固定空間范圍或僅在通道維度操作,導致難以捕捉長距離空間特征,尤其無法有效處理天氣退化像素&#xff…

涉水救援機器人cad【12張】三維圖+設計書明說

涉水救援機器人設計 摘 要 隨著城市化進度的加快,各種水上游樂設備的增多,水上災害和溺水事件頻繁發生,水上救援任務困難重重,特別是在一些水流湍急的環境下進行救援。傳統的水上救援工作比較緩慢,大多數是通過投射救…

電子病歷:現代HIS系統不可或缺的核心組成部分

一、電子病歷在 HIS 系統中扮演了一個什么角色?電子病歷在醫院信息系統(HIS)中扮演著核心、基礎且不可替代的角色,可以說是整個HIS系統的臨床信息中樞和業務驅動引擎。它的重要性體現在以下幾個方面:1、臨床診療活動的核心載體&a…

【深度學習】通俗易懂的基礎知識:指數加權平均

一、什么是指數加權平均? 指數在數學中表示一個數的冪次運算(如a?中的n),而在統計學中特指隨時間變化的幾何衰減系數,加權指對不同數據賦予不同權重,使重要數據對結果產生更大影響。指數加權平均指是一種時…

c++-list

C-list std::list是C標準模板庫(STL)提供的雙向鏈表容器&#xff0c;它提供了高效的插入和刪除操作&#xff0c;特別適合頻繁修改的序列。定義在 <list> 頭文件中&#xff0c;屬于 std 命名空間。該類的接口與常規容器接口基本一致。 模板原型&#xff1a; template <…

【筆試真題】2024秋招京東后端開發崗位-第一批筆試

31.牛牛與切割機 有一個序列 a1,a2,...,ana_1,a_2,...,a_na1?,a2?,...,an? &#xff0c; 牛牛將對這個序列切割一刀&#xff08;劃分分成兩個不相交的非空序列&#xff0c;一個序列為 a1,...,apa_1,...,a_pa1?,...,ap?&#xff0c;另一個序列為 ap1,...,ana_{p1},...,a_na…

【整數轉羅馬數字】

思路計算數字的位數&#xff1a; 通過 while(x) 循環計算輸入數字 num 的位數 n。提取各位數字&#xff1a; 將數字 num 的每一位分解并存儲到 nums 數組中&#xff0c;順序為從高位到低位。羅馬數字映射&#xff1a; 使用固定數組 Roman 存儲羅馬數字符號&#xff1a;Roman {…

spring Scheduled注解詳解

spirng Scheduled注解詳解 用于標記需要安排執行的方法的注解。必須指定 cron、fixedDelay 或 fixedRate 中的恰好一個屬性。 被標注的方法必須不接受任何參數。它通常會具有 void 類型的返回值&#xff1b;如果不是這樣&#xff0c;那么在通過調度器調用該方法時&#xff0c;返…

新升級超值型系列32位單片機MM32G0005

靈動微推出的新型MM32G0005系列基于ArmCortex - M0內核&#xff0c;具備高可靠性、低功耗、高性價比等特性。Flash升級至64KB&#xff0c;SRAM為4KB&#xff0c;還有1KB Data Flash。Flash全溫擦寫次數超過10萬次。采用24Pin封裝&#xff0c;最多有22個IO。QFN20和TSSOP20封裝與…

Spark SQL 的詳細介紹

Spark SQL 是 Apache Spark 生態系統中用于處理結構化數據的模塊&#xff0c;它將 SQL 查詢與 Spark 的分布式計算能力相結合&#xff0c;提供了一種高效、靈活的方式來處理結構化和半結構化數據。以下是對 Spark SQL 的詳細介紹&#xff1a;1. 核心定位與優勢結構化數據處理&a…

【FreeRTOS】空閑任務與鉤子函數原理、實現與功能詳解

一、FreeRTOS空閑任務概述FreeRTOS中的空閑任務(Idle Task)是系統自動創建的一個特殊任務&#xff0c;具有最低優先級(優先級0)。當沒有其他更高優先級的任務運行時&#xff0c;調度器就會運行空閑任務。空閑任務的主要功能系統資源回收&#xff1a;自動清理被刪除任務的內存和…

imx6ull-驅動開發篇6——Linux 設備樹語法

目錄 前言 設備樹 設備樹概念 DTS、 DTB 和 DTC DTS 語法 .dtsi 頭文件 設備節點 /根節點?? 節點命名與標簽 節點層次結構? 屬性數據類型? 標準屬性 compatible 屬性 model 屬性 status 屬性 #address-cells 和#size-cells 屬性 reg 屬性 ranges 屬性 n…

ansible簡單playbook劇本例子2

1. 準備主機組[rootansible-master ansible_quickstart]# vim inventory/hosts[web:vars] ansible_port22 ansible_passwordAdmin123456[web] 192.168.100.1822.準備劇本 vim hello.yml--- - hosts: webremote_user: roottasks:- name: Ping the target hostsping:- name: 獲取…

EmpService 和 EmpMapper接口的作用

在這個項目中&#xff0c;EmpService 和 EmpMapper 都定義接口&#xff0c;是基于面向接口編程&#xff08;Interface Oriented Programming&#xff0c;IOP&#xff09;的設計思想&#xff0c;這兩種接口在項目中承擔著不同的職責&#xff0c;具體說明如下&#xff1a; EmpSer…

【語音技術】什么是動態實體

目錄 動態實體的定義和維度 1.1 動態實體的資源 1.2 生效維度 1.2.1 應用級 1.2.2 用戶級 1.2.3 自定義級 2. 動態實體的上傳及使用 2.1 WebAPI 2.1.1 授權認證 2.1.2 上傳資源接口 2.1.2.1 參數說明 2.1.2.2 返回說明 2.1.3 查詢打包狀態 2.1.3.1 參數說明 2.1.…

STM32學習記錄--Day3

今天了解了下I2C&#xff1a;1.I2C電路結構I2C通信示意圖&#xff1a;數據傳輸階段????主→從模式??&#xff08;寫操作&#xff09;&#xff1a;主機控制SCL時鐘&#xff08;把SCL拉低&#xff09;主機向SDA線發送數據&#xff08;每次8位1位ACK&#xff09;??主←從模…

裂變數據看板:5個核心指標決定活動生死?

數據是裂變活動的“指南針”。本文詳解曝光量、轉化率、裂變系數等5大核心指標&#xff0c;結合工具與案例&#xff0c;教你用數據驅動活動優化&#xff0c;避免“自嗨式裂變”。?為什么數據是裂變的“生死線”&#xff1f;&#xff08;認知重構&#xff09; 很多企業裂變活動…

iOS 類存儲 與 C# 類存儲 的差異

C# 中類的代碼&#xff08;包括方法、屬性等成員&#xff09;的存儲機制與 Objective-C 有顯著差異&#xff0c;其核心依賴于 ?CLR&#xff08;公共語言運行時&#xff09;的方法表&#xff08;Method Table&#xff09;和虛擬方法表&#xff08;vtable&#xff09;機制&#…

Selenium自動化:輕松實現網頁操控

selenium自動化 1 什么是 Selenium 自動化 Selenium 是一個用于 Web 應用程序測試的工具&#xff0c;支持多種瀏覽器&#xff08;如 Chrome、Firefox、Edge 等&#xff09;。WebDriver 是 Selenium 的核心組件&#xff0c;用于控制瀏覽器行為并執行自動化操作。元素定位是通過…