From ec1bf4658e36a17f971a54007920a44c5378b7dc Mon Sep 17 00:00:00 2001
From: cuijian <cuijian@xalxzn.com>
Date: 星期一, 16 六月 2025 10:41:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java                         |   40 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsToDncController.java                             |  138 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java                                           |  167 ++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java                           |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunchRate.java                                |  129 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaBladeMapper.java                                      |    6 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java                     |    0 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml                         |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAndon.java                                               |   20 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductInfoServiceImpl.java                         |   16 
 lxzn-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java                                               |   18 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaHoleToolsMapper.xml                               |    1 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/ext/NcTxtFilePathInfo.java                                       |   12 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ProcessTraceChain.java                                       |   86 +
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java                      |   85 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java                                           |    4 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaHoleToolsServiceImpl.java                       |   31 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java                   |   69 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaHoleToolsMapper.java                                  |    3 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java                    |   22 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaTurningToolsMapper.xml                            |    1 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java                  |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentPunchExportDTO.java                              |   98 +
 lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml                                          |    6 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/CompressionUtils.java                                      |   35 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataImportService.java                              |  455 ++++++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java                                              |   26 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java                                     |   18 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java                               |    2 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaThreadingToolService.java                           |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaBladeMapper.xml                                   |   39 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepPackageStrategy.java                        |   43 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/JsonUtils.java                                             |   48 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java                                  |    6 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java                           |   49 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessSpecVersionMapper.java                             |    6 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessStreamMapper.java                                  |    4 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java                 |    5 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ComponentInfoSeServiceImpl.java                     |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java                |  143 +
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java                      |    0 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/constant/DncPassLogPassType.java                                 |   39 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java                                    |   52 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataPackageService.java                             |   36 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductMixServiceImpl.java                          |   63 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentAlarmService.java                              |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java                          |  125 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java                    |    6 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaThreadingToolServiceImpl.java                   |   34 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentServiceImpl.java                |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/ToolQueryParamDto.java                                |  104 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java                       |    9 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaMillToolMapper.java                                   |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java                        |    8 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/DailyPunchRateJob.java                                       |  108 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaBladeService.java                                   |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java                             |    9 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/PartsInfoMapper.java                                      |    6 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml                                   |   14 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java                  |   48 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaThreadingToolMapper.java                              |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentAlarmMapper.xml                              |   16 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java                                           |   19 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java                          |    5 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java                              |   53 
 lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml                         |   39 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchRateController.java                  |   81 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java                       |    6 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaBladeServiceImpl.java                           |   36 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductMixService.java                                  |   18 
 lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java                     |   20 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java                                  |   20 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/WorkStepMapper.java                                       |    9 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java         |    7 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FullHierarchyTraceService.java                      |  236 +++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java                             |   44 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java                                         |   32 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcWorkshopInfoMapper.xml                             |   19 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java                            |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java                                      |   17 
 lxzn-module-dnc/pom.xml                                                                                              |    6 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java                                |   10 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductInfoMapper.java                                    |    6 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductMixMapper.java                                     |   22 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java                                              |    3 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml                           |   91 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaThreadingToolMapper.xml                           |   45 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java                   |    2 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java                            |    2 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchRateMapper.xml                       |    6 
 lxzn-module-system/lxzn-system-start/src/main/resources/application-prod.yml                                         |    2 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java                             |   12 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java                               |  254 +++
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java                                   |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentAlarmServiceImpl.java                      |    6 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/CutterController.java                                 |   13 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchRateServiceImpl.java               |   81 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/DataPackageStrategy.java                                 |   13 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaTurningToolsServiceImpl.java                    |   43 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml                                 |    4 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentAlarmMapper.java                                 |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessPackageStrategy.java                         |   42 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ComponentHierarchy.java                                      |   28 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/SecurityService.java                                |   48 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml                 |   13 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/ComponentInfoMapper.xml                               |   22 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml                                  |   19 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml                                   |   27 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java                              |   18 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchRateService.java                       |   19 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java                                    |  104 +
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaMillToolServiceImpl.java                        |   35 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml                         |   12 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/ICutterService.java                                      |    6 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductInfoService.java                                 |    2 
 /dev/null                                                                                                            |   62 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaTurningToolsMapper.java                               |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java                       |    5 
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaMillToolMapper.xml                                |    3 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/PartsInfoServiceImpl.java                           |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ComponentInfoMapper.java                                  |   10 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java |    5 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchRateMapper.java                          |   14 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java                                       |   22 
 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java                              |   18 
 125 files changed, 3,908 insertions(+), 479 deletions(-)

diff --git a/lxzn-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java b/lxzn-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java
index 1fb1a97..3bb8a8c 100644
--- a/lxzn-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java
+++ b/lxzn-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java
@@ -178,6 +178,24 @@
                 .groupName("eam");
     }
 
