From 32d1bd8a3f94c67198e397aff76bc7b33a30a6b6 Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期五, 09 五月 2025 15:15:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateStandardRequire.java                                        |    4 
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateOrderPlanManagerServiceImpl.java                      |    1 
 aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsMaterialStorageManagementJobServiceImpl.java                 |  221 ++++++++++
 aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlatePlan.java                                                   |    6 
 aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsWorkOrderJob.java                                                  |   34 +
 aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java                                 |   12 
 aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateStandardRequireErrorController.java            |   12 
 aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteCoreService.java                                             |   28 +
 aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteLineController.java             |   12 
 aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsBomHeaderController.java                            |   28 +
 aps-modules/aps-job/src/main/resources/mapper/job/ApsBomHeaderJobMapper.xml                                                |    7 
 aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomLineJobMapper.java                                              |    5 
 aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteCoreFallbackFactory.java                             |   26 +
 aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanOrderManagerMapper.xml                                     |   11 
 aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobMapper.xml                                                |   12 
 aps-common/aps-common-core/src/main/java/com/aps/common/core/constant/ServiceNameConstants.java                            |   10 
 aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanDate.java                                          |    5 
 aps-api/aps-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    2 
 aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteHeaderController.java           |   12 
 aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsMaterialStorageManagementJob.java                                  |  162 +++++++
 aps-modules/aps-job/src/main/java/com/aps/job/service/IApsMaterialStorageManagementJobService.java                         |   82 +++
 aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsBomHeaderJobServiceImpl.java                                 |   33 +
 aps-modules/aps-job/src/main/resources/mapper/job/ApsBomLineJobMapper.xml                                                  |    7 
 aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomHeaderJobMapper.java                                            |    5 
 aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanManager.java                                       |    6 
 aps-modules/aps-job/src/main/java/com/aps/job/service/IApsBomHeaderJobService.java                                         |   12 
 aps-modules/aps-job/src/main/resources/mapper/job/ApsMaterialStorageManagementJobMapper.xml                                |  152 +++++++
 aps-modules/aps-job/src/main/java/com/aps/job/task/RyTask.java                                                             |   32 +
 aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteJobFallbackFactory.java                              |   26 +
 aps-modules/aps-job/src/main/java/com/aps/job/controller/SysJobController.java                                             |  156 ++++++
 aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteJobService.java                                              |   28 +
 aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsMaterialStorageManagementJobMapper.java                            |   88 ++++
 32 files changed, 1,174 insertions(+), 63 deletions(-)

diff --git a/aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteCoreService.java b/aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteCoreService.java
new file mode 100644
index 0000000..541813a
--- /dev/null
+++ b/aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteCoreService.java
@@ -0,0 +1,28 @@
+package com.aps.system.api;
+
+import com.aps.common.core.constant.SecurityConstants;
+import com.aps.common.core.constant.ServiceNameConstants;
+import com.aps.common.core.domain.R;
+import com.aps.system.api.factory.RemoteCoreFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 浠诲姟鏈嶅姟
+ * 
+ * @author hjy
+ */
+@FeignClient(contextId = "remoteCoreService", value = ServiceNameConstants.CORE_SERVICE, fallbackFactory = RemoteCoreFallbackFactory.class)
+public interface RemoteCoreService
+{
+
+    /**
+     * 鍒锋柊BOM鏁版嵁鍒癛edis
+     * @param source
+     * @return
+     */
+    @PostMapping("/ApsBomHeader/setBomDataToRedis")
+    R<Boolean> setBomDataToRedis(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+}
diff --git a/aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteJobService.java b/aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteJobService.java
new file mode 100644
index 0000000..c3f1be5
--- /dev/null
+++ b/aps-api/aps-api-system/src/main/java/com/aps/system/api/RemoteJobService.java
@@ -0,0 +1,28 @@
+package com.aps.system.api;
+
+import com.aps.common.core.constant.SecurityConstants;
+import com.aps.common.core.constant.ServiceNameConstants;
+import com.aps.common.core.domain.R;
+import com.aps.system.api.factory.RemoteJobFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 浠诲姟鏈嶅姟
+ * 
+ * @author hjy
+ */
+@FeignClient(contextId = "remoteJobService", value = ServiceNameConstants.JOB_SERVICE, fallbackFactory = RemoteJobFallbackFactory.class)
+public interface RemoteJobService
+{
+
+    /**
+     * 鍒锋柊BOM鍏ㄩ噺鏁版嵁
+     * @param source
+     * @return
+     */
+    @PostMapping("/job/refreshBomData")
+    R<Boolean> refreshBomData(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+}
diff --git a/aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteCoreFallbackFactory.java b/aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteCoreFallbackFactory.java
new file mode 100644
index 0000000..b2d846d
--- /dev/null
+++ b/aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteCoreFallbackFactory.java
@@ -0,0 +1,26 @@
+package com.aps.system.api.factory;
+
+import com.aps.common.core.domain.R;
+import com.aps.system.api.RemoteCoreService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鐢ㄦ埛鏈嶅姟闄嶇骇澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteCoreFallbackFactory implements FallbackFactory<RemoteCoreService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteCoreFallbackFactory.class);
+
+    @Override
+    public RemoteCoreService create(Throwable throwable)
+    {
+        log.error("浠诲姟鏈嶅姟璋冪敤澶辫触:{}", throwable.getMessage());
+        return source -> R.fail("BOM鏁版嵁瀛樺偍鍒癛edis涓け璐�:" + throwable.getMessage());
+    }
+}
diff --git a/aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteJobFallbackFactory.java b/aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteJobFallbackFactory.java
new file mode 100644
index 0000000..12659b1
--- /dev/null
+++ b/aps-api/aps-api-system/src/main/java/com/aps/system/api/factory/RemoteJobFallbackFactory.java
@@ -0,0 +1,26 @@
+package com.aps.system.api.factory;
+
+import com.aps.common.core.domain.R;
+import com.aps.system.api.RemoteJobService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鐢ㄦ埛鏈嶅姟闄嶇骇澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteJobFallbackFactory implements FallbackFactory<RemoteJobService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteJobFallbackFactory.class);
+
+    @Override
+    public RemoteJobService create(Throwable throwable)
+    {
+        log.error("浠诲姟鏈嶅姟璋冪敤澶辫触:{}", throwable.getMessage());
+        return source -> R.fail("鍒锋柊BOM鏁版嵁澶辫触:" + throwable.getMessage());
+    }
+}
diff --git a/aps-api/aps-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/aps-api/aps-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 6d7e80c..e149c00 100644
--- a/aps-api/aps-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/aps-api/aps-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,3 +1,5 @@
 com.aps.system.api.factory.RemoteUserFallbackFactory
 com.aps.system.api.factory.RemoteLogFallbackFactory
 com.aps.system.api.factory.RemoteFileFallbackFactory
+com.aps.system.api.factory.RemoteJobFallbackFactory
+com.aps.system.api.factory.RemoteCoreFallbackFactory
diff --git a/aps-common/aps-common-core/src/main/java/com/aps/common/core/constant/ServiceNameConstants.java b/aps-common/aps-common-core/src/main/java/com/aps/common/core/constant/ServiceNameConstants.java
index 52c3fea..25642ad 100644
--- a/aps-common/aps-common-core/src/main/java/com/aps/common/core/constant/ServiceNameConstants.java
+++ b/aps-common/aps-common-core/src/main/java/com/aps/common/core/constant/ServiceNameConstants.java
@@ -21,4 +21,14 @@
      * 鏂囦欢鏈嶅姟鐨剆erviceid
      */
     public static final String FILE_SERVICE = "aps-file";
+
+    /**
+     * aps鏈嶅姟鐨剆erviceid
+     */
+    public static final String CORE_SERVICE = "aps-core";
+
+    /**
+     * 浠诲姟鏈嶅姟鐨剆erviceid
+     */
+    public static final String JOB_SERVICE = "aps-job";
 }
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java
index 16a850c..065ef6e 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/basicData/ApsBomController.java
@@ -31,7 +31,7 @@
     /**
      * 鏌ヨBOM鏁版嵁绠$悊鍒楄〃
      */
