From 0bbd986930e4b41e0741fd07c4287208da398330 Mon Sep 17 00:00:00 2001
From: zhangherong <571457620@qq.com>
Date: 星期五, 01 八月 2025 17:03:37 +0800
Subject: [PATCH] art: 生产订单同步定时任务

---
 src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java |   26 +
 db/双林新火炬MES数据库设计.pdma.json                                                                     |  204 +++++++++----
 src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java                             |   67 ++--
 src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java                                       |    2 
 src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java            |   49 +++
 src/main/java/org/jeecg/modules/sap/FunctionConst.java                                         |   12 
 src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java            |   34 ++
 src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java       |   59 +++
 src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java                    |   16 +
 src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java                    |   17 +
 src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java                        |   19 -
 src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncJob.java                            |  141 +++++++++
 src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java               |   18 +
 src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java                  |   22 +
 src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java         |   15 +
 src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java                             |  157 ++++++---
 16 files changed, 671 insertions(+), 187 deletions(-)

diff --git "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json" "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json"
index 19f8250..79a4257 100644
--- "a/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json"
+++ "b/db/\345\217\214\346\236\227\346\226\260\347\201\253\347\202\254MES\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241.pdma.json"
@@ -4,7 +4,7 @@
   "avatar": "",
   "version": "4.9.2",
   "createdTime": "2025-3-10 16:38:19",