+    @Bean(value = "defaultApiBoard")
+    public Docket activitiApiBoard() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                //姝ゅ寘璺緞涓嬬殑绫伙紝鎵嶇敓鎴愭帴鍙f枃妗�
+                .apis(RequestHandlerSelectors.basePackage("org.jeecg.modules.board"))
+                //鍔犱簡ApiOperation娉ㄨВ鐨勭被锛屾墠鐢熸垚鎺ュ彛鏂囨。
+                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                .paths(PathSelectors.any())
+                .build()
+                .securitySchemes(Collections.singletonList(securityScheme()))
+                .securityContexts(securityContexts())
+                .globalOperationParameters(setHeaderToken())
+                .groupName("鏁板瓧瀛敓鐪嬫澘");
+    }
+
     /***
      * oauth2閰嶇疆
      * 闇�瑕佸鍔爏wagger鎺堟潈鍥炶皟鍦板潃
diff --git a/lxzn-module-dnc/pom.xml b/lxzn-module-dnc/pom.xml
index 2c815f4..47f1a8f 100644
--- a/lxzn-module-dnc/pom.xml
+++ b/lxzn-module-dnc/pom.xml
@@ -58,6 +58,12 @@
             <artifactId>fastutil</artifactId>
             <version>8.5.6</version>
         </dependency>
+        <dependency>
+            <groupId>org.jeecgframework.boot</groupId>
+            <artifactId>lxzn-module-tms</artifactId>
+            <version>3.4.3</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/constant/DncPassLogPassType.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/constant/DncPassLogPassType.java
new file mode 100644
index 0000000..bbc9d2a
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/constant/DncPassLogPassType.java
@@ -0,0 +1,39 @@
+package org.jeecg.modules.dnc.constant;
+
+public enum DncPassLogPassType {
+    //NC鏂囦欢
+    DOCUMENT("01", "nc鏂囦欢"),
+    //nc鏂囦欢
+    NCFILE("02", "NC鏂囦欢"),
+    //浜у搧缁撴瀯鏍�
+    PRODUCTSTRUCTURE("03", "浜у搧缁撴瀯鏍�"),
+    //绋嬪簭鍔犲伐纭琛�
+    PROGRAMPROCESSING("04", "绋嬪簭鍔犲伐纭琛�");
+
+    private String code;
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    DncPassLogPassType() {
+    }
+
+    DncPassLogPassType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/CutterController.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/CutterController.java
index 3d85d1a..0c59cb5 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/CutterController.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/controller/CutterController.java
@@ -110,4 +110,17 @@
         return service.extractAndSaveFromContent(docId,attributionId,attributionType);
     }
 
+    /**
+     * 鍙戦�佸垁鍏风郴缁�
+     * @param docId 鏂囨。Id
+     * @return
+     */
+    @AutoLog(value = "鍒�鍏蜂俊鎭�-鍙戦�佸垁鍏风郴缁�")
+    @ApiOperation(value = "鍒�鍏蜂俊鎭�-鍙戦�佸垁鍏风郴缁�", notes = "鍒�鍏蜂俊鎭�-鍙戦�佸垁鍏风郴缁�")
+    @GetMapping("/sendCutterInfo/{docId}/{attributionType}/{attributionId}")
+    public Result<?> sendCutterInfo(@PathVariable("docId") String docId
+            ,@PathVariable("attributionType") Integer attributionType
+            ,@PathVariable("attributionId") String attributionId) {
+        return service.sendToCutterSystem(docId,attributionId,attributionType);
+    }
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ComponentHierarchy.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ComponentHierarchy.java
new file mode 100644
index 0000000..d00ff7e
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ComponentHierarchy.java
@@ -0,0 +1,28 @@
+package org.jeecg.modules.dnc.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.jeecg.modules.dnc.entity.ComponentInfo;
+import org.jeecg.modules.dnc.entity.ProductInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ComponentHierarchy {
+    private ProductInfo rootProduct;
+    private final List<ComponentInfo> components = new ArrayList<>(); // 浠庢牴閮ㄤ欢鍒板簳灞傞儴浠剁殑椤哄簭
+
+    public void addComponentToTop(ComponentInfo component) {
+        components.add(0, component);
+    }
+
+    public List<ComponentInfo> getComponentsFromTop() {
+        return new ArrayList<>(components);
+    }
+
+    public ComponentInfo getLeafComponent() {
+        return components.isEmpty() ? null : components.get(components.size() - 1);
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ProcessTraceChain.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ProcessTraceChain.java
new file mode 100644
index 0000000..c61acc2
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ProcessTraceChain.java
@@ -0,0 +1,86 @@
+package org.jeecg.modules.dnc.dto;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+import org.jeecg.modules.dnc.entity.*;
+
+import java.util.List;
+/**
+ * @Description: 娑夊瘑缃戝悓姝ュ伐鎺х綉闇�瑕佺殑鏁版嵁
+ * @Author: lyh
+ * @Date:   2025-06-13
+ * @Version: V1.0
+ * @remark: 鍚庣画闇�瑕佸鍔狅紝娣诲姞瀵瑰簲鍙傛暟涓庣粨鏋勬暟鎹紝閲囩敤JSON搴忓垪鍖栦笌鍙嶅簭鍒楀寲杩涜浼犺緭锛屾柟渚夸紶杈擄紙鍔犲瘑鎿嶄綔锛岄伩鍏嶆暟鎹薄鏌擄級
+ */
+@Data
+@Builder
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProcessTraceChain {
+    /**绋嬪簭鍔犲伐纭琛�*/
+    private GuideCardBatch guideCardBatch;
+    /**鍒�鍏峰垪琛�*/
+    private List<Cutter> cutterList;
+    /**鏂囦欢*/
+    private DocFile docFile;
+    /**璁惧鏂囨。瀵瑰簲鍏崇郴*/
+    private DocRelative docRelative;
+    /**鏂囨。*/
+    private DocInfo docInfo;
+    /**璁惧绫�*/
+    private DeviceType deviceType;
+    /**璁惧绫诲搴斿叧绯�*/
+    private DeviceManagement deviceManagement;
+    /**宸ユ*/
+    private WorkStep workStep;
+    /**宸ュ簭*/
+    private ProcessStream process;
+    /**宸ヨ壓瑙勭▼鐗堟湰*/
+    private ProcessSpecVersion processSpec;
+    /**闆朵欢*/
+    private PartsInfo parts;
+    /**閮ㄤ欢*/
+    private ComponentHierarchy componentHierarchy;
+    /**浜у搧*/
+    private ProductInfo product;
+    /**浜у搧鏍戣矾寰�*/
+    private List<ProductMix> treePath;
+    /**鏉冮檺琛�*/
+    private List<PermissionStreamNew> permissionStreamNewList;
+    @JsonCreator
+    public ProcessTraceChain(
+            @JsonProperty("guideCardBatch") GuideCardBatch guideCardBatch,
+            @JsonProperty("cutterList") List<Cutter> cutterList,
+            @JsonProperty("docFile") DocFile docFile,
+            @JsonProperty("docRelative") DocRelative docRelative,
+            @JsonProperty("docInfo") DocInfo docInfo,
+            @JsonProperty("deviceType") DeviceType deviceType,
+            @JsonProperty("deviceManagement") DeviceManagement deviceManagement,
+            @JsonProperty("workStep") WorkStep workStep,
+            @JsonProperty("process") ProcessStream process,
+            @JsonProperty("processSpec") ProcessSpecVersion processSpec,
+            @JsonProperty("parts") PartsInfo parts,
+            @JsonProperty("componentHierarchy") ComponentHierarchy componentHierarchy,
+            @JsonProperty("product") ProductInfo product,
+            @JsonProperty("treePath") List<ProductMix> treePath,
+            @JsonProperty("permissionStreamNewList") List<PermissionStreamNew> permissionStreamNewList
+    ) {
+        this.guideCardBatch = guideCardBatch;
+        this.cutterList = cutterList;
+        this.docFile = docFile;
+        this.docRelative = docRelative;
+        this.docInfo = docInfo;
+        this.deviceType = deviceType;
+        this.deviceManagement = deviceManagement;
+        this.workStep = workStep;
+        this.process = process;
+        this.processSpec = processSpec;
+        this.parts = parts;
+        this.componentHierarchy = componentHierarchy;
+        this.product = product;
+        this.treePath = treePath;
+        this.permissionStreamNewList = permissionStreamNewList;
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java
new file mode 100644
index 0000000..15bd6b1
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java
@@ -0,0 +1,32 @@
+package org.jeecg.modules.dnc.dto;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+import org.jeecg.modules.dnc.entity.DocRelative;
+
+@Data
+@Builder
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TransferPackage {
+    public enum DataType { PROCESS, WORKSTEP }
+
+    private final DataType dataType;
+    private final DocRelative docRelative;
+    private final ProcessTraceChain traceChain;
+
+    @JsonCreator
+    public TransferPackage(
+            @JsonProperty("dataType") DataType dataType,
+            @JsonProperty("docRelative")  DocRelative docRelative,
+            @JsonProperty("traceChain") ProcessTraceChain traceChain
+    ) {
+        this.dataType = dataType;
+        this.docRelative = docRelative;
+        this.traceChain = traceChain;
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java
index 9e3df96..92c381e 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java
@@ -82,6 +82,9 @@
     //鎵�灞炶妭鐐逛唬鍙�
     @TableField(exist = false)
     private String nodeCode;
+    //鎵�灞炶妭鐐筰d
+    @TableField(exist = false)
+    private String nodeId;
     //璁惧绫诲悕绉�
     @TableField(exist = false)
     private String deviceName;
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java
index 81e49a1..879114e 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java
@@ -6,7 +6,6 @@
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
-import lombok.Getter;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
@@ -14,7 +13,6 @@
 import java.util.Date;
 import java.util.List;
 
-@Getter
 @Data
 @NoArgsConstructor
 @TableName(value = "nc_product_mix")
@@ -29,13 +27,13 @@
     private Long parentId;
     // 鍚嶇О
     @TableField(value = "tree_name")
-    private String name;
+    private String treeName;
     // code
     @TableField(value = "tree_code")
-    private String code;
+    private String treeCode;
     // 绫诲瀷
     @TableField(value = "tree_type")
-    private Integer type;
+    private Integer treeType;
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     @TableField(value = "create_time")
     private Date createTime;
@@ -43,17 +41,20 @@
     //灞曠ず鍚嶇О
     private transient String label;
 
+    //绫诲瀷鏂逛究鍓嶇灞曠ず
+    private transient Integer type;
+
 
     private transient List<ProductMix> children = new ArrayList<>();
 
-    public ProductMix(Long id, Long parentId, String name, String code, Integer type, Date createTime) {
+    public ProductMix(Long id, Long parentId, String treeName, String treeCode, Integer type, Date createTime) {
         this.id = id;
         this.parentId = parentId;
-        this.name = name;
-        this.code = code;
+        this.treeName = treeName;
+        this.treeCode = treeCode;
         this.type = type;
         this.children = new ArrayList<>();
-        this.label="["+code+"]"+name;
+        this.label="["+treeCode+"]"+treeName;
         this.createTime = createTime;
     }
 
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/ext/NcTxtFilePathInfo.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/ext/NcTxtFilePathInfo.java
index 1d81bc4..21e2c1c 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/ext/NcTxtFilePathInfo.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/ext/NcTxtFilePathInfo.java
@@ -24,6 +24,18 @@
     private Integer fileAddOrDelete;
     /*鏂囦欢澶у皬*/
     private String fileSize;
+    /*浜у搧娣诲姞鎵ц璇彞*/
+    private String productAddSql;
+    /*閮ㄤ欢娣诲姞鎵ц璇彞*/
+    private String componentAddSql;
+    /*闆朵欢娣诲姞鎵ц璇彞*/
+    private String partAddSql;
+    /*宸ヨ壓瑙勭▼鐗堟湰娣诲姞鎵ц璇彞*/
+    private String processVersionAddSql;
+    /*宸ュ簭鐗堟湰娣诲姞鎵ц璇彞*/
+    private String processAddSql;
+    /*宸ユ鐗堟湰娣诲姞鎵ц璇彞*/
+    private String processStepAddSql;
 
     @Override
     public String toString() {
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
index 59eb0af..d7d6b1f 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
@@ -1,14 +1,13 @@
 package org.jeecg.modules.dnc.listener;
+
 import org.apache.commons.io.monitor.FileAlterationListener;
 import org.apache.commons.io.monitor.FileAlterationObserver;
 import org.jeecg.common.util.FileUtil;
 import org.jeecg.modules.dnc.service.IDocInfoService;
 import org.jeecg.modules.dnc.utils.file.FileUtilS;
-import org.jeecg.modules.message.enums.DeployEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import java.io.File;
@@ -17,16 +16,12 @@
 @Component
 public class FileListener implements FileAlterationListener {
     private static final Logger log = LoggerFactory.getLogger(FileListener.class);
-
-    @Value("${deploy.deployType}")
-    private String deployType;    //宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓哄伐鎺х綉 1涓烘秹瀵嗙綉
-
     @Autowired
     private IDocInfoService docInfoService;  // 鏂囨。鏈嶅姟
 
     @Override
     public void onStart(FileAlterationObserver observer) {
-        log.info("寮�濮嬬洃鍚洰褰�: {}", observer.getDirectory().getAbsolutePath());
+//        log.info("寮�濮嬬洃鍚洰褰�: {}", observer.getDirectory().getAbsolutePath());
     }
 
     @Override
@@ -48,17 +43,6 @@
     public void onFileCreate(File file) {
         String filePath = file.getAbsolutePath();
         log.info("[鏂板缓]: {}", filePath);
-        if (DeployEnum.GW.getCode().equals(deployType)) {
-            //宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽
-            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
-                handleIndustrialDocFile(file);
-            }
-        }else {
-            //娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級
-            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
-                handleSecretDocFile(file);
-            }
-        }
     }
     @Override
     public void onFileChange(File file) {
@@ -72,7 +56,7 @@
 
     @Override
     public void onStop(FileAlterationObserver observer) {
-        log.info("缁撴潫鐩戝惉鐩綍: {}", observer.getDirectory().getAbsolutePath());
+//        log.info("缁撴潫鐩戝惉鐩綍: {}", observer.getDirectory().getAbsolutePath());
     }
 
     /**
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ComponentInfoMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ComponentInfoMapper.java
index 482ab76..02a288b 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ComponentInfoMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ComponentInfoMapper.java
@@ -1,9 +1,9 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-import org.jeecg.modules.dnc.dto.ComponentExt;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.dnc.dto.ComponentExt;
 import org.jeecg.modules.dnc.entity.ComponentInfo;
 
 import java.util.List;
@@ -38,4 +38,10 @@
      */
     List<ComponentExt> getByParentIdAndUserPerms(@Param("parentId") String parentId, @Param("userId") String userId);
 
+    @Select("SELECT * FROM nc_component_info WHERE component_id = #{componentId}")
+    ComponentInfo selectById(@Param("componentId") String componentId);
+
+    // 閫掑綊鏌ヨ閮ㄤ欢灞傜骇缁撴瀯
+    List<ComponentInfo> findComponentHierarchy(@Param("componentId") String componentId);
+
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/PartsInfoMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/PartsInfoMapper.java
index 63ade13..c1bbb4f 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/PartsInfoMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/PartsInfoMapper.java
@@ -1,8 +1,9 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.dnc.entity.PartsInfo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.dnc.entity.PartsInfo;
 
 import java.util.List;
 
@@ -14,4 +15,7 @@
      * @return
      */
     List<PartsInfo> getByUserPerms(@Param("userId") String userId);
+
+    @Select("SELECT * FROM nc_parts_info WHERE parts_id = #{partsId}")
+    PartsInfo selectById(@Param("partsId") String partsId);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessSpecVersionMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessSpecVersionMapper.java
index e0fc8ae..780d6fa 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessSpecVersionMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessSpecVersionMapper.java
@@ -1,8 +1,9 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.dnc.entity.ProcessSpecVersion;
-import org.jeecg.modules.dnc.entity.WorkStep;
 
 import java.util.List;
 
@@ -14,4 +15,7 @@
      * @return
      */
     List<ProcessSpecVersion> getByUserPerms(String userId);
+
+    @Select("SELECT * FROM nc_process_spec_version WHERE id = #{id}")
+    ProcessSpecVersion selectById(@Param("id") String id);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessStreamMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessStreamMapper.java
index c1ece69..4e4813e 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessStreamMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessStreamMapper.java
@@ -1,6 +1,8 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.dnc.entity.ProcessStream;
 
 import java.util.List;
@@ -22,4 +24,6 @@
      */
     List<ProcessStream> findByPartsAndComponents(String productId, List<String> componentIds, List<String> partsIds);
 
+    @Select("SELECT * FROM nc_process_stream WHERE process_id = #{processId}")
+    ProcessStream selectById(@Param("processId") String processId);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductInfoMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductInfoMapper.java
index d7e1d6b..680f30d 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductInfoMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductInfoMapper.java
@@ -1,8 +1,9 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.dnc.entity.ProductInfo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.dnc.entity.ProductInfo;
 
 import java.util.List;
 
@@ -13,4 +14,7 @@
      * @return
      */
     List<ProductInfo> getByUserPerms(@Param("userId") String userId);
+
+    @Select("SELECT * FROM nc_product_info WHERE product_id = #{productId}")
+    ProductInfo selectById(@Param("productId") String productId);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductMixMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductMixMapper.java
index b0c0b32..aaa74b5 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductMixMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductMixMapper.java
@@ -1,7 +1,29 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.dnc.entity.ProductMix;
 
 public interface ProductMixMapper extends BaseMapper<ProductMix> {
+
+    @Select("SELECT * FROM nc_product_mix WHERE id = #{productId} AND tree_type = 1")
+    ProductMix findByProductId(@Param("productId") String productId);
+
+    @Select("SELECT * FROM nc_product_mix WHERE id = #{componentId} AND tree_type = 2")
+    ProductMix findByComponentId(@Param("componentId") String componentId);
+
+    @Select("SELECT * FROM nc_product_mix WHERE id = #{partsId} AND tree_type = 3")
+    ProductMix findByPartsId(@Param("partsId") String partsId);
+
+    @Select("SELECT * FROM nc_product_mix WHERE id = #{operationId} AND tree_type = 4")
+    ProductMix findByOperationId(@Param("operationId") String operationId);
+
+    @Select("SELECT * FROM nc_product_mix WHERE id = #{processId} AND tree_type = 5")
+    ProductMix findByProcessId(@Param("operationId") String processId);
+
+    @Select("SELECT * FROM nc_product_mix WHERE id = #{worksiteId} AND tree_type = 6")
+    ProductMix findByWorksiteId(@Param("operationId") String worksiteId);
+
+
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/WorkStepMapper.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/WorkStepMapper.java
index 06ba661..dffe68b 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/WorkStepMapper.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/WorkStepMapper.java
@@ -1,7 +1,8 @@
 package org.jeecg.modules.dnc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.dnc.entity.SynchronizedFlag;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.dnc.entity.WorkStep;
 
 import java.util.List;
@@ -13,4 +14,10 @@
      * @return
      */
     List<WorkStep> getByUserPerms(String userId);
+
+    @Select("SELECT * FROM nc_work_step WHERE id = #{workStepId}")
+    WorkStep selectById(@Param("workStepId") String workStepId);
+
+    @Select("SELECT * FROM nc_work_step WHERE process_id = #{processId}")
+    List<WorkStep> selectByProcessId(@Param("processId") String processId);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/ComponentInfoMapper.xml b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/ComponentInfoMapper.xml
index b09355a..5d51485 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/ComponentInfoMapper.xml
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/ComponentInfoMapper.xml
@@ -158,4 +158,26 @@
         on comp.component_id=s.component_id
         where delete_flag = 0 and parent_id=#{parentId}
     </select>
+    <select id="findComponentHierarchy" resultType="org.jeecg.modules.dnc.entity.ComponentInfo">
+        WITH component_tree AS (
+            SELECT
+                *,
+                0 AS LEVEL
+            FROM
+                nc_component_info
+            WHERE
+                component_id = #{componentId} UNION ALL
+            SELECT
+                c.*,
+                ct.level + 1
+            FROM
+                nc_component_info c
+                    INNER JOIN component_tree ct ON c.component_id = ct.parent_id
+        ) SELECT
+            *
+        FROM
+            component_tree
+        ORDER BY
+            LEVEL ASC
+    </select>
 </mapper>
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml
index 76f6228..6ebebfa 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml
@@ -4,8 +4,8 @@
     <select id="loadProductMix" resultType="org.jeecg.modules.dnc.entity.ProductMix">
         SELECT DISTINCT
             mix.id,
-            mix.tree_code 'code',
-                mix.tree_name 'name',
+            mix.tree_code,
+            mix.tree_name,
             mix.parent_id,
             mix.tree_type AS 'type',
                 mix.extend,
@@ -31,8 +31,8 @@
     </select>
     <select id="loadProductMixAll" resultType="org.jeecg.modules.dnc.entity.ProductMix">
         SELECT DISTINCT mix.id,
-                        mix.tree_code    'code',
-                        mix.tree_name    'name',
+                        mix.tree_code,
+                        mix.tree_name   ,
                         mix.parent_id,
                         mix.tree_type AS 'type',
                         mix.extend,
@@ -92,8 +92,8 @@
         )
         SELECT DISTINCT
             mix.id,
-            mix.tree_code 'code',
-            mix.tree_name 'name',
+            mix.tree_code,
+            mix.tree_name,
             mix.parent_id,
             mix.tree_type AS 'type',
             mix.extend,
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/DataPackageStrategy.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/DataPackageStrategy.java
new file mode 100644
index 0000000..b736527
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/DataPackageStrategy.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.dnc.service;
+
+import org.jeecg.modules.dnc.dto.TransferPackage;
+
+// 鏁版嵁灏佽绛栫暐鎺ュ彛
+public interface DataPackageStrategy {
+    /**
+     * 灏佽涓氬姟鏁版嵁涓轰紶杈撳寘
+     * @param id 涓氬姟瀹炰綋ID锛堝伐搴廔D鎴栧伐姝D锛�
+     * @return 灏佽濂界殑浼犺緭鍖�
+     */
+    TransferPackage packageData(String id);
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/ICutterService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/ICutterService.java
index ad99cbf..45cb630 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/ICutterService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/ICutterService.java
@@ -40,5 +40,9 @@
      */
     Result<?> extractAndSaveFromContent(String docId,String attributionId,Integer attributionType);
 
-
+    /**
+     * 鍙戦�佸垁鍏峰垪琛ㄥ埌鍒�鍏风郴缁�
+     * @param docId
+     */
+    Result<?> sendToCutterSystem(String docId,String attributionId,Integer attributionType);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductInfoService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductInfoService.java
index 34f769f..8b2ee7f 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductInfoService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductInfoService.java
@@ -221,7 +221,7 @@
 
     /**
      * 鑾峰彇鍏蜂綋灞傜骇瀹炰綋
-     * @param id,type
+     * @param id,treeType
      * @return
      */
     Result<?> getTreeById(String id, Integer type);
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductMixService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductMixService.java
index d6d8a13..dafd539 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductMixService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductMixService.java
@@ -1,8 +1,6 @@
 package org.jeecg.modules.dnc.service;
 
-import cn.hutool.core.lang.tree.Tree;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.dnc.entity.ProductMix;
 
 import java.util.List;
@@ -10,8 +8,20 @@
 public interface IProductMixService extends IService<ProductMix> {
 
     //鑾峰彇灏佽浜у搧缁撴瀯鏍�
-    public List<ProductMix> getTree();
+    List<ProductMix> getTree();
 
-    //妯℃嫙鐢熸垚浜у搧缁撴瀯鏍�
+    /**
+     * 鏌ヨ瀵瑰簲id鐨勬墍鏈夌埗绾�(鏉冮檺鍒嗛厤浣跨敤)
+     * @param id
+     * @return
+     */
+    List<ProductMix> getParentList(String id);
+
+    /**
+     * 鏌ヨ瀵瑰簲id鐨勬墍鏈夊瓙鑺傜偣(鏉冮檺鍒嗛厤浣跨敤)
+     * @param id
+     * @return
+     */
+    List<ProductMix> getChildrenList(String id);
 
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ComponentInfoSeServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ComponentInfoSeServiceImpl.java
index 34f9f77..91e9992 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ComponentInfoSeServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ComponentInfoSeServiceImpl.java
@@ -189,8 +189,8 @@
         boolean b = super.updateById(componentInfo);
         //鍚屾淇敼缁撴瀯鏍�
         ProductMix productMix = productMixService.getById(Long.parseLong(id));
-        productMix.setName(componentInfo.getComponentName());
-        productMix.setCode(componentInfo.getComponentCode());
+        productMix.setTreeName(componentInfo.getComponentName());
+        productMix.setTreeCode(componentInfo.getComponentCode());
         productMixService.updateById(productMix);
         if(!b)
             return false;
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
index 2d1c271..9dbdaec 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/CutterServiceImpl.java
@@ -10,15 +10,19 @@
 import org.jeecg.modules.dnc.entity.Cutter;
 import org.jeecg.modules.dnc.entity.DocFile;
 import org.jeecg.modules.dnc.entity.DocInfo;
+import org.jeecg.modules.dnc.entity.GuideCardBatch;
 import org.jeecg.modules.dnc.exception.ExceptionCast;
 import org.jeecg.modules.dnc.mapper.CutterMapper;
 import org.jeecg.modules.dnc.response.CommonCode;
 import org.jeecg.modules.dnc.service.ICutterService;
 import org.jeecg.modules.dnc.service.IDocFileService;
 import org.jeecg.modules.dnc.service.IDocInfoService;
+import org.jeecg.modules.dnc.service.IGuideCardBatchService;
 import org.jeecg.modules.dnc.utils.ValidateUtil;
 import org.jeecg.modules.dnc.utils.file.FileUtilS;
-import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.jeecg.modules.tms.service.IPreparationOrderService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,8 +44,10 @@
     private IDocFileService docFileService;
 
     @Autowired
-    private ISysDictService sysDictService;
+    private IGuideCardBatchService guideCardBatchService;
 
+    @Autowired
+    private IPreparationOrderService preparationOrderService;
     /**
      * 鏂板鍒�鍏蜂俊鎭�
      * @param cutter
@@ -194,13 +200,54 @@
                 return Result.error("鏈彂鐜板垁鍏风殑鍙傛暟淇℃伅娉ㄩ噴锛屾棤娉曟彁鍙栧垁鍏蜂俊鎭�");
             }
             this.saveBatch(newCutterList);
-            //TODO鍙戦�佸垁鍏风鐞嗘暟鎹�
             return Result.OK("鎻愬彇鍒�鍏蜂俊鎭垚鍔�");
         }else {
             return Result.error("鏈彂鐜板垁鍏风殑鍙傛暟淇℃伅娉ㄩ噴锛屾棤娉曟彁鍙栧垁鍏蜂俊鎭�");
         }
     }
 
+    @Override
+    public Result<?> sendToCutterSystem(String docId,String attributionId,Integer attributionType){
+        List<Cutter> cutterList = this.list(new QueryWrapper<Cutter>()
+                .eq("doc_id", docId)
+                .eq(StrUtil.isNotEmpty(attributionId),"attribution_id",attributionId)
+                .eq("attribution_type",attributionType));
+        if (cutterList == null || cutterList.isEmpty()) {
+            return Result.error("鏈彂鐜板垁鍏蜂俊鎭紝鏃犳硶鍙戦�佸埌鍒�鍏风郴缁�");
+        }
+        if (cutterList.stream().anyMatch(item -> item.getCutterCode() == null)) {
+            return Result.error("鏈彂鐜板垁鍏风紪鍙蜂俊鎭紝鏃犳硶鍙戦�佸埌鍒�鍏风郴缁�");
+        }
+        //鑾峰彇鏈�鏂版暟鎺х▼搴忓姞宸ョ‘璁よ〃
+        List<GuideCardBatch> guideCardBatchList = guideCardBatchService.list(new QueryWrapper<GuideCardBatch>()
+                .eq("doc_id", docId)
+                .isNotNull("serial_number")
+                .orderByDesc("SUBSTRING(serial_number, LEN(serial_number)-3, 4)"));
+        if (guideCardBatchList == null || guideCardBatchList.isEmpty()) {
+            return Result.error("鏈彂鐜扮▼搴忓姞宸ョ‘璁よ〃淇℃伅锛屾棤娉曞彂閫佸埌鍒�鍏风郴缁�");
+        }
+        GuideCardBatch guideCardBatch = guideCardBatchList.get(0);
+        PreparationOrderAndDetailDto dto = new PreparationOrderAndDetailDto();
+        dto.setPartDrawingNo(guideCardBatch.getPartsCode());
+        dto.setPartName(guideCardBatch.getPartsName());
+        dto.setPartMaterial(guideCardBatch.getMaterielDesp());
+        dto.setProductionProcessesNo(guideCardBatch.getProcessWorkCode());
+        dto.setBatchCode(guideCardBatch.getProcessingBatch());
+        dto.setMachiningCount(guideCardBatch.getProcessingQuantity());
+        dto.setEquipmentCode(guideCardBatch.getProcessingEquipment());
+        dto.setNcName(guideCardBatch.getDocName());
+        List<PreparationOrderDetail> detailList = new ArrayList<>();
+        cutterList.forEach(item -> {
+            PreparationOrderDetail detail = new PreparationOrderDetail();
+            detail.setToolCode(item.getCutterCode());
+            detail.setToolId(item.getToolsId());
+            detailList.add(detail);
+        });
+        dto.setPreparationOrderDetailList(detailList);
+        preparationOrderService.addPreparationOrderFromDnc(dto);
+        return Result.OK("鍙戦�佸埌鍒�鍏风郴缁熸垚鍔�");
+    }
+
     public List<Cutter> extractToolAfterM6(DocInfo docInfo, List<String> ncLines) {
         List<Cutter> cutterList = new ArrayList<>();
         String currentToolCode = null; // 鐢ㄤ簬杩借釜褰撳墠鎹㈠垁鎸囦护鐨勫垁鍏峰彿
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataImportService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataImportService.java
new file mode 100644
index 0000000..b8649bd
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataImportService.java
@@ -0,0 +1,455 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.jeecg.weibo.exception.BusinessException;
+import org.jeecg.modules.dnc.dto.ComponentHierarchy;
+import org.jeecg.modules.dnc.dto.TransferPackage;
+import org.jeecg.modules.dnc.entity.*;
+import org.jeecg.modules.dnc.mapper.*;
+import org.jeecg.modules.dnc.service.*;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class DataImportService {
+    private static final Logger logger = LoggerFactory.getLogger(DataImportService.class);
+
+    @Autowired
+    private ProductInfoMapper productMapper;
+
+    @Autowired
+    private ComponentInfoMapper componentMapper;
+
+    @Autowired
+    private PartsInfoMapper partsMapper;
+
+    @Autowired
+    private ProcessSpecVersionMapper psvMapper;
+
+    @Autowired
+    private ProcessStreamMapper processMapper;
+
+    @Autowired
+    private WorkStepMapper workStepMapper;
+
+    @Autowired
+    private ProductMixMapper productMixMapper;
+
+    @Autowired
+    private PermissionStreamNewMapper permissionStreamNewMapper;
+
+    @Autowired
+    private DeviceManagementMapper deviceManagementMapper;
+
+    @Autowired
+    private DeviceTypeMapper deviceTypeMapper;
+
+    @Autowired
+    private DocInfoMapper docInfoMapper;
+
+    @Autowired
+    private DocFileMapper docFileMapper;
+
+    @Autowired
+    private DocRelativeMapper docRelativeMapper;
+
+    @Autowired
+    private CutterMapper cutterMapper;
+
+    @Autowired
+    private GuideCardBatchMapper guideCardBatchMapper;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private IMdcProductionService mdcProductionService;
+
+    @Autowired
+    private IProductPermissionService productPermissionService;
+
+    @Autowired
+    private IProductDepartmentService productDepartmentService;
+
+    @Autowired
+    private IComponentPermissionService componentPermissionService;
+
+    @Autowired
+    private IComponentDepartmentService componentDepartmentService;
+
+    @Autowired
+    private IPartsPermissionService partsPermissionService;
+
+    @Autowired
+    private IPartsDepartmentService partsDepartmentService;
+
+    @Autowired
+    private IProcessSpecVersionPermissionService processSpecVersionPermissionService;
+
+    @Autowired
+    private IProcessSpecVersionDepartmentService processSpecVersionDepartmentService;
+
+    @Autowired
+    private IProcessStreamPermissionService processStreamPermissionService;
+
+    @Autowired
+    private IProcessionDepartmentService processionDepartmentService;
+
+    @Autowired
+    private IWorkStepPermissionService workStepPermissionService;
+
+    @Autowired
+    private IWorkStepDepartmentService workStepDepartmentService;
+
+    @Transactional(rollbackFor = Exception.class)
+    public void importTransferPackage(TransferPackage transferPackage) {
+        try {
+            logger.info("寮�濮嬪鍏ヤ紶杈撳寘鏁版嵁, 绫诲瀷: {}", transferPackage.getDataType());
+
+            // 淇濆瓨浜у搧
+            if (transferPackage.getTraceChain() != null &&
+                    transferPackage.getTraceChain().getProduct() != null) {
+                saveProduct(transferPackage.getTraceChain().getProduct());
+            }
+
+            // 淇濆瓨閮ㄤ欢灞傜骇
+            if (transferPackage.getTraceChain() != null &&
+                    transferPackage.getTraceChain().getComponentHierarchy() != null) {
+                saveComponentHierarchy(transferPackage.getTraceChain().getComponentHierarchy());
+            }
+
+            // 淇濆瓨闆朵欢
+            if (transferPackage.getTraceChain() != null &&
+                    transferPackage.getTraceChain().getParts() != null) {
+                saveParts(transferPackage.getTraceChain().getParts());
+            }
+
+            // 淇濆瓨宸ヨ壓瑙勭▼
+            if (transferPackage.getTraceChain() != null &&
+                    transferPackage.getTraceChain().getProcessSpec() != null) {
+                saveProcessSpec(transferPackage.getTraceChain().getProcessSpec());
+            }
+
+            // 淇濆瓨宸ュ簭
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getProcess() != null) {
+                saveProcess(transferPackage.getTraceChain().getProcess());
+            }
+
+            // 淇濆瓨宸ユ
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getWorkStep() != null) {
+                saveWorkSteps(transferPackage.getTraceChain().getWorkStep());
+            }
+
+            // 淇濆瓨缁撴瀯鏍�
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getTreePath() != null) {
+                saveTreePath(transferPackage.getTraceChain().getTreePath());
+            }
+
+            //淇濆瓨鏉冮檺
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getPermissionStreamNewList() != null) {
+                savePermissionStreamNewList(transferPackage.getTraceChain().getPermissionStreamNewList());
+            }
+
+            // 淇濆瓨璁惧绫�
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getDeviceManagement() != null) {
+                saveDeviceManagement(transferPackage.getTraceChain().getDeviceManagement());
+            }
+
+            // 淇濆瓨璁惧绫诲搴斾俊鎭�
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getDeviceType() != null) {
+                saveDeviceType(transferPackage.getTraceChain().getDeviceType());
+            }
+
+            // 淇濆瓨鏂囨。
+            if (transferPackage.getTraceChain() != null&&
+                    transferPackage.getTraceChain().getDocInfo() != null) {
+                saveDocInfo(transferPackage.getTraceChain().getDocInfo());
+            }
+
+            // 淇濆瓨鏂囦欢
+            if (transferPackage.getTraceChain() !=null&&
+                    transferPackage.getTraceChain().getDocFile() != null) {
+                saveDocFile(transferPackage.getTraceChain().getDocFile());
+            }
+
+            // 淇濆瓨鏂囨。鏂囦欢瀵瑰簲鍏崇郴
+            if (transferPackage.getDocRelative() !=null){
+                saveDocRelative(transferPackage.getDocRelative());
+            }
+
+            // 淇濆瓨鍒�鍏风郴缁�
+            if (transferPackage.getTraceChain() !=null&&
+                    transferPackage.getTraceChain().getCutterList() != null) {
+                saveCutterList(transferPackage.getTraceChain().getCutterList());
+            }
+
+            //淇濆瓨鏁版帶绋嬪簭鍔犲伐纭琛�
+            if (transferPackage.getTraceChain() !=null&&
+                    transferPackage.getTraceChain().getGuideCardBatch() != null) {
+                saveGuideCardBatch(transferPackage.getTraceChain().getGuideCardBatch());
+            }
+
+            logger.info("鏁版嵁瀵煎叆鎴愬姛");
+        } catch (DuplicateKeyException e) {
+            logger.warn("涓婚敭鍐茬獊: {}", e.getMessage());
+            throw new BusinessException("鏁版嵁宸插瓨鍦紝鏃犳硶閲嶅瀵煎叆");
+        } catch (DataIntegrityViolationException e) {
+            logger.error("鏁版嵁瀹屾暣鎬ц繚鍙�: {}", e.getMessage());
+            throw new BusinessException("鏁版嵁涓嶅畬鏁达紝璇锋鏌ュ繀濉瓧娈�");
+        } catch (Exception e) {
+            logger.error("鏁版嵁瀵煎叆澶辫触: {}", e.getMessage(), e);
+            throw new BusinessException("鏁版嵁瀵煎叆澶辫触: " + e.getMessage());
+        }
+    }
+
+    private void saveProduct(ProductInfo product) {
+        if (productMapper.selectById(product.getProductId()) == null) {
+            productMapper.insert(product);
+            logger.debug("浜у搧宸蹭繚瀛�: {}", product.getProductId());
+        } else {
+            logger.debug("浜у搧宸插瓨鍦�: {}", product.getProductId());
+        }
+    }
+
+    private void saveComponentHierarchy(ComponentHierarchy hierarchy) {
+        for (ComponentInfo component : hierarchy.getComponents()) {
+            if (componentMapper.selectById(component.getComponentId()) == null) {
+                componentMapper.insert(component);
+                logger.debug("閮ㄤ欢宸蹭繚瀛�: {}", component.getComponentId());
+            } else {
+                logger.debug("閮ㄤ欢宸插瓨鍦�: {}", component.getComponentId());
+            }
+        }
+    }
+
+    private void saveParts(PartsInfo parts) {
+        if (partsMapper.selectById(parts.getPartsId()) == null) {
+            partsMapper.insert(parts);
+            logger.debug("闆朵欢宸蹭繚瀛�: {}", parts.getPartsId());
+        } else {
+            logger.debug("闆朵欢宸插瓨鍦�: {}", parts.getPartsId());
+        }
+    }
+
+    private void saveProcessSpec(ProcessSpecVersion processSpec) {
+        if (psvMapper.selectById(processSpec.getId()) == null) {
+            psvMapper.insert(processSpec);
+            logger.debug("宸ヨ壓瑙勭▼宸蹭繚瀛�: {}", processSpec.getId());
+        } else {
+            logger.debug("宸ヨ壓瑙勭▼宸插瓨鍦�: {}", processSpec.getId());
+        }
+    }
+
+    private void saveProcess(ProcessStream process) {
+        if (processMapper.selectById(process.getProcessId()) == null) {
+            processMapper.insert(process);
+            logger.debug("宸ュ簭宸蹭繚瀛�: {}", process.getProcessId());
+        } else {
+            logger.debug("宸ュ簭宸插瓨鍦�: {}", process.getProcessId());
+        }
+    }
+
+    private void saveWorkSteps(WorkStep workStep) {
+        if (workStepMapper.selectById(workStep.getId()) == null) {
+            workStepMapper.insert(workStep);
+            logger.debug("宸ユ宸蹭繚瀛�: {}", workStep.getId());
+        } else {
+            logger.debug("宸ユ宸插瓨鍦�: {}", workStep.getId());
+        }
+    }
+
+    private void saveTreePath(List<ProductMix> productMixList){
+        for (ProductMix productMix : productMixList) {
+            if (productMixMapper.selectById(productMix.getId()) == null) {
+                productMixMapper.insert(productMix);
+                logger.debug("浜у搧缁勫悎宸蹭繚瀛�: {}", productMix.getId());
+            } else {
+                logger.debug("浜у搧缁勫悎宸插瓨鍦�: {}", productMix.getId());
+            }
+        }
+    }
+
+    private void savePermissionStreamNewList(List<PermissionStreamNew> permissionStreamNewList) {
+        for (PermissionStreamNew permissionStreamNew : permissionStreamNewList) {
+            if (permissionStreamNew.getUserId() != null) {
+                String id=sysUserService.getUserByName(permissionStreamNew.getUserId()).getId();
+                if (id!=null){
+                    permissionStreamNew.setUserId(id);
+                }
+            }
+            if (permissionStreamNew.getDepartId() != null) {
+                String id=mdcProductionService.findByOrgCode(permissionStreamNew.getDepartId()).getId();
+                if (id!=null){
+                permissionStreamNew.setDepartId(id);
+                }
+            }
+            permissionStreamNewMapper.insert(permissionStreamNew);
+            logger.debug("鏉冮檺宸蹭繚瀛�: {}", permissionStreamNew.getId());
+        }
+        //鍒嗘壒娣诲姞浜у搧銆侀儴浠躲�侀浂浠躲�佸伐鑹鸿绋嬨�佸伐搴忋�佸伐姝ユ潈闄�
+        permissionStreamNewList.forEach(item -> {
+            switch (item.getBusinessType()){
+                case "1":
+                    if (StrUtil.isNotEmpty(item.getUserId())){
+                        ProductPermission productPermission = new ProductPermission();
+                        productPermission.setProductId(item.getBusinessId());
+                        productPermission.setUserId(item.getUserId());
+                        productPermissionService.save(productPermission);
+                    }else {
+                        ProductDepartment productDepartment = new ProductDepartment();
+                        productDepartment.setProductId(item.getBusinessId());
+                        productDepartment.setDepartId(item.getDepartId());
+                        productDepartmentService.save(productDepartment);
+                    }
+                    break;
+                case "2":
+
+                    if (StrUtil.isNotEmpty(item.getUserId())){
+                        ComponentPermission componentPermission = new ComponentPermission();
+                        componentPermission.setComponentId(item.getBusinessId());
+                        componentPermission.setUserId(item.getUserId());
+                        componentPermissionService.save(componentPermission);
+                    }else {
+                        ComponentDepartment componentDepartment = new ComponentDepartment();
+                        componentDepartment.setComponentId(item.getBusinessId());
+                        componentDepartment.setDepartId(item.getDepartId());
+                        componentDepartmentService.save(componentDepartment);
+                    }
+                    break;
+                case "3":
+                    if (StrUtil.isNotEmpty(item.getUserId())){
+                        PartsPermission partsPermission = new PartsPermission();
+                        partsPermission.setPartsId(item.getBusinessId());
+                        partsPermission.setUserId(item.getUserId());
+                        partsPermissionService.save(partsPermission);
+                    }else {
+                        PartsDepartment partsDepartment = new PartsDepartment();
+                        partsDepartment.setPartsId(item.getBusinessId());
+                        partsDepartment.setDepartId(item.getDepartId());
+                        partsDepartmentService.save(partsDepartment);
+                    }
+                    break;
+                case "4":
+                    if (StrUtil.isNotEmpty(item.getUserId())){
+                        ProcessSpecVersionPermission processSpecVersionPermission = new ProcessSpecVersionPermission();
+                        processSpecVersionPermission.setPsvId(item.getBusinessId());
+                        processSpecVersionPermission.setUserId(item.getUserId());
+                        processSpecVersionPermissionService.save(processSpecVersionPermission);
+                    }else {
+                        ProcessSpecVersionDepartment processSpecVersionDepartment = new ProcessSpecVersionDepartment();
+                        processSpecVersionDepartment.setPsvId(item.getBusinessId());
+                        processSpecVersionDepartment.setDepartId(item.getDepartId());
+                        processSpecVersionDepartmentService.save(processSpecVersionDepartment);
+                    }
+                    break;
+                case "5":
+                    if (StrUtil.isNotEmpty(item.getUserId())){
+                        ProcessionPermission processionPermission = new ProcessionPermission();
+                        processionPermission.setProcessId(item.getBusinessId());
+                        processionPermission.setUserId(item.getUserId());
+                        processStreamPermissionService.save(processionPermission);
+                    }else {
+                        ProcessionDepartment processionDepartment = new ProcessionDepartment();
+                        processionDepartment.setProcessId(item.getBusinessId());
+                        processionDepartment.setDepartId(item.getDepartId());
+                        processionDepartmentService.save(processionDepartment);
+                    }
+                    break;
+                case  "6":
+                    if (StrUtil.isNotEmpty(item.getUserId())){
+                        WorkStepPermission workStepPermission = new WorkStepPermission();
+                        workStepPermission.setStepId(item.getBusinessId());
+                        workStepPermission.setUserId(item.getUserId());
+                        workStepPermissionService.save(workStepPermission);
+                    }else {
+                        WorkStepDepartment workStepDepartment = new WorkStepDepartment();
+                        workStepDepartment.setStepId(item.getBusinessId());
+                        workStepDepartment.setDepartId(item.getDepartId());
+                        workStepDepartmentService.save(workStepDepartment);
+                    }
+                    break;
+                    default:
+            }
+        });
+    }
+
+    private void saveDeviceManagement(DeviceManagement deviceManagement) {
+        if (deviceManagementMapper.selectById(deviceManagement.getId()) == null) {
+            deviceManagementMapper.insert(deviceManagement);
+            logger.debug("璁惧绫讳俊鎭凡淇濆瓨: {}", deviceManagement.getId());
+        } else {
+            logger.debug("璁惧绫讳俊鎭凡瀛樺湪: {}", deviceManagement.getId());
+        }
+    }
+
+    private void saveDeviceType(DeviceType deviceType) {
+        if (deviceTypeMapper.selectById(deviceType.getId()) == null) {
+            deviceTypeMapper.insert(deviceType);
+            logger.debug("璁惧绫诲凡淇濆瓨: {}", deviceType.getId());
+        } else {
+            logger.debug("璁惧绫诲凡瀛樺湪: {}", deviceType.getId());
+        }
+    }
+
+    private void saveDocInfo(DocInfo docInfo) {
+        if (docInfoMapper.selectById(docInfo.getDocId()) == null) {
+            docInfoMapper.insert(docInfo);
+            logger.debug("鏂囨。宸蹭繚瀛�: {}", docInfo.getDocId());
+        } else {
+            logger.debug("鏂囨。宸插瓨鍦�: {}", docInfo.getDocId());
+        }
+    }
+
+    private void saveDocFile(DocFile docFile) {
+        if (docFileMapper.selectById(docFile.getFileId()) == null) {
+            docFileMapper.insert(docFile);
+            logger.debug("鏂囨。鏂囦欢宸蹭繚瀛�: {}", docFile.getFileId());
+        } else {
+            logger.debug("鏂囨。鏂囦欢宸插瓨鍦�: {}", docFile.getFileId());
+        }
+    }
+
+    private void saveDocRelative(DocRelative docRelative) {
+        if (docRelativeMapper.selectById(docRelative.getId()) == null) {
+            docRelativeMapper.insert(docRelative);
+            logger.debug("鏂囨。瀵瑰簲鍏崇郴宸蹭繚瀛�: {}", docRelative.getId());
+        } else {
+            logger.debug("鏂囨。瀵瑰簲鍏崇郴宸插瓨鍦�: {}", docRelative.getId());
+        }
+    }
+
+    private void saveCutterList(List<Cutter> cutterList) {
+        for (Cutter cutter : cutterList) {
+            if (cutterMapper.selectById(cutter.getId()) == null) {
+                cutterMapper.insert(cutter);
+                logger.debug("鍒�鍏峰凡淇濆瓨: {}", cutter.getId());
+            } else {
+                cutterMapper.updateById(cutter);
+            }
+        }
+    }
+
+    private void saveGuideCardBatch(GuideCardBatch guideCardBatch) {
+        if (guideCardBatchMapper.selectById(guideCardBatch.getId()) == null) {
+            guideCardBatchMapper.insert(guideCardBatch);
+            logger.debug("鍒�鐗囨壒娆″凡淇濆瓨: {}", guideCardBatch.getId());
+        } else {
+            logger.debug("鍒�鐗囨壒娆″凡瀛樺湪: {}", guideCardBatch.getId());
+        }
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataPackageService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataPackageService.java
new file mode 100644
index 0000000..46cfe99
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataPackageService.java
@@ -0,0 +1,36 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import org.jeecg.modules.dnc.dto.TransferPackage;
+import org.jeecg.modules.dnc.service.DataPackageStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DataPackageService {
+
+    private final Map<TransferPackage.DataType, DataPackageStrategy> strategies;
+
+    @Autowired
+    public DataPackageService(List<DataPackageStrategy> strategyList) {
+        strategies = new EnumMap<>(TransferPackage.DataType.class);
+        strategyList.forEach(strategy -> {
+            if (strategy instanceof ProcessPackageStrategy) {
+                strategies.put(TransferPackage.DataType.PROCESS, strategy);
+            } else if (strategy instanceof WorkStepPackageStrategy) {
+                strategies.put(TransferPackage.DataType.WORKSTEP, strategy);
+            }
+        });
+    }
+
+    public TransferPackage packageData(TransferPackage.DataType type, String id) {
+        DataPackageStrategy strategy = strategies.get(type);
+        if (strategy == null) {
+            throw new IllegalArgumentException("涓嶆敮鎸佺殑鏁版嵁绫诲瀷: " + type);
+        }
+        return strategy.packageData(id);
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java
index 28816b1..2704bd2 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java
@@ -196,9 +196,9 @@
         populateEquipmentNodes(treeList, equipmentMap, userRealNameMap);
     }
 
-/**
-        * 鑾峰彇鎺堟潈璁惧ID闆嗗悎
- */
+    /**
+     * 鑾峰彇鎺堟潈璁惧ID闆嗗悎
+    */
     private Set<String> getAuthorizedDeviceIds(String userId) {
         return super.list(new QueryWrapper<DevicePermission>().select("device_id").eq("user_id", userId))
                 .stream()
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
index a32370c..dc6ef58 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -342,10 +342,20 @@
     @Override
     @Transactional(rollbackFor = {Exception.class})
     public boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec){
-        //todo 绋嬪簭鍥炰紶
+        //纭瑙f瀽鐩綍
         return true;
     }
 
+    /**
+     * 鏂囨。瑙f瀽
+     * todo 淇敼鍒涘缓鏂囦欢鍏宠仈鍏崇郴锛屾敼鎴愬浐瀹歞ocId锛屽幓闄ゅ垱寤篋ocInfo
+     * @param equipmentId
+     * @param fileRec
+     * @param fileNameSuffix
+     * @param fileNameNew
+     * @param filePath
+     * @return
+     */
     @Override
     @Transactional(rollbackFor = {Exception.class})
     public boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath ) {
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java
new file mode 100644
index 0000000..419c241
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java
@@ -0,0 +1,254 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.modules.dnc.dto.ComponentHierarchy;
+import org.jeecg.modules.dnc.dto.TransferPackage;
+import org.jeecg.modules.dnc.entity.*;
+import org.jeecg.modules.dnc.exception.ExceptionCast;
+import org.jeecg.modules.dnc.response.ActivitiCode;
+import org.jeecg.modules.dnc.response.DocumentCode;
+import org.jeecg.modules.dnc.service.IDocClassificationService;
+import org.jeecg.modules.dnc.service.IDocInfoService;
+import org.jeecg.modules.dnc.service.IDocRelativeService;
+import org.jeecg.modules.dnc.utils.JsonUtils;
+import org.jeecg.modules.dnc.utils.file.FileUtilS;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentMapper;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class FileFerryService {
+
+    private final DataPackageService dataPackageService;
+    private final SecurityService securityService;
+
+    private static final Logger logger = LoggerFactory.getLogger(FileFerryService.class);
+
+    @Value("${deploy.secretFolder}")
+    private String ferryPath;
+
+    @Value("${fileHomePath}")
+    private String fileHomePath;
+
+    @Autowired
+    private MdcEquipmentMapper mdcEquipmentMapper;
+
+    @Autowired
+    private IMdcProductionService mdcProductionService;
+
+    @Autowired
+    private IDocClassificationService classificationService;
+
+    @Autowired
+    private IDocRelativeService docRelativeService;
+
+    @Autowired
+    private IDocInfoService docInfoService;
+
+    @Autowired
+    public FileFerryService(DataPackageService dataPackageService, SecurityService securityService) {
+        this.dataPackageService = dataPackageService;
+        this.securityService = securityService;
+    }
+
+    public String exportData(TransferPackage.DataType type, String id,String fileName) {
+        // 1. 鑾峰彇灏佽鏁版嵁
+        TransferPackage transferPackage = dataPackageService.packageData(type, id);
+
+        // 2. 鍘嬬缉灞傜骇缁撴瀯
+        compressHierarchy(transferPackage);
+
+        // 3. JSON搴忓垪鍖�
+        String json = JsonUtils.toJson(transferPackage);
+
+//        // 4. 鍘嬬缉鍔犲瘑
+//        byte[] compressed = CompressionUtils.gzipCompress(json.getBytes(StandardCharsets.UTF_8));
+//        byte[] encrypted = securityService.encrypt(compressed);
+        //鏆傛椂涓嶅姞瀵�
+        byte[] compressed = json.getBytes(StandardCharsets.UTF_8);
+
+        // 5. 鐢熸垚鏂囦欢
+        Path filePath = Paths.get(ferryPath,fileName);
+        try {
+            Files.createDirectories(filePath.getParent());
+            Files.write(filePath, compressed);
+            return filePath.toString();
+        } catch (IOException e) {
+            throw new RuntimeException("鏂囦欢鍐欏叆澶辫触", e);
+        }
+    }
+
+    public TransferPackage importData(String filePath) {
+        try {
+            // 1. 璇诲彇鏂囦欢
+            Path path = Paths.get(filePath);
+            String fileName = path.getFileName().toString();
+            byte[] encrypted = Files.readAllBytes(path);
+            logger.debug("璇诲彇鏂囦欢瀹屾垚, 澶у皬: {} 瀛楄妭", encrypted.length);
+
+            // 2. 瑙e瘑 (褰撳墠宸叉敞閲�)
+            // byte[] compressed = securityService.decrypt(encrypted);
+
+            // 3. 瑙e帇缂�
+//            byte[] jsonBytes = CompressionUtils.gzipDecompress(encrypted);
+            String json = new String(encrypted, StandardCharsets.UTF_8);
+            logger.debug("瑙e帇缂╁畬鎴�, JSON闀垮害: {} 瀛楃", json.length());
+
+            // 璁板綍JSON鍐呭鐢ㄤ簬璋冭瘯
+            logger.trace("鍘熷JSON鍐呭:\n{}", json);
+
+            // 4. JSON鍙嶅簭鍒楀寲
+            logger.debug("寮�濮嬪弽搴忓垪鍖�...");
+            TransferPackage pkg = JsonUtils.fromJson(json, TransferPackage.class);
+
+            // 5. 澶勭悊鏂囦欢鍚� - 绀轰緥: 10A20250614000026_3102038
+            String[] split = fileName.split("_");
+            if (split.length < 2) {
+                throw new IllegalArgumentException("鏃犳晥鐨勬枃浠跺悕鏍煎紡: " + fileName);
+            }
+
+            String id = split[0];
+            String equipmentId = split[1].split("\\.")[0];
+
+            // 鎻愬彇鍓嶇紑鍜屾暟瀛楅儴鍒�
+            int aIndex = id.indexOf("A");
+            if (aIndex == -1 || aIndex == id.length() - 1) {
+                throw new IllegalArgumentException("鏃犳晥鐨処D鏍煎紡: " + id);
+            }
+
+            String prefix = id.substring(0, aIndex + 1);
+            String numericPart = id.substring(aIndex + 1);
+
+            // 璁$畻鍓嶄竴涓枃浠跺悕
+            long number = Long.parseLong(numericPart);
+            number--;  // 鑾峰彇鍓嶄竴涓簭鍒楀彿
+
+            // 淇濇寔鐩稿悓浣嶆暟鏍煎紡
+            String newNumeric = String.format("%0" + numericPart.length() + "d", number);
+            String ncFileName = prefix + newNumeric + "_" + equipmentId+".NC";
+            String ncFilePath = path.getParent().resolve(ncFileName).toString();
+
+            // 6. 鑾峰彇鏂囦欢澶嶅埗鐩爣璺緞
+            DocFile docFile = pkg.getTraceChain().getDocFile();
+            DocInfo docInfo = pkg.getTraceChain().getDocInfo();
+            if (docFile == null) {
+                throw new IllegalStateException("浼犺緭鍖呬腑缂哄皯鏂囨。鏂囦欢淇℃伅");
+            }
+
+            // 鏋勫缓鐩爣璺緞
+            String targetDirectory = fileHomePath + docFile.getFilePath();
+            String targetPath = Paths.get(targetDirectory, docFile.getFileEncodeName()).toString();
+
+            // 纭繚鐩爣鐩綍瀛樺湪
+            File targetDir = new File(targetDirectory);
+            if (!targetDir.exists() && !targetDir.mkdirs()) {
+                throw new IOException("鏃犳硶鍒涘缓鐩爣鐩綍: " + targetDirectory);
+            }
+
+            // 7. 澶嶅埗鏂囦欢骞堕噸鍛藉悕
+            logger.info("澶嶅埗鏂囦欢: {} 鈫� {}", ncFilePath, targetPath);
+            Path source = Paths.get(ncFilePath);
+            Files.copy(source, Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);
+
+            // 8. 鏌ヨ璁惧id
+            MdcEquipment mdcEquipment=mdcEquipmentMapper.selectOne(new QueryWrapper<MdcEquipment>().eq("equipment_id",equipmentId));
+            if (mdcEquipment == null) {
+                throw new IllegalArgumentException("鏃犳晥鐨勮澶嘔D: " + equipmentId);
+            }
+
+            // 9.浼犺緭鏂囦欢鍒拌澶囦笅
+            List<String> strings = mdcProductionService.findListParentTreeAll(mdcEquipment.getId());
+            if (strings != null && !strings.isEmpty()) {
+                DocInfo deviceDoc = docInfoService.getByDocAttrAndDocId(docInfo.getDocId(), 7, mdcEquipment.getId());
+                if (deviceDoc == null) {
+                    DocClassification classification = classificationService.getByCode("send");
+                    if(classification == null)
+                        ExceptionCast.cast(DocumentCode.DOC_CLASS_ERROR);
+                    DocRelative docRelative = new DocRelative();
+                    docRelative.setDocId(docInfo.getDocId());
+                    docRelative.setClassificationId(classification.getClassificationId());
+                    docRelative.setAttributionType(7);
+                    docRelative.setAttributionId(mdcEquipment.getId());
+                    docRelativeService.save(docRelative);
+                }
+                String sendPath = StringUtils.join(strings.toArray(), "/");
+                boolean copyFileNc = FileUtilS.copyFileNc(docFile.getFilePath(), sendPath + "/" + mdcEquipment.getEquipmentId(),
+                        docFile.getFileEncodeName(),
+                        docFile.getFileName(), docFile.getFileSuffix());
+                if (!copyFileNc) {
+                    ExceptionCast.cast(ActivitiCode.ACT_FILE_ERROR);
+                } else {
+                    FileUtilS.deleteZipFromToSend(sendPath + "/" + mdcEquipment.getEquipmentId(),
+                            docFile.getFileName(), docFile.getFileSuffix());
+                }
+            } else {
+                throw new RuntimeException("鏂囦欢浼犺緭璺緞鑾峰彇澶辫触");
+            }
+
+            // 10.鍒犻櫎涓存椂NC鏂囦欢涓巎son鏂囦欢
+            logger.info("鍒犻櫎涓存椂鏂囦欢: {}", ncFilePath);
+            Files.delete(source);
+            Files.delete(path);
+
+            return JsonUtils.fromJson(json, TransferPackage.class);
+
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("鏂囦欢鍚嶄腑鐨勬暟瀛楁牸寮忔棤鏁�: " + e.getMessage(), e);
+        } catch (IOException e) {
+            throw new RuntimeException("鏂囦欢鎿嶄綔澶辫触: " + e.getMessage(), e);
+        } catch (Exception e) {
+            logger.error("鏂囦欢瀵煎叆澶辫触 [璺緞: {}]", filePath, e);
+            throw new RuntimeException("鏂囦欢瀵煎叆澶辫触: " + e.getMessage(), e);
+        }
+    }
+
+    private void compressHierarchy(TransferPackage pkg) {
+        if (pkg.getTraceChain() == null ||
+                pkg.getTraceChain().getComponentHierarchy() == null ||
+                pkg.getTraceChain().getComponentHierarchy().getComponents().size() < 4) {
+            return;
+        }
+
+        ComponentHierarchy hierarchy = pkg.getTraceChain().getComponentHierarchy();
+        List<ComponentInfo> compressed = new ArrayList<>();
+
+        // 淇濈暀鏍归儴浠�
+        compressed.add(hierarchy.getComponents().get(0));
+
+        // 淇濈暀鍏抽敭涓棿鑺傜偣
+        int step = Math.max(1, hierarchy.getComponents().size() / 3);
+        for (int i = step; i < hierarchy.getComponents().size() - 1; i += step) {
+            compressed.add(hierarchy.getComponents().get(i));
+        }
+
+        // 淇濈暀鍙跺瓙閮ㄤ欢
+        compressed.add(hierarchy.getLeafComponent());
+
+        // 鏇存柊灞傜骇
+        hierarchy.getComponents().clear();
+        hierarchy.getComponents().addAll(compressed);
+    }
+
+    private String generateFilename(TransferPackage.DataType type, String id) {
+        return String.format("%s_%s_%d.ferry",
+                type.name().toLowerCase(),
+                id,
+                System.currentTimeMillis());
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FullHierarchyTraceService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FullHierarchyTraceService.java
new file mode 100644
index 0000000..38ca508
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FullHierarchyTraceService.java
@@ -0,0 +1,236 @@
+package org.jeecg.modules.dnc.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.jeecg.modules.dnc.constant.DocAttributionTypeEnum;
+import org.jeecg.modules.dnc.dto.ComponentHierarchy;
+import org.jeecg.modules.dnc.dto.ProcessTraceChain;
+import org.jeecg.modules.dnc.entity.*;
+import org.jeecg.modules.dnc.mapper.*;
+import org.jeecg.modules.dnc.service.IPermissionStreamNewService;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Service
+public class FullHierarchyTraceService {
+    @Autowired
+    private ProductMixMapper productMixMapper;
+    @Autowired
+    private ProductInfoMapper productMapper;
+    @Autowired
+    private ComponentInfoMapper componentMapper;
+    @Autowired
+    private PartsInfoMapper partsMapper;
+    @Autowired
+    private ProcessSpecVersionMapper psvMapper;
+    @Autowired
+    private ProcessStreamMapper processMapper;
+    @Autowired
+    private WorkStepMapper workStepMapper;
+    @Autowired
+    private DeviceTypeMapper deviceTypeMapper;
+    @Autowired
+    private DeviceManagementMapper deviceManagementMapper;
+    @Autowired
+    private DocInfoMapper docInfoMapper;
+    @Autowired
+    private DocFileMapper docFileMapper;
+    @Autowired
+    private CutterMapper cutterMapper;
+    @Autowired
+    private GuideCardBatchMapper guideCardBatchMapper;
+    @Autowired
+    private IPermissionStreamNewService permissionStreamNewService;
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private IMdcProductionService mdcProductionService;
+
+    public ProcessTraceChain traceFromProcess(DocRelative docRelative) {
+        ProcessTraceChain chain = initChainWithDocInfo(docRelative);
+        DeviceType deviceType = deviceTypeMapper.selectById(docRelative.getAttributionId());
+        chain.setDeviceType(deviceType);
+
+        if (isProcessType(deviceType)) {
+            chain.setDeviceManagement(deviceManagementMapper.selectById(deviceType.getDeviceManagementId()));
+            traceProcessChain(chain, deviceType.getAttributionId());
+        }
+
+        completeChainWithProductInfo(chain);
+        List<ProductMix> productMixList=buildFullTreePath(chain);
+        chain.setTreePath(productMixList);
+        chain.setPermissionStreamNewList(buildFullTreePathPermission(productMixList));
+        return chain;
+    }
+
+    public ProcessTraceChain traceFromWorkStep(DocRelative docRelative) {
+        ProcessTraceChain chain = initChainWithDocInfo(docRelative);
+        DeviceType deviceType = deviceTypeMapper.selectById(docRelative.getAttributionId());
+        chain.setDeviceType(deviceType);
+
+        if (isWorkSiteType(deviceType)) {
+            chain.setDeviceManagement(deviceManagementMapper.selectById(deviceType.getDeviceManagementId()));
+            traceWorkStepChain(chain, deviceType.getAttributionId());
+        }
+
+        completeChainWithProductInfo(chain);
+        List<ProductMix> productMixList=buildFullTreePath(chain);
+        chain.setTreePath(productMixList);
+        chain.setPermissionStreamNewList(buildFullTreePathPermission(productMixList));
+        return chain;
+    }
+
+    private ProcessTraceChain initChainWithDocInfo(DocRelative docRelative) {
+        ProcessTraceChain chain = ProcessTraceChain.builder().docRelative(docRelative).build();
+        Optional.ofNullable(docInfoMapper.selectById(docRelative.getDocId()))
+                .ifPresent(doc -> {
+                    chain.setDocInfo(doc);
+                    chain.setDocFile(docFileMapper.selectById(doc.getPublishFileId()));
+                    chain.setCutterList(getCuttersByDocId(doc.getDocId()));
+                    getLatestGuideCardBatch(doc.getDocId()).ifPresent(chain::setGuideCardBatch);
+                });
+        return chain;
+    }
+
+    private List<Cutter> getCuttersByDocId(String docId) {
+        return cutterMapper.selectList(new QueryWrapper<Cutter>().eq("doc_id", docId));
+    }
+
+    private Optional<GuideCardBatch> getLatestGuideCardBatch(String docId) {
+        List<GuideCardBatch> batches = guideCardBatchMapper.selectList(
+                new QueryWrapper<GuideCardBatch>()
+                        .eq("doc_id", docId)
+                        .orderByDesc("SUBSTRING(serial_number, LEN(serial_number)-3, 4)"));
+        return CollectionUtils.isEmpty(batches) ? Optional.empty() : Optional.of(batches.get(0));
+    }
+
+    private boolean isProcessType(DeviceType deviceType) {
+        return deviceType != null &&
+                Objects.equals(deviceType.getAttributionType(), DocAttributionTypeEnum.PROCESS.getCode());
+    }
+
+    private boolean isWorkSiteType(DeviceType deviceType) {
+        return deviceType != null &&
+                Objects.equals(deviceType.getAttributionType(), DocAttributionTypeEnum.WORKSITE.getCode());
+    }
+
+    private void traceProcessChain(ProcessTraceChain chain, String processId) {
+        ProcessStream process = processMapper.selectById(processId);
+        if (process == null) return;
+
+        chain.setProcess(process);
+        if (process.getPsvId() != null) {
+            ProcessSpecVersion psv = psvMapper.selectById(process.getPsvId());
+            chain.setProcessSpec(psv);
+            if (psv != null && psv.getPartsId() != null) {
+                PartsInfo parts = partsMapper.selectById(psv.getPartsId());
+                chain.setParts(parts);
+                if (parts != null && parts.getComponentId() != null) {
+                    chain.setComponentHierarchy(traceComponentHierarchy(parts.getComponentId()));
+                }
+            }
+        } else if (process.getComponentId() != null) {
+            chain.setComponentHierarchy(traceComponentHierarchy(process.getComponentId()));
+        }
+    }
+
+    private void traceWorkStepChain(ProcessTraceChain chain, String workStepId) {
+        WorkStep workStep = workStepMapper.selectById(workStepId);
+        if (workStep == null) return;
+
+        chain.setWorkStep(workStep);
+        traceProcessChain(chain, workStep.getProcessId());
+    }
+
+    private ComponentHierarchy traceComponentHierarchy(String componentId) {
+        ComponentHierarchy hierarchy = new ComponentHierarchy();
+        ComponentInfo current = componentMapper.selectById(componentId);
+
+        while (current != null) {
+            hierarchy.addComponentToTop(current);
+
+            if (current.getParentId() == null || current.getParentId().isEmpty()) {
+                Optional.ofNullable(current.getProductId())
+                        .map(productMapper::selectById)
+                        .ifPresent(hierarchy::setRootProduct);
+                break;
+            }
+
+            current = componentMapper.selectById(current.getParentId());
+        }
+
+        return hierarchy;
+    }
+
+    private void completeChainWithProductInfo(ProcessTraceChain chain) {
+        Optional.ofNullable(chain.getComponentHierarchy())
+                .map(ComponentHierarchy::getComponents)
+                .filter(components -> !components.isEmpty())
+                .map(components -> components.get(0))
+                .map(ComponentInfo::getProductId)
+                .map(productMapper::selectById)
+                .ifPresent(chain::setProduct);
+    }
+
+    private List<ProductMix> buildFullTreePath(ProcessTraceChain chain) {
+        List<ProductMix> path = new ArrayList<>();
+
+        Optional.ofNullable(chain.getProduct())
+                .map(ProductInfo::getProductId)
+                .map(productMixMapper::findByProductId)
+                .ifPresent(path::add);
+
+        Optional.ofNullable(chain.getComponentHierarchy())
+                .map(ComponentHierarchy::getComponentsFromTop)
+                .ifPresent(components -> components.stream()
+                        .map(ComponentInfo::getComponentId)
+                        .map(productMixMapper::findByComponentId)
+                        .filter(Objects::nonNull)
+                        .forEach(path::add));
+
+        Optional.ofNullable(chain.getParts())
+                .map(PartsInfo::getPartsId)
+                .map(productMixMapper::findByPartsId)
+                .ifPresent(path::add);
+
+        Optional.ofNullable(chain.getProcessSpec())
+                .map(ProcessSpecVersion::getId)
+                .map(productMixMapper::findByOperationId)
+                .ifPresent(path::add);
+
+        Optional.ofNullable(chain.getProcess())
+                .map(ProcessStream::getProcessId)
+                .map(productMixMapper::findByProcessId)
+                .ifPresent(path::add);
+
+        Optional.ofNullable(chain.getWorkStep())
+                .map(WorkStep::getId)
+                .map(productMixMapper::findByWorksiteId)
+                .ifPresent(path::add);
+
+        return path;
+    }
+
+    private List<PermissionStreamNew> buildFullTreePathPermission(List<ProductMix> productMixList) {
+        List<Long> ids=productMixList.stream().map(ProductMix::getId).collect(Collectors.toList());
+        List<PermissionStreamNew> path = permissionStreamNewService
+                .list(new QueryWrapper<PermissionStreamNew>().in("business_id",ids)
+                        .eq("delete_flag",0));
+        path.forEach(item->{
+            if (item.getDepartId()!=null){
+                item.setDepartId(mdcProductionService.getById(item.getDepartId()).getOrgCode());
+            }
+            if (item.getUserId()!=null){
+                item.setUserId(sysUserService.getById(item.getUserId()).getUsername());
+            }
+        });
+        return path;
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/PartsInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/PartsInfoServiceImpl.java
index bbc8d9a..931166f 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/PartsInfoServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/PartsInfoServiceImpl.java
@@ -151,8 +151,8 @@
         boolean b = super.updateById(partsInfo);
         //鍚屾淇敼缁撴瀯鏍�
         ProductMix productMix = productMixService.getById(Long.parseLong(id));
-        productMix.setName(partsInfo.getPartsName());
-        productMix.setCode(partsInfo.getPartsCode());
+        productMix.setTreeName(partsInfo.getPartsName());
+        productMix.setTreeCode(partsInfo.getPartsCode());
         productMixService.updateById(productMix);
         if(!b)
             return false;
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessPackageStrategy.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessPackageStrategy.java
new file mode 100644
index 0000000..b6cdfd5
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessPackageStrategy.java
@@ -0,0 +1,42 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import org.jeecg.modules.dnc.constant.DocAttributionTypeEnum;
+import org.jeecg.modules.dnc.dto.TransferPackage;
+import org.jeecg.modules.dnc.entity.DeviceType;
+import org.jeecg.modules.dnc.entity.DocRelative;
+import org.jeecg.modules.dnc.entity.ProcessStream;
+import org.jeecg.modules.dnc.mapper.DeviceTypeMapper;
+import org.jeecg.modules.dnc.mapper.DocRelativeMapper;
+import org.jeecg.modules.dnc.mapper.ProcessStreamMapper;
+import org.jeecg.modules.dnc.service.DataPackageStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProcessPackageStrategy implements DataPackageStrategy {
+    @Autowired
+    private ProcessStreamMapper processMapper;
+    @Autowired
+    private DeviceTypeMapper deviceTypeMapper;
+    @Autowired
+    private FullHierarchyTraceService traceService;
+    @Autowired
+    private DocRelativeMapper docRelativeMapper;
+
+    @Override
+    public TransferPackage packageData(String relativeId) {
+        DocRelative docRelative=docRelativeMapper.selectById(relativeId);
+        DeviceType deviceType=deviceTypeMapper.selectById(docRelative.getAttributionId());
+        if (deviceType!=null&&deviceType.getAttributionType().equals(DocAttributionTypeEnum.PROCESS.getCode())) {
+            ProcessStream process = processMapper.selectById(deviceType.getAttributionId());
+            if (process == null) {
+                throw new IllegalArgumentException("璁惧绫诲搴旂殑宸ュ簭涓嶅瓨鍦�: " + deviceType.getDeviceManagementId());
+            }
+        }
+        return TransferPackage.builder()
+                .dataType(TransferPackage.DataType.PROCESS)
+                .docRelative(docRelative)
+                .traceChain(traceService.traceFromProcess(docRelative))
+                .build();
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java
index 6ec4525..d0ce204 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java
@@ -205,8 +205,8 @@
         boolean b = super.updateById(processSpecVersion);
         //鍚屾淇敼缁撴瀯鏍�
         ProductMix productMix = productMixService.getById(Long.parseLong(id));
-        productMix.setName(processSpecVersion.getProcessSpecVersionName());
-        productMix.setCode(processSpecVersion.getProcessSpecVersionCode());
+        productMix.setTreeName(processSpecVersion.getProcessSpecVersionName());
+        productMix.setTreeCode(processSpecVersion.getProcessSpecVersionCode());
         productMixService.updateById(productMix);
         if(!b)
             return false;
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
index 82587b2..8b1fc58 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
@@ -61,7 +61,6 @@
     private IDocInfoService docInfoService;
     @Autowired
     private IDeviceTypeService deviceTypeService;
-
     @Override
     @Transactional(rollbackFor = {Exception.class})
     public boolean addProcessStream(ProcessStream stream) {
@@ -177,8 +176,8 @@
         boolean b = super.updateById(stream);
         //鍚屾淇敼缁撴瀯鏍�
         ProductMix productMix = productMixService.getById(Long.parseLong(id));
-        productMix.setName(stream.getProcessName());
-        productMix.setCode(stream.getProcessCode());
+        productMix.setTreeName(stream.getProcessName());
+        productMix.setTreeCode(stream.getProcessCode());
         productMixService.updateById(productMix);
         if(!b)
             ExceptionCast.cast(CommonCode.FAIL);
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentServiceImpl.java
similarity index 93%
rename from lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentService.java
rename to lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentServiceImpl.java
index 02ec1f9..208ecf1 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentServiceImpl.java
@@ -10,10 +10,11 @@
 import org.jeecg.modules.system.entity.MdcProduction;
 import org.springframework.stereotype.Service;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
-public class ProcessionDepartmentService extends ServiceImpl<ProcessionDepartmentMapper, ProcessionDepartment> implements IProcessionDepartmentService {
+public class ProcessionDepartmentServiceImpl extends ServiceImpl<ProcessionDepartmentMapper, ProcessionDepartment> implements IProcessionDepartmentService {
 
     @Override
     public boolean deleteByProcessId(String processId) {
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductInfoServiceImpl.java
index 0562ada..6a6c10f 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductInfoServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductInfoServiceImpl.java
@@ -164,8 +164,8 @@
         boolean b = super.updateById(productInfo);
         //鍚屾淇敼缁撴瀯鏍�
         ProductMix productMix = productMixService.getById(Long.parseLong(id));
-        productMix.setName(productInfo.getProductName());
-        productMix.setCode(productInfo.getProductNo());
+        productMix.setTreeName(productInfo.getProductName());
+        productMix.setTreeCode(productInfo.getProductNo());
         productMixService.updateById(productMix);
         if (!b)
             return false;
@@ -422,6 +422,7 @@
      * @param paramId      浜у搧鏍戣妭鐐筰d
      * @param relativeFlag 1 鏄� 2 鍚�
      * @param userIds      娣诲姞鐢ㄦ埛ids
+     * todo浼樺寲缁撴瀯锛岄噰鐢╩ix琛ㄨ繘琛岀埗瀛愰�掑綊鏌ヨ锛屽垎绫昏繘琛屾潈闄愬垎閰嶏紙鍗曡〃鏌ヨ锛�
      * @return
      */
     @Override
@@ -457,6 +458,7 @@
      * @param paramId       浜у搧鏍戣妭鐐筰d
      * @param relativeFlag  1 鏄� 2 鍚�
      * @param departmentIds 娣诲姞閮ㄩ棬ids
+     * todo浼樺寲缁撴瀯锛岄噰鐢╩ix琛ㄨ繘琛岀埗瀛愰�掑綊鏌ヨ锛屽垎绫昏繘琛屾潈闄愬垎閰嶏紙鍗曡〃鏌ヨ锛�
      * @return
      */
     @Override
@@ -492,6 +494,7 @@
      * @param paramId      浜у搧鏍戣妭鐐筰d
      * @param relativeFlag 1 鏄� 2 鍚�
      * @param userIds      绉婚櫎鐢ㄦ埛ids
+     * todo浼樺寲缁撴瀯锛岄噰鐢╩ix琛ㄨ繘琛岀埗瀛愰�掑綊鏌ヨ锛屽垎绫昏繘琛屾潈闄愬垎閰嶏紙鍗曡〃鏌ヨ锛�
      * @return
      */
     @Override
@@ -526,6 +529,7 @@
      * @param paramId       浜у搧鏍戣妭鐐筰d
      * @param relativeFlag  1 鏄� 2 鍚�
      * @param departmentIds 绉婚櫎閮ㄩ棬ids
+     * todo浼樺寲缁撴瀯锛岄噰鐢╩ix琛ㄨ繘琛岀埗瀛愰�掑綊鏌ヨ锛屽垎绫昏繘琛屾潈闄愬垎閰嶏紙鍗曡〃鏌ヨ锛�
      * @return
      */
     @Override
@@ -1179,31 +1183,37 @@
                         ProductInfo productInfo=this.getById(docInfo.getAttributionId());
                         docInfo.setNodeName(productInfo.getProductName());
                         docInfo.setNodeCode(productInfo.getProductNo());
+                        docInfo.setNodeId(productInfo.getProductId());
                         break;
                     case 2:
                         ComponentInfo componentInfo=componentInfoService.getById(docInfo.getAttributionId());
                         docInfo.setNodeName(componentInfo.getComponentName());
                         docInfo.setNodeCode(componentInfo.getComponentCode());
+                        docInfo.setNodeId(componentInfo.getComponentId());
                         break;
                     case 3:
                         PartsInfo partsInfo=partsInfoService.getById(docInfo.getAttributionId());
                         docInfo.setNodeCode(partsInfo.getPartsCode());
                         docInfo.setNodeName(partsInfo.getPartsName());
+                        docInfo.setNodeId(partsInfo.getPartsId());
                         break;
                     case 4:
                         ProcessSpecVersion processSpecVersion=processSpecVersionService.getById(docInfo.getAttributionId());
                         docInfo.setNodeName(processSpecVersion.getProcessSpecVersionName());
                         docInfo.setNodeCode(processSpecVersion.getProcessSpecVersionCode());
+                        docInfo.setNodeId(processSpecVersion.getId());
                         break;
                     case 5:
                         ProcessStream processStream=processStreamService.getById(docInfo.getAttributionId());
                         docInfo.setNodeName(processStream.getProcessName());
                         docInfo.setNodeCode(processStream.getProcessCode());
+                        docInfo.setNodeId(processStream.getProcessId());
                         break;
                     case 6:
                         WorkStep workStep=workStepService.getById(docInfo.getAttributionId());
                         docInfo.setNodeName(workStep.getStepName());
                         docInfo.setNodeCode(workStep.getStepName());
+                        docInfo.setNodeId(workStep.getId());
                         break;
                 }
             });
@@ -1225,11 +1235,13 @@
                     ProcessStream processStream=processStreamService.getById(deviceType.getAttributionId());
                     docInfo.setNodeName(processStream.getProcessName());
                     docInfo.setNodeCode(processStream.getProcessCode());
+                    docInfo.setNodeId(processStream.getProcessId());
                 }else {
                     //宸ユ涓嬬殑璁惧绫�
                     WorkStep workStep=workStepService.getById(deviceType.getAttributionId());
                     docInfo.setNodeName(workStep.getStepName());
                     docInfo.setNodeCode(workStep.getStepName());
+                    docInfo.setNodeId(workStep.getId());
                 }
             });
         }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductMixServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductMixServiceImpl.java
index 2d4824d..699b3a6 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductMixServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductMixServiceImpl.java
@@ -48,4 +48,67 @@
         result.sort(Comparator.comparing(ProductMix::getCreateTime, Comparator.nullsLast(Date::compareTo)));
         return result;
     }
+
+    @Override
+    public List<ProductMix> getParentList(String id) {
+        List<ProductMix> parentList = new ArrayList<>();
+        // 1. 鏍规嵁ID鏌ヨ褰撳墠鑺傜偣
+        ProductMix current = this.getById(id);
+        if (current == null) {
+            return parentList; // 鑺傜偣涓嶅瓨鍦ㄦ椂杩斿洖绌哄垪琛�
+        }
+        // 2. 浠庡綋鍓嶈妭鐐瑰紑濮嬪悜涓婃煡鎵剧埗鑺傜偣
+        Long parentId = current.getParentId();
+        while ( parentId != 0L) {
+            ProductMix parent = this.getById(parentId.toString());
+            if (parent == null) {
+                break;
+            }
+            parentList.add(parent);
+            parentId = parent.getParentId();
+        }
+
+        return parentList;
+    }
+
+    @Override
+    public List<ProductMix> getChildrenList(String id) {
+        List<ProductMix> childrenList = new ArrayList<>();
+        ProductMix current = this.getById(id);
+        if (current == null) {
+            return childrenList;
+        }
+
+        // 浣跨敤闃熷垪杩涜BFS
+        Queue<ProductMix> queue = new LinkedList<>();
+        queue.add(current); // 鍔犲叆褰撳墠鑺傜偣浣滀负璧风偣
+
+        // 璁板綍宸茶闂妭鐐圭殑ID锛岄伩鍏嶅惊鐜紩鐢�
+        Set<String> visited = new HashSet<>();
+        visited.add(id); // 璧峰鑺傜偣宸茶闂�
+
+        while (!queue.isEmpty()) {
+            ProductMix node = queue.poll();
+            // 璺宠繃璧峰鑺傜偣锛堝嵆浼犲叆鐨勮妭鐐癸級锛屼笉鍔犲叆缁撴灉鍒楄〃
+            if (!node.getId().toString().equals(id)) {
+                childrenList.add(node);
+            }
+
+            // 鏌ヨ褰撳墠鑺傜偣鐨勭洿鎺ュ瓙鑺傜偣
+            List<ProductMix> directChildren = this.lambdaQuery().eq(ProductMix::getParentId, node.getId()).list();
+            if (directChildren != null && !directChildren.isEmpty()) {
+                for (ProductMix child : directChildren) {
+                    String childId = child.getId().toString();
+                    // 濡傛灉璇ュ瓙鑺傜偣杩樻湭璁块棶杩�
+                    if (!visited.contains(childId)) {
+                        visited.add(childId);
+                        queue.add(child);
+                    }
+                    // 鍚﹀垯蹇界暐锛岄伩鍏嶅惊鐜紩鐢ㄥ鑷寸殑姝诲惊鐜�
+                }
+            }
+        }
+        return childrenList;
+    }
+
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java
index e799e3a..add7b3d 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java
@@ -143,7 +143,7 @@
                 break;
             default:
                 // 澶勭悊鏈煡绫诲瀷
-                throw new IllegalArgumentException("Unknown permission type: " + type);
+                throw new IllegalArgumentException("Unknown permission treeType: " + type);
         }
     }
 
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/SecurityService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/SecurityService.java
new file mode 100644
index 0000000..d43c5cb
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/SecurityService.java
@@ -0,0 +1,48 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.Security;
+
+@Service
+public class SecurityService {
+    private static final String ALGORITHM = "SM4/ECB/PKCS5Padding";
+    private final String secretKey;
+
+    static {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    @Autowired
+    public SecurityService(@Value("${security.encryption-key}") String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public byte[] encrypt(byte[] data) {
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
+            SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "SM4");
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
+            return cipher.doFinal(data);
+        } catch (Exception e) {
+            throw new RuntimeException("鍔犲瘑澶辫触", e);
+        }
+    }
+
+    public byte[] decrypt(byte[] encryptedData) {
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
+            SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "SM4");
+            cipher.init(Cipher.DECRYPT_MODE, keySpec);
+            return cipher.doFinal(encryptedData);
+        } catch (Exception e) {
+            throw new RuntimeException("瑙e瘑澶辫触", e);
+        }
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepPackageStrategy.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepPackageStrategy.java
new file mode 100644
index 0000000..8c9c1b8
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepPackageStrategy.java
@@ -0,0 +1,43 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import org.jeecg.modules.dnc.constant.DocAttributionTypeEnum;
+import org.jeecg.modules.dnc.dto.TransferPackage;
+import org.jeecg.modules.dnc.entity.DeviceType;
+import org.jeecg.modules.dnc.entity.DocRelative;
+import org.jeecg.modules.dnc.entity.WorkStep;
+import org.jeecg.modules.dnc.mapper.DeviceTypeMapper;
+import org.jeecg.modules.dnc.mapper.DocRelativeMapper;
+import org.jeecg.modules.dnc.mapper.WorkStepMapper;
+import org.jeecg.modules.dnc.service.DataPackageStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class WorkStepPackageStrategy implements DataPackageStrategy {
+    @Autowired
+    private WorkStepMapper workStepMapper;
+    @Autowired
+    private FullHierarchyTraceService traceService;
+    @Autowired
+    private DeviceTypeMapper deviceTypeMapper;
+    @Autowired
+    private DocRelativeMapper docRelativeMapper;
+
+    @Override
+    public TransferPackage packageData(String relativeId) {
+        DocRelative docRelative=docRelativeMapper.selectById(relativeId);
+        DeviceType deviceType=deviceTypeMapper.selectById(docRelative.getAttributionId());
+        if (deviceType!=null&&deviceType.getAttributionType().equals(DocAttributionTypeEnum.WORKSITE.getCode())) {
+            WorkStep workStep = workStepMapper.selectById(deviceType.getAttributionId());
+            if (workStep == null) {
+                throw new IllegalArgumentException("璁惧绫诲搴旂殑宸ユ涓嶅瓨鍦�: " + deviceType.getDeviceManagementId());
+            }
+        }
+        return TransferPackage.builder()
+                .dataType(TransferPackage.DataType.WORKSTEP)
+                .docRelative(docRelative)
+                .traceChain(traceService.traceFromWorkStep(docRelative))
+                .build();
+    }
+}
+
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java
index d11f96c..37623aa 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java
@@ -175,8 +175,8 @@
             ExceptionCast.cast(ProcessInfoCode.WORKSTEP_NOT_EXIST);
         //鍚屾淇敼缁撴瀯鏍�
         ProductMix productMix = productMixService.getById(Long.parseLong(id));
-        productMix.setName(workStep.getStepName());
-        productMix.setCode(workStep.getStepCode());
+        productMix.setTreeName(workStep.getStepName());
+        productMix.setTreeCode(workStep.getStepCode());
         productMixService.updateById(productMix);
         return super.updateById(workStep);
     }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/CompressionUtils.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/CompressionUtils.java
new file mode 100644
index 0000000..1ce5f44
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/CompressionUtils.java
@@ -0,0 +1,35 @@
+package org.jeecg.modules.dnc.utils;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+public class CompressionUtils {
+    public static byte[] gzipCompress(byte[] data) {
+        try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
+             GZIPOutputStream gzip = new GZIPOutputStream(bos)) {
+            gzip.write(data);
+            gzip.finish();
+            return bos.toByteArray();
+        } catch (IOException e) {
+            throw new RuntimeException("GZIP鍘嬬缉澶辫触", e);
+        }
+    }
+
+    public static byte[] gzipDecompress(byte[] compressed) {
+        try (ByteArrayInputStream bis = new ByteArrayInputStream(compressed);
+             GZIPInputStream gzip = new GZIPInputStream(bis);
+             ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+            byte[] buffer = new byte[1024];
+            int len;
+            while ((len = gzip.read(buffer)) > 0) {
+                bos.write(buffer, 0, len);
+            }
+            return bos.toByteArray();
+        } catch (IOException e) {
+            throw new RuntimeException("GZIP瑙e帇澶辫触", e);
+        }
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/JsonUtils.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/JsonUtils.java
new file mode 100644
index 0000000..74254cb
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/JsonUtils.java
@@ -0,0 +1,48 @@
+package org.jeecg.modules.dnc.utils;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import java.text.SimpleDateFormat;
+
+public class JsonUtils {
+    private static final ObjectMapper objectMapper = createObjectMapper();
+
+    private static ObjectMapper createObjectMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+
+        // 閰嶇疆鏃ユ湡鏍煎紡
+        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+        mapper.registerModule(new JavaTimeModule());
+        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+
+        // 閰嶇疆搴忓垪鍖栭�夐」
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+        // 閰嶇疆鍙嶅簭鍒楀寲閫夐」
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+        mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
+
+        return mapper;
+    }
+
+    public static String toJson(Object object) {
+        try {
+            return objectMapper.writeValueAsString(object);
+        } catch (Exception e) {
+            throw new RuntimeException("JSON搴忓垪鍖栧け璐�: " + e.getMessage(), e);
+        }
+    }
+
+    public static <T> T fromJson(String json, Class<T> valueType) {
+        try {
+            return objectMapper.readValue(json, valueType);
+        } catch (Exception e) {
+            throw new RuntimeException("JSON鍙嶅簭鍒楀寲澶辫触: " + e.getMessage() + "\nJSON鍐呭: " + json, e);
+        }
+    }
+}
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java
index 6a2c903..7397986 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java
@@ -108,8 +108,8 @@
             ProductMix newNode = new ProductMix(
                     node.getId(),
                     node.getParentId(),
-                    node.getName(),
-                    node.getCode(),
+                    node.getTreeName(),
+                    node.getTreeCode(),
                     node.getType(),
                     node.getCreateTime()
             );
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
index dc0ef87..806a4a8 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.dnc.entity.DocFile;
 import org.jeecg.modules.dnc.response.QueryPageResponseResult;
 import org.jeecg.modules.dncFlow.entity.AssignFileStream;
 import org.jeecg.modules.dncFlow.ext.AssignFileStreamExt;
@@ -9,6 +10,7 @@
 import org.jeecg.modules.dncFlow.request.AssignFileRequest;
 import org.jeecg.modules.dncFlow.request.AssignFileStreamQueryRequest;
 import org.jeecg.modules.dncFlow.vo.AssignFlowTaskVo;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
 
 public interface IAssignFileStreamService extends IService<AssignFileStream> {
     /**
@@ -41,9 +43,7 @@
 
     /**
      * 瀹℃壒鏈嶅姟
-     * @param taskId
-     * @param streamId
-     * @param stream
+     * @param assignFlowTaskVo
      * @return
      */
     boolean approveAssignFile(AssignFlowTaskVo assignFlowTaskVo);
@@ -84,4 +84,6 @@
      * @return
      */
     Boolean getFlowableEnable();
+
+    void handleFileTransfer(MdcEquipment mdcEquipment, DocFile docFile);
 }
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
index 70ab35e..036ac42 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
@@ -16,11 +16,14 @@
 import org.flowable.task.api.Task;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.dnc.constant.DncPassLogPassType;
+import org.jeecg.modules.dnc.constant.DocAttributionTypeEnum;
+import org.jeecg.modules.dnc.dto.TransferPackage;
 import org.jeecg.modules.dnc.entity.*;
 import org.jeecg.modules.dnc.exception.ExceptionCast;
-import org.jeecg.modules.dnc.ext.NcTxtFilePathInfo;
 import org.jeecg.modules.dnc.response.*;
 import org.jeecg.modules.dnc.service.*;
+import org.jeecg.modules.dnc.service.impl.FileFerryService;
 import org.jeecg.modules.dnc.utils.ValidateUtil;
 import org.jeecg.modules.dnc.utils.date.DateUtil;
 import org.jeecg.modules.dnc.utils.file.FileUtilS;
@@ -42,7 +45,6 @@
 import org.jeecg.modules.flowable.service.IFlowTaskService;
 import org.jeecg.modules.mdc.entity.MdcEquipment;
 import org.jeecg.modules.mdc.service.IMdcEquipmentService;
-import org.jeecg.modules.message.enums.DeployEnum;
 import org.jeecg.modules.system.service.IMdcProductionService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,23 +53,17 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.io.IOException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service("IAssignFileStreamService")
 public class AssignFileStreamServiceImpl extends ServiceImpl<AssignFileStreamMapper, AssignFileStream> implements IAssignFileStreamService , FlowCallBackServiceI {
     private static final String PROCESS_KEY = "assign_nc_to_device";
-    private static final String APPLY_VARIABLE = "apply_user";
-    private static final String APPROVE_VARIABLE = "approve_users";
     private static final String SEND_CODE = "SEND";
-
     @Value("${flowable.enable}")
     private Boolean flowableEnable;
-
+    @Value("${fileHomePath}")
+    private String fileHomePath;
     @Autowired
     private IDocInfoService docInfoService;
     @Autowired
@@ -98,11 +94,10 @@
     private PermissionService permissionService;
     @Autowired
     private IDncPassLogService dncPassLogService;
-    @Value("${deploy.deployType}")
-    private String deployType;    //宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓哄伐鎺х綉 1涓烘秹瀵嗙綉
     @Value("${deploy.secretFolder}")
     private String secretFolder;    //娑夊瘑缃戜紶杈搉c鏂囦欢澶�
-
+    @Autowired
+    private FileFerryService ferryService;
     @Override
     @Transactional(rollbackFor = {Exception.class})
     public Result applyAssignFile(AssignFileStream stream) {
@@ -253,11 +248,19 @@
             }
 
         }
-        handleFileTransfer(mdcEquipment, docFile);
-        //娉ㄦ剰----鍖哄垎宸ユ帶缃戜笌娑夊瘑缃戯紒锛侊紒  娑夊瘑缃戣繘琛孨C鏂囦欢鐨勬嫹璐濓紝宸ユ帶缃戣礋璐h繘琛岃В鏋怤C鏂囦欢
-        if (deployType.equals(DeployEnum.SMW.getCode())) {
-            handleFileProcessing(docFile, mdcEquipment, secretFolder);
+        List<DocRelative> docRelativeList=docRelativeService.
+                list(new QueryWrapper<DocRelative>()
+                        .eq("attribution_type",stream.getAttributionType())
+                        .eq("attribution_id",stream.getAttributionId())
+                        .eq("doc_id",stream.getDocId()));
+        if (docRelativeList.isEmpty()){
+            ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
         }
+        handleFileTransfer(mdcEquipment, docFile);
+        //NC鏂囦欢鐨勬嫹璐�
+        handleFileProcessing(docFile, mdcEquipment, secretFolder);
+        //瀵瑰簲浜у搧缁撴瀯鏍戞嫹璐�
+        handleProductTree(docInfo,docRelativeList.get(0),mdcEquipment.getEquipmentId());
         synchronizedFlagService.updateFlag(2);
         return Result.OK("鎿嶄綔鎴愬姛");
     }
@@ -383,10 +386,20 @@
                     }
                 }
             }
-            //娉ㄦ剰----鍖哄垎宸ユ帶缃戜笌娑夊瘑缃戯紒锛侊紒  娑夊瘑缃戣繘琛孨C鏂囦欢鐨勬嫹璐濓紝宸ユ帶缃戣礋璐h繘琛岃В鏋怤C鏂囦欢
-            if (deployType.equals(DeployEnum.SMW.getCode())) {
-                handleFileProcessing(docFile, mdcEquipment, secretFolder);
+            List<DocRelative> docRelativeList=docRelativeService.
+                    list(new QueryWrapper<DocRelative>()
+                            .eq("attribution_type",en.getAttributionType())
+                            .eq("attribution_id",en.getAttributionId())
+                            .eq("doc_id",en.getDocId()));
+            if (docRelativeList.isEmpty()){
+                ExceptionCast.cast(ActivitiCode.ACT_APPROVE_ERROR);
             }
+            //娑夊瘑缃戣繘琛孨C鏂囦欢鐨勬嫹璐�
+            handleFileTransfer(mdcEquipment, docFile);
+            //NC鏂囦欢鐨勬嫹璐�
+            handleFileProcessing(docFile, mdcEquipment, secretFolder);
+            //瀵瑰簲浜у搧缁撴瀯鏍戞嫹璐�
+            handleProductTree(docInfo,docRelativeList.get(0),mdcEquipment.getEquipmentId());
             return synchronizedFlagService.updateFlag(1);
         }else if(up.getStatus() == 3) {
             //鎷掔粷鎿嶄綔 浠�涔堜篃涓嶅仛
@@ -579,7 +592,8 @@
     }
 
     //鎻掑叆鏂囦欢浼犺緭浠诲姟琛�
-    private void handleFileTransfer(MdcEquipment mdcEquipment, DocFile docFile) {
+    @Override
+    public void handleFileTransfer(MdcEquipment mdcEquipment, DocFile docFile) {
         List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
         if (strings != null && !strings.isEmpty()) {
             String path = StringUtils.join(strings.toArray(), "/");
@@ -600,7 +614,6 @@
     //灏佽澶勭悊鏂囦欢
     private void handleFileProcessing(DocFile docFile, MdcEquipment mdcEquipment, String secretFolder) {
         if (!docFile.getFileSuffix().equals("zip") && !docFile.getFileSuffix().equals("rar")) {
-            String size = FileUtilS.fileSizeNC(docFile.getFilePath(), docFile.getFileEncodeName());
             List<String> strings = iMdcProductionService.findListParentTreeAll(mdcEquipment.getId());
             if (strings != null && !strings.isEmpty()) {
                 DncPassLog passInfoTxt = new DncPassLog();
@@ -611,23 +624,14 @@
                 /*鏌ヨ鏈�鍚庝竴鏉¤褰�*/
                 //浼戠湢 500姣
                 DncPassLog dncPassLog  = dncPassLogService.findDayTime(DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY));
-                int fileTxt = 0, fileNc =0;
+                int fileNc =0;
                 if (dncPassLog !=null) {
-                    fileTxt = dncPassLog.getSequenceNumber() + 1;
+                    fileNc = dncPassLog.getSequenceNumber() + 1;
                 } else {
-                    fileTxt =  1;
+                    fileNc =  1;
                 }
-                fileNc = fileTxt + 1;
                 //澶勭悊鏂囦欢鍚嶇О  鏂囦欢璺緞
-                String sequence = String.format("%06d",fileTxt);
                 String sequenceNc = String.format("%06d",fileNc);
-                passInfoTxt.setSequenceNumber(fileTxt);
-                passInfoTxt.setSequenceOrder(sequence);
-                passInfoTxt.setCreateTime(dateFirst);
-                System.out.println(DateUtil.format(dateFirst,DateUtil.STR_DATE_TIME));
-                passInfoTxt.setPassType("02");
-                dncPassLogService.save(passInfoTxt);
-
                 DncPassLog passInfoNc = new DncPassLog();
                 passInfoNc.setSequenceNumber(fileNc);
                 passInfoNc.setSequenceOrder(sequenceNc);
@@ -642,41 +646,50 @@
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
-
                 dncPassLogService.save(passInfoNc);
-                NcTxtFilePathInfo ncTxt = new NcTxtFilePathInfo();
-                ncTxt.setEquipmentId(mdcEquipment.getEquipmentId());
-                ncTxt.setFileNcName("10A"+DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY)+sequenceNc);
-                ncTxt.setFileTxtName("10A"+DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY)+sequence);
-                ncTxt.setFilePath(path + "/" + mdcEquipment.getEquipmentId() + "/");
-                ncTxt.setOrigFileName(docFile.getFileName());
-                ncTxt.setOrigFileSuffix(docFile.getFileSuffix());
-                ncTxt.setFileAddOrDelete(1);
-                String loFilePath = secretFolder +"/"+ ncTxt.getFileTxtName() + ".nc";
-                try {
-                    String allList = ncTxt.getFileTxtName() + "\n"
-                            + ncTxt.getFileNcName() + "\n"
-                            + ncTxt.getOrigFileName() + "\n"
-                            + ncTxt.getOrigFileSuffix() + "\n"
-                            + ncTxt.getFilePath() + "\n"
-                            + ncTxt.getEquipmentId() + "\n"
-                            + ncTxt.getFileAddOrDelete().toString() + "\n"
-                            + size + "\n";
-                    FileUtilS.fileWriterSql(loFilePath, allList);
-                    boolean copyFileNc = FileUtilS.copyFileUpName(path + "/" + mdcEquipment.getEquipmentId() + "/send/" +
-                                    docFile.getFileName(),
-                            secretFolder +"/"+ncTxt.getFileNcName(),
-                            docFile.getFileSuffix(), "NC");
-                    if (!copyFileNc) {
-                        FileUtilS.deleteNcFile(loFilePath);
-                    }
-                } catch (IOException e) {
-                    throw new RuntimeException("鏂囦欢澶勭悊澶辫触", e);
-                }
+                FileUtilS.copyFileUpName(path + "/" + mdcEquipment.getEquipmentId() + "/send/" +
+                                docFile.getFileName(),
+                        secretFolder +"/"+"10A"+DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY)+sequenceNc+"_"+mdcEquipment.getEquipmentId(),
+                        docFile.getFileSuffix(), "NC");
             }
         }
     }
 
+    /**
+     * 澶勭悊瀵瑰簲浜у搧缁撴瀯鏍戙�乶c鏂囦欢銆佸垁鍏峰垪琛ㄣ�佺▼搴忓姞宸ョ‘璁よ〃灏佽
+     * @param docInfo
+     */
+    private void handleProductTree(DocInfo docInfo,DocRelative docRelative,String equipmentId) {
+        /*鏌ヨ鏈�鍚庝竴鏉¤褰�*/
+        //浼戠湢 500姣
+        DncPassLog passInfoTxt = new DncPassLog();
+        Date dateFirst = DateUtil.getNow();
+        passInfoTxt.setDayTime(DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY));
+        DncPassLog dncPassLog  = dncPassLogService.findDayTime(DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY));
+        int fileTxt = 0, fileNc =0;
+        if (dncPassLog !=null) {
+            fileTxt = dncPassLog.getSequenceNumber() + 1;
+        } else {
+            fileTxt =  1;
+        }
+        String sequence = String.format("%06d",fileTxt);
+        passInfoTxt.setSequenceNumber(fileTxt);
+        passInfoTxt.setCreateTime(dateFirst);
+        passInfoTxt.setSequenceOrder(sequence);
+        System.out.println(DateUtil.format(dateFirst,DateUtil.STR_DATE_TIME));
+        passInfoTxt.setPassType(DncPassLogPassType.PRODUCTSTRUCTURE.getCode());
+        dncPassLogService.save(passInfoTxt);
+        String fileName="10A"+DateUtil.format(dateFirst,DateUtil.STR_YEARMONTHDAY);
+        if (Objects.equals(docInfo.getAttributionType(), DocAttributionTypeEnum.PROCESS.getCode())){
+            //宸ュ簭瀵瑰簲璁惧绫�
+            String filePath = ferryService.exportData(TransferPackage.DataType.PROCESS, docRelative.getId(),fileName+sequence+"_"+equipmentId+".ferry");
+            System.out.println("宸ュ簭鏁版嵁宸插鍑�: " + filePath);
+        }else {
+            //宸ユ瀵瑰簲璁惧绫�
+            String filePath = ferryService.exportData(TransferPackage.DataType.WORKSTEP, docRelative.getId(),fileName+sequence+"_"+equipmentId+".ferry");
+            System.out.println("宸ユ鏁版嵁宸插鍑�: " + filePath);
+        }
+    }
     @Override
     public void afterFlowHandle(FlowMyBusiness business) {
         business.getTaskNameId();//鎺ヤ笅鏉ュ鎵圭殑鑺傜偣
diff --git a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
index e588f05..0cae0d9 100644
--- a/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
+++ b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/aspect/EquipmentHistoryLogAspect.java
@@ -100,8 +100,28 @@
                 }
                 break;
             case SECOND_MAINTENANCE:
+                if (result instanceof EamSecondMaintenanceOrder) {
+                    EamSecondMaintenanceOrder order = (EamSecondMaintenanceOrder) result;
+                    if (SecondMaintenanceStatusEnum.COMPLETE.name().equals(order.getMaintenanceStatus())) {
+                        log.setEquipmentId(order.getEquipmentId());
+                        log.setBusinessId(order.getId());
+                        log.setOperator(order.getOperator());
+                        log.setDescription(order.getConfirmComment());
+                        log.setCreateTime(order.getActualEndTime());
+                    }
+                }
                 break;
             case THIRD_MAINTENANCE:
+                if (result instanceof EamThirdMaintenanceOrder) {
+                    EamThirdMaintenanceOrder order = (EamThirdMaintenanceOrder) result;
+                    if (ThirdMaintenanceStatusEnum.COMPLETE.name().equals(order.getMaintenanceStatus())) {
+                        log.setEquipmentId(order.getEquipmentId());
+                        log.setBusinessId(order.getId());
+                        log.setOperator(order.getOperator());
+                        log.setDescription(order.getLeaderConfirmComment());
+                        log.setCreateTime(order.getActualEndTime());
+                    }
+                }
                 break;
             case REPORT_REPAIR:
                 if (result instanceof EamReportRepair) {
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrder.java
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java b/lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java
similarity index 100%
rename from lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java
rename to lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamThirdMaintenanceOrder.java
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java
index f7873d5..b2e6977 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipment.java
@@ -164,6 +164,12 @@
     @ApiModelProperty(value = "鏄惁MDC璁惧")
     private String deviceTypeMdc;
 
+    /**
+     * 璁惧鍥剧墖
+     */
+    @ApiModelProperty(value = "璁惧鍥剧墖")
+    private String equipmentImage;
+
     /**閮ㄩ棬鍚嶇О*/
     @Excel(name = "閮ㄩ棬鍚嶇О", width = 15)
     private transient String orgCodeTxt;
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
index 3d0755f..4e876b7 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentMapper.xml
@@ -106,19 +106,34 @@
     <!--鏌ヨ璁惧鐩戞帶淇℃伅-->
     <select id="checkStatusFromEquipmentIds" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentMonitor">
         SELECT
-            t1.equipment_id,
-            t2.CollectTime,
-            t1.equipment_name,
-            t2.Oporation,
-            t1.id,
-            t1.equipment_status,
-            t1.equipment_type equipmentType,
-            t3.equipment_type_pictures
+          t1.equipment_id,
+          t2.CollectTime,
+          t1.equipment_name,
+        CASE
+
+            WHEN repair.count > 0 THEN
+            '5' ELSE t2.Oporation
+          END AS Oporation,
+          t1.id,
+          t1.equipment_status,
+          t1.equipment_type equipmentType,
+          t1.equipment_image equipmentTypePictures
+
         FROM
-            mdc_equipment t1
-            LEFT JOIN Equipment t2 ON t1.equipment_id = t2.EquipmentID
-            LEFT JOIN mdc_equipment_type t3 ON t1.equipment_type = t3.equipment_type_name
-        WHERE equipment_id IN
+          mdc_equipment t1
+          LEFT JOIN Equipment t2 ON t1.equipment_id = t2.EquipmentID
+          LEFT JOIN (
+            SELECT
+              e1.equipment_code,
+              COUNT(1) COUNT
+            FROM
+              eam_report_repair r1
+              INNER JOIN eam_equipment e1 ON e1.id = r1.equipment_id
+            WHERE
+              r1.report_status NOT IN ('COMPLETE', 'ABOLISH')
+          GROUP BY
+            e1.equipment_code) repair ON repair.equipment_code = t1.equipment_id
+        WHERE t1.equipment_id IN
         <foreach collection="equipmentIds" index="index" item="id" open="(" separator="," close=")">
             #{id}
         </foreach>
diff --git a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
index c4d6284..49944e5 100644
--- a/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
+++ b/lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -430,6 +430,9 @@
                         case 22:
                             mdcEquipmentMonitor.setOporationDict("鎶ヨ");
                             break;
+                        case 5:
+                            mdcEquipmentMonitor.setOporationDict("鏁呴殰");
+                            break;
                         default:
                             mdcEquipmentMonitor.setOporationDict("鍏虫満");
                             break;
@@ -1049,7 +1052,7 @@
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String userId = user.getId();
         if (StringUtils.isNotEmpty(user.getEquipmentIds())) {
-            return this.baseMapper.selectList(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA))));
+            return this.baseMapper.selectList(new LambdaQueryWrapper<MdcEquipment>().in(MdcEquipment::getEquipmentId, Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA))));
         }
         //鑾峰彇鎵�鏈変骇绾挎暟鎹�
         List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder));
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
index 909ed5c..61d23bc 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/controller/DtBoardController.java
@@ -85,11 +85,19 @@
         return Result.OK(result);
     }
 