-    @RequiresPermissions("apsBom:list")
+    @RequiresPermissions("Aps:apsBom:list")
     @GetMapping("/list")
     public TableDataInfo list(ApsBom apsBom)
     {
@@ -43,7 +43,7 @@
     /**
      * 瀵煎嚭BOM鏁版嵁绠$悊鍒楄〃
      */
-    @RequiresPermissions("apsBom:export")
+    @RequiresPermissions("Aps:apsBom:export")
     @Log(title = "BOM鏁版嵁绠$悊", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ApsBom apsBom)
@@ -56,7 +56,7 @@
     /**
      * 鑾峰彇BOM鏁版嵁绠$悊璇︾粏淇℃伅
      */
-    @RequiresPermissions("apsBom:query")
+    @RequiresPermissions("Aps:apsBom:query")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -66,7 +66,7 @@
     /**
      * 鏂板BOM鏁版嵁绠$悊
      */
-    @RequiresPermissions("apsBom:add")
+    @RequiresPermissions("Aps:apsBom:add")
     @Log(title = "BOM鏁版嵁绠$悊", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody ApsBom apsBom)
@@ -77,7 +77,7 @@
     /**
      * 淇敼BOM鏁版嵁绠$悊
      */
-    @RequiresPermissions("apsBom:edit")
+    @RequiresPermissions("Aps:apsBom:edit")
     @Log(title = "BOM鏁版嵁绠$悊", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody ApsBom apsBom)
@@ -88,7 +88,7 @@
     /**
      * 鍒犻櫎BOM鏁版嵁绠$悊
      */
-    @RequiresPermissions("apsBom:remove")
+    @RequiresPermissions("Aps:apsBom:remove")
     @Log(title = "BOM鏁版嵁绠$悊", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsBomHeaderController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsBomHeaderController.java
index 0aeb3f6..d26a61c 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsBomHeaderController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsBomHeaderController.java
@@ -1,5 +1,7 @@
 package com.aps.core.controller.mainPlan;
 
+import com.aps.common.core.constant.SecurityConstants;
+import com.aps.common.core.domain.R;
 import com.aps.common.core.utils.poi.ExcelUtil;
 import com.aps.common.core.web.controller.BaseController;
 import com.aps.common.core.web.domain.AjaxResult;
@@ -9,6 +11,7 @@
 import com.aps.common.security.annotation.RequiresPermissions;
 import com.aps.core.domain.ApsBomHeader;
 import com.aps.core.service.IApsBomHeaderService;
+import com.aps.system.api.RemoteJobService;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -30,11 +33,14 @@
     @Autowired
     private IApsBomHeaderService apsBomHeaderService;
 
+    @Autowired
+    private RemoteJobService remoteJobService;
+
     /**
      * 鏌ヨBOM Header 鏁版嵁绠$悊鍒楄〃
      */
 
-    @RequiresPermissions("aps:ApsBomHeader:list")
+    @RequiresPermissions("Aps:ApsBomHeader:list")
     @GetMapping("/list")
     public TableDataInfo list(ApsBomHeader apsBomHeader)
     {
@@ -104,6 +110,26 @@
         return toAjax(apsBomHeaderService.deleteApsBomHeaderByIds(ids));
     }
 
+    /**
+     * 鍒锋柊鍏ㄩ噺BOM鏁版嵁
+     */
+    @RequiresPermissions("Aps:ApsBomHeader:refreshBomData")
+    @PostMapping("/refreshBomData")
+    public void refreshBomData()
+    {
+        R<Boolean> res = remoteJobService.refreshBomData(SecurityConstants.INNER);
+        if (R.isSuccess(res))
+        {
+            apsBomHeaderService.setBomDataToRedis("");
+        }
+    }
+
+    @PostMapping("/setBomDataToRedis")
+    public void setBomDataToRedis()
+    {
+        apsBomHeaderService.setBomDataToRedis("");
+    }
+
     @PostMapping("/test")
     public void test()
     {
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateStandardRequireErrorController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateStandardRequireErrorController.java
index a5e2539..4aae62e 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateStandardRequireErrorController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateStandardRequireErrorController.java
@@ -37,7 +37,7 @@
      */
 
     @Operation(summary = "鏌ヨ閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭垪琛�", description = "鍒嗛〉鏌ヨ")
-    //@RequiresPermissions("ApsPlateStandardRequireError:ApsPlateStandardRequireError:list")
+    @RequiresPermissions("Aps:ApsPlateStandardRequireError:list")
     @GetMapping("/list")
     public TableDataInfo list(ApsPlateStandardRequireError apsPlateStandardRequireError)
     {
@@ -50,7 +50,7 @@
      * 瀵煎嚭閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭垪琛�
      */
     @Operation(summary = "瀵煎嚭閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭垪琛�", description = "瀵煎嚭")
-    //@RequiresPermissions("ApsPlateStandardRequireError:ApsPlateStandardRequireError:export")
+    @RequiresPermissions("Aps:ApsPlateStandardRequireError:export")
     @Log(title = "閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ApsPlateStandardRequireError apsPlateStandardRequireError)
@@ -64,7 +64,7 @@
      * 鑾峰彇閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭缁嗕俊鎭�
      */
     @Operation(summary = "鑾峰彇閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭缁嗕俊鎭�", description = "鏍规嵁id鑾峰彇")
-    //@RequiresPermissions("ApsPlateStandardRequireError:ApsPlateStandardRequireError:query")
+    @RequiresPermissions("Aps:ApsPlateStandardRequireError:query")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -75,7 +75,7 @@
      * 鏂板閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�
      */
     @Operation(summary = "鏂板閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", description = "鍗曚釜鏂板")
-    //@RequiresPermissions("ApsPlateStandardRequireError:ApsPlateStandardRequireError:add")
+    @RequiresPermissions("Aps:ApsPlateStandardRequireError:add")
     @Log(title = "閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody ApsPlateStandardRequireError apsPlateStandardRequireError)
@@ -87,7 +87,7 @@
      * 淇敼閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�
      */
     @Operation(summary = "淇敼閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", description = "鍗曚釜淇敼")
-    //@RequiresPermissions("ApsPlateStandardRequireError:ApsPlateStandardRequireError:edit")
+    @RequiresPermissions("Aps:ApsPlateStandardRequireError:edit")
     @Log(title = "閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody ApsPlateStandardRequireError apsPlateStandardRequireError)
@@ -99,7 +99,7 @@
      * 鍒犻櫎閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�
      */
     @Operation(summary = "鍒犻櫎閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", description = "鎵归噺鍒犻櫎")
-   // @RequiresPermissions("ApsPlateStandardRequireError:ApsPlateStandardRequireError:remove")
+    @RequiresPermissions("Aps:ApsPlateStandardRequireError:remove")
     @Log(title = "閽i噾鏍囧噯闇�姹傚紓甯镐俊鎭�", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteHeaderController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteHeaderController.java
index b48cc01..bfd9b80 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteHeaderController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteHeaderController.java
@@ -34,7 +34,7 @@
      * 鏌ヨ鏍囧噯宸ヨ壓璺嚎Header鍒楄〃
      */
 
-    @RequiresPermissions("aps:ApsStandardProcessRouteHeader:list")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteHeader:list")
     @GetMapping("/list")
     public TableDataInfo list(ApsStandardProcessRouteHeader apsStandardProcessRouteHeader)
     {
@@ -47,7 +47,7 @@
      * 瀵煎嚭鏍囧噯宸ヨ壓璺嚎Header鍒楄〃
      */
 
-    @RequiresPermissions("aps:ApsStandardProcessRouteHeader:export")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteHeader:export")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Header", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ApsStandardProcessRouteHeader apsStandardProcessRouteHeader)
@@ -60,7 +60,7 @@
     /**
      * 鑾峰彇鏍囧噯宸ヨ壓璺嚎Header璇︾粏淇℃伅
      */
-    @RequiresPermissions("aps:ApsStandardProcessRouteHeader:query")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteHeader:query")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -70,7 +70,7 @@
     /**
      * 鏂板鏍囧噯宸ヨ壓璺嚎Header
      */
-    @RequiresPermissions("aps:ApsStandardProcessRouteHeader:add")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteHeader:add")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Header", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody ApsStandardProcessRouteHeader apsStandardProcessRouteHeader)
@@ -81,7 +81,7 @@
     /**
      * 淇敼鏍囧噯宸ヨ壓璺嚎Header
      */
-    @RequiresPermissions("aps:ApsStandardProcessRouteHeader:edit")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteHeader:edit")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Header", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody ApsStandardProcessRouteHeader apsStandardProcessRouteHeader)
@@ -92,7 +92,7 @@
     /**
      * 鍒犻櫎鏍囧噯宸ヨ壓璺嚎Header
      */
-    @RequiresPermissions("aps:ApsStandardProcessRouteHeader:remove")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteHeader:remove")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Header", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteLineController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteLineController.java
index 16abad2..cd8d9a7 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteLineController.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsStandardProcessRouteLineController.java
@@ -33,7 +33,7 @@
     /**
      * 鏌ヨ鏍囧噯宸ヨ壓璺嚎Line鍒楄〃
      */
-    @RequiresPermissions("ApsStandardProcessRouteLine:ApsStandardProcessRouteLine:list")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteLine:list")
     @GetMapping("/list")
     public TableDataInfo list(ApsStandardProcessRouteLine apsStandardProcessRouteLine)
     {
@@ -45,7 +45,7 @@
     /**
      * 瀵煎嚭鏍囧噯宸ヨ壓璺嚎Line鍒楄〃
      */
-    @RequiresPermissions("ApsStandardProcessRouteLine:ApsStandardProcessRouteLine:export")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteLine:export")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Line", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ApsStandardProcessRouteLine apsStandardProcessRouteLine)
@@ -58,7 +58,7 @@
     /**
      * 鑾峰彇鏍囧噯宸ヨ壓璺嚎Line璇︾粏淇℃伅
      */
-    @RequiresPermissions("ApsStandardProcessRouteLine:ApsStandardProcessRouteLine:query")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteLine:query")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -68,7 +68,7 @@
     /**
      * 鏂板鏍囧噯宸ヨ壓璺嚎Line
      */
-    @RequiresPermissions("ApsStandardProcessRouteLine:ApsStandardProcessRouteLine:add")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteLine:add")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Line", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody ApsStandardProcessRouteLine apsStandardProcessRouteLine)
@@ -79,7 +79,7 @@
     /**
      * 淇敼鏍囧噯宸ヨ壓璺嚎Line
      */
-    @RequiresPermissions("ApsStandardProcessRouteLine:ApsStandardProcessRouteLine:edit")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteLine:edit")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Line", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody ApsStandardProcessRouteLine apsStandardProcessRouteLine)
@@ -90,7 +90,7 @@
     /**
      * 鍒犻櫎鏍囧噯宸ヨ壓璺嚎Line
      */
-    @RequiresPermissions("ApsStandardProcessRouteLine:ApsStandardProcessRouteLine:remove")
+    @RequiresPermissions("Aps:ApsStandardProcessRouteLine:remove")
     @Log(title = "鏍囧噯宸ヨ壓璺嚎Line", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanDate.java b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanDate.java
index 5908bd2..8ea0b85 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanDate.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanDate.java
@@ -1,5 +1,7 @@
 package com.aps.core.domain;
 
+import com.aps.common.core.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serial;
@@ -13,7 +15,7 @@
  * &#064;date  2025-05-08
  */
 @Data
-public class ApsPlateOrderPlanDate
+public class ApsPlateOrderPlanDate extends BaseEntity
 {
     @Serial
     private static final long serialVersionUID = 1L;
@@ -27,5 +29,6 @@
     private List<Long> planIds;
 
     /** 鑷畾涔夋棩鏈� */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Timestamp customDate;
 }
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanManager.java b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanManager.java
index 5bcac8f..e43b215 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanManager.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateOrderPlanManager.java
@@ -102,7 +102,7 @@
     private Date completeDate;
 
     /** 鑷畾涔夋棩鏈� */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "鑷畾涔夋棩鏈�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    private Date customTime;
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @Excel(name = "鑷畾涔夋棩鏈�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+//    private Date customTime;
 }
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlatePlan.java b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlatePlan.java
index d56b49c..087713f 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlatePlan.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlatePlan.java
@@ -190,9 +190,9 @@
     private Date orderCreateTime;
 
     /** 鑷畾涔夋椂闂� */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "鑷畾涔夋椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    private Date customTime;
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @Excel(name = "鑷畾涔夋椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+//    private Date customTime;
 
     /** 鐢熶骇鍩哄湴 */
     @Excel(name = "鐢熶骇鍩哄湴")
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateStandardRequire.java b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateStandardRequire.java
index f1b80b9..510df6b 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateStandardRequire.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateStandardRequire.java
@@ -66,14 +66,17 @@
     private BigDecimal netRequirement;
 
     /** 璁″垝寮�宸ユ棩 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "璁″垝寮�宸ユ棩")
     private Date startDate;
 
     /** 璁″垝瀹屽伐鏃� */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "璁″垝瀹屽伐鏃�")
     private Date completeDate;
 
     /** 闇�姹傛棩鏈� */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "闇�姹傛棩鏈�")
     private Date demandDate;
 
@@ -101,6 +104,7 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "寤鸿瀹屾垚鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date suggestedCompletionDate;
+
     /** 寤惰繜椋庨櫓鏍囪瘑 */
     private String hasDelayRisk;
 
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateOrderPlanManagerServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateOrderPlanManagerServiceImpl.java
index fde2037..48c0241 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateOrderPlanManagerServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateOrderPlanManagerServiceImpl.java
@@ -59,6 +59,7 @@
     @Override
     public void updatePlanDate(ApsPlateOrderPlanDate apsPlateOrderPlanDate) {
         if (apsPlateOrderPlanDate.getIsCustom()) {
+            apsPlateOrderPlanDate.setUpdateBy(SecurityUtils.getUsername());
             apsPlateOrderPlanManagerMapper.updatePlanDateByCustom(apsPlateOrderPlanDate);
         } else {
             List<ApsPlateOrderPlanRequireDate> planRequireDates = apsPlateOrderPlanManagerMapper.selectPlanRequireIds(apsPlateOrderPlanDate.getPlanIds());
diff --git a/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanOrderManagerMapper.xml b/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanOrderManagerMapper.xml
index be61a98..b4358df 100644
--- a/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanOrderManagerMapper.xml
+++ b/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanOrderManagerMapper.xml
@@ -23,7 +23,7 @@
         <result property="hasDelayRisk"    column="has_delay_risk"    />
         <result property="startDate"    column="start_date"    />
         <result property="completeDate"    column="complete_date"    />
-        <result property="customTime"    column="custom_time"    />
+<!--        <result property="customTime"    column="custom_time"    />-->
     </resultMap>
 
     <select id="selectApsPlanOrderManager" parameterType="ApsPlateOrderPlanManager" resultMap="ApsPlateOrderPlanManagerResult">
@@ -42,7 +42,6 @@
             plan.plan_start_day,
             plan.plan_end_day,
             plan.unmatched_quantity,
-            plan.custom_time,
             require.has_delay_risk,
             plan.id,
             require.start_date,
@@ -52,7 +51,7 @@
             left join aps_plate_plan plan on detail.doc_no = plan.document_number
         <where>  
             <if test="workOrderNo != null  and workOrderNo != ''"> and detail.doc_no = #{workOrderNo}</if>
-            <if test="requireId != null  and requireId != ''"> and detail.require_id = #{requireId}</if>
+            <if test="requireTrackId != null  and requireTrackId != ''"> and detail.require_track_id = #{requireTrackId}</if>
             <if test="mainPartNumber != null  and mainPartNumber != ''"> and plan.main_part_number = #{mainPartNumber}</if>
             <if test="hasDelayRisk != null  and hasDelayRisk != ''"> and require.has_delay_risk = #{hasDelayRisk}</if>
         </where>
@@ -159,11 +158,11 @@
 
     <update id="updatePlanDateByCustom" parameterType="ApsPlateOrderPlanDate">
         update aps_plate_plan set
-          custom_time = #{planRequireDate.customDate},
-          update_by = #{planRequireDate.updateBy},
+          plan_end_day = #{customDate},
+          update_by = #{updateBy},
           update_time = now()
         where id in
-        <foreach collection="planRequireDate.planIds" item="id" open="(" separator="," close=")">
+        <foreach collection="planIds" item="id" open="(" separator="," close=")">
             #{id}
         </foreach>
     </update>
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/controller/SysJobController.java b/aps-modules/aps-job/src/main/java/com/aps/job/controller/SysJobController.java
index 5616aa4..46c1747 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/controller/SysJobController.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/controller/SysJobController.java
@@ -1,32 +1,35 @@
 package com.aps.job.controller;
 
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import org.quartz.SchedulerException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.aps.common.core.constant.Constants;
+import com.aps.common.core.constant.SecurityConstants;
 import com.aps.common.core.exception.job.TaskException;
 import com.aps.common.core.utils.StringUtils;
 import com.aps.common.core.utils.poi.ExcelUtil;
+import com.aps.common.core.utils.uuid.Sequence;
 import com.aps.common.core.web.controller.BaseController;
 import com.aps.common.core.web.domain.AjaxResult;
 import com.aps.common.core.web.page.TableDataInfo;
 import com.aps.common.log.annotation.Log;
 import com.aps.common.log.enums.BusinessType;
-import com.aps.common.security.annotation.RequiresPermissions;
 import com.aps.common.security.utils.SecurityUtils;
 import com.aps.job.domain.SysJob;
-import com.aps.job.service.ISysJobService;
+import com.aps.job.service.*;
 import com.aps.job.util.CronUtils;
 import com.aps.job.util.ScheduleUtils;
+import com.aps.system.api.RemoteCoreService;
+import jakarta.servlet.http.HttpServletResponse;
+import org.quartz.SchedulerException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
 
 /**
  * 璋冨害浠诲姟淇℃伅鎿嶄綔澶勭悊
@@ -40,6 +43,23 @@
     @Autowired
     private ISysJobService jobService;
 
+    @Autowired
+    private IApsWorkOrderProcessService apsWorkOrderProcessService;
+
+    @Autowired
+    private IApsWorkOrderJobService apsWorkOrderJobService;
+
+    @Autowired
+    private IApsBomHeaderJobService apsBomHeaderJobService;
+
+    @Autowired
+    private Sequence sequence;
+
+    @Autowired
+    private IApsMaterialStorageManagementJobService apsMaterialStorageManagementJobService;
+
+    @Autowired
+    private RemoteCoreService remoteCoreService;
     /**
      * 鏌ヨ瀹氭椂浠诲姟鍒楄〃
      */
@@ -183,4 +203,112 @@
         jobService.deleteJobByIds(jobIds);
         return success();
     }
+
+    @PostMapping("/refreshBomData")
+    public Boolean refreshBomData() throws SchedulerException, TaskException
+    {
+        return apsBomHeaderJobService.syncBomDataJob(1, 1000, "", "");
+    }
+
+    @PutMapping("/test")
+    public void test(@RequestBody SysJob job) throws Exception
+    {
+        System.out.println("start");
+        //灏咮OM鏁版嵁瀛樿繘Redis涓�
+        remoteCoreService.setBomDataToRedis(SecurityConstants.INNER);
+        //鍚屾鐗╂枡搴撳瓨鏁版嵁
+//        apsMaterialStorageManagementJobService.syncApsMaterialStorageData(1, 1000, "", "");
+        //鍚屾BOM鏁版嵁
+//        apsBomHeaderJobService.syncBomData(1, 1000,  "FORTUNA", "");
+
+//        System.out.println(sequence.nextId());
+//        List<String> docNos = new ArrayList<>();
+//        docNos.add("MO-240328010093");
+//        apsWorkOrderProcessService.getWorkOrderProcessFromU9(docNos);
+//        apsWorkOrderProcessService.syncWorkOrderProcessData("", 100);
+//        apsWorkOrderJobService.syncPartOrderData();
+//        apsWorkOrderJobService.syncPlateOrderData();
+//        apsWorkOrderJobService.syncGasPipingData();
+//        apsWorkOrderProcessService.syncProcessRouteData();
+        System.out.println("end");
+        //鐢熸垚鏁版嵁瀛楀吀
+//        HikariConfig hikariConfig = new HikariConfig();
+//        hikariConfig.setDriverClassName("org.postgresql.Driver");
+//        hikariConfig.setJdbcUrl("jdbc:postgresql://192.168.50.160:5432/postgres?stringtype=unspecified");
+//        hikariConfig.setUsername("postgres");
+//        hikariConfig.setPassword("pwd@aps");
+//        //璁剧疆鍙互鑾峰彇tables remarks淇℃伅
+//        hikariConfig.addDataSourceProperty("useInformationSchema", "true");
+//        hikariConfig.setMinimumIdle(2);
+//        hikariConfig.setMaximumPoolSize(5);
+//        DataSource dataSource = new HikariDataSource(hikariConfig);
+//        //鐢熸垚閰嶇疆
+//        EngineConfig engineConfig = EngineConfig.builder()
+//                //鐢熸垚鏂囦欢璺緞
+//                .fileOutputDir("D:\\projects\\aps\\鏂囨。")
+//                //鎵撳紑鐩綍
+//                .openOutputDir(true)
+//                //鏂囦欢绫诲瀷
+//                .fileType(EngineFileType.WORD)
+//                //鐢熸垚妯℃澘瀹炵幇
+//                .produceType(EngineTemplateType.freemarker)
+//                //鑷畾涔夋枃浠跺悕绉�
+//                .fileName("鑷畾涔夋枃浠跺悕绉�").build();
+//
+//        //蹇界暐琛�
+//        ArrayList<String> ignoreTableName = new ArrayList<>();
+//        ignoreTableName.add("test_user");
+//        ignoreTableName.add("test_group");
+//        //蹇界暐琛ㄥ墠缂�
+//        ArrayList<String> ignorePrefix = new ArrayList<>();
+//        ignorePrefix.add("test_");
+//        //蹇界暐琛ㄥ悗缂�
+//        ArrayList<String> ignoreSuffix = new ArrayList<>();
+//        ignoreSuffix.add("_test");
+//        ProcessConfig processConfig = ProcessConfig.builder()
+//                //鎸囧畾鐢熸垚閫昏緫銆佸綋瀛樺湪鎸囧畾琛ㄣ�佹寚瀹氳〃鍓嶇紑銆佹寚瀹氳〃鍚庣紑鏃讹紝灏嗙敓鎴愭寚瀹氳〃锛屽叾浣欒〃涓嶇敓鎴愩�佸苟璺宠繃蹇界暐琛ㄩ厤缃�
+//                //鏍规嵁鍚嶇О鎸囧畾琛ㄧ敓鎴�
+//                .designatedTableName(new ArrayList<>())
+//                //鏍规嵁琛ㄥ墠缂�鐢熸垚
+//                .designatedTablePrefix(new ArrayList<>())
+//                //鏍规嵁琛ㄥ悗缂�鐢熸垚
+//                .designatedTableSuffix(new ArrayList<>())
+//                //蹇界暐琛ㄥ悕
+//                .ignoreTableName(ignoreTableName)
+//                //蹇界暐琛ㄥ墠缂�
+//                .ignoreTablePrefix(ignorePrefix)
+//                //蹇界暐琛ㄥ悗缂�
+//                .ignoreTableSuffix(ignoreSuffix).build();
+//        //閰嶇疆
+//        Configuration config = Configuration.builder()
+//                //鐗堟湰
+//                .version("1.0.0")
+//                //鎻忚堪
+//                .description("鏁版嵁搴撹璁℃枃妗g敓鎴�")
+//                //鏁版嵁婧�
+//                .dataSource(dataSource)
+//                //鐢熸垚閰嶇疆
+//                .engineConfig(engineConfig)
+//                //鐢熸垚閰嶇疆
+//                .produceConfig(processConfig)
+//                .build();
+//        //鎵ц鐢熸垚
+//        new DocumentationExecute(config).execute();
+//        System.out.println("end");
+    }
+
+    public static void main(String[] args) {
+        BigDecimal a = new BigDecimal("0.1234");
+        Double b = a.doubleValue()*60*60*1000;
+        LocalDateTime now = LocalDateTime.now();
+        //灏唍ow鎹㈡垚鎴愭绉� 鐒跺悗鍔犱笂a 鐒跺悗杞崲鎴怢ocalDateTime
+        //a杞崲鎴愭绉�
+        System.out.println(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        System.out.println(b/1000/60);
+        Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
+        milliSecond += b.longValue();
+        System.out.println(LocalDateTime.ofInstant(Instant.ofEpochMilli(milliSecond), ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        System.out.println(new BigDecimal(585).divide(BigDecimal.valueOf(1232), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)));
+        new BigDecimal(585).divide(BigDecimal.valueOf(1232), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
+    }
 }
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsMaterialStorageManagementJob.java b/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsMaterialStorageManagementJob.java
new file mode 100644
index 0000000..5d1a72c
--- /dev/null
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsMaterialStorageManagementJob.java
@@ -0,0 +1,162 @@
+package com.aps.job.domain;
+
+import com.aps.common.core.annotation.Excel;
+import com.aps.common.core.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鐗╂枡搴撳瓨绠$悊瀵硅薄 aps_material_storage_management_job
+ * 
+ * @author hjy
+ * @date 2025-05-08
+ */
+@Schema(description = "鐗╂枡搴撳瓨绠$悊瀹炰綋绫�")
+public class ApsMaterialStorageManagementJob extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @Schema(description = "id")
+    private Long id;
+
+    /** 鏂欏彿 */
+    @Excel(name = "鏂欏彿")
+    @Schema(description = "鏂欏彿")
+    private String itemNumber;
+
+    /** 鏁伴噺 */
+    @Excel(name = "鏁伴噺")
+    @Schema(description = "鏁伴噺")
+    private BigDecimal num;
+
+    /** 閫傜敤宸ュ巶 */
+    @Excel(name = "閫傜敤宸ュ巶")
+    @Schema(description = "閫傜敤宸ュ巶")
+    private String applicableFactories;
+
+    /** 闆嗘垚鏃ユ湡 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "闆嗘垚鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @Schema(description = "闆嗘垚鏃ユ湡")
+    private Date integrationDate;
+
+    /** 鍒锋柊鏃ユ湡 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍒锋柊鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @Schema(description = "鍒锋柊鏃ユ湡")
+    private Date refreshDate;
+
+    /** 鍓╀綑搴撳瓨 */
+    @Excel(name = "鍓╀綑搴撳瓨")
+    @Schema(description = "鍓╀綑搴撳瓨")
+    private BigDecimal remainderStock;
+
+    /** 淇敼鐗堟湰 */
+    @Excel(name = "淇敼鐗堟湰")
+    @Schema(description = "淇敼鐗堟湰")
+    private Double version;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setItemNumber(String itemNumber) 
+    {
+        this.itemNumber = itemNumber;
+    }
+
+    public String getItemNumber() 
+    {
+        return itemNumber;
+    }
+
+    public void setNum(BigDecimal num) 
+    {
+        this.num = num;
+    }
+
+    public BigDecimal getNum() 
+    {
+        return num;
+    }
+
+    public void setApplicableFactories(String applicableFactories) 
+    {
+        this.applicableFactories = applicableFactories;
+    }
+
+    public String getApplicableFactories() 
+    {
+        return applicableFactories;
+    }
+
+    public void setIntegrationDate(Date integrationDate) 
+    {
+        this.integrationDate = integrationDate;
+    }
+
+    public Date getIntegrationDate() 
+    {
+        return integrationDate;
+    }
+
+    public void setRefreshDate(Date refreshDate) 
+    {
+        this.refreshDate = refreshDate;
+    }
+
+    public Date getRefreshDate() 
+    {
+        return refreshDate;
+    }
+
+    public void setRemainderStock(BigDecimal remainderStock) 
+    {
+        this.remainderStock = remainderStock;
+    }
+
+    public BigDecimal getRemainderStock() 
+    {
+        return remainderStock;
+    }
+
+    public void setVersion(Double version) 
+    {
+        this.version = version;
+    }
+
+    public Double getVersion() 
+    {
+        return version;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("itemNumber", getItemNumber())
+            .append("num", getNum())
+            .append("applicableFactories", getApplicableFactories())
+            .append("integrationDate", getIntegrationDate())
+            .append("refreshDate", getRefreshDate())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remainderStock", getRemainderStock())
+            .append("version", getVersion())
+            .toString();
+    }
+}
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsWorkOrderJob.java b/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsWorkOrderJob.java
index 09322b3..1387e3a 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsWorkOrderJob.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/domain/ApsWorkOrderJob.java
@@ -141,16 +141,44 @@
     @Excel(name = "涓嬩竴宸ュ簭鍚嶇О")
     private String nextOpName;
 
-    /**
-     * 浣庨樁鐮�
-     */
+    /** 浣庨樁鐮� */
+    @JsonProperty("LowLevelCode")
     private String lowOrderCode;
 
     /** 宸ュ崟鍒涘缓鏃堕棿 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "宸ュ崟鍒涘缓鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonProperty("CreatedOn")
     private Date orderCreateTime;
 
+    /** 宸ュ崟瀹℃牳鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "宸ュ崟瀹℃牳鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonProperty("ApproveOn")
+    private Date approveOn;
+
+    /** 宸ュ崟寮�宸ユ椂闂� */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "宸ュ崟寮�宸ユ椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @JsonProperty("StartDatetime")
+    private Date startWorkDate;
+
+    public Date getApproveOn() {
+        return approveOn;
+    }
+
+    public void setApproveOn(Date approveOn) {
+        this.approveOn = approveOn;
+    }
+
+    public Date getStartWorkDate() {
+        return startWorkDate;
+    }
+
+    public void setStartWorkDate(Date startWorkDate) {
+        this.startWorkDate = startWorkDate;
+    }
+
     public String getLowOrderCode() {
         return lowOrderCode;
     }
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomHeaderJobMapper.java b/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomHeaderJobMapper.java
index 5854349..e2302d9 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomHeaderJobMapper.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomHeaderJobMapper.java
@@ -79,4 +79,9 @@
      * @return
      */
     public void deleteApsBomHeader();
+
+    /**
+     * 鍒犻櫎涓棿琛˙OM Header鏁版嵁
+     */
+    public void deleteApsBomHeaderJob();
 }
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomLineJobMapper.java b/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomLineJobMapper.java
index 3d2385d..6990931 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomLineJobMapper.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsBomLineJobMapper.java
@@ -79,4 +79,9 @@
      */
     public void deleteApsBomLine() ;
 
+    /**
+     * 鍒犻櫎涓棿琛˙OM Line鏁版嵁
+     */
+    public void deleteApsBomLineJob() ;
+
 }
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsMaterialStorageManagementJobMapper.java b/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsMaterialStorageManagementJobMapper.java
new file mode 100644
index 0000000..c701221
--- /dev/null
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/mapper/ApsMaterialStorageManagementJobMapper.java
@@ -0,0 +1,88 @@
+package com.aps.job.mapper;
+
+import com.aps.job.domain.ApsMaterialStorageManagementJob;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 鐗╂枡搴撳瓨绠$悊Mapper鎺ュ彛
+ * 
+ * @author hjy
+ * @date 2025-05-08
+ */
+public interface ApsMaterialStorageManagementJobMapper 
+{
+    /**
+     * 鏌ヨ鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param id 鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 鐗╂枡搴撳瓨绠$悊
+     */
+    public ApsMaterialStorageManagementJob selectApsMaterialStorageManagementJobById(Long id);
+
+    /**
+     * 鏌ヨ鐗╂枡搴撳瓨绠$悊鍒楄〃
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 鐗╂枡搴撳瓨绠$悊闆嗗悎
+     */
+    public List<ApsMaterialStorageManagementJob> selectApsMaterialStorageManagementJobList(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob);
+
+    /**
+     * 鏂板鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 缁撴灉
+     */
+    public int insertApsMaterialStorageManagementJob(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob);
+
+    /**
+     * 淇敼鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 缁撴灉
+     */
+    public int updateApsMaterialStorageManagementJob(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob);
+
+    /**
+     * 鍒犻櫎鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param id 鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteApsMaterialStorageManagementJobById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteApsMaterialStorageManagementJobByIds(Long[] ids);
+
+    /**
+     * 鎵归噺鎻掑叆鐗╂枡搴撳瓨鏁版嵁
+     * @param list
+     * @return
+     */
+    public int insertApsMaterialStorageBatch(@Param("list") List<ApsMaterialStorageManagementJob> list);
+
+    /**
+     * 鎵归噺鎻掑叆鐗╂枡搴撳瓨鏁版嵁鍒颁笟鍔¤〃
+     * @return
+     */
+    public void insertIntoApsMaterialStorage();
+
+    /**
+     * 鍒犻櫎鐗╂枡搴撳瓨鏁版嵁
+     * @return
+     */
+    public void deleteApsMaterialStorage();
+
+    /**
+     * 鍒犻櫎涓棿琛ㄧ墿鏂欏簱瀛樻暟鎹�
+     */
+    public void deleteApsMaterialStorageJob();
+
+}
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsBomHeaderJobService.java b/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsBomHeaderJobService.java
index 2804618..47385d5 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsBomHeaderJobService.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsBomHeaderJobService.java
@@ -65,4 +65,16 @@
      * @return
      */
     public boolean syncBomData(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList);
+
+    /**
+     * 鍚屾bom鏁版嵁瀹氭椂浠诲姟
+     * @param pageIndex
+     * @param pageSize
+     * @param orgCode
+     * @param itemCodeList
+     * @return
+     */
+    public boolean syncBomDataJob(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList);
+
+
 }
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsMaterialStorageManagementJobService.java b/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsMaterialStorageManagementJobService.java
new file mode 100644
index 0000000..332a35f
--- /dev/null
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/service/IApsMaterialStorageManagementJobService.java
@@ -0,0 +1,82 @@
+package com.aps.job.service;
+
+import com.aps.job.domain.ApsMaterialStorageManagementJob;
+
+import java.util.List;
+
+/**
+ * 鐗╂枡搴撳瓨绠$悊Service鎺ュ彛
+ * 
+ * @author hjy
+ * @date 2025-05-08
+ */
+public interface IApsMaterialStorageManagementJobService 
+{
+    /**
+     * 鏌ヨ鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param id 鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 鐗╂枡搴撳瓨绠$悊
+     */
+    public ApsMaterialStorageManagementJob selectApsMaterialStorageManagementJobById(Long id);
+
+    /**
+     * 鏌ヨ鐗╂枡搴撳瓨绠$悊鍒楄〃
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 鐗╂枡搴撳瓨绠$悊闆嗗悎
+     */
+    public List<ApsMaterialStorageManagementJob> selectApsMaterialStorageManagementJobList(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob);
+
+    /**
+     * 鏂板鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 缁撴灉
+     */
+    public int insertApsMaterialStorageManagementJob(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob);
+
+    /**
+     * 淇敼鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 缁撴灉
+     */
+    public int updateApsMaterialStorageManagementJob(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob);
+
+    /**
+     * 鎵归噺鍒犻櫎鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐗╂枡搴撳瓨绠$悊涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteApsMaterialStorageManagementJobByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎鐗╂枡搴撳瓨绠$悊淇℃伅
+     * 
+     * @param id 鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteApsMaterialStorageManagementJobById(Long id);
+
+    /**
+     * 鍚屾鐗╂枡搴撳瓨鏁版嵁
+     * @param pageIndex
+     * @param pageSize
+     * @param orgCode
+     * @param itemCodeList
+     * @return
+     */
+    public boolean syncApsMaterialStorageData(int pageIndex, int pageSize, String orgCode, String itemCodeList);
+
+    /**
+     * 鍚屾鍏ㄩ噺鐗╂枡搴撳瓨鏁版嵁瀹氭椂浠诲姟
+     * @param pageIndex
+     * @param pageSize
+     * @param orgCode
+     * @param itemCodeList
+     * @return
+     */
+    public boolean syncApsMaterialStorageDataJob(int pageIndex, int pageSize, String orgCode, String itemCodeList);
+}
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsBomHeaderJobServiceImpl.java b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsBomHeaderJobServiceImpl.java
index 3a1fa14..c307d96 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsBomHeaderJobServiceImpl.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsBomHeaderJobServiceImpl.java
@@ -19,6 +19,7 @@
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
 
 import java.util.ArrayList;
@@ -39,9 +40,6 @@
     @Autowired
     private ApsBomLineJobMapper apsBomLineJobMapper;
 
-    /**
-     * 鑾峰彇璁㈠崟鎺ュ彛
-     * */
     @Value("${u9.bomJobUrl}")
     private String getBomUrl;
 
@@ -223,4 +221,33 @@
         }
         return true;
     }
+
+    /**
+     * 鍏ㄩ噺鍚屾BOM鏁版嵁瀹氭椂浠诲姟
+     * @param pageIndex
+     * @param pageSize
+     * @param orgCode
+     * @param itemCodeList
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean syncBomDataJob(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList){
+        try {
+            apsBomHeaderJobMapper.deleteApsBomHeaderJob();
+            apsBomLineJobMapper.deleteApsBomLineJob();
+            boolean res = syncBomData(pageIndex, pageSize, orgCode, itemCodeList);
+            if(!res){
+                return false;
+            }
+            apsBomHeaderJobMapper.deleteApsBomHeader();
+            apsBomLineJobMapper.deleteApsBomLine();
+            apsBomHeaderJobMapper.insertIntoApsBomHeader();
+            apsBomLineJobMapper.insertIntoApsBomLine();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
 }
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsMaterialStorageManagementJobServiceImpl.java b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsMaterialStorageManagementJobServiceImpl.java
new file mode 100644
index 0000000..7126cfb
--- /dev/null
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsMaterialStorageManagementJobServiceImpl.java
@@ -0,0 +1,221 @@
+package com.aps.job.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aps.common.core.utils.DateUtils;
+import com.aps.common.core.utils.StringUtils;
+import com.aps.job.domain.ApsMaterialStorageManagementJob;
+import com.aps.job.domain.ApsWorkOrderJobLog;
+import com.aps.job.mapper.ApsMaterialStorageManagementJobMapper;
+import com.aps.job.mapper.ApsWorkOrderJobLogMapper;
+import com.aps.job.service.IApsMaterialStorageManagementJobService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鐗╂枡搴撳瓨绠$悊Service涓氬姟灞傚鐞�
+ * 
+ * @author hjy
+ * @date 2025-05-08
+ */
+@Service
+public class ApsMaterialStorageManagementJobServiceImpl implements IApsMaterialStorageManagementJobService 
+{
+    @Autowired
+    private ApsMaterialStorageManagementJobMapper apsMaterialStorageManagementJobMapper;
+
+    @Value("${u9.materialStorageUrl}")
+    private String getMaterialStorageUrl;
+
+    @Autowired
+    private ApsWorkOrderJobLogMapper jobLogMapper;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    /**
+     * 鏌ヨ鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param id 鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 鐗╂枡搴撳瓨绠$悊
+     */
+    @Override
+    public ApsMaterialStorageManagementJob selectApsMaterialStorageManagementJobById(Long id)
+    {
+        return apsMaterialStorageManagementJobMapper.selectApsMaterialStorageManagementJobById(id);
+    }
+
+    /**
+     * 鏌ヨ鐗╂枡搴撳瓨绠$悊鍒楄〃
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 鐗╂枡搴撳瓨绠$悊
+     */
+    @Override
+    public List<ApsMaterialStorageManagementJob> selectApsMaterialStorageManagementJobList(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob)
+    {
+        return apsMaterialStorageManagementJobMapper.selectApsMaterialStorageManagementJobList(apsMaterialStorageManagementJob);
+    }
+
+    /**
+     * 鏂板鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertApsMaterialStorageManagementJob(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob)
+    {
+        apsMaterialStorageManagementJob.setCreateTime(DateUtils.getNowDate());
+        return apsMaterialStorageManagementJobMapper.insertApsMaterialStorageManagementJob(apsMaterialStorageManagementJob);
+    }
+
+    /**
+     * 淇敼鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param apsMaterialStorageManagementJob 鐗╂枡搴撳瓨绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateApsMaterialStorageManagementJob(ApsMaterialStorageManagementJob apsMaterialStorageManagementJob)
+    {
+        apsMaterialStorageManagementJob.setUpdateTime(DateUtils.getNowDate());
+        return apsMaterialStorageManagementJobMapper.updateApsMaterialStorageManagementJob(apsMaterialStorageManagementJob);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐗╂枡搴撳瓨绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteApsMaterialStorageManagementJobByIds(Long[] ids)
+    {
+        return apsMaterialStorageManagementJobMapper.deleteApsMaterialStorageManagementJobByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鐗╂枡搴撳瓨绠$悊淇℃伅
+     * 
+     * @param id 鐗╂枡搴撳瓨绠$悊涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteApsMaterialStorageManagementJobById(Long id)
+    {
+        return apsMaterialStorageManagementJobMapper.deleteApsMaterialStorageManagementJobById(id);
+    }
+
+    @Override
+    public boolean syncApsMaterialStorageData(int pageIndex, int pageSize, String orgCode, String itemCodeList) {
+        JSONObject requestBody = new JSONObject();
+        ResponseEntity<String> response = null;
+        ApsWorkOrderJobLog jobLog = new ApsWorkOrderJobLog();
+        try {
+            // 璁剧疆璇锋眰澶�
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            // 璁剧疆璇锋眰浣�
+            while (true) {
+                jobLog = new ApsWorkOrderJobLog();
+                requestBody = new JSONObject();
+                requestBody.put("PageIndex", pageIndex);
+                requestBody.put("PageSize", pageSize);
+                if(!StringUtils.isEmpty(orgCode)){
+                    requestBody.put("OrgCode", orgCode);
+                }
+                // 鍒涘缓HttpEntity瀵硅薄
+                HttpEntity<String> request = new HttpEntity<>(requestBody.toJSONString(), headers);
+                // 鍙戦�丳OST璇锋眰
+                response = restTemplate.postForEntity(getMaterialStorageUrl, request, String.class);
+                JSONObject responseBodyJson = JSONObject.parseObject(response.getBody());
+                if (response.getStatusCode().is2xxSuccessful() && "200".equals(responseBodyJson.getString("status"))) {
+                    JSONArray jsonArray = responseBodyJson.getJSONArray("data");
+                    if (!jsonArray.isEmpty()) {
+                        List<ApsMaterialStorageManagementJob> storageList = new ArrayList<>();
+                        for (Object o : jsonArray) {
+                            JSONObject storage = (JSONObject) o;
+                            ApsMaterialStorageManagementJob materialStorage = new ApsMaterialStorageManagementJob();
+                            materialStorage.setId(IdUtil.getSnowflakeNextId());
+                            materialStorage.setItemNumber(storage.getString("ItemCode"));
+                            materialStorage.setNum(storage.getBigDecimal("StoreQty"));
+                            materialStorage.setApplicableFactories(storage.getString("OrgCode"));
+                            storageList.add(materialStorage);
+                        }
+                        List<ApsMaterialStorageManagementJob> temp = new ArrayList<>();
+                        for(int i=0;i<storageList.size();i++){
+                            temp.add(storageList.get(i));
+                            if(temp.size()>=20){
+                                apsMaterialStorageManagementJobMapper.insertApsMaterialStorageBatch(temp);
+                                temp = new ArrayList<>();
+                            }
+                        }
+                        jobLog.setRequestData(requestBody.toJSONString());
+                        jobLog.setPageNum(Long.valueOf(pageIndex));
+                        jobLog.setPageCount(Long.valueOf(pageSize));
+                        jobLog.setCreateTime(DateUtils.getNowDate());
+                        jobLog.setBizType("storage");
+                        jobLog.setResult("storage:"+storageList.size());
+                        jobLogMapper.insertApsWorkOrderJobLog(jobLog);
+                        pageIndex++;
+                    }else{
+                        break;
+                    }
+                }else{
+                    jobLog.setRequestData(requestBody.toJSONString());
+                    jobLog.setResponseData(response.getBody());
+                    jobLog.setPageNum(Long.valueOf(pageIndex));
+                    jobLog.setPageCount(Long.valueOf(pageSize));
+                    jobLog.setCreateTime(DateUtils.getNowDate());
+                    jobLog.setBizType("storage");
+                    jobLog.setResult("error");
+                    jobLogMapper.insertApsWorkOrderJobLog(jobLog);
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            jobLog.setRequestData(requestBody.toJSONString());
+            jobLog.setResponseData(response.getBody());
+            jobLog.setPageNum(Long.valueOf(pageIndex));
+            jobLog.setPageCount(Long.valueOf(pageSize));
+            jobLog.setCreateTime(DateUtils.getNowDate());
+            jobLog.setBizType("storage");
+            jobLog.setResult("error");
+            jobLogMapper.insertApsWorkOrderJobLog(jobLog);
+            return false;
+        }
+        return true;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean syncApsMaterialStorageDataJob(int pageIndex, int pageSize, String orgCode, String itemCodeList) {
+        try {
+            apsMaterialStorageManagementJobMapper.deleteApsMaterialStorageJob();
+            boolean res = syncApsMaterialStorageData(pageIndex, pageSize, orgCode, itemCodeList);
+            if(!res){
+                return false;
+            }
+            apsMaterialStorageManagementJobMapper.deleteApsMaterialStorage();
+            apsMaterialStorageManagementJobMapper.insertIntoApsMaterialStorage();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+}
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/task/RyTask.java b/aps-modules/aps-job/src/main/java/com/aps/job/task/RyTask.java
index c48844c..837a54d 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/task/RyTask.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/task/RyTask.java
@@ -1,9 +1,13 @@
 package com.aps.job.task;
 
+import com.aps.common.core.constant.SecurityConstants;
 import com.aps.common.core.utils.StringUtils;
 import com.aps.job.param.ApsWorkOrderJobParam;
+import com.aps.job.service.IApsBomHeaderJobService;
+import com.aps.job.service.IApsMaterialStorageManagementJobService;
 import com.aps.job.service.IApsWorkOrderJobService;
 import com.aps.job.service.IApsWorkOrderProcessService;
+import com.aps.system.api.RemoteCoreService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -26,6 +30,15 @@
 
     @Autowired
     private IApsWorkOrderJobService iApsWorkOrderJobService;
+
+    @Autowired
+    private IApsBomHeaderJobService iApsBomHeaderJobService;
+
+    @Autowired
+    private RemoteCoreService remoteCoreService;
+
+    @Autowired
+    private IApsMaterialStorageManagementJobService apsMaterialStorageManagementJobService;
 
     public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
     {
@@ -133,4 +146,23 @@
         iApsWorkOrderJobService.syncGasPipingData();
         iApsWorkOrderProcessService.syncProcessRouteData();
     }
+
+    /**
+     * 鍚屾鍏ㄩ噺BOM鏁版嵁瀹氭椂浠诲姟
+     */
+    public void syncBomDataJob(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList)
+    {
+        boolean res =  iApsBomHeaderJobService.syncBomDataJob(pageIndex, pageSize, orgCode, itemCodeList);
+        if(res){
+            remoteCoreService.setBomDataToRedis(SecurityConstants.INNER);
+        }
+    }
+
+    /**
+     * 鍚屾鍏ㄩ噺搴撳瓨鏁版嵁瀹氭椂浠诲姟
+     */
+    public void syncApsMaterialStorageDataJob(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList)
+    {
+        apsMaterialStorageManagementJobService.syncApsMaterialStorageDataJob(pageIndex, pageSize, orgCode, itemCodeList);
+    }
 }
diff --git a/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomHeaderJobMapper.xml b/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomHeaderJobMapper.xml
index 1eec45e..1f527b8 100644
--- a/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomHeaderJobMapper.xml
+++ b/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomHeaderJobMapper.xml
@@ -150,9 +150,14 @@
         FROM aps_bom_header_job
     </insert>
 
-    <!-- 鍒犻櫎 aps_process_route 琛ㄤ腑鐨勬暟鎹� -->
+    <!-- 鍒犻櫎 aps_bom_header 琛ㄤ腑鐨勬暟鎹� -->
     <delete id="deleteApsBomHeader">
         DELETE FROM aps_bom_header
     </delete>
 
+    <!-- 鍒犻櫎 aps_bom_header_job 琛ㄤ腑鐨勬暟鎹� -->
+    <delete id="deleteApsBomHeaderJob">
+        DELETE FROM aps_bom_header_job
+    </delete>
+
 </mapper>
\ No newline at end of file
diff --git a/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomLineJobMapper.xml b/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomLineJobMapper.xml
index 452300d..84e470b 100644
--- a/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomLineJobMapper.xml
+++ b/aps-modules/aps-job/src/main/resources/mapper/job/ApsBomLineJobMapper.xml
@@ -198,9 +198,14 @@
         FROM aps_bom_line_job
     </insert>
 
-    <!-- 鍒犻櫎 aps_process_route 琛ㄤ腑鐨勬暟鎹� -->
+    <!-- 鍒犻櫎 aps_bom_line 琛ㄤ腑鐨勬暟鎹� -->
     <delete id="deleteApsBomLine">
         DELETE FROM aps_bom_line
     </delete>
 
+    <!-- 鍒犻櫎 aps_bom_line_job 琛ㄤ腑鐨勬暟鎹� -->
+    <delete id="deleteApsBomLineJob">
+        DELETE FROM aps_bom_line_job
+    </delete>
+
 </mapper>
\ No newline at end of file
diff --git a/aps-modules/aps-job/src/main/resources/mapper/job/ApsMaterialStorageManagementJobMapper.xml b/aps-modules/aps-job/src/main/resources/mapper/job/ApsMaterialStorageManagementJobMapper.xml
new file mode 100644
index 0000000..ce3ec29
--- /dev/null
+++ b/aps-modules/aps-job/src/main/resources/mapper/job/ApsMaterialStorageManagementJobMapper.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.aps.job.mapper.ApsMaterialStorageManagementJobMapper">
+    
+    <resultMap type="ApsMaterialStorageManagementJob" id="ApsMaterialStorageManagementJobResult">
+        <result property="id"    column="id"    />
+        <result property="itemNumber"    column="item_number"    />
+        <result property="num"    column="num"    />
+        <result property="applicableFactories"    column="applicable_factories"    />
+        <result property="integrationDate"    column="integration_date"    />
+        <result property="refreshDate"    column="refresh_date"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remainderStock"    column="remainder_stock"    />
+        <result property="version"    column="version"    />
+    </resultMap>
+
+    <sql id="selectApsMaterialStorageManagementJobVo">
+        select id, item_number, num, applicable_factories, integration_date, refresh_date, create_by, create_time, update_by, update_time, remainder_stock, version from aps_material_storage_management_job
+    </sql>
+
+    <select id="selectApsMaterialStorageManagementJobList" parameterType="ApsMaterialStorageManagementJob" resultMap="ApsMaterialStorageManagementJobResult">
+        <include refid="selectApsMaterialStorageManagementJobVo"/>
+        <where>  
+            <if test="itemNumber != null  and itemNumber != ''"> and item_number = #{itemNumber}</if>
+            <if test="num != null "> and num = #{num}</if>
+            <if test="applicableFactories != null  and applicableFactories != ''"> and applicable_factories = #{applicableFactories}</if>
+            <if test="integrationDate != null "> and integration_date = #{integrationDate}</if>
+            <if test="refreshDate != null "> and refresh_date = #{refreshDate}</if>
+            <if test="remainderStock != null "> and remainder_stock = #{remainderStock}</if>
+            <if test="version != null "> and version = #{version}</if>
+        </where>
+    </select>
+    
+    <select id="selectApsMaterialStorageManagementJobById" parameterType="Long" resultMap="ApsMaterialStorageManagementJobResult">
+        <include refid="selectApsMaterialStorageManagementJobVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertApsMaterialStorageManagementJob" parameterType="ApsMaterialStorageManagementJob">
+        insert into aps_material_storage_management_job
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="itemNumber != null">item_number,</if>
+            <if test="num != null">num,</if>
+            <if test="applicableFactories != null">applicable_factories,</if>
+            <if test="integrationDate != null">integration_date,</if>
+            <if test="refreshDate != null">refresh_date,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remainderStock != null">remainder_stock,</if>
+            <if test="version != null">version,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="itemNumber != null">#{itemNumber},</if>
+            <if test="num != null">#{num},</if>
+            <if test="applicableFactories != null">#{applicableFactories},</if>
+            <if test="integrationDate != null">#{integrationDate},</if>
+            <if test="refreshDate != null">#{refreshDate},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remainderStock != null">#{remainderStock},</if>
+            <if test="version != null">#{version},</if>
+         </trim>
+    </insert>
+
+    <update id="updateApsMaterialStorageManagementJob" parameterType="ApsMaterialStorageManagementJob">
+        update aps_material_storage_management_job
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="itemNumber != null">item_number = #{itemNumber},</if>
+            <if test="num != null">num = #{num},</if>
+            <if test="applicableFactories != null">applicable_factories = #{applicableFactories},</if>
+            <if test="integrationDate != null">integration_date = #{integrationDate},</if>
+            <if test="refreshDate != null">refresh_date = #{refreshDate},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remainderStock != null">remainder_stock = #{remainderStock},</if>
+            <if test="version != null">version = #{version},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteApsMaterialStorageManagementJobById" parameterType="Long">
+        delete from aps_material_storage_management_job where id = #{id}
+    </delete>
+
+    <delete id="deleteApsMaterialStorageManagementJobByIds" parameterType="String">
+        delete from aps_material_storage_management_job where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <insert id="insertApsMaterialStorageBatch">
+        INSERT INTO aps_material_storage_management_job (
+        id,
+        item_number,
+        num,
+        applicable_factories,
+        create_time
+        ) VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.id},
+            #{item.itemNumber},
+            #{item.num},
+            #{item.applicableFactories},
+            now()
+            )
+        </foreach>
+    </insert>
+
+    <!-- 鎻掑叆鏁版嵁鍒� aps_material_storage_management -->
+    <insert id="insertIntoApsMaterialStorage">
+        INSERT INTO aps_material_storage_management (
+            id,
+            item_number,
+            num,
+            applicable_factories,
+            create_time
+        )
+        SELECT
+            id,
+            item_number,
+            num,
+            applicable_factories,
+            now()
+        FROM aps_material_storage_management_job
+    </insert>
+
+    <!-- 鍒犻櫎 aps_material_storage_management 琛ㄤ腑鐨勬暟鎹� -->
+    <delete id="deleteApsMaterialStorage">
+        DELETE FROM aps_material_storage_management
+    </delete>
+
+    <!-- 鍒犻櫎 aps_material_storage_management_job 琛ㄤ腑鐨勬暟鎹� -->
+    <delete id="deleteApsMaterialStorageJob">
+        DELETE FROM aps_material_storage_management_job
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git a/aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobMapper.xml b/aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobMapper.xml
index 8e82da4..6edc249 100644
--- a/aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobMapper.xml
+++ b/aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobMapper.xml
@@ -41,6 +41,8 @@
         <result property="nextOpName"    column="next_op_name"    />
         <result property="lowOrderCode"    column="low_order_code"    />
         <result property="orderCreateTime"    column="order_create_time"    />