-  "updatedTime": "2025-7-31 10:26:58",
+  "updatedTime": "2025-8-1 16:49:40",
   "dbConns": [],
   "profile": {
     "default": {
@@ -10822,6 +10822,114 @@
           "id": "4BF071F1-4F69-4044-8C17-25D7B66404F7"
         },
         {
+          "defKey": "dispatcher_code",
+          "defName": "璋冨害鍛樼紪鍙�",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "09E4DA62-D2E3-4D82-9259-DCACA5C40FFD"
+        },
+        {
+          "defKey": "dispatcher_name",
+          "defName": "璋冨害鍛樺悕绉�",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
+          "id": "C700FB1A-B747-4E97-A7BE-0044C0B3B2EE"
+        },
+        {
+          "defKey": "order_create_date",
+          "defName": "璁㈠崟鍒涘缓鏃ユ湡",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "BD647EC3-B32A-460E-A6D9-A4A1D808F849"
+        },
+        {
+          "defKey": "order_update_date",
+          "defName": "璁㈠崟鏇存柊鏃ユ湡",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "E2F64B2D-D193-410E-83F5-7CA29FC2F1C7"
+        },
+        {
+          "defKey": "order_update_time",
+          "defName": "璁㈠崟鏇存柊鏃堕棿",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "99C90188-1886-45E3-8A66-062CF8672F15"
+        },
+        {
+          "defKey": "order_update_user",
+          "defName": "璁㈠崟淇敼浜�",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "refDict": "",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
+          "extProps": {},
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "id": "57BE810E-5423-4B64-B5C4-914D4FC48965"
+        },
+        {
           "defKey": "customer_order_model",
           "defName": "瀹㈡埛鍨嬪彿",
           "comment": "",
@@ -12045,8 +12153,8 @@
           "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098"
         },
         {
-          "defKey": "del_flag",
-          "defName": "鍒犻櫎鏍囪",
+          "defKey": "order_id",
+          "defName": "鐢熶骇璁㈠崟ID",
           "comment": "",
           "type": "",
           "len": "",
@@ -12057,10 +12165,10 @@
           "defaultValue": "",
           "hideInGraph": false,
           "refDict": "",
-          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
           "extProps": {},
-          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
-          "id": "ABF02681-A2E7-4077-AEEF-7338AF47C4B8"
+          "domain": "16120F75-6AA7-4483-868D-F07F511BB081",
+          "id": "FE30BEF4-FD2C-477D-83B9-DAE0546C7D09"
         },
         {
           "defKey": "material_number",
@@ -12107,24 +12215,6 @@
           "attr9": "",
           "id": "CADE8A93-4759-4DA5-8210-942102A9F18B",
           "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
-        },
-        {
-          "defKey": "factory_id",
-          "defName": "浜х嚎ID(SAP宸ヤ綔涓績)",
-          "comment": "",
-          "type": "",
-          "len": "",
-          "scale": "",
-          "primaryKey": false,
-          "notNull": false,
-          "autoIncrement": false,
-          "defaultValue": "",
-          "hideInGraph": false,
-          "refDict": "",
-          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
-          "extProps": {},
-          "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573",
-          "id": "F5683C11-B21C-44C4-AF88-2D9A92F7444F"
         },
         {
           "defKey": "process_code",
@@ -12426,24 +12516,6 @@
           "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098"
         },
         {
-          "defKey": "del_flag",
-          "defName": "鍒犻櫎鏍囪",
-          "comment": "",
-          "type": "",
-          "len": "",
-          "scale": "",
-          "primaryKey": false,
-          "notNull": false,
-          "autoIncrement": false,
-          "defaultValue": "",
-          "hideInGraph": false,
-          "refDict": "",
-          "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811",
-          "extProps": {},
-          "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E",
-          "id": "B43CBCB3-5BC6-4411-9999-C50D2C6A8A5D"
-        },
-        {
           "defKey": "order_id",
           "defName": "鐢熸垚璁㈠崟ID",
           "comment": "",
@@ -12516,24 +12588,6 @@
           "attr9": "",
           "id": "5428A165-EF43-40AF-B56F-9F75CBA47A0C",
           "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
-        },
-        {
-          "defKey": "bill_materials_code",
-          "defName": "BOM浠g爜",
-          "comment": "",
-          "type": "",
-          "len": "",
-          "scale": "",
-          "primaryKey": false,
-          "notNull": false,
-          "autoIncrement": false,
-          "defaultValue": "",
-          "hideInGraph": false,
-          "refDict": "",
-          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64",
-          "extProps": {},
-          "domain": "BE09D493-E183-402D-ACC4-EEA21EB35B8E",
-          "id": "07D7B55E-B88D-4493-B916-987978EA20D1"
         },
         {
           "defKey": "production_unit",
@@ -60905,7 +60959,35 @@
           "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
         },
         {
-          "defKey": "usage_unit",
+          "defKey": "production_unit",
+          "defName": "鍩烘湰鍗曚綅",
+          "comment": "",
+          "type": "",
+          "len": "",
+          "scale": "",
+          "primaryKey": false,
+          "notNull": false,
+          "autoIncrement": false,
+          "defaultValue": "",
+          "hideInGraph": false,
+          "domain": "54611CCC-CA4B-42E1-9F32-4944C85B85A6",
+          "refDict": "",
+          "extProps": {},
+          "notes": {},
+          "attr1": "",
+          "attr2": "",
+          "attr3": "",
+          "attr4": "",
+          "attr5": "",
+          "attr6": "",
+          "attr7": "",
+          "attr8": "",
+          "attr9": "",
+          "id": "4F81E835-2971-44F0-872E-61BD47417674",
+          "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"
+        },
+        {
+          "defKey": "usage_quantity",
           "defName": "闇�姹傜敤閲�",
           "comment": "",
           "type": "",
diff --git a/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java b/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java
index 47573aa..e6e7f4d 100644
--- a/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java
+++ b/src/main/java/org/jeecg/modules/mes/entity/MesProductionOrder.java
@@ -11,124 +11,167 @@
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.jeecg.common.aspect.annotation.Dict;
-import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.sap.dto.ProductionOrderDTO;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
  * @Description: SAP鐢熶骇璁㈠崟
  * @Author: jeecg-boot
- * @Date:   2025-07-04
+ * @Date: 2025-07-04
  * @Version: V1.0
  */
 @Data
 @TableName("mes_production_order")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="mes_production_order瀵硅薄", description="SAP鐢熶骇璁㈠崟")
+@ApiModel(value = "mes_production_order瀵硅薄", description = "SAP鐢熶骇璁㈠崟")
 public class MesProductionOrder implements Serializable {
     private static final long serialVersionUID = 1L;
 
-	/**涓婚敭*/
-	@TableId(type = IdType.ASSIGN_ID)
+    /**涓婚敭*/
+    @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "涓婚敭")
     private String id;
-	/**鍒涘缓浜�*/
+    /**鍒涘缓浜�*/
     @ApiModelProperty(value = "鍒涘缓浜�")
     private String createBy;
-	/**鍒涘缓鏃ユ湡*/
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    /**鍒涘缓鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "鍒涘缓鏃ユ湡")
     private Date createTime;
-	/**鏇存柊浜�*/
+    /**鏇存柊浜�*/
     @ApiModelProperty(value = "鏇存柊浜�")
     private String updateBy;
-	/**鏇存柊鏃ユ湡*/
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    /**鏇存柊鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "鏇存柊鏃ユ湡")
     private Date updateTime;
-	/**鍒犻櫎鏍囪*/
-	@Excel(name = "鍒犻櫎鏍囪", width = 15)
+    /**鍒犻櫎鏍囪*/
     @ApiModelProperty(value = "鍒犻櫎鏍囪")
     @TableLogic
     private Integer delFlag;
-	/**鐢熶骇璁㈠崟鍙�*/
-	@Excel(name = "鐢熶骇璁㈠崟鍙�", width = 15)
+    /**鐢熶骇璁㈠崟鍙�*/
     @ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
     private String orderCode;
-	/**璁㈠崟绫诲瀷*/
-	@Excel(name = "璁㈠崟绫诲瀷", width = 15)
+    /**璁㈠崟绫诲瀷*/
     @ApiModelProperty(value = "璁㈠崟绫诲瀷")
     private String orderCategory;
-	/**鐗╂枡缂栧彿*/
-	@Excel(name = "鐗╂枡缂栧彿", width = 15)
+    /**鐗╂枡缂栧彿*/
     @ApiModelProperty(value = "鐗╂枡缂栧彿")
     private String materialNumber;
-	/**鐗╂枡鍚嶇О*/
-	@Excel(name = "鐗╂枡鍚嶇О", width = 15)
+    /**鐗╂枡鍚嶇О*/
     @ApiModelProperty(value = "鐗╂枡鍚嶇О")
     private String materialName;
-	/**璁″垝寮�濮嬫棩鏈�*/
-	@Excel(name = "璁″垝寮�濮嬫棩鏈�", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    /**璁″垝寮�濮嬫棩鏈�*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "璁″垝寮�濮嬫棩鏈�")
     private Date planStart;
-	/**璁″垝缁撴潫鏃ユ湡*/
-	@Excel(name = "璁″垝缁撴潫鏃ユ湡", width = 20, format = "yyyy-MM-dd HH:mm:ss")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    /**璁″垝缁撴潫鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "璁″垝缁撴潫鏃ユ湡")
     private Date planEnd;
-	/**璁㈠崟鏁伴噺*/
-	@Excel(name = "璁㈠崟鏁伴噺", width = 15)
+    /**璁㈠崟鏁伴噺*/
     @ApiModelProperty(value = "璁㈠崟鏁伴噺")
-    private Double orderQuantity;
-	/**浜у搧鍗曚綅*/
-	@Excel(name = "浜у搧鍗曚綅", width = 15, dicCode = "production_unit")
-	@Dict(dicCode = "production_unit")
+    private BigDecimal orderQuantity;
+    /**浜у搧鍗曚綅*/
+    @Dict(dicCode = "production_unit")
     @ApiModelProperty(value = "浜у搧鍗曚綅")
     private String productionUnit;
-	/**璁㈠崟鐘舵��*/
-	@Excel(name = "璁㈠崟鐘舵��", width = 15, dicCode = "order_status")
-	@Dict(dicCode = "order_status")
+    /**璁㈠崟鐘舵��*/
+    @Dict(dicCode = "order_status")
     @ApiModelProperty(value = "璁㈠崟鐘舵��")
     private String orderStatus;
-	/**浼樺厛绾�*/
-	@Excel(name = "浼樺厛绾�", width = 15, dicCode = "priority")
-	@Dict(dicCode = "priority")
+    /**浼樺厛绾�*/
+    @Dict(dicCode = "priority")
     @ApiModelProperty(value = "浼樺厛绾�")
     private String priority;
-	/**璁″垝宸ヨ壓璺嚎*/
-	@Excel(name = "璁″垝宸ヨ壓璺嚎", width = 15)
+    /**璁″垝宸ヨ壓璺嚎*/
     @ApiModelProperty(value = "璁″垝宸ヨ壓璺嚎")
     private String processRoute;
-	/**璁″垝鐗╂枡娓呭崟*/
-	@Excel(name = "璁″垝鐗╂枡娓呭崟", width = 15)
+    /**璁″垝鐗╂枡娓呭崟*/
     @ApiModelProperty(value = "璁″垝鐗╂枡娓呭崟")
     private String materialListCode;
-	/**宸ュ巶缂栫爜*/
-	@Excel(name = "宸ュ巶缂栫爜", width = 15)
+    /**宸ュ巶缂栫爜*/
     @ApiModelProperty(value = "宸ュ巶缂栫爜")
     private String factoryCode;
-	/**宸ュ巶鍚嶇О*/
-	@Excel(name = "宸ュ巶鍚嶇О", width = 15)
+    /**宸ュ巶鍚嶇О*/
     @ApiModelProperty(value = "宸ュ巶鍚嶇О")
     private String factoryName;
-	/**瀹㈡埛鍨嬪彿*/
-	@Excel(name = "瀹㈡埛鍨嬪彿", width = 15)
+    /**璋冨害鍛樼紪鍙�*/
+    @ApiModelProperty(value = "璋冨害鍛樼紪鍙�")
+    private String dispatcherCode;
+    /**璋冨害鍛樺悕绉�*/
+    @ApiModelProperty(value = "璋冨害鍛樺悕绉�")
+    private String dispatcherName;
+    /**璁㈠崟鍒涘缓鏃ユ湡 yyyy-MM-dd*/
+    @ApiModelProperty(value = "璁㈠崟鍒涘缓鏃ユ湡")
+    private String orderCreateDate;
+    /**璁㈠崟鏇存柊鏃ユ湡 yyyy-MM-dd*/
+    @ApiModelProperty(value = "璁㈠崟鏇存柊鏃ユ湡")
+    private String orderUpdateDate;
+    /**璁㈠崟鏇存柊鏃堕棿 HH:mm:ss*/
+    @ApiModelProperty(value = "璁㈠崟鏇存柊鏃堕棿")
+    private String orderUpdateTime;
+    /**璁㈠崟淇敼浜�*/
+    @ApiModelProperty(value = "璁㈠崟淇敼浜�")
+    private String orderUpdateUser;
+    /**瀹㈡埛鍨嬪彿*/
     @ApiModelProperty(value = "瀹㈡埛鍨嬪彿")
     private String customerOrderModel;
-	/**瀹㈡埛鍚嶇О*/
-	@Excel(name = "瀹㈡埛鍚嶇О", width = 15)
+    /**瀹㈡埛鍚嶇О*/
     @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
     private String customer;
-	/**澶囨敞*/
-	@Excel(name = "澶囨敞", width = 15)
+    /**澶囨敞*/
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
+
+    public MesProductionOrder() {
+    }
+
+    public MesProductionOrder(ProductionOrderDTO dto) {
+        this.orderCode = dto.getAUFNR();
+        this.orderCategory = dto.getDAUAT();
+        this.materialNumber = dto.getMATNR();
+        this.materialName = dto.getMAKTX();
+        this.planStart = DateUtils.str2Date(dto.getGSTRP(), DateUtils.date_sdf.get());
+        this.planEnd = DateUtils.str2Date(dto.getGLTRP(), DateUtils.date_sdf.get());
+        this.orderQuantity = new BigDecimal(dto.getGAMNG());
+        this.productionUnit = dto.getGMEIN();
+        this.orderStatus = dto.getTXT04();
+        this.priority = dto.getAPRIO();
+        this.processRoute = dto.getAUFPL();
+        this.materialListCode = dto.getSTLNR();
+        this.factoryCode = dto.getDWERK();
+        this.factoryName = dto.getNAME1();
+        this.dispatcherCode = dto.getFEVOR();
+        this.dispatcherName = dto.getTXT();
+        this.orderCreateDate = dto.getUDATE();
+        this.orderUpdateDate = dto.getLAEDA();
+        this.orderUpdateTime = dto.getTIMES();
+        this.orderUpdateUser = dto.getUSNAM();
+        this.delFlag = CommonConstant.DEL_FLAG_0;
+    }
+
+    public void updateEntity(ProductionOrderDTO dto) {
+        this.orderCategory = dto.getDAUAT();
+        this.planStart = DateUtils.str2Date(dto.getGSTRP(), DateUtils.date_sdf.get());
+        this.planEnd = DateUtils.str2Date(dto.getGLTRP(), DateUtils.date_sdf.get());
+        this.orderQuantity = new BigDecimal(dto.getGAMNG());
+        this.orderStatus = dto.getTXT04();
+        this.priority = dto.getAPRIO();
+        this.orderCreateDate = dto.getUDATE();
+        this.orderUpdateDate = dto.getLAEDA();
+        this.orderUpdateTime = dto.getTIMES();
+        this.orderUpdateUser = dto.getUSNAM();
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncJob.java b/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncJob.java
new file mode 100644
index 0000000..f6db679
--- /dev/null
+++ b/src/main/java/org/jeecg/modules/mes/job/ProductionOrderSyncJob.java
@@ -0,0 +1,141 @@
+package org.jeecg.modules.mes.job;
+
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.mes.entity.MesProductionOrder;
+import org.jeecg.modules.mes.service.IMesProductionOrderService;
+import org.jeecg.modules.pms.service.IPmsMaterialProcessService;
+import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
+import org.jeecg.modules.sap.dto.OrderBomDTO;
+import org.jeecg.modules.sap.dto.OrderProcessDTO;
+import org.jeecg.modules.sap.dto.ProductionOrderDTO;
+import org.jeecg.modules.sap.service.OrderBomSync;
+import org.jeecg.modules.sap.service.OrderProcessSync;
+import org.jeecg.modules.sap.service.ProductionOrderSync;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Component
+@Slf4j
+public class ProductionOrderSyncJob implements Job {
+    //宸ュ巶缂栫爜(鏂扮伀鐐� 2301)
+    private static final String FACTORY_CODE = "2301";
+    /**
+     * 璁㈠崟绫诲瀷
+     * 鏍囧噯鐢熶骇璁㈠崟 Z001
+     * 瀹㈤��杩斿伐鐢熶骇璁㈠崟 Z002
+     * 鍛嗘粸澶勭悊杩斿伐鐢熶骇璁㈠崟 Z003
+     * 璇曞埗鐢熶骇璁㈠崟(鏂扮伀鐐�)  Z011
+     * 鎷嗛浂鐢熶骇璁㈠崟(鏂扮伀鐐�)  2012
+     */
+    private static final String ORDER_TYPE_CODE = "Z001";
+    /**
+     * 鐢熶骇璋冨害鍛�
+     * 001 涓�鍒嗗巶璋冨害鍛�
+     * 002 浜屽垎鍘傝皟搴﹀憳
+     * 003 涓夊垎鍘傝皟搴﹀憳
+     * 004 鍥涘垎鍘傝皟搴﹀憳
+     * 005 ABS璋冨害鍛�
+     * 006 璋冭川璋冨害鍛�
+     * 007 浜斿垎鍘傝皟搴﹀憳
+     * 008 璇曞埗杞﹂棿璋冨害鍛�
+     * 009 澶栭噰璋冨害鍛�
+     * 010 鍏巶璋冨害鍛�
+     * 012 鍏垎鍘傝皟搴﹀憳
+     */
+    private static final String PRODUCTION_MANAGER = "010";
+    /**
+     * 鐢熶骇璁㈠崟鐘舵�侊紝瀹為檯涓婏紝鍙湁REL鐘舵�佺殑宸ュ崟鎵嶅彲浠ヨ繘琛屾搷浣�
+     * CRTD 鏂板缓
+     * REL 涓嬭揪
+     * TECO 鍏抽棴
+     */
+    private static final String ORDER_STATUS = "REL";
+
+    /**
+     * 璇锋眰鎴愬姛缂栫爜
+     */
+    private static final String SUCCESS_CODE = "S";
+
+    @Autowired
+    private ProductionOrderSync productionOrderSync;
+    @Autowired
+    private OrderBomSync orderBomSync;
+    @Autowired
+    private OrderProcessSync orderProcessSync;
+    @Autowired
+    private IMesProductionOrderService productionOrderService;
+    @Autowired
+    private IPmsProcessBillMaterialsService processBillMaterialsService;
+    @Autowired
+    private IPmsMaterialProcessService materialProcessService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        //鑾峰彇涓婃鍚屾鏃堕棿
+        try {
+            //璋冪敤SAP鎺ュ彛鑾峰彇鐢熶骇璁㈠崟
+            Map<String, Object> productionOrderMap = productionOrderSync.syncProductionOrder(FACTORY_CODE, ORDER_TYPE_CODE, PRODUCTION_MANAGER, ORDER_STATUS, null, null);
+            if (productionOrderMap == null || !SUCCESS_CODE.equals(productionOrderMap.get("ztype"))) {
+                log.error("鏈悓姝ュ埌璁㈠崟淇℃伅锛佹棩鏈燂細{}", LocalDateTime.now());
+                return;
+            }
+            //璋冪敤鎴愬姛锛岃幏鍙栬繑鍥炴暟鎹�
+            Object result = productionOrderMap.get("result");
+            boolean b = result instanceof List;
+            if(!b) {
+                log.error("杩斿洖绫诲瀷閿欒锛� class:{}", result == null ? null : result.getClass());
+                return;
+            }
+            List<ProductionOrderDTO> productionOrderDTOList = (List<ProductionOrderDTO>) result;
+            Map<String, MesProductionOrder> orderMap = productionOrderService.saveOrUpdateProductionOrder(productionOrderDTOList);
+            String orderCodes = String.join(",", orderMap.keySet());
+            //璁㈠崟BOM鍚屾
+            Map<String, Object> orderBomMap = orderBomSync.syncOrderBom(FACTORY_CODE, orderCodes);
+            if (orderBomMap == null || !SUCCESS_CODE.equals(orderBomMap.get("ztype"))) {
+                log.error("鏈悓姝ュ埌璁㈠崟BOM淇℃伅锛佹棩鏈燂細{}", LocalDateTime.now());
+                return;
+            }
+            //璋冪敤鎴愬姛锛岃幏鍙栬繑鍥炴暟鎹�
+            result = orderBomMap.get("result");
+            b = result instanceof List;
+            if(!b) {
+                log.error("杩斿洖绫诲瀷閿欒锛� class:{}", result == null ? null : result.getClass());
+                return;
+            }
+            List<OrderBomDTO> orderBomDTOList = (List<OrderBomDTO>) result;
+            b = processBillMaterialsService.saveOrUpdateOrderBom(orderMap, orderBomDTOList);
+            if(!b) {
+                log.error("淇濆瓨璁㈠崟BOM澶辫触锛屾棩鏈燂細{}", LocalDateTime.now());
+                return;
+            }
+            //璁㈠崟宸ュ簭鍚屾
+            Map<String, Object> orderProcessMap = orderProcessSync.syncOrderProcess(FACTORY_CODE, orderCodes);
+            if (orderBomMap == null || !SUCCESS_CODE.equals(orderProcessMap.get("ztype"))) {
+                log.error("鏈悓姝ュ埌璁㈠崟宸ュ簭淇℃伅锛佹棩鏈燂細{}", LocalDateTime.now());
+                return;
+            }
+            //璋冪敤鎴愬姛锛岃幏鍙栬繑鍥炴暟鎹�
+            result = orderBomMap.get("result");
+            b = result instanceof List;
+            if(!b) {
+                log.error("杩斿洖绫诲瀷閿欒锛� class:{}", result == null ? null : result.getClass());
+                return;
+            }
+            List<OrderProcessDTO> orderProcessDTOList = (List<OrderProcessDTO>) result;
+            b = materialProcessService.saveOrUpdateOrderProcess(orderMap, orderProcessDTOList);
+            if(!b) {
+                log.error("淇濆瓨璁㈠崟宸ュ簭澶辫触锛屾棩鏈燂細{}", LocalDateTime.now());
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+}
diff --git a/src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java b/src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java
index ff8affa..a833e82 100644
--- a/src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java
+++ b/src/main/java/org/jeecg/modules/mes/service/IMesProductionOrderService.java
@@ -2,6 +2,10 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.mes.entity.MesProductionOrder;
+import org.jeecg.modules.sap.dto.ProductionOrderDTO;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: SAP鐢熶骇璁㈠崟
@@ -11,4 +15,17 @@
  */
 public interface IMesProductionOrderService extends IService<MesProductionOrder> {
 
+    /**
+     * SAP鍚屾鏁版嵁淇濆瓨
+     * @param productionOrderDTOList
+     * @return
+     */
+    Map<String, MesProductionOrder> saveOrUpdateProductionOrder(List<ProductionOrderDTO> productionOrderDTOList);
+
+    /**
+     * 鏍规嵁璁㈠崟鍙锋煡璇�
+     * @param orderCode
+     * @return
+     */
+    MesProductionOrder getByOrderCode(String orderCode);
 }
diff --git a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java b/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java
index ed8e452..0b0f002 100644
--- a/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/mes/service/impl/MesProductionOrderServiceImpl.java
@@ -1,18 +1,65 @@
 package org.jeecg.modules.mes.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.mes.mapper.MesProductionOrderMapper;
 import org.jeecg.modules.mes.service.IMesProductionOrderService;
+import org.jeecg.modules.sap.dto.ProductionOrderDTO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
 
 /**
  * @Description: SAP鐢熶骇璁㈠崟
  * @Author: jeecg-boot
- * @Date:   2025-07-04
+ * @Date: 2025-07-04
  * @Version: V1.0
  */
 @Service
 public class MesProductionOrderServiceImpl extends ServiceImpl<MesProductionOrderMapper, MesProductionOrder> implements IMesProductionOrderService {
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, MesProductionOrder> saveOrUpdateProductionOrder(List<ProductionOrderDTO> productionOrderDTOList) {
+        List<MesProductionOrder> addList = new ArrayList<>();
+        List<MesProductionOrder> updateList = new ArrayList<>();
+        Map<String, MesProductionOrder> resultMap = new HashMap<>();
+        for (ProductionOrderDTO productionOrderDTO : productionOrderDTOList) {
+            MesProductionOrder updated = getByOrderCode(productionOrderDTO.getAUFNR());
+            if (updated == null) {
+                updated = new MesProductionOrder(productionOrderDTO);
+                addList.add(updated);
+                resultMap.put(updated.getOrderCode(), updated);
+            } else {
+                updated.updateEntity(productionOrderDTO);
+                updateList.add(updated);
+                resultMap.put(updated.getOrderCode(), updated);
+            }
+        }
+        if(CollectionUtil.isEmpty(addList)){
+            super.saveBatch(addList);
+        }
+        if(CollectionUtil.isEmpty(updateList)){
+            super.updateBatchById(updateList);
+        }
+        return resultMap;
+    }
+
+    @Override
+    public MesProductionOrder getByOrderCode(String orderCode) {
+        LambdaQueryWrapper<MesProductionOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(MesProductionOrder::getOrderCode, orderCode);
+        queryWrapper.eq(MesProductionOrder::getDelFlag, CommonConstant.DEL_FLAG_0);
+        List<MesProductionOrder> list = super.list(queryWrapper);
+        if (CollectionUtil.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
+
+
 }
diff --git a/src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java b/src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java
index 86974f7..0a341d6 100644
--- a/src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java
+++ b/src/main/java/org/jeecg/modules/pms/entity/PmsMaterialProcess.java
@@ -2,7 +2,6 @@
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -10,8 +9,7 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.jeecg.common.aspect.annotation.Dict;
-import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.modules.sap.dto.OrderProcessDTO;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
@@ -20,65 +18,64 @@
 /**
  * @Description: 鐗╂枡宸ュ簭
  * @Author: jeecg-boot
- * @Date:   2025-07-01
+ * @Date: 2025-07-01
  * @Version: V1.0
  */
 @Data
 @TableName("pms_material_process")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="pms_material_process瀵硅薄", description="鐗╂枡宸ュ簭")
+@ApiModel(value = "pms_material_process瀵硅薄", description = "鐗╂枡宸ュ簭")
 public class PmsMaterialProcess implements Serializable {
     private static final long serialVersionUID = 1L;
 
-	/**涓婚敭*/
-	@TableId(type = IdType.ASSIGN_ID)
+    /**涓婚敭*/
+    @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(value = "涓婚敭")
     private String id;
-	/**鍒涘缓浜�*/
+    /**鍒涘缓浜�*/
     @ApiModelProperty(value = "鍒涘缓浜�")
     private String createBy;
-	/**鍒涘缓鏃ユ湡*/
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    /**鍒涘缓鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "鍒涘缓鏃ユ湡")
     private Date createTime;
-	/**鏇存柊浜�*/
+    /**鏇存柊浜�*/
     @ApiModelProperty(value = "鏇存柊浜�")
     private String updateBy;
-	/**鏇存柊鏃ユ湡*/
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    /**鏇存柊鏃ユ湡*/
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "鏇存柊鏃ユ湡")
     private Date updateTime;
-	/**鍒犻櫎鏍囪*/
-	@Excel(name = "鍒犻櫎鏍囪", width = 15)
-    @ApiModelProperty(value = "鍒犻櫎鏍囪")
-    @TableLogic
-    private Integer delFlag;
-	/**鐗╂枡缂栫爜*/
-	@Excel(name = "鐗╂枡缂栫爜", width = 15)
+    /**鐢熶骇璁㈠崟ID*/
+    @ApiModelProperty(value = "鐢熶骇璁㈠崟ID")
+    private String orderId;
+    /**鐗╂枡缂栫爜*/
     @ApiModelProperty(value = "鐗╂枡缂栫爜")
     private String materialNumber;
-	/**鐗╂枡鍚嶇О*/
-	@Excel(name = "鐗╂枡鍚嶇О", width = 15)
+    /**鐗╂枡鍚嶇О*/
     @ApiModelProperty(value = "鐗╂枡鍚嶇О")
     private String materialName;
-	/**浜х嚎ID(SAP宸ヤ綔涓績)*/
-	@Excel(name = "浜х嚎ID(SAP宸ヤ綔涓績)", width = 15)
-    @ApiModelProperty(value = "浜х嚎ID(SAP宸ヤ綔涓績)")
-    @Dict(dictTable = "base_factory", dicCode = "id", dicText = "factory_name")
-    private String factoryId;
-	/**宸ュ簭鍙�*/
-	@Excel(name = "宸ュ簭鍙�", width = 15)
+    /**宸ュ簭鍙�*/
     @ApiModelProperty(value = "宸ュ簭鍙�")
     private String processCode;
-	/**宸ュ簭鍚嶇О*/
-	@Excel(name = "宸ュ簭鍚嶇О", width = 15)
+    /**宸ュ簭鍚嶇О*/
     @ApiModelProperty(value = "宸ュ簭鍚嶇О")
     private String processName;
-	/**鎺у埗鐮�*/
-	@Excel(name = "鎺у埗鐮�", width = 15)
+    /**鎺у埗鐮�*/
     @ApiModelProperty(value = "鎺у埗鐮�")
     private String controlCode;
+
+    public PmsMaterialProcess(){}
+
+    public PmsMaterialProcess(String orderId, String materialName,  OrderProcessDTO dto) {
+        this.orderId = orderId;
+        this.materialNumber = dto.getMATNR();
+        this.materialName = materialName;
+        this.processCode = dto.getVORNR();
+        this.processName = dto.getLTXA1();
+        this.controlCode = dto.getSTEUS();
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java b/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java
index 95ea7ca..f4ce7d6 100644
--- a/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java
+++ b/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterials.java
@@ -2,7 +2,6 @@
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -10,10 +9,10 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -50,33 +49,19 @@
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "鏇存柊鏃ユ湡")
     private Date updateTime;
-	/**鍒犻櫎鏍囪*/
-	@Excel(name = "鍒犻櫎鏍囪", width = 15)
-    @ApiModelProperty(value = "鍒犻櫎鏍囪")
-    @TableLogic
-    private Integer delFlag;
 	/**鐢熸垚璁㈠崟ID*/
-	@Excel(name = "鐢熸垚璁㈠崟ID", width = 15)
     @ApiModelProperty(value = "鐢熸垚璁㈠崟ID")
     private String orderId;
 	/**鐗╂枡缂栫爜*/
-	@Excel(name = "鐗╂枡缂栫爜", width = 15)
     @ApiModelProperty(value = "鐗╂枡缂栫爜")
     private String materialNumber;
 	/**鐗╂枡鍚嶇О*/
-	@Excel(name = "鐗╂枡鍚嶇О", width = 15)
     @ApiModelProperty(value = "鐗╂枡鍚嶇О")
     private String materialName;
-	/**BOM浠g爜*/
-	@Excel(name = "BOM浠g爜", width = 15)
-    @ApiModelProperty(value = "BOM浠g爜")
-    private String billMaterialsCode;
 	/**鍩烘湰鍗曚綅*/
-	@Excel(name = "鍩烘湰鍗曚綅", width = 15)
     @ApiModelProperty(value = "鍩烘湰鍗曚綅")
     private String productionUnit;
 	/**璁㈠崟鏁伴噺*/
-	@Excel(name = "璁㈠崟鏁伴噺", width = 15)
     @ApiModelProperty(value = "璁㈠崟鏁伴噺")
-    private Double productionQuantity;
+    private BigDecimal productionQuantity;
 }
diff --git a/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java b/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java
index 95dc6c7..b00dfef 100644
--- a/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java
+++ b/src/main/java/org/jeecg/modules/pms/entity/PmsProcessBillMaterialsDetail.java
@@ -10,10 +10,11 @@
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.jeecg.common.aspect.annotation.Dict;
-import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.modules.sap.dto.OrderBomDTO;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -51,20 +52,29 @@
     @ApiModelProperty(value = "鏇存柊鏃ユ湡")
     private Date updateTime;
 	/**鐢熶骇鐗╂枡ID*/
-	@Excel(name = "鐢熶骇鐗╂枡ID", width = 15)
     @ApiModelProperty(value = "鐢熶骇鐗╂枡ID")
     @Dict(dictTable = "pms_process_bill_materials", dicCode = "id", dicText = "material_number")
     private String materialId;
 	/**鐗╂枡缂栫爜*/
-	@Excel(name = "鐗╂枡缂栫爜", width = 15)
     @ApiModelProperty(value = "鐗╂枡缂栫爜")
     private String materialNumber;
 	/**鐗╂枡鍚嶇О*/
-	@Excel(name = "鐗╂枡鍚嶇О", width = 15)
     @ApiModelProperty(value = "鐗╂枡鍚嶇О")
     private String materialName;
+    /**鍩烘湰鍗曚綅*/
+    @ApiModelProperty(value = "鍩烘湰鍗曚綅")
+    private String productionUnit;
 	/**闇�姹傜敤閲�*/
-	@Excel(name = "闇�姹傜敤閲�", width = 15)
     @ApiModelProperty(value = "闇�姹傜敤閲�")
-    private Double usageUnit;
+    private BigDecimal usageQuantity;
+
+    public PmsProcessBillMaterialsDetail(){}
+
+    public PmsProcessBillMaterialsDetail(String materialId, OrderBomDTO dto) {
+        this.materialId = materialId;
+        this.materialNumber = dto.getMATNR();
+        this.materialName = dto.getMAKTX();
+        this.productionUnit = dto.getMEINS();
+        this.usageQuantity = new BigDecimal(dto.getBDMNG());
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java b/src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java
index 12c8cef..a3d097b 100644
--- a/src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java
+++ b/src/main/java/org/jeecg/modules/pms/service/IPmsMaterialProcessService.java
@@ -2,9 +2,12 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.pms.entity.PmsMaterialProcess;
+import org.jeecg.modules.sap.dto.OrderProcessDTO;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -15,4 +18,17 @@
  */
 public interface IPmsMaterialProcessService extends IService<PmsMaterialProcess> {
     IPage<Map<String, Object>> getpmsMaterialProcessListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
+
+    /**
+     *
+     * @param orderMap
+     * @param orderProcessDTOList
+     * @return
+     */
+    boolean saveOrUpdateOrderProcess(Map<String, MesProductionOrder> orderMap, List<OrderProcessDTO> orderProcessDTOList);
+    /**
+     * 鍒犻櫎鍘熸湁鐨勬暟鎹�
+     * @param orderId
+     */
+    void removeByOrderId(String orderId);
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java
index 3d0b428..b49558b 100644
--- a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java
+++ b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsDetailService.java
@@ -3,8 +3,10 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail;
+import org.jeecg.modules.sap.dto.OrderBomDTO;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -16,4 +18,17 @@
 public interface IPmsProcessBillMaterialsDetailService extends IService<PmsProcessBillMaterialsDetail> {
     PmsProcessBillMaterialsDetail queryByMaterialId(String materialId);
     IPage<Map<String, Object>> getpmsProcessBillMaterialsDetailListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
+
+    /**
+     * 鍒犻櫎鍘熸湁鐨勬暟鎹�
+     * @param materialsId
+     */
+    void removeByMaterialsId(String materialsId);
+
+    /**
+     * 鎵归噺淇℃伅鐗╂枡娓呭崟鏄庣粏
+     * @param materialsId
+     * @param collect
+     */
+    void saveBatchDetail(String materialsId, List<OrderBomDTO> collect);
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
index cacfe51..4ddfc1f 100644
--- a/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
+++ b/src/main/java/org/jeecg/modules/pms/service/IPmsProcessBillMaterialsService.java
@@ -2,9 +2,12 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
+import org.jeecg.modules.sap.dto.OrderBomDTO;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -15,4 +18,19 @@
  */
 public interface IPmsProcessBillMaterialsService extends IService<PmsProcessBillMaterials> {
     IPage<Map<String, Object>> getpmsProcessBillMaterialsListData(Integer pageNo, Integer pageSize, HttpServletRequest req);
+
+    /**
+     * 鎵归噺淇濆瓨鎴栨洿鏂拌鍗旴OM鏁版嵁
+     * @param orderMap
+     * @param orderBomDTOList
+     * @return
+     */
+    boolean saveOrUpdateOrderBom(Map<String, MesProductionOrder> orderMap, List<OrderBomDTO> orderBomDTOList);
+
+    /**
+     * 璁㈠崟鐗╂枡鏌ヨ
+     * @param orderId
+     * @return
+     */
+    PmsProcessBillMaterials getByOrderId(String orderId);
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java b/src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java
index 3629fc2..876678d 100644
--- a/src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/pms/service/impl/PmsMaterialProcessServiceImpl.java
@@ -1,22 +1,29 @@
 package org.jeecg.modules.pms.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang.StringUtils;
+import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.pms.entity.PmsMaterialProcess;
 import org.jeecg.modules.pms.mapper.PmsMaterialProcessMapper;
 import org.jeecg.modules.pms.service.IPmsMaterialProcessService;
+import org.jeecg.modules.sap.dto.OrderProcessDTO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 鐗╂枡宸ュ簭
  * @Author: jeecg-boot
- * @Date:   2025-07-01
+ * @Date: 2025-07-01
  * @Version: V1.0
  */
 @Service
@@ -40,4 +47,29 @@
         }
         return super.getBaseMapper().getpmsMaterialProcessListData(pageData, paramMap);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveOrUpdateOrderProcess(Map<String, MesProductionOrder> orderMap, List<OrderProcessDTO> orderProcessDTOList) {
+        for (Map.Entry<String, MesProductionOrder> entry : orderMap.entrySet()) {
+            MesProductionOrder order = entry.getValue();
+            //鍒犻櫎鍘熸湁鐨勬暟鎹�
+            this.removeByOrderId(order.getId());
+            //閲嶆柊鏂板宸ュ簭淇℃伅
+            List<OrderProcessDTO> collect = orderProcessDTOList.stream().filter(orderProcessDTO -> entry.getKey().equals(orderProcessDTO.getAUFNR())).collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(collect)) {
+                List<PmsMaterialProcess> list = collect.stream().map(orderBomDTO -> new PmsMaterialProcess(entry.getKey(), order.getMaterialName(), orderBomDTO)).collect(Collectors.toList());
+                super.saveBatch(list);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeByOrderId(String orderId) {
+        LambdaQueryWrapper<PmsMaterialProcess> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PmsMaterialProcess::getOrderId, orderId);
+        super.remove(queryWrapper);
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java
index 81fa739..8273062 100644
--- a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsDetailServiceImpl.java
@@ -1,5 +1,7 @@
 package org.jeecg.modules.pms.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -7,16 +9,20 @@
 import org.jeecg.modules.pms.entity.PmsProcessBillMaterialsDetail;
 import org.jeecg.modules.pms.mapper.PmsProcessBillMaterialsDetailMapper;
 import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService;
+import org.jeecg.modules.sap.dto.OrderBomDTO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 鐗╂枡娓呭崟
  * @Author: jeecg-boot
- * @Date:   2025-07-01
+ * @Date: 2025-07-01
  * @Version: V1.0
  */
 @Service
@@ -45,4 +51,22 @@
         }
         return super.getBaseMapper().getpmsProcessBillMaterialsDetailListData(pageData, paramMap);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeByMaterialsId(String materialsId) {
+        LambdaQueryWrapper<PmsProcessBillMaterialsDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PmsProcessBillMaterialsDetail::getMaterialId, materialsId);
+        this.getBaseMapper().delete(queryWrapper);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveBatchDetail(String materialsId, List<OrderBomDTO> collect) {
+        if (CollectionUtil.isEmpty(collect)) {
+            return;
+        }
+        List<PmsProcessBillMaterialsDetail> list = collect.stream().map(orderBomDTO -> new PmsProcessBillMaterialsDetail(materialsId, orderBomDTO)).collect(Collectors.toList());
+        super.saveBatch(list);
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
index eda1def..75cda98 100644
--- a/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
+++ b/src/main/java/org/jeecg/modules/pms/service/impl/PmsProcessBillMaterialsServiceImpl.java
@@ -1,26 +1,37 @@
 package org.jeecg.modules.pms.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang.StringUtils;
+import org.jeecg.modules.mes.entity.MesProductionOrder;
 import org.jeecg.modules.pms.entity.PmsProcessBillMaterials;
 import org.jeecg.modules.pms.mapper.PmsProcessBillMaterialsMapper;
+import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsDetailService;
 import org.jeecg.modules.pms.service.IPmsProcessBillMaterialsService;
+import org.jeecg.modules.sap.dto.OrderBomDTO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 璁㈠崟BOM
  * @Author: jeecg-boot
- * @Date:   2025-07-01
+ * @Date: 2025-07-01
  * @Version: V1.0
  */
 @Service
 public class PmsProcessBillMaterialsServiceImpl extends ServiceImpl<PmsProcessBillMaterialsMapper, PmsProcessBillMaterials> implements IPmsProcessBillMaterialsService {
+    @Autowired
+    private IPmsProcessBillMaterialsDetailService processBillMaterialsDetailService;
 
     @Override
     public IPage<Map<String, Object>> getpmsProcessBillMaterialsListData(Integer pageNo, Integer pageSize, HttpServletRequest req) {
@@ -40,4 +51,50 @@
         }
         return super.getBaseMapper().getpmsProcessBillMaterialsListData(pageData, paramMap);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveOrUpdateOrderBom(Map<String, MesProductionOrder> orderMap, List<OrderBomDTO> orderBomDTOList) {
+        for (Map.Entry<String, MesProductionOrder> entry :  orderMap.entrySet()) {
+            MesProductionOrder order = entry.getValue();
+            PmsProcessBillMaterials materials = getByOrderId(order.getId());
+            if(materials != null) {
+                //鏇存柊鐗╂枡鏁版嵁
+                materials.setOrderId(order.getId());
+                materials.setMaterialNumber(order.getMaterialNumber());
+                materials.setMaterialName(order.getMaterialName());
+                materials.setProductionUnit(order.getProductionUnit());
+                materials.setProductionQuantity(order.getOrderQuantity());
+                this.getBaseMapper().updateById(materials);
+                //鏇存柊鐗╂枡鏄庣粏鏁版嵁
+                processBillMaterialsDetailService.removeByMaterialsId(materials.getId());
+                //杩囨护鍑烘璁㈠崟鐨勭墿鏂欎俊鎭�
+                List<OrderBomDTO> collect = orderBomDTOList.stream().filter(orderBomDTO -> entry.getKey().equals(orderBomDTO.getAUFNR())).collect(Collectors.toList());
+                processBillMaterialsDetailService.saveBatchDetail(materials.getId(), collect);
+            }else {
+                materials = new PmsProcessBillMaterials();
+                materials.setOrderId(order.getId());
+                materials.setMaterialNumber(order.getMaterialNumber());
+                materials.setMaterialName(order.getMaterialName());
+                materials.setProductionUnit(order.getProductionUnit());
+                materials.setProductionQuantity(order.getOrderQuantity());
+                this.getBaseMapper().insert(materials);
+                //杩囨护鍑烘璁㈠崟鐨勭墿鏂欎俊鎭�
+                List<OrderBomDTO> collect = orderBomDTOList.stream().filter(orderBomDTO -> entry.getKey().equals(orderBomDTO.getAUFNR())).collect(Collectors.toList());
+                processBillMaterialsDetailService.saveBatchDetail(materials.getId(), collect);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public PmsProcessBillMaterials getByOrderId(String orderId) {
+        LambdaQueryWrapper<PmsProcessBillMaterials> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PmsProcessBillMaterials::getOrderId, orderId);
+        List<PmsProcessBillMaterials> list = super.list(queryWrapper);
+        if (CollectionUtil.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/jeecg/modules/sap/FunctionConst.java b/src/main/java/org/jeecg/modules/sap/FunctionConst.java
index 3126ff1..68929c6 100644
--- a/src/main/java/org/jeecg/modules/sap/FunctionConst.java
+++ b/src/main/java/org/jeecg/modules/sap/FunctionConst.java
@@ -2,15 +2,15 @@
 
 public class FunctionConst {
     //1.鐢熶骇璁㈠崟鍚屾鎺ュ彛
-    public static String ZPPF_033_1 = "ZPPF_033_1";
+    public static final String ZPPF_033_1 = "ZPPF_033_1";
     //2.璁㈠崟BOM鍚屾鎺ュ彛
-    public static String ZPPF_033_3 = "ZPPF_033_3";
+    public static final String ZPPF_033_3 = "ZPPF_033_3";
     //3.浜у搧宸ュ簭鍚屾鎺ュ彛
-    public static String ZPPF_033_2 = "ZPPF_033_2";
+    public static final String ZPPF_033_2 = "ZPPF_033_2";
     //4.鐢熶骇璁㈠崟宸ュ簭鎶ュ伐鎺ュ彛銆佺敓浜ц鍗曞叆搴撱�佷笉鍚堟牸鍝佸鐞�
-    public static String ZMES_PRODORDCONF_CREATE_TT2301 = "ZMES_PRODORDCONF_CREATE_TT2301";
+    public static final String ZMES_PRODORDCONF_CREATE_TT2301 = "ZMES_PRODORDCONF_CREATE_TT2301";
     //5.鐢熶骇璁㈠崟鎶曟枡鎺ュ彛
-    public static String ZMES_GOODSMVT_CREATE_2301 = "ZMES_GOODSMVT_CREATE_2301";
+    public static final String ZMES_GOODSMVT_CREATE_2301 = "ZMES_GOODSMVT_CREATE_2301";
     //6.鐢熶骇璁㈠崟鍏抽棴鎺ュ彛
-    public static String ZPPF_019 = "ZPPF_019";
+    public static final String ZPPF_019 = "ZPPF_019";
 }
diff --git a/src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java b/src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java
index 6622759..7cb84b2 100644
--- a/src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java
+++ b/src/main/java/org/jeecg/modules/sap/dto/OrderBomDTO.java
@@ -14,6 +14,6 @@
     private String MAKTX;
     /** 闇�姹傞噺 */
     private String BDMNG;
-    /** MEINS */
+    /** 鍩烘湰璁¢噺鍗曚綅 */
     private String MEINS;
 }

--
Gitblit v1.9.3