-//    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰")
-//    @GetMapping("/equAlarmList")
-//    public Result<?> equAlarmList(@ApiParam(value = "productionId", required = true) String productionId) {
-//        dtBoardService.
-//    }
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧鏁呴殰")
+    @GetMapping("/equRepairList")
+    public Result<?> equRepairList(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquRepair> result = dtBoardService.equRepairList(productionId);
+        return Result.OK(result);
+    }
+
+    @ApiOperation(value = "鏁板瓧瀛敓鐪嬫澘-璁惧瀹夌伅淇℃伅", notes = "鏁板瓧瀛敓鐪嬫澘-璁惧瀹夌伅淇℃伅")
+    @GetMapping("/equAndonList")
+    public Result<?> equAndonList(@ApiParam(value = "productionId", required = true) String productionId) {
+        List<EquAndon> result = dtBoardService.equAndonList(productionId);
+        return Result.OK(result);
+    }
 
 
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java
new file mode 100644
index 0000000..12e64b6
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/DtBoardMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.board.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.board.vo.EquRepair;
+
+import java.util.List;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-11
+ * @Description:
+ */
+@Mapper
+public interface DtBoardMapper {
+    List<EquRepair> equRepairList(@Param("equipmentIdList") List<String> equipmentIdList, @Param("date") String date);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml
new file mode 100644
index 0000000..566cd4b
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/mapper/xml/DtBoardMapper.xml
@@ -0,0 +1,27 @@
+<?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="org.jeecg.modules.board.mapper.DtBoardMapper">
+
+    <select id="equRepairList" resultType="org.jeecg.modules.board.vo.EquRepair">
+        SELECT
+            t3.equipment_code equipmentId,
+            COUNT(*) faultNum,
+            ROUND(
+                    SUM(DATEDIFF(MINUTE, t2.fault_start_time, t1.actual_end_time)) / 60.0,
+                    2
+            ) faultTime
+        FROM
+            eam_repair_order t1
+                LEFT JOIN eam_report_repair t2 ON t1.report_id = t2.id
+                LEFT JOIN eam_equipment t3 ON t1.equipment_id = t3.id
+        WHERE
+            t1.repair_status = 'COMPLETE'
+            AND t2.fault_start_time > #{date}
+            AND t3.equipment_code IN
+            <foreach collection="equipmentIdList" item="id" index="index" open="(" close=")" separator=",">
+                #{ id }
+            </foreach>
+        GROUP BY
+            t3.equipment_code
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
index 07069e7..8133429 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/IDtBoardService.java
@@ -27,4 +27,9 @@
     List<EquDowntimeInfo> equDowntimeStatistics(String productionId);
 
     List<EquAlarm> equAlarmList(String productionId);
+
+    List<EquRepair> equRepairList(String productionId);
+
+    List<EquAndon> equAndonList(String productionId);
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
index bf79693..f6fc360 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/service/impl/DtBoardServiceImpl.java
@@ -5,8 +5,10 @@
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.board.mapper.DtBoardMapper;
 import org.jeecg.modules.board.service.IDtBoardService;
 import org.jeecg.modules.board.vo.*;
+import org.jeecg.modules.eam.service.IEamRepairOrderService;
 import org.jeecg.modules.mdc.constant.MdcConstant;
 import org.jeecg.modules.mdc.entity.*;
 import org.jeecg.modules.mdc.service.*;
@@ -14,12 +16,15 @@
 import org.jeecg.modules.system.entity.MdcProduction;
 import org.jeecg.modules.system.service.IMdcProductionService;
 import org.jeecg.modules.system.service.ISysDictService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -63,6 +68,12 @@
 
     @Resource
     private IMdcAlarmInfoService mdcAlarmInfoService;
+
+    @Resource
+    private DtBoardMapper dtBoardMapper;
+
+    @Resource
+    private IAndonOrderService andonOrderService;
 
     /**
      * 杞﹂棿淇℃伅
@@ -319,7 +330,7 @@
         if (equipmentIdList == null || equipmentIdList.isEmpty()) {
             return null;
         }
-        List<EquipmentAlarm> equipmentAlarmList =  equipmentAlarmService.list(new LambdaQueryWrapper<EquipmentAlarm>().in(EquipmentAlarm::getEquipmentid, equipmentIdList).orderByDesc(EquipmentAlarm::getCollecttime).isNotNull(EquipmentAlarm::getAlarmNo).last("TOP 15"));
+        List<EquipmentAlarm> equipmentAlarmList = equipmentAlarmService.equAlarmList(equipmentIdList);
         if (equipmentAlarmList == null || equipmentAlarmList.isEmpty()) {
             return null;
         }
@@ -337,4 +348,40 @@
         return result;
     }
 
+    /**
+     * 璁惧鏁呴殰
+     */
+    @Override
+    public List<EquRepair> equRepairList(String productionId) {
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return null;
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return null;
+        }
+        LocalDateTime currentDate = LocalDate.now().minusMonths(1).atStartOfDay();
+        String format = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        List<EquRepair> result = dtBoardMapper.equRepairList(equipmentIdList, format);
+        return result;
+    }
+
+    /**
+     * 璁惧瀹夌伅闂
+     */
+    @Override
+    public List<EquAndon> equAndonList(String productionId) {
+        List<String> proIds = mdcProductionService.findChildByProId(productionId);
+        if (proIds == null || proIds.isEmpty()) {
+            return null;
+        }
+        List<String> equipmentIdList = mdcEquipmentService.getEquIdsByProIds(proIds);
+        if (equipmentIdList == null || equipmentIdList.isEmpty()) {
+            return null;
+        }
+        List<EquAndon> result = andonOrderService.equAndonList(equipmentIdList);
+        return result;
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAndon.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAndon.java
new file mode 100644
index 0000000..78eb963
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquAndon.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-12
+ * @Description: 瀹夌伅淇℃伅
+ */
+@Data
+public class EquAndon {
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+    /**
+     * 瀹夌伅闂
+     */
+    private String andonInfo;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java
new file mode 100644
index 0000000..8122dfc
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/board/vo/EquRepair.java
@@ -0,0 +1,26 @@
+package org.jeecg.modules.board.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Lius
+ * @CreateTime: 2025-06-10
+ * @Description: 璁惧鏁呴殰
+ */
+@Data
+public class EquRepair {
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+    /**
+     *  鏁呴殰娆℃暟
+     */
+    private BigDecimal faultNum;
+    /**
+     * 鏁呴殰鏃堕暱
+     */
+    private BigDecimal faultTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java
new file mode 100644
index 0000000..a9a33ee
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/AndonOrderController.java
@@ -0,0 +1,44 @@
+package org.jeecg.modules.mdc.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+import org.jeecg.modules.mdc.service.IAndonOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+ /**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+@Api(tags="andon_order")
+@RestController
+@RequestMapping("/AndonOrder/andonOrder")
+@Slf4j
+public class AndonOrderController extends JeecgController<AndonOrder, IAndonOrderService> {
+	@Autowired
+	private IAndonOrderService andonOrderService;
+
+	 /**
+	  * 绋嬪簭鍛煎彨
+	  *
+	  * @param andonOrder
+	  * @return
+	  */
+	 @AutoLog(value = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨")
+	 @ApiOperation(value = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨", notes = "瀹夌伅宸ュ崟-绋嬪簭鍛煎彨")
+	 @PostMapping(value = "/procedureCall")
+	 public Result<?> procedureCall(@RequestBody AndonOrder andonOrder) {
+		 andonOrderService.procedureCall(andonOrder);
+		 return Result.OK("鍛煎彨鎴愬姛锛�");
+	 }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
index 482612f..f6aa15c 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchController.java
@@ -16,55 +16,56 @@
 /**
  * @Description: mdc_equipment_punch
  * @Author: jeecg-boot
- * @Date:   2025-06-09
+ * @Date: 2025-06-09
  * @Version: V1.0
  */
-@Api(tags="涓婁笅鐝墦鍗¤褰曡〃")
+@Api(tags = "涓婁笅鐝墦鍗¤褰曡〃")
 @RestController
 @RequestMapping("/mdcEquipmentPunch")
 @Slf4j
 public class MdcEquipmentPunchController extends JeecgController<MdcEquipmentPunch, IMdcEquipmentPunchService> {
-	@Autowired
-	private IMdcEquipmentPunchService mdcEquipmentPunchService;
+    @Autowired
+    private IMdcEquipmentPunchService mdcEquipmentPunchService;
 
-	private static final String msg = "鎵撳崱鎴愬姛锛�";
-	
-	/**
-	 * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌
-	 *
-	 * @return
-	 */
-	@ApiOperation(value="鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌", notes="鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌")
-	@GetMapping(value = "/list")
-	public Result<List<MdcEquipmentPunch>> queryList() {
-		return Result.OK(mdcEquipmentPunchService.queryList());
-	}
+    private static final String msg = "鎵撳崱鎴愬姛锛�";
 
-	/**
-	 *   涓婄彮鎵撳崱
-	 *
-	 * @param mdcEquipmentPunch
-	 * @return
-	 */
-	@AutoLog(value = "涓婄彮鎵撳崱")
-	@ApiOperation(value="涓婄彮鎵撳崱", notes="涓婄彮鎵撳崱")
-	@PostMapping(value = "/workUp")
-	public Result<String> workUp(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
-		mdcEquipmentPunchService.workUp(mdcEquipmentPunch);
-		return Result.OK(msg);
-	}
+    /**
+     * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌
+     *
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌", notes = "鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌")
+    @GetMapping(value = "/list")
+    public Result<List<MdcEquipmentPunch>> queryList() {
+        return Result.OK(mdcEquipmentPunchService.queryList());
+    }
 
-	/**
-	 *   涓嬬彮鎵撳崱
-	 *
-	 * @param mdcEquipmentPunch
-	 * @return
-	 */
-	@AutoLog(value = "涓嬬彮鎵撳崱")
-	@ApiOperation(value="涓嬬彮鎵撳崱", notes="涓嬬彮鎵撳崱")
-	@PostMapping(value = "/workDown")
-	public Result<String> workDown(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
-		mdcEquipmentPunchService.workDown(mdcEquipmentPunch);
-		return Result.OK(msg);
-	}
+    /**
+     * 涓婄彮鎵撳崱
+     *
+     * @param mdcEquipmentPunch
+     * @return
+     */
+    @AutoLog(value = "涓婄彮鎵撳崱")
+    @ApiOperation(value = "涓婄彮鎵撳崱", notes = "涓婄彮鎵撳崱")
+    @PostMapping(value = "/workUp")
+    public Result<String> workUp(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
+        mdcEquipmentPunchService.workUp(mdcEquipmentPunch);
+        return Result.OK(msg);
+    }
+
+    /**
+     * 涓嬬彮鎵撳崱
+     *
+     * @param mdcEquipmentPunch
+     * @return
+     */
+    @AutoLog(value = "涓嬬彮鎵撳崱")
+    @ApiOperation(value = "涓嬬彮鎵撳崱", notes = "涓嬬彮鎵撳崱")
+    @PostMapping(value = "/workDown")
+    public Result<String> workDown(@RequestBody MdcEquipmentPunch mdcEquipmentPunch) {
+        mdcEquipmentPunchService.workDown(mdcEquipmentPunch);
+        return Result.OK(msg);
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchRateController.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchRateController.java
new file mode 100644
index 0000000..ac98d6b
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/controller/MdcEquipmentPunchRateController.java
@@ -0,0 +1,81 @@
+package org.jeecg.modules.mdc.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunchRate;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchRateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: mdc_equipment_punch_rate
+ * @Author: jeecg-boot
+ * @Date: 2025-06-09
+ * @Version: V1.0
+ */
+@Api(tags = "璁惧鎵撳崱鐜囨姤琛�")
+@RestController
+@RequestMapping("/mdcEquipmentPunchRate")
+@Slf4j
+public class MdcEquipmentPunchRateController extends JeecgController<MdcEquipmentPunchRate, IMdcEquipmentPunchRateService> {
+    @Autowired
+    private IMdcEquipmentPunchRateService mdcEquipmentPunchService;
+
+
+
+
+
+
+    /**
+     * 鍒嗛〉鍒楄〃鏌ヨ
+     *
+     * @param mdEquipmentPunch 鏌ヨ鍙傛暟
+     * @param pageNo           褰撳墠椤电爜
+     * @param pageSize         姣忛〉鏉℃暟
+     * @param req              璇锋眰瀵硅薄
+     * @return
+     */
+    @ApiOperation(value = "璁惧鎵撳崱鐜�-鍒嗛〉鍒楄〃鏌ヨ", notes = "璁惧鎵撳崱鐜�-鍒嗛〉鍒楄〃鏌ヨ")
+    @AutoLog(value = "璁惧鎵撳崱鐜�-鍒嗛〉鍒楄〃鏌ヨ")
+    @GetMapping(value = "/queryPageList")
+    public Result<IPage<MdcEquipmentPunchRate>> queryPageList(MdcEquipmentPunchRate mdEquipmentPunch,
+                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                          HttpServletRequest req) {
+
+        QueryWrapper<MdcEquipmentPunchRate> queryWrapper = QueryGenerator.initQueryWrapper(mdEquipmentPunch, req.getParameterMap());
+        Page<MdcEquipmentPunchRate> page = new Page<MdcEquipmentPunchRate>(pageNo, pageSize);
+        IPage<MdcEquipmentPunchRate> pageList = mdcEquipmentPunchService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+
+    /**
+     * 瀵煎嚭excel
+     *
+     * @param request
+     * @param mdcEquipmentPunchRate
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, MdcEquipmentPunchRate mdcEquipmentPunchRate) {
+        return super.exportXls(request, mdcEquipmentPunchRate, MdcEquipmentPunchRate.class, "璁惧鎵撳崱鐜囨姤琛�");
+    }
+
+
+
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentPunchExportDTO.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentPunchExportDTO.java
new file mode 100644
index 0000000..e86cad0
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/dto/MdcEquipmentPunchExportDTO.java
@@ -0,0 +1,98 @@
+package org.jeecg.modules.mdc.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import java.math.BigDecimal;
+import java.util.Date;
+@Data
+public class MdcEquipmentPunchExportDTO {
+
+
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+
+
+    @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛")
+    @Dict(dicCode = "id", dictTable = "sys_user", dicText = "realname")
+    private String punchUser;
+
+
+    @ApiModelProperty(value = "涓婄彮鏃堕棿")
+    private Date checkInTime;
+    /**
+     * 涓嬬彮鏃堕棿
+     */
+
+    @ApiModelProperty(value = "涓嬬彮鏃堕棿")
+    private Date checkOutTime;
+    /**
+     * 璁板綍鏃ユ湡
+     */
+
+    @ApiModelProperty(value = "璁板綍鏃ユ湡")
+    private String recordDate;
+
+
+    @ApiModelProperty(value = "鐝")
+    @Dict(dicCode = "shift_schedule")
+    private Integer shiftSchedule;
+
+
+    @ApiModelProperty(value = "鏄惁缂哄崱")
+    private Integer isAbsent;
+
+
+    @ApiModelProperty(value = "鏄惁杩熷埌")
+    private Integer isLate;
+
+
+    @ApiModelProperty(value = "鏄惁鏃╅��")
+    private Integer isEarly;
+
+
+    /**
+     * 鏃╃彮涓婄彮鎵撳崱鐜�
+     */
+
+
+    @ApiModelProperty(value = "鏃╃彮涓婄彮鎵撳崱鐜�")
+    private BigDecimal morningShiftInRate;
+
+    /**
+     * 鏅氱彮涓婄彮鎵撳崱鐜�
+     */
+
+    @ApiModelProperty(value = "鏅氱彮涓婄彮鎵撳崱鐜�")
+    private BigDecimal eveningShiftInRate;
+
+
+    @ApiModelProperty(value = "鏃╃彮涓嬬彮鎵撳崱鐜�")
+    private BigDecimal morningShiftOutRate;
+
+
+    @ApiModelProperty(value = "鏅氱彮涓嬬彮鎵撳崱鐜�")
+    private BigDecimal eveningShiftOutRate;
+
+
+    @ApiModelProperty(value = "鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺")
+    private Integer morningShiftInDeviceNum;
+
+
+    @ApiModelProperty(value = "鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺")
+    private Integer morningShiftOutDeviceNum;
+
+
+    @ApiModelProperty(value = "澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺")
+    private Integer eveningShiftInDeviceNum;
+
+    @ApiModelProperty(value = "澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺")
+    private Integer eveningShiftOutDeviceNum;
+
+    @ApiModelProperty(value = "璁惧鎬绘暟")
+    private Integer deviceCountNum;
+
+    private String punchUserRealName;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java
new file mode 100644
index 0000000..84d58c3
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/AndonOrder.java
@@ -0,0 +1,167 @@
+package org.jeecg.modules.mdc.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.constant.CommonConstant;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date: 2025-06-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("andon_order")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "andon_order瀵硅薄", description = "andon_order")
+public class AndonOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+    /**
+     * 鎵�灞炲巶鎴�
+     */
+    @Excel(name = "鎵�灞炲巶鎴�", width = 15)
+    @ApiModelProperty(value = "鎵�灞炲巶鎴�")
+    private String plantName;
+    /**
+     * 瀹夌伅绫诲瀷
+     */
+    @Excel(name = "瀹夌伅绫诲瀷", width = 15)
+    @ApiModelProperty(value = "瀹夌伅绫诲瀷")
+    @Dict(dicCode = "andon_type")
+    private String andonType;
+    /**
+     * 瀹夌伅浜�(鍛煎彨浜�)
+     */
+    @Excel(name = "瀹夌伅浜�", width = 15)
+    @ApiModelProperty(value = "瀹夌伅浜�")
+    private String operator;
+    /**
+     * 鍛煎彨鍘熷洜
+     */
+    @Excel(name = "鍛煎彨鍘熷洜", width = 15)
+    @ApiModelProperty(value = "鍛煎彨鍘熷洜")
+    private String callReason;
+    /**
+     * 瀹夌伅鏃堕棿
+     */
+    @Excel(name = "瀹夌伅鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "瀹夌伅鏃堕棿")
+    private Date operateTime;
+    /**
+     * 鍝嶅簲浜�(璐d换浜�)
+     */
+    @Excel(name = "鍝嶅簲浜�", width = 15)
+    @ApiModelProperty(value = "鍝嶅簲浜�")
+    private String responder;
+    /**
+     * 鍝嶅簲鏃堕棿
+     */
+    @Excel(name = "鍝嶅簲鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍝嶅簲鏃堕棿")
+    private Date responseTime;
+    /**
+     * 澶勭悊浜�
+     */
+    @Excel(name = "澶勭悊浜�", width = 15)
+    @ApiModelProperty(value = "澶勭悊浜�")
+    private String processor;
+    /**
+     * 澶勭悊瀹屾垚鏃堕棿
+     */
+    @Excel(name = "澶勭悊瀹屾垚鏃堕棿", width = 15, format = DatePattern.NORM_DATETIME_PATTERN)
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "澶勭悊瀹屾垚鏃堕棿")
+    private Date processTime;
+    /**
+     * 瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚
+     */
+    @Excel(name = "瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚", width = 15)
+    @ApiModelProperty(value = "瀹夌伅鐘舵��;寰呭搷搴斻�佸緟澶勭悊銆佸凡瀹屾垚")
+    @Dict(dicCode = "order_status")
+    private String orderStatus;
+    /**
+     * 闂鎻忚堪
+     */
+    @Excel(name = "闂鎻忚堪", width = 15)
+    @ApiModelProperty(value = "闂鎻忚堪")
+    private String problemDescreption;
+    /**
+     * 澶勭悊缁撴灉鎻忚堪
+     */
+    @Excel(name = "澶勭悊缁撴灉鎻忚堪", width = 15)
+    @ApiModelProperty(value = "澶勭悊缁撴灉鎻忚堪")
+    private String resolutionDescreption;
+    /**
+     * 澶勭悊缁撴灉鍥剧墖
+     */
+    @Excel(name = "澶勭悊缁撴灉鍥剧墖", width = 15)
+    @ApiModelProperty(value = "澶勭悊缁撴灉鍥剧墖")
+    private String imageFiles;
+    /**
+     * 鍒犻櫎鏍囪
+     */
+    @Excel(name = "鍒犻櫎鏍囪", width = 15)
+    @ApiModelProperty(value = "鍒犻櫎鏍囪")
+    @TableLogic
+    private Integer delFlag = CommonConstant.DEL_FLAG_0;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value = "鏇存柊浜�")
+    private String updateBy;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date updateTime;
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
index b64bcc4..9ae8010 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunch.java
@@ -1,22 +1,24 @@
 package org.jeecg.modules.mdc.entity;
 
-import java.io.Serializable;
-import java.util.Date;
-
 import cn.hutool.core.date.DatePattern;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import org.jeecg.common.aspect.annotation.Dict;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.jeecgframework.poi.excel.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecg.common.system.base.entity.JeecgEntity;
+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;
 
 /**
  * @Description: mdc_equipment_punch
@@ -29,7 +31,7 @@
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
 @ApiModel(value = "mdc_equipment_punch瀵硅薄", description = "mdc_equipment_punch")
-public class MdcEquipmentPunch implements Serializable {
+public class MdcEquipmentPunch extends JeecgEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -49,18 +51,18 @@
      */
     @Excel(name = "鎵撳崱鐢ㄦ埛", width = 15)
     @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛")
+    @Dict(dicCode = "id", dictTable = "sys_user", dicText = "realname")
     private String punchUser;
     /**
      * 鎵撳崱鐢ㄦ埛璐﹀彿
      */
-    @Excel(name = "鎵撳崱鐢ㄦ埛璐﹀彿", width = 15)
+
     @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛璐﹀彿")
     @TableField(exist = false)
     private String punchUserRealName;
     /**
      * 鎵撳崱鐢ㄦ埛鍚嶇О
      */
-    @Excel(name = "鎵撳崱鐢ㄦ埛鍚嶇О", width = 15)
     @ApiModelProperty(value = "鎵撳崱鐢ㄦ埛鍚嶇О")
     @TableField(exist = false)
     private String punchUserUserName;
@@ -87,7 +89,7 @@
     @ApiModelProperty(value = "璁板綍鏃ユ湡")
     private String recordDate;
     /**
-     * 鐝
+     *  鐝
      */
     @Excel(name = "鐝", width = 15)
     @ApiModelProperty(value = "鐝")
@@ -107,7 +109,7 @@
     @ApiModelProperty(value = "鏄惁缂哄崱")
     private Integer isAbsent;
     /**
-     * 鏄惁杩熷埌
+     * 鏄惁杩熷埌锛�0鏈棭閫�锛�1鏃╅��锛�
      */
     @Excel(name = "鏄惁杩熷埌", width = 15)
     @ApiModelProperty(value = "鏄惁杩熷埌")
@@ -118,28 +120,74 @@
     @Excel(name = "鏄惁鏃╅��", width = 15)
     @ApiModelProperty(value = "鏄惁鏃╅��")
     private Integer isEarly;
+
     /**
-     * 鍒涘缓浜�
+     * 鏃╃彮涓婄彮鎵撳崱鐜�
      */
-    @ApiModelProperty(value = "鍒涘缓浜�")
-    private String createBy;
+    @TableField(exist = false)
+    @Excel(name = "鏃╃彮涓婄彮鎵撳崱鐜�", width = 15)
+    @ApiModelProperty(value = "鏃╃彮涓婄彮鎵撳崱鐜�")
+    private BigDecimal morningShiftInRate;
+
     /**
-     * 鍒涘缓鏃堕棿
+     * 鏅氱彮涓婄彮鎵撳崱鐜�
      */
-    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
-    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
-    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    private Date createTime;
+    @TableField(exist = false)
+    @Excel(name = "鏅氱彮涓婄彮鎵撳崱鐜�", width = 15)
+    @ApiModelProperty(value = "鏅氱彮涓婄彮鎵撳崱鐜�")
+    private BigDecimal eveningShiftInRate;
+
     /**
-     * 鏇存柊浜�
+     * 鏃╃彮涓嬬彮鎵撳崱鐜�
      */
-    @ApiModelProperty(value = "鏇存柊浜�")
-    private String updateBy;
+    @TableField(exist = false)
+    @Excel(name = "鏃╃彮涓嬬彮鎵撳崱鐜�", width = 15)
+    @ApiModelProperty(value = "鏃╃彮涓嬬彮鎵撳崱鐜�")
+    private BigDecimal morningShiftOutRate;
+
     /**
-     * 鏇存柊鏃堕棿
+     * 鏅氱彮涓嬬彮鎵撳崱鐜�
      */
-    @JsonFormat(timezone = "GMT+8", pattern = DatePattern.NORM_DATETIME_PATTERN)
-    @DateTimeFormat(pattern = DatePattern.NORM_DATETIME_PATTERN)
-    @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    private Date updateTime;
+    @TableField(exist = false)
+    @Excel(name = "鏅氱彮涓嬬彮鎵撳崱鐜�", width = 15)
+    @ApiModelProperty(value = "鏅氱彮涓嬬彮鎵撳崱鐜�")
+    private BigDecimal eveningShiftOutRate;
+
+    /**
+     * 鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺
+     */
+    @TableField(exist = false)
+    @Excel(name = "鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺")
+    private Integer morningShiftInDeviceNum;
+
+    /**
+     * 鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺
+     */
+    @TableField(exist = false)
+    @Excel(name = "鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺")
+    private Integer morningShiftOutDeviceNum;
+    /**
+     * 澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺
+     */
+    @TableField(exist = false)
+    @Excel(name = "澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺")
+    private Integer eveningShiftInDeviceNum;
+    /**
+     * 澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺
+     */
+    @TableField(exist = false)
+    @Excel(name = "澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺")
+    private Integer eveningShiftOutDeviceNum;
+    /**
+     * 璁惧鎬绘暟
+     */
+    @TableField(exist = false)
+    @Excel(name = "璁惧鎬绘暟", width = 15)
+    @ApiModelProperty(value = "璁惧鎬绘暟")
+    private Integer deviceCountNum;
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunchRate.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunchRate.java
new file mode 100644
index 0000000..a77b65d
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcEquipmentPunchRate.java
@@ -0,0 +1,129 @@
+package org.jeecg.modules.mdc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecg.common.system.base.entity.JeecgEntity;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Description: mdc_equipment_punch_rate
+ * @Author: jeecg-boot
+ * @Date: 2025-06-09
+ * @Version: V1.0
+ */
+@Data
+@TableName("mdc_equipment_punch_rate")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "mdc_equipment_punch_rate瀵硅薄", description = "mdc_equipment_punch_rate")
+public class MdcEquipmentPunchRate extends JeecgEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * 璁惧缂栧彿
+     */
+    @Excel(name = "璁惧缂栧彿", width = 15)
+    @ApiModelProperty(value = "璁惧缂栧彿")
+    private String equipmentId;
+
+
+    /**
+     * 璁板綍鏃ユ湡
+     */
+    @Excel(name = "璁板綍鏃ユ湡", width = 15)
+    @ApiModelProperty(value = "璁板綍鏃ユ湡")
+    private String theDate;
+    /**
+     * 鐝
+     */
+    @Excel(name = "鐝", width = 15)
+    @ApiModelProperty(value = "鐝")
+    @Dict(dicCode = "shift_schedule")
+    private Integer shiftSchedule;
+
+    /**
+     * 鏃╃彮涓婄彮鎵撳崱鐜�
+     */
+  
+    @Excel(name = "鏃╃彮涓婄彮鎵撳崱鐜�(%)", width = 15)
+    @ApiModelProperty(value = "鏃╃彮涓婄彮鎵撳崱鐜�")
+    private BigDecimal mornShiftInRate;
+
+    /**
+     * 鏅氱彮涓婄彮鎵撳崱鐜�
+     */
+    
+    @Excel(name = "鏅氱彮涓婄彮鎵撳崱鐜�(%)", width = 15)
+    @ApiModelProperty(value = "鏅氱彮涓婄彮鎵撳崱鐜�")
+    private BigDecimal evenShiftInRate;
+
+    /**
+     * 鏃╃彮涓嬬彮鎵撳崱鐜�
+     */
+    
+    @Excel(name = "鏃╃彮涓嬬彮鎵撳崱鐜�(%)", width = 15)
+    @ApiModelProperty(value = "鏃╃彮涓嬬彮鎵撳崱鐜�")
+    private BigDecimal mornShiftOutRate;
+
+    /**
+     * 鏅氱彮涓嬬彮鎵撳崱鐜�
+     */
+    
+    @Excel(name = "鏅氱彮涓嬬彮鎵撳崱鐜�(%)", width = 15)
+    @ApiModelProperty(value = "鏅氱彮涓嬬彮鎵撳崱鐜�")
+    private BigDecimal evenShiftOutRate;
+
+    /**
+     * 鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺
+     */
+    
+    @Excel(name = "鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鐧界彮涓婄彮鎵撳崱璁惧鏁伴噺")
+    private Integer mornShiftInNum;
+
+    /**
+     * 鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺
+     */
+    
+    @Excel(name = "鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "鐧界彮涓嬬彮鎵撳崱璁惧鏁伴噺")
+    private Integer mornShiftOutNum;
+    /**
+     * 澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺
+     */
+    
+    @Excel(name = "澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "澶滅彮涓婄彮鎵撳崱璁惧鏁伴噺")
+    private Integer evenShiftInNum;
+    /**
+     * 澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺
+     */
+    
+    @Excel(name = "澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺", width = 15)
+    @ApiModelProperty(value = "澶滅彮涓嬬彮鎵撳崱璁惧鏁伴噺")
+    private Integer evenShiftOutNum;
+    /**
+     * 璁惧鎬绘暟
+     */
+    
+    @Excel(name = "璁惧鎬绘暟", width = 15)
+    @ApiModelProperty(value = "璁惧鎬绘暟")
+    private Integer deviceCountNum;
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/DailyPunchRateJob.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/DailyPunchRateJob.java
new file mode 100644
index 0000000..cff7388
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/DailyPunchRateJob.java
@@ -0,0 +1,108 @@
+
+package org.jeecg.modules.mdc.job;
+
+import cn.hutool.core.date.DatePattern;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchRateService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchService;
+import org.jeecg.modules.quartz.entity.QuartzJob;
+import org.jeecg.modules.quartz.entity.SysQuartzLog;
+import org.jeecg.modules.quartz.service.IQuartzJobService;
+import org.jeecg.modules.quartz.service.ISysQuartzLogService;
+import org.jeecg.modules.system.service.ISysAnnouncementService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 姣忔棩鍑屾櫒瀹氭椂璁$畻鍓嶄竴澶╃殑璁惧鎵撳崱鐜囷紝骞跺叆搴�
+ * @Author: Lius
+ * @CreateTime: 2025-06-12
+ */
+@Slf4j
+public class DailyPunchRateJob implements Job {
+
+    private String parameter; // 鍙�夊弬鏁帮細鎸囧畾鏃ユ湡锛堝 "2025-06-11"锛�
+
+    public void setParameter(String parameter) {
+        this.parameter = parameter;
+    }
+
+    @Resource
+    private IQuartzJobService quartzJobService;
+
+    @Resource
+    private ISysQuartzLogService sysQuartzLogService;
+
+    @Resource
+    private ISysAnnouncementService sysAnnouncementService;
+
+    @Resource
+    private IMdcEquipmentPunchService mdcEquipmentPunchService;
+
+
+    @Resource
+    private IMdcEquipmentPunchRateService mdcEquipmentPunchRateService;
+
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        SysQuartzLog quartzLog = new SysQuartzLog();
+        quartzLog.setCreateTime(new Date());
+
+        List<QuartzJob> jobList = this.quartzJobService.findByJobClassName(this.getClass().getName());
+        if (jobList != null && !jobList.isEmpty()) {
+            quartzLog.setJobId(jobList.get(0).getId());
+        }
+
+        log.info("銆愬紑濮嬫墽琛屾瘡鏃ヨ澶囨墦鍗$巼缁熻浠诲姟銆�");
+
+        long startTime = System.currentTimeMillis();
+
+        try {
+            String yesterdayStr;
+
+
+
+            if (parameter != null && !parameter.isEmpty()) {
+                yesterdayStr = parameter; // 鏀寔鎵嬪姩浼犲弬
+            } else {
+                LocalDate yesterday = LocalDate.now().minusDays(1);
+                 yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN)); // 鏍煎紡鍖栦负 "yyyy-MM-dd"
+            }
+            log.info("鉁� 鎴愬姛瀹屾垚姣忔棩璁惧鎵撳崱鐜囩粺璁℃暟鎹�", yesterdayStr);
+            // Step 1锛氳幏鍙栨槰鏃ユ墦鍗℃暟鎹�
+            List<MdcEquipmentPunch> punchRecords = mdcEquipmentPunchService.getYesterdayRecords(yesterdayStr);
+            log.info("鉁� 鎴愬姛瀹屾垚姣忔棩璁惧鎵撳崱鐜囩粺璁℃暟鎹�", punchRecords);
+            if (punchRecords == null || punchRecords.isEmpty()) {
+                log.warn("鈿狅笍 娌℃湁鎵惧埌鏄ㄦ棩璁惧鎵撳崱鏁版嵁");
+                quartzLog.setIsSuccess(0);
+                return;
+            }
+
+            // Step 2锛氫繚瀛樺埌鎵撳崱鐜囪〃
+            mdcEquipmentPunchRateService.savePunchRates(yesterdayStr, punchRecords);
+
+            quartzLog.setIsSuccess(0);
+            log.info("鉁� 鎴愬姛瀹屾垚姣忔棩璁惧鎵撳崱鐜囩粺璁★紝鍏卞鐞� {} 鏉¤褰曪紝鏃ユ湡锛歿}", punchRecords.size(), yesterdayStr);
+        } catch (Exception e) {
+            quartzLog.setIsSuccess(-1);
+            quartzLog.setExceptionDetail(e.getMessage());
+            log.error("鉂� 璁惧鎵撳崱鐜囩粺璁′换鍔℃墽琛屽け璐�", e);
+            sysAnnouncementService.jobSendMessage("璁惧鎵撳崱鐜囩粺璁′换鍔�", e.getMessage());
+        }
+
+        // 璁板綍鎵ц鏃堕棿
+        long endTime = System.currentTimeMillis();
+        quartzLog.setExecutionTime((int)(endTime - startTime));
+        sysQuartzLogService.save(quartzLog);
+    }
+
+}
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java
new file mode 100644
index 0000000..6224509
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/AndonOrderMapper.java
@@ -0,0 +1,18 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+
+import java.util.List;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+public interface AndonOrderMapper extends BaseMapper<AndonOrder> {
+
+    List<AndonOrder> equAndonList(@Param("equipmentIdList") List<String> equipmentIdList);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentAlarmMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentAlarmMapper.java
index 4bbcd26..629c89b 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentAlarmMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/EquipmentAlarmMapper.java
@@ -1,11 +1,15 @@
 package org.jeecg.modules.mdc.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.mdc.entity.EquipmentAlarm;
+
+import java.util.List;
 
 /**
  * @author: LiuS
  * @create: 2023-04-12 16:39
  */
 public interface EquipmentAlarmMapper extends BaseMapper<EquipmentAlarm> {
+    List<EquipmentAlarm> equAlarmList(@Param("equipmentIdList") List<String> equipmentIdList);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
index 3b45151..16091a2 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchMapper.java
@@ -15,4 +15,22 @@
 public interface MdcEquipmentPunchMapper extends BaseMapper<MdcEquipmentPunch> {
 
     List<MdcEquipmentPunch> list(@Param("equipmentIds") List<String> equipmentIds, @Param("date") String date);
+
+
+    // 鏌ヨ鏃╃彮涓婄彮鎵撳崱璁惧鏁�
+    int countMorningShiftIn(@Param("date") String date);
+
+    // 鏌ヨ鏅氱彮涓婄彮鎵撳崱璁惧鏁�
+    int countEveningShiftIn(@Param("date") String date);
+
+    // 鏌ヨ鏃╃彮涓嬬彮鎵撳崱璁惧鏁�
+    int countMorningShiftOut(@Param("date") String date);
+
+    // 鏌ヨ鏅氱彮涓嬬彮鎵撳崱璁惧鏁�
+    int countEveningShiftOut(@Param("date") String date);
+    /**
+     * 鑾峰彇鎵�鏈夎澶囨暟
+     */
+    int getTotalDeviceCount();
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchRateMapper.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchRateMapper.java
new file mode 100644
index 0000000..a80d853
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcEquipmentPunchRateMapper.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.mdc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunchRate;
+
+/**
+ * @Description: mdc_equipment_punch_rate
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface MdcEquipmentPunchRateMapper extends BaseMapper<MdcEquipmentPunchRate> {
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml
new file mode 100644
index 0000000..36ecafa
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/AndonOrderMapper.xml
@@ -0,0 +1,19 @@
+<?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="org.jeecg.modules.mdc.mapper.AndonOrderMapper">
+
+    <select id="equAndonList" resultType="org.jeecg.modules.mdc.entity.AndonOrder">
+        SELECT
+            *
+        FROM
+            andon_order
+        WHERE
+            CONVERT ( DATE, create_time ) = CONVERT ( DATE, GETDATE( ) )
+          AND equipment_id IN
+        <foreach collection="equipmentIdList" index="index" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        ORDER BY
+            create_time
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentAlarmMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentAlarmMapper.xml
new file mode 100644
index 0000000..07a9412
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/EquipmentAlarmMapper.xml
@@ -0,0 +1,16 @@
+<?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="org.jeecg.modules.mdc.mapper.EquipmentAlarmMapper">
+
+    <select id="equAlarmList" resultType="org.jeecg.modules.mdc.entity.EquipmentAlarm">
+        SELECT TOP 15 *
+        FROM
+            EquipmentAlarm
+        WHERE EquipmentID IN
+        <foreach collection="equipmentIdList" index="index" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        AND alarmNo != ''
+        ORDER BY collecttime DESC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
index 898cd96..0917a40 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeMapper.xml
@@ -44,7 +44,7 @@
     <select id="equDowntimeStatistics" resultType="org.jeecg.modules.board.vo.EquDowntimeInfo">
         SELECT
             t2.downtime_description AS shutdown_info,
-            SUM ( DATEDIFF( SECOND, t1.start_date, t1.end_date ) ) / 3600.0 AS duration_hours
+            SUM ( DATEDIFF( SECOND, t1.start_date, t1.end_date ) ) / 3600.0 AS duration
         FROM
             mdc_downtime t1
                 LEFT JOIN mdc_downtime_reason t2 ON t1.reason_id = t2.id
@@ -57,7 +57,5 @@
         </foreach>
         GROUP BY
             t2.downtime_description
-        ORDER BY
-            duration_hours DESC
     </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml
index db58e0e..581970f 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcDowntimeOperatorMapper.xml
@@ -9,6 +9,6 @@
             t2.downtime_description downtimeDescription
         FROM mdc_downtime t1 LEFT JOIN mdc_downtime_reason t2 ON t1.reason_id = t2.id
         ${ew.customSqlSegment}
-        ORDER BY t1.create_time DESC
+        ORDER BY t1.equipment_id DESC, t1.start_date ASC
     </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
index 48cc0e8..8c27d52 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchMapper.xml
@@ -4,31 +4,31 @@
 
     <select id="list" resultType="org.jeecg.modules.mdc.entity.MdcEquipmentPunch">
         SELECT
-          p.id,
-          p.equipment_id,
-          p.punch_user,
-          p.check_in_time,
-          p.check_out_time,
-          p.record_date,
-          p.is_absent,
-          p.is_late,
-          p.is_early,
-          p.create_by,
-          p.create_time,
-          p.update_by,
-          p.update_time,
-          p.shift_schedule,
-          u.realname punchUserRealName,
-          u.username punchUserUserName,
-          d1.item_text shiftScheduleName
+        p.id,
+        p.equipment_id,
+        p.punch_user,
+        p.check_in_time,
+        p.check_out_time,
+        p.record_date,
+        p.is_absent,
+        p.is_late,
+        p.is_early,
+        p.create_by,
+        p.create_time,
+        p.update_by,
+        p.update_time,
+        p.shift_schedule,
+        u.realname punchUserRealName,
+        u.username punchUserUserName,
+        d1.item_text shiftScheduleName
         FROM
-          mdc_equipment_punch p
-          INNER JOIN sys_user u ON u.id = p.punch_user
-          INNER JOIN (SELECT i1.item_text, i1.item_value
-                      FROM sys_dict_item i1
-                          LEFT JOIN sys_dict i2 ON i2.id = i1.dict_id
-                      WHERE i2.dict_code = 'shift_schedule') d1
-              ON d1.item_value = CAST (p.shift_schedule AS nvarchar)
+        mdc_equipment_punch p
+        INNER JOIN sys_user u ON u.id = p.punch_user
+        INNER JOIN (SELECT i1.item_text, i1.item_value
+        FROM sys_dict_item i1
+        LEFT JOIN sys_dict i2 ON i2.id = i1.dict_id
+        WHERE i2.dict_code = 'shift_schedule') d1
+        ON d1.item_value = CAST (p.shift_schedule AS nvarchar)
         where 1=1
         AND p.equipment_id IN
         <foreach collection="equipmentIds" item="equipmentId" open="(" close=")" separator=",">
@@ -39,4 +39,47 @@
         </if>
         order by p.equipment_id desc, p.shift_schedule asc
     </select>
+
+    <!--鏌ヨ鎵�鏈夎澶囨暟閲�-->
+    <select id="getTotalDeviceCount" resultType="int">
+        SELECT COUNT(*)
+        FROM mdc_equipment
+    </select>
+
+    <!-- 鏃╃彮 涓婄彮鎵撳崱 -->
+    <select id="countMorningShiftIn" resultType="int">
+        SELECT COUNT(DISTINCT equipment_id)
+        FROM mdc_equipment_punch
+        WHERE record_date = #{date, jdbcType=VARCHAR}
+          AND shift_schedule = '1'
+          AND check_in_time IS NOT NULL
+    </select>
+
+    <!-- 鏅氱彮 涓婄彮鎵撳崱 -->
+    <select id="countEveningShiftIn" resultType="int">
+        SELECT COUNT(DISTINCT equipment_id)
+        FROM mdc_equipment_punch
+        WHERE record_date = #{date, jdbcType=VARCHAR}
+          AND shift_schedule = '2'
+          AND check_in_time IS NOT NULL
+    </select>
+
+    <!-- 鏃╃彮 涓嬬彮鎵撳崱 -->
+    <select id="countMorningShiftOut" resultType="int">
+        SELECT COUNT(DISTINCT equipment_id)
+        FROM mdc_equipment_punch
+        WHERE record_date = #{date, jdbcType=VARCHAR}
+          AND shift_schedule = '1'
+          AND check_out_time IS NOT NULL
+    </select>
+
+    <!-- 鏅氱彮 涓嬬彮鎵撳崱 -->
+    <select id="countEveningShiftOut" resultType="int">
+        SELECT COUNT(DISTINCT equipment_id)
+        FROM mdc_equipment_punch
+        WHERE record_date = #{date, jdbcType=VARCHAR}
+          AND shift_schedule = '2'
+          AND check_out_time IS NOT NULL
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchRateMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchRateMapper.xml
new file mode 100644
index 0000000..e576a6c
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcEquipmentPunchRateMapper.xml
@@ -0,0 +1,6 @@
+<?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="org.jeecg.modules.mdc.mapper.MdcEquipmentPunchRateMapper">
+
+
+</mapper>
\ No newline at end of file
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcWorkshopInfoMapper.xml b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcWorkshopInfoMapper.xml
index e286929..b3a2f9a 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcWorkshopInfoMapper.xml
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcWorkshopInfoMapper.xml
@@ -9,8 +9,12 @@
             a.EquipmentID equipmentId,
             me.equipment_name equipmentName,
             me.equipment_type equipmentType,
-            met.equipment_type_pictures equipmentImage,
-            a.Oporation equipmentStatus,
+            me.equipment_image equipmentImage,
+            CASE
+
+                WHEN repair.count > 0 THEN
+                    '5' ELSE a.Oporation
+                END AS equipmentStatus,
             mew.coordinate_left coordinateLeft,
             mew.coordinate_top coordinateTop,
             mew.vw vw,
@@ -24,6 +28,17 @@
             INNER JOIN mdc_equipment_type met ON me.equipment_type = met.equipment_type_name
             AND a.CollectTime= b.maxgdtime
             AND mew.workshop_id = #{ workshopId }
+            LEFT JOIN (
+                SELECT
+                    e1.equipment_code,
+                    COUNT(1) COUNT
+                FROM
+                    eam_report_repair r1
+                    INNER JOIN eam_equipment e1 ON e1.id = r1.equipment_id
+                WHERE
+                    r1.report_status NOT IN ('COMPLETE', 'ABOLISH')
+                GROUP BY
+                    e1.equipment_code) repair ON repair.equipment_code = me.equipment_id
     </select>
 
     <select id="listByUser" resultType="org.jeecg.modules.mdc.entity.MdcWorkshopInfo">
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java
new file mode 100644
index 0000000..d392a52
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IAndonOrderService.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.board.vo.EquAndon;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+
+import java.util.List;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date:   2025-06-11
+ * @Version: V1.0
+ */
+public interface IAndonOrderService extends IService<AndonOrder> {
+
+    void procedureCall(AndonOrder andonOrder);
+
+    List<EquAndon> equAndonList(List<String> equipmentIdList);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentAlarmService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentAlarmService.java
index 1b072fe..56b6113 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentAlarmService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IEquipmentAlarmService.java
@@ -12,4 +12,6 @@
  */
 public interface IEquipmentAlarmService extends IService<EquipmentAlarm> {
     List<EquipmentAlarm> findEquipmentAlarmByDate(String equipmentId, Date startTime, Date endTime);
+
+    List<EquipmentAlarm> equAlarmList(List<String> equipmentIdList);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchRateService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchRateService.java
new file mode 100644
index 0000000..b1a371d
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchRateService.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.mdc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunchRate;
+
+import java.util.List;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+public interface IMdcEquipmentPunchRateService extends IService<MdcEquipmentPunchRate> {
+
+
+    void savePunchRates(String targetDate, List<MdcEquipmentPunch> punchRecords);
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
index 79be14a..a1e32d7 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcEquipmentPunchService.java
@@ -18,4 +18,10 @@
     void workUp(MdcEquipmentPunch mdcEquipmentPunch);
 
     void workDown(MdcEquipmentPunch mdcEquipmentPunch);
+    void fillPunchRates(List<MdcEquipmentPunch> punchList);
+
+    /**
+     * 鏌ヨ鎸囧畾鏃ユ湡鐨勮澶囨墦鍗℃暟鎹紙閫氬父鏄槰澶╋級
+     */
+    List<MdcEquipmentPunch> getYesterdayRecords(String targetDate);
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java
new file mode 100644
index 0000000..499e343
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/AndonOrderServiceImpl.java
@@ -0,0 +1,125 @@
+package org.jeecg.modules.mdc.service.impl;
+
+import cn.hutool.core.date.DatePattern;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.constant.WebsocketConst;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TranslateDictTextUtils;
+import org.jeecg.modules.board.vo.EquAndon;
+import org.jeecg.modules.mdc.dto.MdcEquProDto;
+import org.jeecg.modules.mdc.entity.AndonOrder;
+import org.jeecg.modules.mdc.mapper.AndonOrderMapper;
+import org.jeecg.modules.mdc.service.IAndonOrderService;
+import org.jeecg.modules.mdc.service.IMdcEquipmentService;
+import org.jeecg.modules.mdc.util.DateUtils;
+import org.jeecg.modules.mdc.vo.AndonOrderWebSocketVo;
+import org.jeecg.modules.message.websocket.WebSocket;
+import org.jeecg.modules.system.service.ISysDictService;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: andon_order
+ * @Author: jeecg-boot
+ * @Date: 2025-06-11
+ * @Version: V1.0
+ */
+@Service
+public class AndonOrderServiceImpl extends ServiceImpl<AndonOrderMapper, AndonOrder> implements IAndonOrderService {
+
+    @Resource
+    private IMdcEquipmentService mdcEquipmentService;
+    @Resource
+    private WebSocket webSocket;
+    @Resource
+    private ISysUserService userService;
+    @Resource
+    private ISysDictService sysDictService;
+
+    @Override
+    public void procedureCall(AndonOrder andonOrder) {
+        if (StringUtils.isBlank(andonOrder.getEquipmentId())) {
+            throw new JeecgBootException("璇烽�夋嫨璁惧锛�");
+        }
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = user.getId();
+        List<String> equipmentIds = Arrays.asList(andonOrder.getEquipmentId().split(StringPool.COMMA));
+
+        List<MdcEquProDto> equipmentList = mdcEquipmentService.findEquProList(equipmentIds);
+        Map<String, MdcEquProDto> equipmentIdToProductionIdMap = equipmentList.stream().collect(Collectors.toMap(MdcEquProDto::getEquipmentId, comRateDto -> comRateDto));
+        List<AndonOrder> list = Lists.newArrayList();
+        for (String equipmentId : equipmentIds) {
+            AndonOrder andonOrderInfo = new AndonOrder();
+            andonOrderInfo.setEquipmentId(equipmentId);
+            andonOrderInfo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(equipmentId) ? equipmentIdToProductionIdMap.get(equipmentId).getId() : null);
+            andonOrderInfo.setAndonType(StringPool.ONE);
+            andonOrderInfo.setOrderStatus(StringPool.ONE);
+            andonOrderInfo.setOperator(andonOrder.getOperator());
+            andonOrderInfo.setOperateTime(new Date());
+            andonOrderInfo.setResponder(userId);
+            andonOrderInfo.setCallReason(andonOrder.getCallReason());
+            list.add(andonOrderInfo);
+        }
+
+        if (this.saveBatch(list)) {
+            List<AndonOrderWebSocketVo> andonOrderWebSocketVoList = Lists.newArrayList();
+            //璁剧疆websocket璇锋眰娑堟伅鏁版嵁
+            for (AndonOrder order : list) {
+                AndonOrderWebSocketVo andonOrderWebSocketVo = new AndonOrderWebSocketVo();
+                andonOrderWebSocketVo.setEquipmentId(order.getEquipmentId());
+                andonOrderWebSocketVo.setCallPersonnel(userService.getById(order.getOperator()).getRealname());
+                andonOrderWebSocketVo.setCallTime(DateUtils.format(order.getOperateTime(), DatePattern.NORM_DATE_PATTERN));
+                andonOrderWebSocketVo.setCallReason(order.getCallReason());
+                andonOrderWebSocketVo.setAndonType("绋嬪簭鍛煎彨");
+                andonOrderWebSocketVo.setPersonResponsible(user.getRealname());
+                andonOrderWebSocketVo.setRepairTime(StringPool.EMPTY);
+                andonOrderWebSocketVo.setFaultInfo(StringPool.EMPTY);
+                andonOrderWebSocketVo.setPlantName(equipmentIdToProductionIdMap != null && equipmentIdToProductionIdMap.containsKey(order.getEquipmentId()) ? equipmentIdToProductionIdMap.get(order.getEquipmentId()).getProductionName() : null);
+                andonOrderWebSocketVoList.add(andonOrderWebSocketVo);
+            }
+
+            //鍙戦�亀ebsocket璇锋眰
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put(WebsocketConst.MSG_CMD, "andon");
+            jsonObject.put("data", andonOrderWebSocketVoList);
+            webSocket.sendMessage(jsonObject.toJSONString());
+        }
+    }
+
+    /**
+     * 瀹夌伅闂鍒楄〃
+     */
+    @Override
+    public List<EquAndon> equAndonList(List<String> equipmentIdList) {
+        List<EquAndon> result = new ArrayList<>();
+        List<AndonOrder> andonOrderList = this.baseMapper.equAndonList(equipmentIdList);
+        if (andonOrderList != null && !andonOrderList.isEmpty()) {
+            andonOrderList.forEach(andonOrder -> {
+                EquAndon equAndon = new EquAndon();
+                equAndon.setEquipmentId(andonOrder.getEquipmentId());
+                StringBuilder infoBuilder = new StringBuilder();
+                infoBuilder.append("瀹夌伅绫诲瀷: ").append(sysDictService.queryDictTextByKey("andon_type",andonOrder.getAndonType())).append("\n");
+                infoBuilder.append("瀹夌伅浜�: ").append(sysDictService.queryTableDictTextByKey("sys_user", "realname", "id", andonOrder.getOperator())).append("\n");
+                infoBuilder.append("瀹夌伅鏃堕棿: ").append(DateUtils.format(andonOrder.getOperateTime(), DateUtils.STR_DATE_TIME_SMALL)).append("\n");
+                infoBuilder.append("瀹夌伅鐘舵��: ").append(sysDictService.queryDictTextByKey("order_status",andonOrder.getOrderStatus())).append("\n");
+                equAndon.setAndonInfo(infoBuilder.toString());
+                result.add(equAndon);
+            });
+        }
+        return result;
+    }
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentAlarmServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentAlarmServiceImpl.java
index aa11e2d..b8a2565 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentAlarmServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/EquipmentAlarmServiceImpl.java
@@ -7,6 +7,7 @@
 import org.jeecg.modules.mdc.service.IEquipmentAlarmService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
@@ -22,4 +23,9 @@
                 .ge(EquipmentAlarm::getCollecttime, startTime).le(EquipmentAlarm::getCollecttime, endTime)
                 .eq(EquipmentAlarm::getEquipmentid, equipmentId).orderByDesc(EquipmentAlarm::getCollecttime));
     }
+
+    @Override
+    public List<EquipmentAlarm> equAlarmList(List<String> equipmentIdList) {
+        return this.baseMapper.equAlarmList(equipmentIdList);
+    }
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchRateServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchRateServiceImpl.java
new file mode 100644
index 0000000..00d9379
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchRateServiceImpl.java
@@ -0,0 +1,81 @@
+package org.jeecg.modules.mdc.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunch;
+import org.jeecg.modules.mdc.entity.MdcEquipmentPunchRate;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentPunchMapper;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentPunchRateMapper;
+import org.jeecg.modules.mdc.service.IMdcEquipmentPunchRateService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @Description: mdc_equipment_punch
+ * @Author: jeecg-boot
+ * @Date:   2025-06-09
+ * @Version: V1.0
+ */
+@Service
+public class MdcEquipmentPunchRateServiceImpl extends ServiceImpl<MdcEquipmentPunchRateMapper, MdcEquipmentPunchRate> implements IMdcEquipmentPunchRateService {
+    @Resource
+    private MdcEquipmentPunchRateMapper mdcEquipmentPunchRateMapper;
+
+    @Resource
+    private MdcEquipmentPunchMapper mdcEquipmentPunchMapper;
+    @Override
+    public void savePunchRates(String targetDate, List<MdcEquipmentPunch> punchRecords) {
+
+        int morningIn = mdcEquipmentPunchMapper.countMorningShiftIn(targetDate);
+        int eveningIn = mdcEquipmentPunchMapper.countEveningShiftIn(targetDate);
+        int morningOut = mdcEquipmentPunchMapper.countMorningShiftOut(targetDate);
+        int eveningOut = mdcEquipmentPunchMapper.countEveningShiftOut(targetDate);
+        for (MdcEquipmentPunch punch : punchRecords) {
+            MdcEquipmentPunchRate rate = new MdcEquipmentPunchRate();
+
+            rate.setId(UUID.randomUUID().toString()); // 鐢熸垚鍞竴ID
+            rate.setEquipmentId(punch.getEquipmentId());
+            rate.setTheDate(targetDate);
+            rate.setShiftSchedule(punch.getShiftSchedule());
+
+
+
+
+            // 璁剧疆璁惧鏁伴噺
+            rate.setMornShiftInNum(morningIn);
+            rate.setMornShiftOutNum(eveningIn);
+            rate.setEvenShiftInNum(morningOut);
+            rate.setEvenShiftOutNum(eveningOut);
+
+
+
+            // 鑾峰彇鎬昏澶囨暟
+            int totalDevices = mdcEquipmentPunchMapper.getTotalDeviceCount();
+            if (totalDevices == 0) return;
+
+
+            rate.setDeviceCountNum(totalDevices);
+
+            // 璁$畻鎵撳崱鐜囷紙淇濈暀涓や綅灏忔暟锛�
+            rate.setMornShiftInRate(calculateRate(morningIn, totalDevices));
+            rate.setMornShiftOutRate(calculateRate(eveningIn, totalDevices));
+            rate.setEvenShiftInRate(calculateRate(morningOut, totalDevices));
+            rate.setEvenShiftOutRate(calculateRate(eveningOut, totalDevices));
+
+            this.save(rate);
+        }
+    }
+    private BigDecimal calculateRate(int actual, int total) {
+        if (total == 0) return BigDecimal.ZERO;
+        return new BigDecimal(actual)
+                .divide(new BigDecimal(total), 4, RoundingMode.DOWN)
+                .multiply(BigDecimal.valueOf(100))
+                .setScale(2, RoundingMode.DOWN); // 淇濈暀涓や綅灏忔暟锛屼笉杩涜鍥涜垗浜斿叆
+    }
+
+}
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
index 8b79829..31517e7 100644
--- a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java
@@ -3,6 +3,7 @@
 
 import cn.hutool.core.date.DatePattern;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -19,6 +20,10 @@
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -30,7 +35,8 @@
  */
 @Service
 public class MdcEquipmentPunchServiceImpl extends ServiceImpl<MdcEquipmentPunchMapper, MdcEquipmentPunch> implements IMdcEquipmentPunchService {
-
+    @Resource
+    private MdcEquipmentPunchMapper mdcEquipmentPunchMapper;
     @Resource
     private IMdcEquipmentService mdcEquipmentService;
 
@@ -136,13 +142,16 @@
             MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch();
             if (first.isPresent()) {
                 equipmentPunch = first.get();
+                //宸插瓨鍦ㄨ褰曡鏄庡凡鎵撲笅鐝崱锛屾晠灏嗘槸鍚︾己鍗$疆涓哄惁
+                equipmentPunch.setIsAbsent(0);
             }else {
                 equipmentPunch.setEquipmentId(equipment);
                 equipmentPunch.setPunchUser(userId);
                 equipmentPunch.setRecordDate(currentDate);
                 equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule());
-                equipmentPunch.setIsAbsent(0);
                 equipmentPunch.setIsEarly(0);
+                //姝e父鎵撳崱鏃跺厛灏嗘槸鍚︾己鍗$疆涓衡�滄槸鈥濓紝闃叉鏈墦涓嬬彮鍗℃椂鏃犳硶璋冩暣鐘舵��
+                equipmentPunch.setIsAbsent(1);
             }
             equipmentPunch.setCheckInTime(mdcEquipmentPunch.getCheckInTime());
             //鎵撳崱鏃堕棿澶т簬8锛�30/17:00鏃朵负杩熷埌鎵撳崱
@@ -214,6 +223,7 @@
             MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch();
             if (mdcEquipmentPunchOptional.isPresent()) {
                 equipmentPunch = mdcEquipmentPunchOptional.get();
+                equipmentPunch.setIsAbsent(0);
             }else {
                 equipmentPunch.setIsAbsent(1);
                 equipmentPunch.setIsLate(0);
@@ -231,4 +241,59 @@
 
         this.saveOrUpdateBatch(list);
     }
+
+    @Override
+    public void fillPunchRates(List<MdcEquipmentPunch> punchList) {
+
+        // 鑾峰彇鏄ㄥぉ鏃ユ湡
+        LocalDate yesterday = LocalDate.now().minusDays(1);
+        String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN)); // 鏍煎紡鍖栦负 "yyyy-MM-dd"
+
+
+        // 鑾峰彇鎬昏澶囨暟
+        int totalDevices = mdcEquipmentPunchMapper.getTotalDeviceCount();
+        if (totalDevices == 0) return;
+
+        // 缁熻鍚勭被鍨嬫墦鍗′汉鏁�
+        int morningIn = mdcEquipmentPunchMapper.countMorningShiftIn(yesterdayStr);
+        int eveningIn = mdcEquipmentPunchMapper.countEveningShiftIn(yesterdayStr);
+        int morningOut = mdcEquipmentPunchMapper.countMorningShiftOut(yesterdayStr);
+        int eveningOut = mdcEquipmentPunchMapper.countEveningShiftOut(yesterdayStr);
+
+
+        // 璁剧疆鎵撳崱鐜囧埌姣忎釜 DTO
+        for (MdcEquipmentPunch dto : punchList) {
+            dto.setMorningShiftInRate(calculateRate(morningIn, totalDevices));
+            dto.setEveningShiftInRate(calculateRate(eveningIn, totalDevices));
+            dto.setMorningShiftOutRate(calculateRate(morningOut, totalDevices));
+            dto.setEveningShiftOutRate(calculateRate(eveningOut, totalDevices));
+
+            // 璁剧疆鎵撳崱璁惧鏁伴噺瀛楁
+            dto.setMorningShiftInDeviceNum(morningIn);
+            dto.setMorningShiftOutDeviceNum(morningOut);
+            dto.setEveningShiftInDeviceNum(eveningIn);
+            dto.setEveningShiftOutDeviceNum(eveningOut);
+            dto.setDeviceCountNum(totalDevices);
+        }
+    }
+
+    // 璁$畻鐧惧垎姣斿苟淇濈暀涓や綅灏忔暟
+    private BigDecimal calculateRate(int actual, int total) {
+        if (total == 0) return BigDecimal.ZERO;
+        return new BigDecimal(actual)
+                .divide(new BigDecimal(total), 4, RoundingMode.HALF_UP)
+                .multiply(BigDecimal.valueOf(100))
+                .setScale(2, RoundingMode.HALF_UP); // 淇濈暀涓や綅灏忔暟
+    }
+
+    @Override
+    public List<MdcEquipmentPunch> getYesterdayRecords(String  targetDate) {
+        // 鏋勯�犳煡璇㈡潯浠讹細record_date = targetDate.toString()
+        QueryWrapper<MdcEquipmentPunch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("record_date", targetDate);
+
+        // 鎵ц鏌ヨ骞惰繑鍥炵粨鏋�
+        return baseMapper.selectList(queryWrapper);
+    }
+
 }
diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java
new file mode 100644
index 0000000..411a4ec
--- /dev/null
+++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/AndonOrderWebSocketVo.java
@@ -0,0 +1,52 @@
+package org.jeecg.modules.mdc.vo;
+
+import lombok.Data;
+
+@Data
+public class AndonOrderWebSocketVo {
+
+    /**
+     * 璁惧缂栧彿
+     */
+    private String equipmentId;
+
+    /**
+     * 鍛煎彨浜哄憳
+     */
+    private String callPersonnel;
+
+    /**
+     * 瀹夌伅绫诲瀷
+     */
+    private String andonType;
+
+    /**
+     * 鍛煎彨鏃堕棿
+     */
+    private String callTime;
+
+    /**
+     * 鍛煎彨鍘熷洜
+     */
+    private String callReason;
+
+    /**
+     * 璐d换浜�
+     */
+    private String personResponsible;
+
+    /**
+     * 鎶ヤ慨鏃堕棿
+     */
+    private String repairTime;
+
+    /**
+     * 鏁呴殰鎻忚堪
+     */
+    private String faultInfo;
+
+    /**
+     * 鎵�灞炲巶鎴�
+     */
+    private String plantName;
+}
diff --git a/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java b/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java
deleted file mode 100644
index a104726..0000000
--- a/lxzn-module-msi/src/main/java/org/jeecg/modules/msi/utils/WebServiceUtil.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.jeecg.modules.msi.utils;
-
-
-import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
-import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
-
-
-public class WebServiceUtil {
-    /**
-     * 1.浠g悊绫诲伐鍘傜殑鏂瑰紡,闇�瑕佹嬁鍒板鏂圭殑鎺ュ彛鍦板潃, 鍚屾椂闇�瑕佸紩鍏ユ帴鍙�
-     */
-    public static void invokeService_1(String address, Class<?> tClass){
-        // 鎺ュ彛鍦板潃
-        //String address = "http://localhost:8080/services/ws/api?wsdl";
-        // 浠g悊宸ュ巶
-        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
-        // 璁剧疆浠g悊鍦板潃
-        jaxWsProxyFactoryBean.setAddress(address);
-        // 璁剧疆鎺ュ彛绫诲瀷
-        jaxWsProxyFactoryBean.setServiceClass(tClass);
-        // 鍒涘缓涓�涓唬鐞嗘帴鍙e疄鐜�
-        Object us = jaxWsProxyFactoryBean.create();
-        // 鏁版嵁鍑嗗
-        String data = "hello world";
-        // 璋冪敤浠g悊鎺ュ彛鐨勬柟娉曡皟鐢ㄥ苟杩斿洖缁撴灉
-        //String result = us.emrService(data);
-        //System.out.println("杩斿洖缁撴灉:" + result);
-    }
-
-    /**
-     * 3. 鍔ㄦ�佽皟鐢�
-     */
-    public static String invokeService(String uri, String data, String method)
-    {
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(uri);
-        Object[] objects = new Object[0];
-        try {
-            objects = client.invoke(method, data);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return String.valueOf(objects[0]);
-    }
-
-    /**
-     * 2. 鍔ㄦ�佽皟鐢�
-     */
-    public static String invokeServiceObJect(String uri,Object[] datas, String method)
-    {
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(uri);
-        Object[] objects = new Object[0];
-        try {
-            objects = client.invoke(method, datas);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return String.valueOf(objects[0]);
-    }
-}
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
index d5d6e64..04a7069 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IMdcProductionService.java
@@ -185,4 +185,11 @@
 
 
     String findProName(String equipmentId);
+
+    /**
+     * 鏍规嵁浜х嚎orgCode鏌ヨ浜х嚎
+     * @param orgCode
+     * @return
+     */
+    MdcProduction findByOrgCode(String orgCode);
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
index a3128e2..291d646 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
@@ -637,4 +637,9 @@
     public String findProName(String equipmentId) {
         return this.baseMapper.findProName(equipmentId);
     }
+
+    @Override
+    public MdcProduction findByOrgCode(String orgCode){
+        return this.baseMapper.selectOne(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getOrgCode, orgCode));
+    }
 }
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
index 5b27cd5..682766c 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -309,9 +309,7 @@
 #staticAccessPath: /api/ffile/** # 褰撳墠椤圭洰鐨勯潤鎬佽祫婧愯闂厤缃湪nginx涓�
 #宸ユ帶缃�/娑夊瘑缃戦儴缃茬浉鍏抽厤缃�------------閫氳繃鍏夌洏鎽嗘浮
 deploy:
-    #宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓烘秹瀵嗙綉 1涓哄伐鎺х綉
-    deployType: 0
-    #娑夊瘑缃戜紶杈撳伐鎺х綉nc鏂囦欢澶�(鎸囨淳璁惧nc鏂囦欢)    宸ユ帶缃戜紶杈撴秹瀵嗙綉nc鏂囦欢澶�(瑙f瀽鍥炰紶鍚庣殑nc鏂囦欢)
+    #娑夊瘑缃戜紶杈撳伐鎺х綉nc鏂囦欢澶�(鎸囨淳璁惧nc鏂囦欢)
     secretFolder: D:\\test\\a
 file:
   monitor:
@@ -321,3 +319,5 @@
       - D:\\hy_test\\b
       - D:\\hy_test\\c
     interval: 10000  # 鐩戞帶闂撮殧(ms)
+security:
+  encryption-key: 1234567890abcdef # 鍔犺В瀵嗙閽�
diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-prod.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-prod.yml
index 424cb23..184a80a 100644
--- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-prod.yml
+++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-prod.yml
@@ -291,4 +291,4 @@
       client-id: ??
       # appSecret
       client-secret: ??
-      agent-id: ??
\ No newline at end of file
+      agent-id: ??
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java
index 0a84ad8..b4b0f7c 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/PreparationOrderController.java
@@ -94,6 +94,15 @@
         return Result.OK("娣诲姞鎴愬姛锛�");
     }
 
+    @AutoLog(value = "鍒�鍏峰噯澶囧崟-浠嶥NC绯荤粺鍐欏叆鍒�鍏峰噯澶囧崟鍙婃槑缁�")
+    @ApiOperation(value="鍒�鍏峰噯澶囧崟-浠嶥NC绯荤粺鍐欏叆鍒�鍏峰噯澶囧崟鍙婃槑缁�", notes="鍒�鍏峰噯澶囧崟-浠嶥NC绯荤粺鍐欏叆鍒�鍏峰噯澶囧崟鍙婃槑缁�")
+    //@RequiresPermissions("org.jeecg.modules:tms_preparation_order:add")
+    @PostMapping(value = "/addPreparationOrderFromDnc")
+    public Result<String> addPreparationOrderFromDnc(@RequestBody PreparationOrderAndDetailDto preparationOrderAndDetailDto) {
+        preparationOrderService.addPreparationOrderFromDnc(preparationOrderAndDetailDto);
+        return Result.OK("娣诲姞鎴愬姛锛�");
+    }
+
     /**
      *  缂栬緫
      * @param preparationOrder
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java
index beeaecb..2734032 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolSharpeningController.java
@@ -36,19 +36,7 @@
     @Autowired
     private IToolsSharpeningService toolSharpeningService;
 
-    /**
-     * 鍒嗛〉鏌ヨ
-     */
-//    @GetMapping("/list")
-//    @ApiOperation(value = "鍒嗛〉鏌ヨ", notes = "鍒嗛〉鏌ヨ")
-//    public Result<IPage<ToolSharpening>> queryPageList(ToolSharpening toolSharpening,
-//                                                       @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-//                                                       @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
-//        Page<ToolSharpening> page = new Page<>(pageNo, pageSize);
-//        QueryWrapper<ToolSharpening> queryWrapper = new QueryWrapper<>(toolSharpening);
-//        IPage<ToolSharpening> iPage = toolSharpeningService.page(page, queryWrapper);
-//        return Result.OK(iPage);
-//    }
+
 
 
     @ApiOperation(value="鎶ユ崯鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ", notes="鎶ユ崯鐢宠鍗曟槑缁�-閫氳繃涓昏〃ID鏌ヨ")
@@ -93,17 +81,29 @@
         toolSharpeningService.save(toolSharpening);
         return Result.OK("娣诲姞鎴愬姛锛�");
     }
+//    /**
+//     * 淇敼
+//     */
+//    @PutMapping
+//    @ApiOperation(value = "淇敼", notes = "淇敼")
+//    public Result<ToolSharpening> edit(@RequestBody ToolSharpening toolSharpening) {
+//        toolSharpeningService.updateById(toolSharpening);
+//        return Result.OK(toolSharpening);
+//    }
+
     /**
-     * 淇敼
+     *  缂栬緫
+     *
+     * @param toolSharpening
+     * @return
      */
-    @PutMapping
-    @ApiOperation(value = "淇敼", notes = "淇敼")
-    public Result<ToolSharpening> edit(@RequestBody ToolSharpening toolSharpening) {
+    @AutoLog(value = "tms_tool_sharpening-缂栬緫")
+    @ApiOperation(value="tms_tool_sharpening-缂栬緫", notes="tms_tool_sharpening-缂栬緫")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<String> edit(@RequestBody ToolSharpening toolSharpening) {
         toolSharpeningService.updateById(toolSharpening);
-        return Result.OK(toolSharpening);
+        return Result.OK("缂栬緫鎴愬姛!");
     }
-
-
 
 
     /**
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java
index b818afc..f671f4d 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsStocktakingBoundController.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.tms.controller;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -15,10 +16,7 @@
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
-import org.jeecg.modules.tms.entity.BaseTools;
-import org.jeecg.modules.tms.entity.ToolSharpening;
-import org.jeecg.modules.tms.entity.ToolsStocktakingBound;
-import org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail;
+import org.jeecg.modules.tms.entity.*;
 import org.jeecg.modules.tms.entity.dto.LossBoundFlowDto;
 import org.jeecg.modules.tms.entity.dto.StocktakingBoundFlowDto;
 import org.jeecg.modules.tms.entity.vo.ToolsStocktakingVo;
@@ -38,6 +36,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -172,27 +171,42 @@
     @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
     @Transactional(rollbackFor = {Exception.class})
     public Result<String> edit(@RequestBody ToolsStocktakingBound toolsStocktakingBound) {
-        if (toolsStocktakingBound == null || StringUtils.isBlank(toolsStocktakingBound.getId())) {
-            return Result.error("鍙傛暟閿欒");
-        }
 
-        toolsStocktakingBoundDetailService.remove(new LambdaQueryWrapper<ToolsStocktakingBoundDetail>()
+        toolsStocktakingBoundService.updateById(toolsStocktakingBound);
+        // 鍒犻櫎鐢宠鍗曟槑缁嗘暟鎹�
+                toolsStocktakingBoundDetailService.remove(new LambdaQueryWrapper<ToolsStocktakingBoundDetail>()
                 .eq(ToolsStocktakingBoundDetail::getStocktakingBoundId, toolsStocktakingBound.getId()));
-
-        ToolsStocktakingBound stocktakingBound = new ToolsStocktakingBound();
-        BeanUtils.copyProperties(stocktakingBound, toolsStocktakingBound);
-        toolsStocktakingBoundMapper.updateById(stocktakingBound);
-
 
         List<ToolsStocktakingBoundDetail> detailList = toolsStocktakingBound.getToolsStocktakingBoundDetailList();
         if (CollectionUtils.isEmpty(detailList)) {
             return Result.error("鏄庣粏涓嶈兘涓虹┖");
         }
+        for (ToolsStocktakingBoundDetail item : detailList) {
+            item.setStocktakingBoundId(toolsStocktakingBound.getId());
+            item.setToolId(item.getToolId());
+            item.setToolCode(item.getToolCode());
+            item.setRemark(item.getRemark());
+            item.setStocktakingDate(item.getStocktakingDate());
+            item.setBookQuantity(item.getBookQuantity());
+            item.setAvailableQuantity(item.getAvailableQuantity());
+            item.setPracticalQuantity(item.getPracticalQuantity());
+            item.setSurplusDeficit(item.getSurplusDeficit());
+            item.setDifferenceValue(item.getDifferenceValue());
+            item.setParamaTableName(item.getParamaTableName());
+            item.setForeignLanguageName(item.getForeignLanguageName());
+            item.setChineseName(item.getChineseName());
+            item.setSupplierId(item.getSupplierId());
+            item.setStorageLocation(item.getStorageLocation());
+            item.setToolMaterial(item.getToolMaterial());
+            item.setToolModel(item.getToolModel());
+            item.setPositionCode(item.getPositionCode());
+            item.setClassifyId(item.getClassifyId());
+            item.setApplicationType(item.getApplicationType());
+            toolsStocktakingBoundDetailService.saveOrUpdate(item);
+        }
+        toolsStocktakingBoundDetailService.saveOrUpdateBatch(detailList);
+        return Result.OK("鎿嶄綔鎴愬姛!");
 
-        detailList.forEach(item -> item.setStocktakingBoundId(stocktakingBound.getId()));
-        toolsStocktakingBoundDetailService.saveBatch(detailList);
-
-        return Result.OK("缂栬緫鎴愬姛");
     }
 
 
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsToDncController.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsToDncController.java
index 9bc6c00..d5d3798 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsToDncController.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/controller/ToolsToDncController.java
@@ -1,15 +1,14 @@
 package org.jeecg.modules.tms.controller;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import io.swagger.annotations.ApiOperation;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.modules.tms.entity.ToolsClassify;
 import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
-import org.jeecg.modules.tms.entity.vo.ParaHolesToolsVo;
-import org.jeecg.modules.tms.entity.vo.ParaMillToolVo;
-import org.jeecg.modules.tms.entity.vo.ParaTurningToolsVo;
+import org.jeecg.modules.tms.entity.vo.*;
 import org.jeecg.modules.tms.enums.ToolParaType;
 import org.jeecg.modules.tms.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,9 +17,10 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/tms/toolsToDnc")
@@ -34,57 +34,125 @@
     private IParaMillToolService paraMillToolService;
     @Autowired
     private IParaTurningToolsService paraTurningToolsService;
+    @Autowired
+    private IParaThreadingToolService paraThreadingToolService;
+    @Autowired
+    private IParaBladeService paraBladeService;
 
+    @ApiOperation(value = "閫氳繃宸ュ叿绠�绉版煡璇㈠伐鍏峰垎绫讳俊鎭紝閫夊垁椤甸潰宸ュ叿绫诲瀷涓嬫媺妗嗙敤", notes = "閫氳繃宸ュ叿绠�绉版煡璇㈠伐鍏峰垎绫讳俊鎭紝閫夊垁椤甸潰宸ュ叿绫诲瀷涓嬫媺妗嗙敤")
+    @GetMapping("/queryToolClassifyByParam")
+    public Result<?> queryToolClassifyByParam(@RequestParam("aliasLabel") String aliasLabel) {
+        List<ToolsClassify> classifyList = toolsClassifyService.list(new LambdaQueryWrapper<ToolsClassify>()
+                .eq(ToolsClassify::getAliasLabel, aliasLabel)
+                .eq(ToolsClassify::getStatus, CommonConstant.STATUS_1));
+        List<Map<String, String>> list = classifyList.stream()
+                .map(classify -> new HashMap<String, String>() {{
+                    put("value", classify.getId());
+                    put("label", classify.getTypeName());
+                }})
+                .collect(Collectors.toList());
+        return Result.ok(list);
+    }
     /**
      * 閫氳繃宸ュ叿绠�绉�/鐩村緞鍙傛暟鏌ヨ鍏蜂綋宸ュ叿鍙傛暟淇℃伅(缁橠NC鎻愪緵鎺ュ彛)锛屽弬鏁扮ず渚嬶細3E锛�3涓哄伐鍏风洿寰勫弬鏁般�丒涓哄姞宸ヤ腑蹇冨垁鍏风畝绉帮級
+     *
      * @param queryParam
      * @return
      */
     @ApiOperation(value = "閫氳繃宸ュ叿绠�绉�/鐩村緞鍙傛暟鏌ヨ鍏蜂綋宸ュ叿鍙傛暟淇℃伅(缁橠NC鎻愪緵鎺ュ彛)", notes = "閫氳繃宸ュ叿绠�绉�/鐩村緞鍙傛暟鏌ヨ鍏蜂綋宸ュ叿鍙傛暟淇℃伅(缁橠NC鎻愪緵鎺ュ彛)")
     @GetMapping("/queryToolByParam")
-    public Result<?> queryToolByParam(@RequestParam("param") ToolQueryParamDto queryParam){
-        String param = queryParam.getParam();
-        // 姝e垯琛ㄨ揪寮忥細鍓嶅崐閮ㄥ垎涓烘暟瀛楋紙鏀寔灏忔暟锛夛紝鍚庡崐閮ㄥ垎涓哄ぇ鍐欐垨灏忓啓瀛楁瘝
-        String regex = "^([\\d.]+)([A-Za-z]+)$";
-        Pattern pattern = Pattern.compile(regex);
-        Matcher matcher = pattern.matcher(param);
-        if (matcher.find()) {
-            String diameter = matcher.group(1);
-            String toolAliasName = matcher.group(2);
+    public Result<?> queryToolByParam(ToolQueryParamDto queryParam) {
+        String aliasLabel = queryParam.getAliasLabel();
+        String diameter = queryParam.getDiameter();
+        if (StrUtil.isBlank(aliasLabel)) {
+            return Result.error("缂哄皯蹇呰鍙傛暟");
+        }
 
+        Result<Object> res = Result.OK();
+        Map<String, Object> result = new HashMap<>();
+        int pageNo = Objects.isNull(queryParam.getPageNo()) || queryParam.getPageNo() < 1 ? 1 : queryParam.getPageNo();
+        int pageSize = Objects.isNull(queryParam.getPageSize()) || queryParam.getPageSize() < 1 ? 10 : queryParam.getPageSize();
+
+        List<Object> toolList = CollectionUtil.newArrayList();
+        String classifyId = queryParam.getClassifyId();
+        if (StrUtil.isNotBlank(classifyId)) {
+            //宸茬粡杩涘叆浜嗛�夊垁椤甸潰锛屽伐鍏峰垎绫诲凡缁忕‘瀹�
+            ToolsClassify toolsClassify = toolsClassifyService.getById(classifyId);
+            ToolParaType toolParaType = ToolParaType.fromValue(toolsClassify.getParaTypeFlag());
+            matchTypeSelectTools(queryParam, toolList, toolParaType);
+        } else {
+            //绗竴娆¤繘鍏ラ�夊垁椤甸潰锛屾牴鎹垁鍏风畝绉板拰鐩村緞鍙傛暟鏌ヨ宸ュ叿鍒嗙被
             List<ToolsClassify> classifyList = toolsClassifyService.list(new LambdaQueryWrapper<ToolsClassify>()
-                    .eq(ToolsClassify::getAliasLabel, toolAliasName)
+                    .eq(ToolsClassify::getAliasLabel, aliasLabel)
                     .eq(ToolsClassify::getStatus, CommonConstant.STATUS_1));
             if (CollectionUtil.isEmpty(classifyList)) {
-                return Result.error("鏈壘鍒板尮閰嶇殑宸ュ叿鍒嗙被");
+                result.put("records", CollectionUtil.newArrayList());
+                result.put("total", 0);
+                result.put("current", pageNo);
+                result.put("size", pageSize);
+                res.setResult(result);
+                return res;
             }
-            List<Object> toolList = CollectionUtil.newArrayList();
             for (ToolsClassify classify : classifyList) {
                 String paraTypeFlag = classify.getParaTypeFlag();
                 queryParam.setClassifyId(classify.getId());
                 queryParam.setDiameter(diameter);
                 ToolParaType toolParaType = ToolParaType.fromValue(paraTypeFlag);
-                if (toolParaType != null) {
-                    switch (toolParaType) {
-                        case HOLE:
-                            List<ParaHolesToolsVo> paraHoleToolsList = paraHoleToolsService.selectByClassifyAndDiameter(queryParam);
-                            toolList.addAll(paraHoleToolsList);
-                            break;
-                        case MILL:
-                            List<ParaMillToolVo> paraMillToolList = paraMillToolService.selectByClassifyAndDiameter(queryParam);
-                            toolList.addAll(paraMillToolList);
-                            break;
-                        case TURNING:
-                            List<ParaTurningToolsVo> paraTurningToolsList = paraTurningToolsService.selectByClassifyAndDiameter(queryParam);
-                            toolList.addAll(paraTurningToolsList);
-                            break;
-                        default:
-                    }
-                }
+                matchTypeSelectTools(queryParam, toolList, toolParaType);
             }
-            return Result.OK(toolList);
+        }
+
+        // ====== 鍒嗛〉閫昏緫 start ======
+        int total = toolList.size();
+        int fromIndex = (pageNo - 1) * pageSize;
+        int toIndex = Math.min(fromIndex + pageSize, total);
+
+        List<Object> pagedList;
+        if (fromIndex > total) {
+            pagedList = Collections.emptyList();
         } else {
-            return Result.error("鍙傛暟鏍煎紡涓嶆纭�");
+            pagedList = toolList.subList(fromIndex, toIndex);
+        }
+
+        result.put("records", pagedList);
+        result.put("total", total);
+        result.put("current", pageNo);
+        result.put("size", pageSize);
+        res.setResult(result);
+        return res;
+        // ====== 鍒嗛〉閫昏緫 end ======
+    }
+
+    private void matchTypeSelectTools(ToolQueryParamDto queryParam, List<Object> toolList, ToolParaType toolParaType) {
+        if (toolParaType != null) {
+            String diameter = queryParam.getDiameter();
+            switch (toolParaType) {
+                case HOLE:
+                    List<ParaHolesToolsVo> paraHoleToolsList = paraHoleToolsService.selectByClassifyAndDiameter(queryParam);
+                    toolList.addAll(paraHoleToolsList);
+                    break;
+                case THREADING://铻虹汗鍒�鍏锋病鏈夌洿寰勫弬鏁帮紝濡傛灉浼犲叆鐩村緞锛岀洿鎺ョ暐杩�
+                    if (StrUtil.isBlank(diameter)) {
+                        List<ParaThreadingToolVo> paraThreadingToolList = paraThreadingToolService.selectByClassifyAndParam(queryParam);
+                        toolList.addAll(paraThreadingToolList);
+                    }
+                    break;
+                case MILL:
+                    List<ParaMillToolVo> paraMillToolList = paraMillToolService.selectByClassifyAndDiameter(queryParam);
+                    toolList.addAll(paraMillToolList);
+                    break;
+                case TURNING:
+                    List<ParaTurningToolsVo> paraTurningToolsList = paraTurningToolsService.selectByClassifyAndDiameter(queryParam);
+                    toolList.addAll(paraTurningToolsList);
+                    break;
+                case BLADE://鍒�鐗囨病鏈夌洿寰勫弬鏁帮紝濡傛灉浼犲叆鐩村緞锛岀洿鎺ョ暐杩�
+                    if (StrUtil.isBlank(diameter)) {
+                        List<ParaBladeVo> paraBladeToolsList = paraBladeService.selectByClassifyAndParam(queryParam);
+                        toolList.addAll(paraBladeToolsList);
+                    }
+                    break;
+                default:
+            }
         }
     }
 
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java
index 96d0f66..f369fd9 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/OutboundOrderConvert.java
@@ -2,17 +2,25 @@
 
 import org.jeecg.modules.tms.entity.OutboundOrder;
 import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
+import org.mapstruct.BeanMapping;
 import org.mapstruct.Mapper;
+import org.mapstruct.NullValuePropertyMappingStrategy;
+import org.mapstruct.ReportingPolicy;
 import org.mapstruct.factory.Mappers;
 
 /**
  * 浣跨敤 MapStruct 鏂瑰紡杩涜灞炴�у鍒�
  * 娉ㄦ剰涓嶈兘鏀惧湪 mybatis鎵弿鐨刴apper鍖呬笅闈紝鍚﹀垯浼氭姤閿�
  */
-@Mapper
+@Mapper(
+        unmappedTargetPolicy = ReportingPolicy.IGNORE, // 蹇界暐鐩爣涓湭琚槧灏勭殑瀛楁
+        componentModel = "spring" // 濡傛灉浣跨敤 Spring锛屽彲鐢熸垚 Spring 绠$悊鐨� Bean
+)
 public interface OutboundOrderConvert {
+
 
     OutboundOrderConvert INSTANCE = Mappers.getMapper(OutboundOrderConvert.class);
 
+    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)// 蹇界暐 null 瀛楁
     OutboundOrder convert(OutboundOrderAndDetailDto dto);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java
index 561a4f2..8e88a03 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/convert/PreparationOrderConvert.java
@@ -2,17 +2,24 @@
 
 import org.jeecg.modules.tms.entity.PreparationOrder;
 import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.mapstruct.BeanMapping;
 import org.mapstruct.Mapper;
+import org.mapstruct.NullValuePropertyMappingStrategy;
+import org.mapstruct.ReportingPolicy;
 import org.mapstruct.factory.Mappers;
 
 /**
  * 浣跨敤 MapStruct 鏂瑰紡杩涜灞炴�у鍒�
  * 娉ㄦ剰涓嶈兘鏀惧湪 mybatis鎵弿鐨刴apper鍖呬笅闈紝鍚﹀垯浼氭姤閿�
  */
-@Mapper
+@Mapper(
+        unmappedTargetPolicy = ReportingPolicy.IGNORE, // 蹇界暐鐩爣涓湭琚槧灏勭殑瀛楁
+        componentModel = "spring" // 濡傛灉浣跨敤 Spring锛屽彲鐢熸垚 Spring 绠$悊鐨� Bean
+)
 public interface PreparationOrderConvert {
 
     PreparationOrderConvert INSTANCE = Mappers.getMapper(PreparationOrderConvert.class);
 
+    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)// 蹇界暐 null 瀛楁
     PreparationOrder convert(PreparationOrderAndDetailDto dto);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java
index 99f9164..b8f107d 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/PreparationOrderDetail.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.experimental.Accessors;
 import org.jeecg.common.aspect.annotation.Dict;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
@@ -21,6 +22,7 @@
  * @Version: V1.0
  */
 @Data
+@Accessors(chain = true)
 @TableName("tms_preparation_order_detail")
 @ApiModel(value="tms_preparation_order_detail瀵硅薄", description="鍒�鍏峰噯澶囧崟鏄庣粏")
 public class PreparationOrderDetail implements Serializable {
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java
index 9b22037..c1281d5 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/ToolsStocktakingBoundDetail.java
@@ -131,6 +131,11 @@
     @TableField(exist = false)
     private String classifyId;
 
+    @Dict(dicCode = "application_type")
+    @TableField(exist = false)
+    private String applicationType;
+
+
 
 
 
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/ToolQueryParamDto.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/ToolQueryParamDto.java
index 77621b9..2305953 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/ToolQueryParamDto.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/entity/dto/ToolQueryParamDto.java
@@ -9,13 +9,23 @@
  */
 @Data
 public class ToolQueryParamDto {
-    /**澶嶅悎鍙傛暟(宸ュ叿绠�绉�/鐩村緞鍙傛暟)锛屼緥濡傦細3E*/
-    @ApiModelProperty(value = "澶嶅悎鍙傛暟(宸ュ叿绠�绉�/鐩村緞鍙傛暟)锛屼緥濡傦細3E")
-    private String param;
+    /**宸ュ叿绠�绉�*/
+    @ApiModelProperty(value = "宸ュ叿绠�绉�")
+    private String aliasLabel;
+    /**鍒�鍏风洿寰�*/
+    @ApiModelProperty(value = "鍒�鍏风洿寰�")
+    private String diameter;
     /**鍒�鍏峰垎绫籌D(涓嶇敤鍓嶇浼狅紝鍚庡彴璁板綍鍙傛暟鐢�)*/
     private String classifyId;
-    /**鍒�鍏风洿寰�(涓嶇敤鍓嶇浼狅紝鍚庡彴璁板綍鍙傛暟鐢�)*/
-    private String diameter;
+    /**宸ュ叿缂栫爜*/
+    @ApiModelProperty(value = "宸ュ叿缂栫爜(tms_base_tool琛╰ool_code瀛楁)")
+    private String toolCode;
+    /**鍨嬪彿/鍥惧彿*/
+    @ApiModelProperty(value = "鍨嬪彿/鍥惧彿")
+    private String toolModel;
+    /**涓枃鍚嶇О*/
+    @ApiModelProperty(value = "涓枃鍚嶇О")
+    private String chineseName;
     /**鍒�鍏锋�婚暱*/
     @ApiModelProperty(value = "鍒�鍏锋�婚暱")
     private String totalLength;
@@ -23,7 +33,7 @@
     @ApiModelProperty(value = "鍒�鍏锋潗鏂�")
     private String toolMaterial;
     /**鍒囧墛鍒冮暱*/
-    @ApiModelProperty(value = "鍒囧墛鍒冮暱(瀛斿姞宸ュ垁鍏枫�侀摚鍓婂垁鍏�)")
+    @ApiModelProperty(value = "鍒囧墛鍒冮暱(瀛斿姞宸ュ垁鍏枫�侀摚鍓婂垁鍏枫�佽灪绾瑰垁鍏�)")
     private String edgeLength;
     /**鍒冩暟(瀛斿姞宸ュ垁鍏�)*/
     @ApiModelProperty(value = "鍒冩暟(瀛斿姞宸ュ垁鍏�)")
@@ -69,7 +79,7 @@
     @ApiModelProperty(value = "鎮几闀垮害(閾e墛鍒�鍏�)")
     private String overhangingLength;
     /**铻鸿窛*/
-    @ApiModelProperty(value = "铻鸿窛(閾e墛鍒�鍏�)")
+    @ApiModelProperty(value = "铻鸿窛(閾e墛鍒�鍏枫�佽灪绾瑰垁鍏枫�佸垁鐗�)")
     private String pitch;
     /**鏈�灏忓姞宸ョ洿寰�*/
     @ApiModelProperty(value = "鏈�灏忓姞宸ョ洿寰�(閾e墛鍒�鍏�)")
@@ -78,7 +88,7 @@
     @ApiModelProperty(value = "閰嶅鍒�鐗囧彿(杞﹀墛鍒�鍏�)")
     private String matchingNumber;
     /**鍒囧墛鏂瑰悜*/
-    @ApiModelProperty(value = "鍒囧墛鏂瑰悜(杞﹀墛鍒�鍏�)")
+    @ApiModelProperty(value = "鍒囧墛鏂瑰悜(杞﹀墛鍒�鍏枫�佸垁鐗�)")
     private String cuttingDirection;
     /**鍒�鐗囧昂瀵�*/
     @ApiModelProperty(value = "鍒�鐗囧昂瀵�(杞﹀墛鍒�鍏�)")
@@ -87,7 +97,7 @@
     @ApiModelProperty(value = "闀楁潌鐩村緞(杞﹀墛鍒�鍏�)")
     private String boringBarDiameter;
     /**鍒�鏉嗛暱搴�*/
-    @ApiModelProperty(value = "鍒�鏉嗛暱搴�(杞﹀墛鍒�鍏�)")
+    @ApiModelProperty(value = "鍒�鏉嗛暱搴�(杞﹀墛鍒�鍏枫�佸垁鐗�)")
     private String bladeLength;
     /**鍒�鏉嗘柟鍚�*/
     @ApiModelProperty(value = "鍒�鏉嗘柟鍚�(杞﹀墛鍒�鍏�)")
@@ -96,7 +106,7 @@
     @ApiModelProperty(value = "鍒�鏉嗛珮搴�(杞﹀墛鍒�鍏�)")
     private String bladeHeight;
     /**鍒�鏉嗗搴�*/
-    @ApiModelProperty(value = "鍒�鏉嗗搴�(杞﹀墛鍒�鍏�)")
+    @ApiModelProperty(value = "鍒�鏉嗗搴�(杞﹀墛鍒�鍏枫�佸垁鐗�)")
     private String bladeWide;
     /**鍒�鐗囨Ы瀹�*/
     @ApiModelProperty(value = "鍒�鐗囨Ы瀹�(杞﹀墛鍒�鍏�)")
@@ -108,9 +118,81 @@
     @ApiModelProperty(value = "鏈�澶у垏妲芥繁搴�(杞﹀墛鍒�鍏�)")
     private String maxDepth;
     /**鍒�鏉垮帤搴�*/
-    @ApiModelProperty(value = "鍒�鏉垮帤搴�(杞﹀墛鍒�鍏�)")
+    @ApiModelProperty(value = "鍒�鏉垮帤搴�(杞﹀墛鍒�鍏枫�佸垁鐗囧帤搴�)")
     private String bladeThickness;
     /**鏈�灏忓姞宸ョ洿寰�*/
     @ApiModelProperty(value = "鏈�灏忓姞宸ョ洿寰�(杞﹀墛鍒�鍏�)")
     private String minDiameter;
+    /**铻虹汗浠e彿*/
+    @ApiModelProperty(value = "铻虹汗浠e彿(铻虹汗鍒�鍏�)")
+    private String threadCode;
+    /**铻虹汗鏃嬪悜*/
+    @ApiModelProperty(value = "铻虹汗鏃嬪悜(铻虹汗鍒�鍏�)")
+    private String rotationDirection;
+    /**铻虹汗鍏樊甯︿唬鍙�/绮惧害绛夌骇*/
+    @ApiModelProperty(value = "铻虹汗鍏樊甯︿唬鍙�/绮惧害绛夌骇(铻虹汗鍒�鍏�)")
+    private String tolerancezoneLevel;
+    /**澶栧瀷灏哄*/
+    @ApiModelProperty(value = "澶栧瀷灏哄(铻虹汗鍒�鍏�)")
+    private String externalDimensions;
+    /**鏌勯儴瑙勬牸*/
+    @ApiModelProperty(value = "鏌勯儴瑙勬牸(铻虹汗鍒�鍏�)")
+    private String handleSpecifications;
+    /**铻哄瓟绫诲瀷*/
+    @ApiModelProperty(value = "铻哄瓟绫诲瀷(铻虹汗鍒�鍏�)")
+    private String screwHoleType;
+    /**铻虹汗鏍囧噯*/
+    @ApiModelProperty(value = "铻虹汗鏍囧噯(铻虹汗鍒�鍏枫�佸垁鐗�)")
+    private String threadStandard;
+    /**鎺掑睉妲藉瀷*/
+    @ApiModelProperty(value = "鎺掑睉妲藉瀷(铻虹汗鍒�鍏�)")
+    private String fluteSoltType;
+    /**铻虹汗绫诲瀷*/
+    @ApiModelProperty(value = "铻虹汗绫诲瀷(铻虹汗鍒�鍏�)")
+    private String threadType;
+    /**瀵煎悜灏哄*/
+    @ApiModelProperty(value = "瀵煎悜灏哄(铻虹汗鍒�鍏�)")
+    private String guidingSize;
+    /**杩炴帴瀛斿緞*/
+    @ApiModelProperty(value = "杩炴帴瀛斿緞(铻虹汗鍒�鍏�)")
+    private String connectionAperture;
+    /**杩炴帴閿Ы*/
+    @ApiModelProperty(value = "杩炴帴閿Ы(铻虹汗鍒�鍏�)")
+    private String connectingKeyway;
+    /**鍒�鐗囧舰鐘�*/
+    @ApiModelProperty(value = "鍒�鐗囧舰鐘�(鍒�鐗�)")
+    private String bladeShape;
+    /**鍒囧墛鍒冩暟*/
+    @ApiModelProperty(value = "鍒囧墛鍒冩暟(鍒�鐗�)")
+    private String cuttingEdgeCount;
+    /**澶瑰浐鍨嬪紡*/
+    @ApiModelProperty(value = "澶瑰浐鍨嬪紡(鍒�鐗�)")
+    private String clampingType;
+    /**鍒�灏朢*/
+    @ApiModelProperty(value = "鍒�灏朢(鍒�鐗�)")
+    private String noseAngleR;
+    /**鍔犲伐鍒嗙被*/
+    @ApiModelProperty(value = "鍔犲伐鍒嗙被(鍒�鐗�)")
+    private String processingClassify;
+    /**鍒�鐗囧悗瑙�*/
+    @ApiModelProperty(value = "鍒�鐗囧悗瑙�(鍒�鐗�)")
+    private String bladePosterior;
+    /**鍒�鐗囧昂瀵�*/
+    @ApiModelProperty(value = "鍒�鐗囧昂瀵�(鍒�鐗�)")
+    private String bladeSize;
+    /**鍐呭铻虹汗*/
+    @ApiModelProperty(value = "鍐呭铻虹汗(鍒�鐗�)")
+    private String inOutThread;
+    /**鐗欏瀷瑙掑害*/
+    @ApiModelProperty(value = "鐗欏瀷瑙掑害(鍒�鐗�)")
+    private String dentalAngle;
+    /**鏈�灏忓姞宸ュ唴铻虹汗鍏О鐩村緞*/
+    @ApiModelProperty(value = "鏈�灏忓姞宸ュ唴铻虹汗鍏О鐩村緞(鍒�鐗�)")
+    private String minInternalThread;
+
+    //鍒嗛〉鍙傛暟
+    @ApiModelProperty(value = "椤电爜")
+    private Integer pageNo = 1;   // 褰撳墠椤电爜锛岄粯璁ょ涓�椤�
+    @ApiModelProperty(value = "姣忛〉鏁伴噺")
+    private Integer pageSize = 10; // 姣忛〉鏁伴噺锛岄粯璁�10鏉�
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaBladeMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaBladeMapper.java
index 9a186f5..85fdf83 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaBladeMapper.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaBladeMapper.java
@@ -2,9 +2,14 @@
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.commons.math3.analysis.function.Constant;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.tms.entity.ParaBlade;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.tms.entity.vo.ParaBladeVo;
 
 /**
  * @Description: tms_para_blade
@@ -14,4 +19,5 @@
  */
 public interface ParaBladeMapper extends BaseMapper<ParaBlade> {
 
+    List<ParaBladeVo> selectByClassifyAndParam(@Param(Constants.WRAPPER) Wrapper<ParaBlade> queryWrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaHoleToolsMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaHoleToolsMapper.java
index d906762..d3f1199 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaHoleToolsMapper.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaHoleToolsMapper.java
@@ -2,6 +2,7 @@
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Param;
@@ -18,5 +19,5 @@
 public interface ParaHoleToolsMapper extends BaseMapper<ParaHoleTools> {
 
     List<ParaHolesToolsVo> selectByClassifyAndDiameter(@Param(Constants.WRAPPER)
-                                                       LambdaQueryWrapper<ParaHolesToolsVo> queryWrapper);
+                                                       Wrapper<ParaHoleTools> queryWrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaMillToolMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaMillToolMapper.java
index 3298150..775a9c5 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaMillToolMapper.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaMillToolMapper.java
@@ -2,7 +2,7 @@
 
 import java.util.List;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.tms.entity.ParaMillTool;
@@ -18,5 +18,5 @@
 public interface ParaMillToolMapper extends BaseMapper<ParaMillTool> {
 
     List<ParaMillToolVo> selectByClassifyAndDiameter(@Param(Constants.WRAPPER)
-                                                     LambdaQueryWrapper<ParaMillTool> queryWrapper);
+                                                     Wrapper<ParaMillTool> queryWrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaThreadingToolMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaThreadingToolMapper.java
index 9e6e997..7a64693 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaThreadingToolMapper.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaThreadingToolMapper.java
@@ -2,9 +2,13 @@
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.tms.entity.ParaThreadingTool;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.tms.entity.vo.ParaThreadingToolVo;
 
 /**
  * @Description: tms_para_threading_tool
@@ -14,4 +18,5 @@
  */
 public interface ParaThreadingToolMapper extends BaseMapper<ParaThreadingTool> {
 
+    List<ParaThreadingToolVo> selectByClassifyAndParam(@Param(Constants.WRAPPER) Wrapper<ParaThreadingTool> queryWrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaTurningToolsMapper.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaTurningToolsMapper.java
index ed9b386..4c78fee 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaTurningToolsMapper.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/ParaTurningToolsMapper.java
@@ -2,7 +2,7 @@
 
 import java.util.List;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.tms.entity.ParaTurningTools;
@@ -18,5 +18,5 @@
 public interface ParaTurningToolsMapper extends BaseMapper<ParaTurningTools> {
 
     List<ParaTurningToolsVo> selectByClassifyAndDiameter(@Param(Constants.WRAPPER)
-                                                         LambdaQueryWrapper<ParaTurningTools> queryWrapper);
+                                                         Wrapper<ParaTurningTools> queryWrapper);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
index c6df81e..c51a68b 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/BaseToolsMapper.xml
@@ -366,20 +366,22 @@
     <select id="pageWithLedgerAndConfig" resultType="org.jeecg.modules.tms.entity.vo.StocktakingPoundVo">
         SELECT
         t.id,
-        t.tool_id  AS toolId,
-        t1.classify_id AS classifyId,
+        t.create_time AS createTime,
         t.tool_code AS toolCode,
         t2.tool_model AS toolModel,
         t2.parama_table_name AS paramaTableName,
-        t1.total_count AS totalCount,
-        t1.available_count AS availableCount,
+        t.tool_id AS toolId,
         t3.position_code AS positionCode,
         t3.application_type AS applicationType,
-        t2.chinese_name AS chineseName,
+        t3.chinese_name AS chineseName,
         t3.supplier_id AS supplierId,
         t3.storage_location AS storageLocation,
         t3.main_unit AS mainUnit,
-
+        t1.available_count AS availableCount,
+        t1.total_count AS totalCount,
+        t3.warehouse_id AS warehouseId,
+        t4.classify_id AS classifyId,
+        t3.province_city AS provinceCity,
         <!-- 鍔ㄦ�佸瓧娈甸�夋嫨锛屼娇鐢ㄨ〃鍒悕锛堥渶纭繚琛ㄥ凡鍏宠仈锛� -->
         <choose>
             <when test="ew.paramNameValuePairs.paramaTableName == '1'">
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaBladeMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaBladeMapper.xml
index edaca31..c50113c 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaBladeMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaBladeMapper.xml
@@ -2,4 +2,43 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.tms.mapper.ParaBladeMapper">
 
+    <select id="selectByClassifyAndParam" resultType="org.jeecg.modules.tms.entity.vo.ParaBladeVo">
+        SELECT
+            t.id,
+            t.classify_id AS classifyId,
+            t2.classify_id AS classifyNum,
+            t2.type_name AS classifyName,
+            t1.id AS toolId,
+            t1.tool_code AS toolCode,
+            t1.parama_table_name AS paramaTableName,
+            t.sign_code AS signCode,
+            t.chinese_name AS chineseName,
+            t.foreign_language_name AS foreignLanguageName,
+            t.standard_level AS standardLevel,
+            t.standard_code AS standardCode,
+            t.position_code AS positionCode,
+            t.tool_model AS toolModel,
+            t.tool_material AS toolMaterial,
+            t.part_material AS partMaterial,
+            t.technical_conditions AS technicalConditions,
+            t.conditions_info AS conditionsInfo,
+            t.brand,
+            t.types,
+            <!-- 鍒�鐗囩壒鏈夊瓧娈� -->
+            t.blade_shape AS bladeShape,
+            t.cutting_edge_count AS cuttingEdgeCount,
+            t.clamping_type AS clampingType,
+            t.nose_angle_r AS noseAngleR,
+            t.processing_classify AS processingClassify,
+            t.blade_posterior AS bladePosterior,
+            t.blade_size AS bladeSize,
+            t.in_out_thread AS inOutThread,
+            t.dental_angle AS dentalAngle,
+            t.min_internal_thread AS minInternalThread,
+            t.thread_standard AS threadStandard
+        FROM tms_para_blade t
+        LEFT JOIN tms_base_tools t1 ON t.tool_code = t1.id
+        LEFT JOIN tms_tools_classify t2 ON t.classify_id = t2.id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaHoleToolsMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaHoleToolsMapper.xml
index f5d2a9c..75bb798 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaHoleToolsMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaHoleToolsMapper.xml
@@ -10,6 +10,7 @@
             t2.type_name AS classifyName,
             t1.id AS toolId,
             t1.tool_code AS toolCode,
+            t1.parama_table_name AS paramaTableName,
             t.sign_code AS signCode,
             t.chinese_name AS chineseName,
             t.foreign_language_name AS foreignLanguageName,
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaMillToolMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaMillToolMapper.xml
index 544f022..aee5ca4 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaMillToolMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaMillToolMapper.xml
@@ -9,7 +9,8 @@
             t2.classify_id AS classifyNum,
             t2.type_name AS classifyName,
             t1.id AS toolId,
-            t.tool_code AS toolCode,
+            t1.tool_code AS toolCode,
+            t1.parama_table_name AS paramaTableName,
             t.sign_code AS signCode,
             t.chinese_name AS chineseName,
             t.foreign_language_name AS foreignLanguageName,
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaThreadingToolMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaThreadingToolMapper.xml
index 83456b7..2fdf9fc 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaThreadingToolMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaThreadingToolMapper.xml
@@ -2,4 +2,49 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.tms.mapper.ParaThreadingToolMapper">
 
+    <select id="selectByClassifyAndParam" resultType="org.jeecg.modules.tms.entity.vo.ParaThreadingToolVo">
+        SELECT
+            t.id,
+            t.classify_id AS classifyId,
+            t2.classify_id AS classifyNum,
+            t2.type_name AS classifyName,
+            t1.id AS toolId,
+            t1.tool_code AS toolCode,
+            t1.parama_table_name AS paramaTableName,
+            t.sign_code AS signCode,
+            t.chinese_name AS chineseName,
+            t.foreign_language_name AS foreignLanguageName,
+            t.standard_level AS standardLevel,
+            t.standard_code AS standardCode,
+            t.position_code AS positionCode,
+            t.tool_model AS toolModel,
+            t.edge_length AS edgeLength,
+            t.total_length AS totalLength,
+            t.tool_material AS toolMaterial,
+            t.part_material AS partMaterial,
+            t.paintcoat_flag AS paintcoatFlag,
+            t.handle_specifications AS handleSpecifications,
+            t.cooling_method AS coolingMethod,
+            t.technical_conditions AS technicalConditions,
+            t.conditions_info AS conditionsInfo,
+            t.brand,
+            t.types,
+            <!-- 铻虹汗鍒�鍏风壒鏈夊瓧娈� -->
+            t.thread_code AS threadCode,
+            t.rotation_direction AS rotationDirection,
+            t.tolerancezone_level AS tolerancezoneLevel,
+            t.external_dimensions AS externalDimensions,
+            t.handle_specifications AS handleSpecifications,
+            t.screw_hole_type AS screwHoleType,
+            t.thread_standard AS threadStandard,
+            t.flute_solt_type AS fluteSoltType,
+            t.thread_type AS threadType,
+            t.guiding_size AS guidingSize,
+            t.connection_aperture AS connectionAperture,
+            t.connecting_keyway AS connectingKeyway
+        FROM tms_para_threading_tool t
+        LEFT JOIN tms_base_tools t1 ON t.tool_code = t1.id
+        LEFT JOIN tms_tools_classify t2 ON t.classify_id = t2.id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaTurningToolsMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaTurningToolsMapper.xml
index 6b78110..1cf19ef 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaTurningToolsMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ParaTurningToolsMapper.xml
@@ -10,6 +10,7 @@
             t2.type_name AS classifyName,
             t1.id AS toolId,
             t1.tool_code AS toolCode,
+            t1.parama_table_name AS paramaTableName,
             t.sign_code AS signCode,
             t.chinese_name AS chineseName,
             t.foreign_language_name AS foreignLanguageName,
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml
index 0b5066b..fb9d1de 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/mapper/xml/ToolsStocktakingBoundDetailMapper.xml
@@ -17,12 +17,12 @@
     <select id="selectByMainId" resultType="org.jeecg.modules.tms.entity.ToolsStocktakingBoundDetail">
         SELECT
         t.*,
-        t2.tool_code AS toolCode,  <!-- 淇锛氬皢t1鏀逛负t2 -->
         t2.parama_table_name paramaTableName,
-        t2.classify_id AS classifyId,
+        t4.classify_id AS classifyId,
         t3.storage_location AS storageLocation,
         t3.chinese_name AS chineseName,
         t2.tool_model AS toolModel,
+        t3.application_type AS applicationType,
         t3.supplier_id AS supplierId,
 
         <choose>
@@ -56,9 +56,14 @@
                 c.part_material AS partMaterial
             </otherwise>
         </choose>
+
         FROM tms_stocktaking_bound_detail t
-        LEFT JOIN tms_base_tools t2 on t.tool_id = t2.id
-        LEFT JOIN tms_tools_config_property t3 on t3.tool_code = t2.id
+        left join tms_tool_ledger t1 ON  t1.tool_id= t.tool_Code
+        left join tms_tool_ledger_detail t5 ON  t5.tool_Code= t.tool_id
+        left join tms_tools_classify t4 on t4.id = t1.classify_id
+        left join tms_base_tools t2 on t2.id = t.tool_code
+        left join tms_tools_config_property t3 on t3.tool_code = t.tool_code
+
 
         <choose>
             <when test="ew.paramNameValuePairs.paramaTableName == '1'">
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaBladeService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaBladeService.java
index e0ece86..832accf 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaBladeService.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaBladeService.java
@@ -2,6 +2,10 @@
 
 import org.jeecg.modules.tms.entity.ParaBlade;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
+import org.jeecg.modules.tms.entity.vo.ParaBladeVo;
+
+import java.util.List;
 
 /**
  * @Description: tms_para_blade
@@ -11,4 +15,5 @@
  */
 public interface IParaBladeService extends IService<ParaBlade> {
 
+    List<ParaBladeVo> selectByClassifyAndParam(ToolQueryParamDto queryParam);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaThreadingToolService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaThreadingToolService.java
index 625d9a3..1ee565e 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaThreadingToolService.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IParaThreadingToolService.java
@@ -2,6 +2,10 @@
 
 import org.jeecg.modules.tms.entity.ParaThreadingTool;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
+import org.jeecg.modules.tms.entity.vo.ParaThreadingToolVo;
+
+import java.util.List;
 
 /**
  * @Description: tms_para_threading_tool
@@ -11,4 +15,5 @@
  */
 public interface IParaThreadingToolService extends IService<ParaThreadingTool> {
 
+    List<ParaThreadingToolVo> selectByClassifyAndParam(ToolQueryParamDto queryParam);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java
index 3c2026c..9621ba9 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/IPreparationOrderService.java
@@ -40,4 +40,6 @@
 	List<String> convertToOutboundOrder(List<String> preparationOrderIds);
 
 	IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page, Map<String, String[]> parameterMap);
+
+	void addPreparationOrderFromDnc(PreparationOrderAndDetailDto preparationOrderAndDetailDto);
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
index 1a8fef7..2ef6f18 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -85,6 +85,8 @@
 	private OutboundOrderMapper outboundOrderMapper;
 	@Autowired
 	private OutboundDetailMapper outboundDetailMapper;
+	@Autowired
+	private OutboundOrderConvert outboundOrderConvert;
 	
 	@Override
 	@Transactional(rollbackFor = Exception.class)
@@ -105,7 +107,7 @@
     @Override
 	@Transactional(rollbackFor = Exception.class)
     public void addTotal(OutboundOrderAndDetailDto outboundOrder) {
-		OutboundOrder order = OutboundOrderConvert.INSTANCE.convert(outboundOrder);
+		OutboundOrder order = outboundOrderConvert.convert(outboundOrder);
 		order.setHandler(Objects.requireNonNull(getCurrentUser()).getId());
 		order.setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"));
 		order.setOrderStatus(OutBillStatus.DRAFT.getValue());
@@ -157,7 +159,7 @@
 		//鍒犻櫎鎵�鏈夋槑缁�
 		outboundDetailService.remove(new LambdaQueryWrapper<OutboundDetail>()
 				.eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()));
-		OutboundOrder outboundOrderUpdate = OutboundOrderConvert.INSTANCE.convert(outboundOrder);
+		OutboundOrder outboundOrderUpdate = outboundOrderConvert.convert(outboundOrder);
 		outboundOrderMapper.updateById(outboundOrderUpdate);
 		List<OutboundDetail> detailList = CollectionUtil.newArrayList();
 		outboundOrder.getOutboundDetailList().forEach(item->{
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaBladeServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaBladeServiceImpl.java
index c4cb7c3..f0fd1b8 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaBladeServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaBladeServiceImpl.java
@@ -1,11 +1,19 @@
 package org.jeecg.modules.tms.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.modules.tms.entity.ParaBlade;
+import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
+import org.jeecg.modules.tms.entity.vo.ParaBladeVo;
 import org.jeecg.modules.tms.mapper.ParaBladeMapper;
 import org.jeecg.modules.tms.service.IParaBladeService;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.Collections;
+import java.util.List;
 
 /**
  * @Description: tms_para_blade
@@ -16,4 +24,32 @@
 @Service
 public class ParaBladeServiceImpl extends ServiceImpl<ParaBladeMapper, ParaBlade> implements IParaBladeService {
 
+    @Override
+    public List<ParaBladeVo> selectByClassifyAndParam(ToolQueryParamDto paramDto) {
+        QueryWrapper<ParaBlade> queryWrapper = Wrappers.query();
+        if (paramDto != null) {
+            // 鍒�鐗囩浉鍏冲弬鏁板瓧娈�
+            queryWrapper
+                    .like(StrUtil.isNotBlank(paramDto.getToolCode()), "t1.tool_code", paramDto.getToolCode())
+                    .like(StrUtil.isNotBlank(paramDto.getToolModel()), "t.tool_model", paramDto.getToolModel())
+                    .like(StrUtil.isNotBlank(paramDto.getChineseName()), "t.chinese_name", paramDto.getChineseName())
+                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), "t.classify_id", paramDto.getClassifyId())
+                    .eq(StrUtil.isNotBlank(paramDto.getPitch()), "t.pitch", paramDto.getPitch())
+                    .eq(StrUtil.isNotBlank(paramDto.getCuttingDirection()), "t.cutting_direction", paramDto.getCuttingDirection())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeLength()), "t.blade_length", paramDto.getBladeLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeWide()), "t.blade_wide", paramDto.getBladeWide())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeShape()), "t.blade_shape", paramDto.getBladeShape())
+                    .eq(StrUtil.isNotBlank(paramDto.getCuttingEdgeCount()), "t.cutting_edge_count", paramDto.getCuttingEdgeCount())
+                    .eq(StrUtil.isNotBlank(paramDto.getClampingType()), "t.clamping_type", paramDto.getClampingType())
+                    .eq(StrUtil.isNotBlank(paramDto.getNoseAngleR()), "t.nose_angle_r", paramDto.getNoseAngleR())
+                    .eq(StrUtil.isNotBlank(paramDto.getProcessingClassify()), "t.processing_classify", paramDto.getProcessingClassify())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladePosterior()), "t.blade_posterior", paramDto.getBladePosterior())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeSize()), "t.blade_size", paramDto.getBladeSize())
+                    .eq(StrUtil.isNotBlank(paramDto.getInOutThread()), "t.in_out_thread", paramDto.getInOutThread())
+                    .eq(StrUtil.isNotBlank(paramDto.getDentalAngle()), "t.dental_angle", paramDto.getDentalAngle())
+                    .eq(StrUtil.isNotBlank(paramDto.getMinInternalThread()), "t.min_internal_thread", paramDto.getMinInternalThread())
+                    .eq(StrUtil.isNotBlank(paramDto.getThreadStandard()), "t.thread_standard", paramDto.getThreadStandard());
+        }
+        return this.baseMapper.selectByClassifyAndParam(queryWrapper);
+    }
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaHoleToolsServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaHoleToolsServiceImpl.java
index 2de5809..660b368 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaHoleToolsServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaHoleToolsServiceImpl.java
@@ -27,23 +27,26 @@
 
     @Override
     public List<ParaHolesToolsVo> selectByClassifyAndDiameter(ToolQueryParamDto paramDto) {
-        LambdaQueryWrapper<ParaHolesToolsVo> queryWrapper = new LambdaQueryWrapper<>();
+        QueryWrapper<ParaHoleTools> queryWrapper = Wrappers.query();
         if (paramDto != null) {
             // 瀛斿姞宸ュ垁鍏风浉鍏冲弬鏁板瓧娈�
             queryWrapper
-                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), ParaHolesToolsVo::getClassifyId, paramDto.getClassifyId())
-                    .eq(StrUtil.isNotBlank(paramDto.getDiameter()), ParaHolesToolsVo::getDiameter, paramDto.getDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getTotalLength()), ParaHolesToolsVo::getTotalLength, paramDto.getTotalLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getToolMaterial()), ParaHolesToolsVo::getToolMaterial, paramDto.getToolMaterial())
-                    .eq(StrUtil.isNotBlank(paramDto.getEdgeLength()), ParaHolesToolsVo::getEdgeLength, paramDto.getEdgeLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getBladeCount()), ParaHolesToolsVo::getBladeCount, paramDto.getBladeCount())
-                    .eq(StrUtil.isNotBlank(paramDto.getEffectiveLength()), ParaHolesToolsVo::getEffectiveLength, paramDto.getEffectiveLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getLatestBoringDiameter()), ParaHolesToolsVo::getLatestBoringDiameter, paramDto.getLatestBoringDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getMaxBoringDiameter()), ParaHolesToolsVo::getMaxBoringDiameter, paramDto.getMaxBoringDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getKnifeDiameter()), ParaHolesToolsVo::getKnifeDiameter, paramDto.getKnifeDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getBoreDiameter()), ParaHolesToolsVo::getBoreDiameter, paramDto.getBoreDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getHeadsNumber()), ParaHolesToolsVo::getHeadsNumber, paramDto.getHeadsNumber())
-                    .eq(StrUtil.isNotBlank(paramDto.getSmallDiameter()), ParaHolesToolsVo::getSmallDiameter, paramDto.getSmallDiameter());
+                    .like(StrUtil.isNotBlank(paramDto.getToolCode()), "t1.tool_code", paramDto.getToolCode())
+                    .like(StrUtil.isNotBlank(paramDto.getToolModel()), "t.tool_model", paramDto.getToolModel())
+                    .like(StrUtil.isNotBlank(paramDto.getChineseName()), "t.chinese_name", paramDto.getChineseName())
+                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), "t.classify_id", paramDto.getClassifyId())
+                    .eq(StrUtil.isNotBlank(paramDto.getDiameter()), "t.diameter", paramDto.getDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getTotalLength()), "t.total_length", paramDto.getTotalLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getToolMaterial()), "t.tool_material", paramDto.getToolMaterial())
+                    .eq(StrUtil.isNotBlank(paramDto.getEdgeLength()), "t.edge_length", paramDto.getEdgeLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeCount()), "t.blade_count", paramDto.getBladeCount())
+                    .eq(StrUtil.isNotBlank(paramDto.getEffectiveLength()), "t.effective_length", paramDto.getEffectiveLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getLatestBoringDiameter()), "t.latest_boring_diameter", paramDto.getLatestBoringDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getMaxBoringDiameter()), "t.max_boring_diameter", paramDto.getMaxBoringDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getKnifeDiameter()), "t.knife_diameter", paramDto.getKnifeDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getBoreDiameter()), "t.bore_diameter", paramDto.getBoreDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getHeadsNumber()), "t.heads_number", paramDto.getHeadsNumber())
+                    .eq(StrUtil.isNotBlank(paramDto.getSmallDiameter()), "t.small_diameter", paramDto.getSmallDiameter());
         }
         return this.baseMapper.selectByClassifyAndDiameter(queryWrapper);
     }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaMillToolServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaMillToolServiceImpl.java
index 35778ed..2943246 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaMillToolServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaMillToolServiceImpl.java
@@ -2,6 +2,8 @@
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.modules.tms.entity.ParaMillTool;
 import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
 import org.jeecg.modules.tms.entity.vo.ParaMillToolVo;
@@ -25,24 +27,27 @@
 
     @Override
     public List<ParaMillToolVo> selectByClassifyAndDiameter(ToolQueryParamDto paramDto) {
-        LambdaQueryWrapper<ParaMillTool> queryWrapper = new LambdaQueryWrapper<>();
+        QueryWrapper<ParaMillTool> queryWrapper = Wrappers.query();
         if (paramDto != null) {
             //閾e墛鍒�鍏风浉鍏冲弬鏁板瓧娈�
             queryWrapper
-                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), ParaMillTool::getClassifyId, paramDto.getClassifyId())
-                    .eq(StrUtil.isNotBlank(paramDto.getDiameter()), ParaMillTool::getDiameter, paramDto.getDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getTotalLength()), ParaMillTool::getTotalLength, paramDto.getTotalLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getToolMaterial()), ParaMillTool::getToolMaterial, paramDto.getToolMaterial())
-                    .eq(StrUtil.isNotBlank(paramDto.getEdgeLength()), ParaMillTool::getEdgeLength, paramDto.getEdgeLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getNumberOfTeeth()), ParaMillTool::getNumberOfTeeth, paramDto.getNumberOfTeeth())
-                    .eq(StrUtil.isNotBlank(paramDto.getNeckDiameter()), ParaMillTool::getNeckDiameter, paramDto.getNeckDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getSmallDiameter()), ParaMillTool::getSmallDiameter, paramDto.getSmallDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getHandleLength()), ParaMillTool::getHandleLength, paramDto.getHandleLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getDeepestDepth()), ParaMillTool::getDeepestDepth, paramDto.getDeepestDepth())
-                    .eq(StrUtil.isNotBlank(paramDto.getHandleNeckLength()), ParaMillTool::getHandleNeckLength, paramDto.getHandleNeckLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getOverhangingLength()), ParaMillTool::getOverhangingLength, paramDto.getOverhangingLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getPitch()), ParaMillTool::getPitch, paramDto.getPitch())
-                    .eq(StrUtil.isNotBlank(paramDto.getRecentlyDiameter()), ParaMillTool::getRecentlyDiameter, paramDto.getRecentlyDiameter());
+                    .like(StrUtil.isNotBlank(paramDto.getToolCode()), "t1.tool_code", paramDto.getToolCode())
+                    .like(StrUtil.isNotBlank(paramDto.getToolModel()), "t.tool_model", paramDto.getToolModel())
+                    .like(StrUtil.isNotBlank(paramDto.getChineseName()), "t.chinese_name", paramDto.getChineseName())
+                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), "t.classify_id", paramDto.getClassifyId())
+                    .eq(StrUtil.isNotBlank(paramDto.getDiameter()), "t.diameter", paramDto.getDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getTotalLength()), "t.total_length", paramDto.getTotalLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getToolMaterial()), "t.tool_material", paramDto.getToolMaterial())
+                    .eq(StrUtil.isNotBlank(paramDto.getEdgeLength()), "t.edge_length", paramDto.getEdgeLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getNumberOfTeeth()), "t.number_of_teeth", paramDto.getNumberOfTeeth())
+                    .eq(StrUtil.isNotBlank(paramDto.getNeckDiameter()), "t.neck_diameter", paramDto.getNeckDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getSmallDiameter()), "t.small_diameter", paramDto.getSmallDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getHandleLength()), "t.handle_length", paramDto.getHandleLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getDeepestDepth()), "t.deepest_depth", paramDto.getDeepestDepth())
+                    .eq(StrUtil.isNotBlank(paramDto.getHandleNeckLength()), "t.handle_neck_length", paramDto.getHandleNeckLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getOverhangingLength()), "t.overhanging_length", paramDto.getOverhangingLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getPitch()), "t.pitch", paramDto.getPitch())
+                    .eq(StrUtil.isNotBlank(paramDto.getRecentlyDiameter()), "t.recently_diameter", paramDto.getRecentlyDiameter());
         }
         return this.baseMapper.selectByClassifyAndDiameter(queryWrapper);
     }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaThreadingToolServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaThreadingToolServiceImpl.java
index 7ec1e9f..dffea5d 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaThreadingToolServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaThreadingToolServiceImpl.java
@@ -1,11 +1,19 @@
 package org.jeecg.modules.tms.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.modules.tms.entity.ParaThreadingTool;
+import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
+import org.jeecg.modules.tms.entity.vo.ParaThreadingToolVo;
 import org.jeecg.modules.tms.mapper.ParaThreadingToolMapper;
 import org.jeecg.modules.tms.service.IParaThreadingToolService;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.Collections;
+import java.util.List;
 
 /**
  * @Description: tms_para_threading_tool
@@ -16,4 +24,30 @@
 @Service
 public class ParaThreadingToolServiceImpl extends ServiceImpl<ParaThreadingToolMapper, ParaThreadingTool> implements IParaThreadingToolService {
 
+    @Override
+    public List<ParaThreadingToolVo> selectByClassifyAndParam(ToolQueryParamDto paramDto) {
+        QueryWrapper<ParaThreadingTool> queryWrapper = Wrappers.query();
+        if (paramDto != null) {
+            // 铻虹汗鍒�鍏风浉鍏冲弬鏁板瓧娈�
+            queryWrapper
+                    .like(StrUtil.isNotBlank(paramDto.getToolCode()), "t1.tool_code", paramDto.getToolCode())
+                    .like(StrUtil.isNotBlank(paramDto.getToolModel()), "t.tool_model", paramDto.getToolModel())
+                    .like(StrUtil.isNotBlank(paramDto.getChineseName()), "t.chinese_name", paramDto.getChineseName())
+                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), "t.classify_id", paramDto.getClassifyId())
+                    .eq(StrUtil.isNotBlank(paramDto.getThreadCode()), "t.thread_code", paramDto.getThreadCode())
+                    .eq(StrUtil.isNotBlank(paramDto.getPitch()), "t.pitch", paramDto.getPitch())
+                    .eq(StrUtil.isNotBlank(paramDto.getRotationDirection()), "t.rotation_direction", paramDto.getRotationDirection())
+                    .eq(StrUtil.isNotBlank(paramDto.getTolerancezoneLevel()), "t.tolerancezone_level", paramDto.getTolerancezoneLevel())
+                    .eq(StrUtil.isNotBlank(paramDto.getExternalDimensions()), "t.external_dimensions", paramDto.getExternalDimensions())
+                    .eq(StrUtil.isNotBlank(paramDto.getHandleSpecifications()), "t.handle_specifications", paramDto.getHandleSpecifications())
+                    .eq(StrUtil.isNotBlank(paramDto.getScrewHoleType()), "t.screw_hole_type", paramDto.getScrewHoleType())
+                    .eq(StrUtil.isNotBlank(paramDto.getThreadStandard()), "t.thread_standard", paramDto.getThreadStandard())
+                    .eq(StrUtil.isNotBlank(paramDto.getFluteSoltType()), "t.flute_solt_type", paramDto.getFluteSoltType())
+                    .eq(StrUtil.isNotBlank(paramDto.getThreadType()), "t.thread_type", paramDto.getThreadType())
+                    .eq(StrUtil.isNotBlank(paramDto.getGuidingSize()), "t.guiding_size", paramDto.getGuidingSize())
+                    .eq(StrUtil.isNotBlank(paramDto.getConnectionAperture()), "t.connection_aperture", paramDto.getConnectionAperture())
+                    .eq(StrUtil.isNotBlank(paramDto.getConnectingKeyway()), "t.connecting_keyway", paramDto.getConnectingKeyway());
+        }
+        return this.baseMapper.selectByClassifyAndParam(queryWrapper);
+    }
 }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaTurningToolsServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaTurningToolsServiceImpl.java
index 739f410..e68f980 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaTurningToolsServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/ParaTurningToolsServiceImpl.java
@@ -2,6 +2,8 @@
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.modules.tms.entity.ParaTurningTools;
 import org.jeecg.modules.tms.entity.dto.ToolQueryParamDto;
 import org.jeecg.modules.tms.entity.vo.ParaTurningToolsVo;
@@ -25,28 +27,31 @@
 
     @Override
     public List<ParaTurningToolsVo> selectByClassifyAndDiameter(ToolQueryParamDto paramDto) {
-        LambdaQueryWrapper<ParaTurningTools> queryWrapper = new LambdaQueryWrapper<>();
+        QueryWrapper<ParaTurningTools> queryWrapper = Wrappers.query();
         if (paramDto != null) {
             //杞﹀墛鍒�鍏风浉鍏冲弬鏁板瓧娈�
             queryWrapper
-                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), ParaTurningTools::getClassifyId, paramDto.getClassifyId())
-                    .eq(StrUtil.isNotBlank(paramDto.getDiameter()), ParaTurningTools::getToolDiameter, paramDto.getDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getTotalLength()), ParaTurningTools::getTotalLength, paramDto.getTotalLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getToolMaterial()), ParaTurningTools::getToolMaterial, paramDto.getToolMaterial())
-                    .eq(StrUtil.isNotBlank(paramDto.getSmallDiameter()), ParaTurningTools::getSmallDiameter, paramDto.getSmallDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getCuttingDirection()), ParaTurningTools::getCuttingDirection, paramDto.getCuttingDirection())
-                    .eq(StrUtil.isNotBlank(paramDto.getKnifeSize()), ParaTurningTools::getKnifeSize, paramDto.getKnifeSize())
-                    .eq(StrUtil.isNotBlank(paramDto.getBoringBarDiameter()), ParaTurningTools::getBoringBarDiameter, paramDto.getBoringBarDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getBladeLength()), ParaTurningTools::getBladeLength, paramDto.getBladeLength())
-                    .eq(StrUtil.isNotBlank(paramDto.getBarDirection()), ParaTurningTools::getBarDirection, paramDto.getBarDirection())
-                    .eq(StrUtil.isNotBlank(paramDto.getBladeHeight()), ParaTurningTools::getBladeHeight, paramDto.getBladeHeight())
-                    .eq(StrUtil.isNotBlank(paramDto.getBladeWide()), ParaTurningTools::getBladeWide, paramDto.getBladeWide())
-                    .eq(StrUtil.isNotBlank(paramDto.getSlotWidth()), ParaTurningTools::getSlotWidth, paramDto.getSlotWidth())
-                    .eq(StrUtil.isNotBlank(paramDto.getMaxDiameter()), ParaTurningTools::getMaxDiameter, paramDto.getMaxDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getMaxDepth()), ParaTurningTools::getMaxDepth, paramDto.getMaxDepth())
-                    .eq(StrUtil.isNotBlank(paramDto.getBladeThickness()), ParaTurningTools::getBladeThickness, paramDto.getBladeThickness())
-                    .eq(StrUtil.isNotBlank(paramDto.getMinDiameter()), ParaTurningTools::getMinDiameter, paramDto.getMinDiameter())
-                    .eq(StrUtil.isNotBlank(paramDto.getMatchingNumber()), ParaTurningTools::getMatchingNumber, paramDto.getMatchingNumber());
+                    .like(StrUtil.isNotBlank(paramDto.getToolCode()), "t1.tool_code", paramDto.getToolCode())
+                    .like(StrUtil.isNotBlank(paramDto.getToolModel()), "t.tool_model", paramDto.getToolModel())
+                    .like(StrUtil.isNotBlank(paramDto.getChineseName()), "t.chinese_name", paramDto.getChineseName())
+                    .eq(StrUtil.isNotBlank(paramDto.getClassifyId()), "t.classify_id", paramDto.getClassifyId())
+                    .eq(StrUtil.isNotBlank(paramDto.getDiameter()), "t.tool_diameter", paramDto.getDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getTotalLength()), "t.total_length", paramDto.getTotalLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getToolMaterial()), "t.tool_material", paramDto.getToolMaterial())
+                    .eq(StrUtil.isNotBlank(paramDto.getSmallDiameter()), "t.small_diameter", paramDto.getSmallDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getCuttingDirection()), "t.cutting_direction", paramDto.getCuttingDirection())
+                    .eq(StrUtil.isNotBlank(paramDto.getKnifeSize()), "t.knife_size", paramDto.getKnifeSize())
+                    .eq(StrUtil.isNotBlank(paramDto.getBoringBarDiameter()), "t.boring_bar_diameter", paramDto.getBoringBarDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeLength()), "t.blade_length", paramDto.getBladeLength())
+                    .eq(StrUtil.isNotBlank(paramDto.getBarDirection()), "t.bar_direction", paramDto.getBarDirection())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeHeight()), "t.blade_height", paramDto.getBladeHeight())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeWide()), "t.blade_wide", paramDto.getBladeWide())
+                    .eq(StrUtil.isNotBlank(paramDto.getSlotWidth()), "t.slot_width", paramDto.getSlotWidth())
+                    .eq(StrUtil.isNotBlank(paramDto.getMaxDiameter()), "t.max_diameter", paramDto.getMaxDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getMaxDepth()), "t.max_depth", paramDto.getMaxDepth())
+                    .eq(StrUtil.isNotBlank(paramDto.getBladeThickness()), "t.blade_thickness", paramDto.getBladeThickness())
+                    .eq(StrUtil.isNotBlank(paramDto.getMinDiameter()), "t.min_diameter", paramDto.getMinDiameter())
+                    .eq(StrUtil.isNotBlank(paramDto.getMatchingNumber()), "t.matching_number", paramDto.getMatchingNumber());
         }
         return this.baseMapper.selectByClassifyAndDiameter(queryWrapper);
     }
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
index 0fb2bcc..f696caf 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
@@ -54,6 +54,8 @@
 	private ISysBusinessCodeRuleService businessCodeRuleService;
 	@Autowired
 	private IBaseToolsService baseToolsService;
+	@Autowired
+	private PreparationOrderConvert preparationOrderConvert;
 	
 	@Override
 	@Transactional(rollbackFor = Exception.class)
@@ -77,7 +79,7 @@
 		//鍏堝垹闄ゆ墍鏈夋槑缁�
 		preparationOrderDetailMapper.delete(new LambdaQueryWrapper<PreparationOrderDetail>()
 				.eq(PreparationOrderDetail::getPreparationOrderId, preparationOrderAndDetailDto.getId()));
-		PreparationOrder preparationOrder = PreparationOrderConvert.INSTANCE.convert(preparationOrderAndDetailDto);
+		PreparationOrder preparationOrder = preparationOrderConvert.convert(preparationOrderAndDetailDto);
 		updateById(preparationOrder);
 		List<PreparationOrderDetail> detailUpdateList = CollectionUtil.newArrayList();
 		preparationOrderAndDetailDto.getPreparationOrderDetailList().forEach(item->{
@@ -218,7 +220,23 @@
 		return this.baseMapper.queryPageList(page, queryWrapper);
 	}
 
-	private LoginUser getCurrentUser() {
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void addPreparationOrderFromDnc(PreparationOrderAndDetailDto preparationOrderAndDetailDto) {
+		PreparationOrder preparationOrder = preparationOrderConvert.convert(preparationOrderAndDetailDto);
+		preparationOrder
+				.setId(null)
+				.setPreparationOrderNum(businessCodeRuleService.generateBusinessCodeSeq("ToolPreparationOrder"))
+				.setOrderStatus(PreparationOrderStatus.PENDING_AUDIT.getValue());
+		save(preparationOrder);
+		List<PreparationOrderDetail> preparationOrderDetailList = preparationOrderAndDetailDto.getPreparationOrderDetailList();
+		preparationOrderDetailList.forEach(item -> {
+			item.setId(null).setPreparationOrderId(preparationOrder.getId());
+		});
+		preparationOrderDetailService.saveBatch(preparationOrderDetailList);
+	}
+
+    private LoginUser getCurrentUser() {
 		// 鑾峰彇褰撳墠璁よ瘉鐨勭櫥褰曠敤鎴蜂俊鎭�
 		Subject currentUser = SecurityUtils.getSubject();
 		if (currentUser != null && currentUser.isAuthenticated()) {

--
Gitblit v1.9.3