生產(chǎn)計劃管理系統(tǒng)設(shè)計與實現(xiàn))
溫馨提示本人主頁置頂文章(點我)開頭有 CSDN 平臺官方提供的學長聯(lián)系方式的名片一、 項目背景與意義在制造業(yè)數(shù)字化轉(zhuǎn)型浪潮下傳統(tǒng)的生產(chǎn)計劃管理方式如Excel表格、紙質(zhì)單據(jù)已難以滿足現(xiàn)代企業(yè)對于生產(chǎn)敏捷性、資源優(yōu)化和實時決策的需求。生產(chǎn)計劃作為連接銷售、采購、庫存與車間執(zhí)行的樞紐其管理效率直接影響到訂單交付周期、生產(chǎn)成本與客戶滿意度?;赟pringBoot的工業(yè)生產(chǎn)計劃管理系統(tǒng)旨在構(gòu)建一個集成的、可擴展的數(shù)字化管理平臺其核心意義在于提升計劃編制效率通過算法輔助如MRP運算自動生成主生產(chǎn)計劃MPS與物料需求計劃MRP大幅縮短人工排程時間。實現(xiàn)資源精細化管理對設(shè)備、人力、物料等資源進行統(tǒng)一視圖管理優(yōu)化資源配置減少資源閑置與瓶頸。增強生產(chǎn)過程可視化與可控性實時跟蹤計劃執(zhí)行進度通過看板、甘特圖等方式直觀展示支持動態(tài)調(diào)整以應對插單、設(shè)備故障等異常。促進部門協(xié)同打通銷售、計劃、采購、生產(chǎn)、倉儲等部門的信息流確保數(shù)據(jù)同源、實時同步減少溝通成本與信息誤差。為決策提供數(shù)據(jù)支撐積累生產(chǎn)歷史數(shù)據(jù)通過報表分析為產(chǎn)能規(guī)劃、效率提升、成本控制提供量化依據(jù)。二、 技術(shù)棧選型本系統(tǒng)采用前后端分離的微服務架構(gòu)后端基于SpringBoot生態(tài)前端采用現(xiàn)代Vue.js框架確保系統(tǒng)的高性能、可維護性與可擴展性。2.1 后端技術(shù)棧核心框架Spring Boot 2.7提供快速啟動、自動配置、內(nèi)嵌容器Web層Spring MVC數(shù)據(jù)持久層ORM框架MyBatis-Plus增強CRUD操作簡化開發(fā)數(shù)據(jù)庫連接池HikariCP數(shù)據(jù)庫主庫MySQL 8.0存儲業(yè)務核心數(shù)據(jù)如訂單、計劃、物料清單BOM緩存Redis存儲會話、熱點數(shù)據(jù)、計劃鎖提升并發(fā)性能安全與權(quán)限Spring Security JWTJSON Web Token實現(xiàn)認證與接口鑒權(quán)API文檔Knife4j集成Swagger生成在線API文檔消息中間件RabbitMQ用于異步處理計劃發(fā)布、狀態(tài)變更通知等場景任務調(diào)度Quartz / Spring Scheduler用于定時執(zhí)行MRP運算、數(shù)據(jù)同步等任務構(gòu)建與依賴管理Maven2.2 前端技術(shù)??蚣躒ue 3 Composition API構(gòu)建工具ViteUI組件庫Element Plus狀態(tài)管理Pinia路由Vue RouterHTTP客戶端Axios可視化圖表ECharts用于生產(chǎn)甘特圖、資源負荷圖、數(shù)據(jù)看板2.3 部署與運維容器化Docker Docker Compose持續(xù)集成/持續(xù)部署CI/CDJenkins / GitLab CI版本控制Git三、 系統(tǒng)核心功能模塊設(shè)計系統(tǒng)采用模塊化設(shè)計核心功能模塊如下3.1 基礎(chǔ)數(shù)據(jù)管理物料主數(shù)據(jù)管理原材料、半成品、成品的編碼、名稱、規(guī)格、單位等。物料清單BOM管理定義產(chǎn)品結(jié)構(gòu)支持多級BOM、版本管理。工作中心/資源管理定義生產(chǎn)線、設(shè)備、班組等生產(chǎn)資源及其產(chǎn)能、日歷。工藝路線管理定義產(chǎn)品加工的工序順序、所需資源、標準工時。3.2 銷售與需求管理銷售訂單管理接收客戶訂單明確產(chǎn)品、數(shù)量、交期。需求預測支持基于歷史數(shù)據(jù)的預測模型生成預測訂單。3.3 主生產(chǎn)計劃MPS計劃編制基于銷售訂單與需求預測考慮現(xiàn)有庫存、在制品編制產(chǎn)品級的主生產(chǎn)計劃。粗能力計劃RCCP校驗關(guān)鍵資源瓶頸設(shè)備的負荷是否滿足計劃。計劃審批與發(fā)布工作流驅(qū)動計劃審批發(fā)布后鎖定。3.4 物料需求計劃MRPMRP運算根據(jù)MPS、BOM、庫存、在途量自動計算各級物料采購件、自制件的凈需求、建議計劃訂單生產(chǎn)/采購及時間。計劃訂單管理對MRP生成的建議訂單進行審核、調(diào)整、下達。3.5 車間作業(yè)計劃SFC與派工工序級排程將生產(chǎn)訂單分解到具體工作中心的工序任務。派工單管理生成并下發(fā)派工單到車間終端或移動設(shè)備。生產(chǎn)執(zhí)行反饋接收工序報工數(shù)量、工時、質(zhì)量狀態(tài)。3.6 生產(chǎn)進度跟蹤與看板甘特圖可視化展示訂單、設(shè)備、工序的排程與進度。生產(chǎn)實績看板實時展示產(chǎn)量、效率、不良率等關(guān)鍵指標。異常報警對計劃延遲、質(zhì)量異常等事件進行預警。四、 數(shù)據(jù)庫核心表結(jié)構(gòu)設(shè)計以下為部分核心業(yè)務表的設(shè)計-- 物料主數(shù)據(jù)表 CREATE TABLE base_material ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵, material_code varchar(64) NOT NULL COMMENT 物料編碼, material_name varchar(255) NOT NULL COMMENT 物料名稱, specification varchar(500) DEFAULT NULL COMMENT 規(guī)格型號, unit varchar(20) DEFAULT NULL COMMENT 單位, material_type tinyint DEFAULT NULL COMMENT 物料類型1-原材料2-半成品3-成品, safety_stock decimal(18,6) DEFAULT NULL COMMENT 安全庫存, lead_time int DEFAULT NULL COMMENT 提前期天, status tinyint DEFAULT 1 COMMENT 狀態(tài)0-禁用1-啟用, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_material_code (material_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT物料主數(shù)據(jù); -- 物料清單BOM表 CREATE TABLE base_bom ( id bigint NOT NULL AUTO_INCREMENT, parent_material_id bigint NOT NULL COMMENT 父項物料ID, child_material_id bigint NOT NULL COMMENT 子項物料ID, usage_qty decimal(18,6) NOT NULL COMMENT 用量, loss_rate decimal(5,4) DEFAULT 0.0000 COMMENT 損耗率, bom_version varchar(20) DEFAULT NULL COMMENT BOM版本, effective_date date DEFAULT NULL COMMENT 生效日期, expiry_date date DEFAULT NULL COMMENT 失效日期, PRIMARY KEY (id), KEY idx_parent_material (parent_material_id), KEY idx_child_material (child_material_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT物料清單; -- 銷售訂單表 CREATE TABLE sales_order ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(64) NOT NULL COMMENT 訂單號, customer_id bigint DEFAULT NULL COMMENT 客戶ID, product_material_id bigint NOT NULL COMMENT 產(chǎn)品物料ID, order_qty decimal(18,6) NOT NULL COMMENT 訂單數(shù)量, delivery_date date NOT NULL COMMENT 要求交期, order_status tinyint DEFAULT 1 COMMENT 狀態(tài)1-新建2-已確認3-已關(guān)閉, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT銷售訂單; -- 主生產(chǎn)計劃MPS表 CREATE TABLE plan_mps ( id bigint NOT NULL AUTO_INCREMENT, plan_no varchar(64) NOT NULL COMMENT 計劃編號, material_id bigint NOT NULL COMMENT 物料ID, plan_qty decimal(18,6) NOT NULL COMMENT 計劃數(shù)量, plan_date date NOT NULL COMMENT 計劃日期, plan_type tinyint DEFAULT NULL COMMENT 計劃類型1-訂單2-預測, source_order_id bigint DEFAULT NULL COMMENT 來源訂單ID, status tinyint DEFAULT 1 COMMENT 狀態(tài)1-草案2-已審核3-已發(fā)布4-已關(guān)閉, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_plan_no (plan_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT主生產(chǎn)計劃; -- 生產(chǎn)訂單表由MRP運算生成或手動創(chuàng)建 CREATE TABLE production_order ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(64) NOT NULL COMMENT 生產(chǎn)訂單號, material_id bigint NOT NULL COMMENT 物料ID, plan_qty decimal(18,6) NOT NULL COMMENT 計劃數(shù)量, start_date date DEFAULT NULL COMMENT 計劃開始日期, end_date date DEFAULT NULL COMMENT 計劃完成日期, priority tinyint DEFAULT 5 COMMENT 優(yōu)先級1-10, order_status tinyint DEFAULT 1 COMMENT 狀態(tài)1-新建2-已下達3-生產(chǎn)中4-已完成5-已關(guān)閉, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT生產(chǎn)訂單;五、 核心業(yè)務邏輯與代碼實現(xiàn)5.1 主生產(chǎn)計劃MPS編制服務核心服務類負責基于銷售訂單和預測生成主生產(chǎn)計劃。package com.example.ppms.service.plan; import com.example.ppms.domain.entity.SalesOrder; import com.example.ppms.domain.entity.PlanMps; import com.example.ppms.domain.entity.BaseMaterial; import com.example.ppms.mapper.PlanMpsMapper; import com.example.ppms.mapper.SalesOrderMapper; import com.example.ppms.mapper.BaseMaterialMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.List; import java.util.ArrayList; /** 主生產(chǎn)計劃MPS服務 */ Slf4j Service RequiredArgsConstructor public class MpsService { private final SalesOrderMapper salesOrderMapper; private final BaseMaterialMapper materialMapper; private final PlanMpsMapper planMpsMapper; /** 根據(jù)銷售訂單生成主生產(chǎn)計劃草案 param startDate 計劃開始日期 param endDate 計劃結(jié)束日期 return 生成的MPS記錄列表 */ Transactional(rollbackFor Exception.class) public ListPlanMps generateMpsFromSalesOrders(LocalDate startDate, LocalDate endDate) { // 1. 查詢指定時間范圍內(nèi)已確認的銷售訂單 ListSalesOrder confirmedOrders salesOrderMapper.selectConfirmedOrdersByDeliveryDate(startDate, endDate); ListPlanMps mpsList new ArrayList(); for (SalesOrder order : confirmedOrders) { BaseMaterial product materialMapper.selectById(order.getProductMaterialId()); if (product null || !product.isFinishedGood()) { log.warn(銷售訂單 {} 對應的產(chǎn)品物料不存在或不是成品跳過。, order.getOrderNo()); continue; } // 2. 構(gòu)建MPS記錄 PlanMps mps new PlanMps(); mps.setPlanNo(generatePlanNo()); // 生成計劃編號 mps.setMaterialId(order.getProductMaterialId()); mps.setPlanQty(order.getOrderQty()); mps.setPlanDate(order.getDeliveryDate()); // 計劃日期默認為訂單交期 mps.setPlanType(PlanMps.PlanType.ORDER); mps.setSourceOrderId(order.getId()); mps.setStatus(PlanMps.Status.DRAFT); // 3. 保存到數(shù)據(jù)庫 planMpsMapper.insert(mps); mpsList.add(mps); log.info(已為銷售訂單 {} 生成MPS草案{}, order.getOrderNo(), mps.getPlanNo()); } return mpsList; } private String generatePlanNo() { // 示例MPS 年月日 序列號 (實際應使用分布式ID或序列) String prefix MPS LocalDate.now().format(java.time.format.DateTimeFormatter.ofPattern(yyyyMMdd)); Long sequence planMpsMapper.selectTodayCount(prefix) 1; return prefix String.format(%04d, sequence); } }5.2 物料需求計劃MRP運算服務核心算法服務根據(jù)MPS、BOM和庫存計算物料凈需求。package com.example.ppms.service.plan; import com.example.ppms.domain.entity.; import com.example.ppms.mapper.; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.*; /** 物料需求計劃MRP運算服務 */ Slf4j Service RequiredArgsConstructor public class MrpService { private final PlanMpsMapper planMpsMapper; private final BaseBomMapper bomMapper; private final InventoryMapper inventoryMapper; private final ProductionOrderMapper productionOrderMapper; private final PurchasePlanMapper purchasePlanMapper; /** 執(zhí)行MRP運算 param mpsIds 參與運算的MPS ID列表 param planDate 計劃基準日期 */ Transactional(rollbackFor Exception.class) public void runMrpCalculation(ListLong mpsIds, LocalDate planDate) { // 1. 獲取已發(fā)布的MPS ListPlanMps mpsList planMpsMapper.selectPublishedMpsByIds(mpsIds); if (mpsList.isEmpty()) { log.warn(未找到已發(fā)布的MPS記錄MRP運算終止。); return; } // 2. 按時間桶匯總毛需求 (物料ID - 日期 - 數(shù)量) MapLong, MapLocalDate, Double grossRequirements new HashMap(); for (PlanMps mps : mpsList) { addGrossRequirement(grossRequirements, mps.getMaterialId(), mps.getPlanDate(), mps.getPlanQty()); } // 3. 遞歸展開BOM計算各級物料毛需求 expandBomRequirements(grossRequirements); // 4. 計算凈需求并生成計劃訂單 for (Map.EntryLong, MapLocalDate, Double entry : grossRequirements.entrySet()) { Long materialId entry.getKey(); BaseMaterial material materialMapper.selectById(materialId); if (material null) continue; Maplt;LocalDate, Doublegt; dateQtyMap entry.getValue(); Listlt;LocalDategt; sortedDates new ArrayListlt;gt;(dateQtyMap.keySet()); Collections.sort(sortedDates); double projectedInventory inventoryMapper.getOnHandQty(materialId); // 當前庫存 for (L