From b5fd4d5dd05e13af32ad50334f5e2f0f8aa56d59 Mon Sep 17 00:00:00 2001
From: lyh <liuyuanheng@xalxzn.com>
Date: 星期六, 14 六月 2025 23:56:26 +0800
Subject: [PATCH] 工控网解析 涉密网产品结构树(添加权限)、nc文件、刀具列表、程序加工确认表

---
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/WorkStepServiceImpl.java                            |    4 
 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                              |  456 +++++++++++++++++++++++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java                                           |   16 
 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/impl/ProductInfoServiceImpl.java                         |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/JsonUtils.java                                             |   48 ++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/ProcessTraceChain.java                                       |   86 ++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java                                           |    4 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java                       |    4 
 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/dto/ComponentHierarchy.java                                      |   28 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ComponentInfoSeServiceImpl.java                     |    4 
 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/service/impl/SecurityService.java                                |   48 ++
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java |    5 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java                                       |   22 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java                                         |   31 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java                               |  224 ++++++++++++
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java                  |    4 
 20 files changed, 1,012 insertions(+), 34 deletions(-)

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..9b28811
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java
@@ -0,0 +1,31 @@
+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.*;
+
+@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/ProductMix.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java
index 81e49a1..f390a20 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
@@ -29,13 +29,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 +43,19 @@
     //灞曠ず鍚嶇О
     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 trrCode, Integer type, Date createTime) {
         this.id = id;
         this.parentId = parentId;
-        this.name = name;
-        this.code = code;
+        this.treeName = treeName;
+        this.treeCode = trrCode;
         this.type = type;
         this.children = new ArrayList<>();
-        this.label="["+code+"]"+name;
+        this.label="["+ trrCode +"]"+ treeName;
         this.createTime = createTime;
     }
 
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 85f68be..65bbe03 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,25 +1,26 @@
 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.jeecg.modules.dnc.dto.TransferPackage;
+import org.jeecg.modules.dnc.service.impl.DataImportService;
+import org.jeecg.modules.dnc.service.impl.FileFerryService;
 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;
-import java.util.Objects;
 
 @Component
 public class FileListener implements FileAlterationListener {
     private static final Logger log = LoggerFactory.getLogger(FileListener.class);
 
     @Autowired
-    private IDocInfoService docInfoService;  // 鏂囨。鏈嶅姟
+    private FileFerryService fileFerryService;
+
+    @Autowired
+    private DataImportService dataImportService;
+
 
     @Override
     public void onStart(FileAlterationObserver observer) {
@@ -45,6 +46,13 @@
     public void onFileCreate(File file) {
         String filePath = file.getAbsolutePath();
         log.info("[鏂板缓]: {}", filePath);
+//        if (filePath.startsWith(fileMonitorConfig.getPaths().get(0))){
+            if (filePath.endsWith(".ferry")){
+                TransferPackage data = fileFerryService.importData(filePath);
+                dataImportService.importTransferPackage(data);
+                log.info("鏂囦欢瀵煎叆瀹屾垚");
+            }
+//        }
     }
     @Override
     public void onFileChange(File file) {
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..a0ccbec 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/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/DataImportService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataImportService.java
new file mode 100644
index 0000000..98dc0d9
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DataImportService.java
@@ -0,0 +1,456 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.jeecg.weibo.exception.BusinessException;
+import liquibase.pro.packaged.S;
+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/FileFerryService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java
new file mode 100644
index 0000000..1d4b5c3
--- /dev/null
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java
@@ -0,0 +1,224 @@
+package org.jeecg.modules.dnc.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import liquibase.pro.packaged.S;
+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.mapper.DocRelativeMapper;
+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.IDocFileService;
+import org.jeecg.modules.dnc.service.IDocInfoService;
+import org.jeecg.modules.dnc.service.IDocRelativeService;
+import org.jeecg.modules.dnc.utils.CompressionUtils;
+import org.jeecg.modules.dnc.utils.JsonUtils;
+import org.jeecg.modules.dnc.utils.file.FileUtilS;
+import org.jeecg.modules.dncFlow.service.IAssignFileStreamService;
+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 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 IDocInfoService docInfoService;
+
+    @Autowired
+    private IDocClassificationService classificationService;
+
+    @Autowired
+    private IDocRelativeService docRelativeService;
+
+
+    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/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/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 c5302eb..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
@@ -176,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/ProductInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductInfoServiceImpl.java
index 0562ada..3c87ff4 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;
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/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-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 104a9db..632ce9e 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
@@ -175,4 +175,11 @@
      * @return
      */
     List<String> findProIdsByUId(String userId, List<String> allProductionIds);
+
+    /**
+     * 鏍规嵁浜х嚎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 c502486..7f378ca 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
@@ -627,4 +627,9 @@
             super.update(updateWrapper);
         }
     }
+
+    @Override
+    public MdcProduction findByOrgCode(String orgCode){
+        return this.baseMapper.selectOne(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getOrgCode, orgCode));
+    }
 }

--
Gitblit v1.9.3