+        <result property="approveOn"    column="approve_on"    />
+        <result property="startWorkDate"    column="start_work_date"    />
     </resultMap>
 
     <sql id="selectApsWorkOrderJobVo">
@@ -48,7 +50,7 @@
                doc_status, item_code, item_figure, item_figure_version, pruduct_qty, work_qty, op_num, work_center,
                dept, start_date, complete_date, next_dept, is_hold_release, is_out_source, org, page_num, page_index,
                del_flag, create_by, create_time, update_by, update_time , process_status,org_code, std_op, op_status, next_op_name,
-               low_order_code, order_create_time
+               low_order_code, order_create_time, approve_on, start_work_date
         from aps_work_order_job
     </sql>
 
@@ -295,7 +297,9 @@
             op_status,
             next_op_name,
             low_order_code,
-            order_create_time
+            order_create_time,
+            approve_on,
+            start_work_date
         </trim>
         values
         <foreach collection="list" item="job" separator=",">
@@ -336,7 +340,9 @@
             #{job.opStatus},
             #{job.nextOpName},
             #{job.lowOrderCode},
-            #{job.orderCreateTime}
+            #{job.orderCreateTime},
+            #{job.approveOn},
+            #{job.startWorkDate}
             )
         </foreach>
     </insert>

--
Gitblit v1.9.3