From 24e0bdd24a10449c98013cdb5bcc5e37735f5a91 Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期一, 16 六月 2025 09:04:01 +0800 Subject: [PATCH] 对接刀具系统,涉密网封装结构树与文件 --- 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-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java | 19 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-dnc/src/main/java/org/jeecg/modules/dnc/service/IProductMixService.java | 18 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProcessSpecVersionMapper.java | 6 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/DataPackageStrategy.java | 13 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/mapper/ProcessStreamMapper.java | 4 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/dto/ComponentHierarchy.java | 28 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FullHierarchyTraceService.java | 236 +++++++ 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/SecurityService.java | 48 + lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/ComponentInfoMapper.xml | 22 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/dto/TransferPackage.java | 32 + lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java | 143 ++-- lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/constant/DncPassLogPassType.java | 39 + 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/mapper/ProductInfoMapper.java | 6 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-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java | 6 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/service/IProductInfoService.java | 2 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/ProductMixMapper.java | 22 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-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessionDepartmentServiceImpl.java | 5 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java | 4 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IAssignFileStreamService.java | 8 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java | 5 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java | 2 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-dnc/src/main/java/org/jeecg/modules/dnc/mapper/PartsInfoMapper.java | 6 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/service/impl/DocInfoServiceImpl.java | 12 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/FileFerryService.java | 254 ++++++++ lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessSpecVersionServiceImpl.java | 4 43 files changed, 1,707 insertions(+), 116 deletions(-) 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/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/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/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/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/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 f1c9ad0..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; 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-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)); + } } -- Gitblit v1.9.3