lyh
2026-03-12 e5bd30e774dba285e0e22bbfa5e4e0d936d88e6b
430代码 SQL server
已添加1个文件
已修改17个文件
671 ■■■■■ 文件已修改
pom.xml 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/activiti/service/IAssignFileStreamService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/activiti/service/IToEquipmentTaskService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/activiti/service/impl/AssignFileStreamServiceImpl.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/activiti/service/impl/ToEquipmentTaskServiceImpl.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/auth/config/WebSecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/config/SwaggerConfig.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/framework/domain/activiti/response/ActivitiCode.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/framework/domain/plm/PdmProgramSource.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/framework/domain/plm/ext/PdmProgramInfoExt.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/framework/utils/date/DateUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/framework/utils/file/FileUtil.java 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/nc/service/IDeviceGroupService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/nc/service/impl/DeviceGroupServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/plm/service/impl/PdmProgramSourceServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lxzn/plm/service/impl/QueryNcProgramLogServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/scheduled.properties 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -71,22 +71,22 @@
        <!--spring boot ç»“束-->
        <!--持久层 æ•°æ®åº“ è¿žæŽ¥æ±  å¼€å§‹-->
        <!--数据库连接在springboot中定义了,所以可以管理包的版本-->
<!--        <dependency>-->
<!--            <groupId>com.microsoft.sqlserver</groupId>-->
<!--            <artifactId>mssql-jdbc</artifactId>-->
<!--            <scope>runtime</scope>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>${mysql-connector-java.version}</version>
         </dependency>-->
        <!--   è¾¾æ¢¦æ•°æ®åº“     -->
        <dependency>
            <groupId>com.dameng</groupId>
            <artifactId>DmJdbcDriver18</artifactId>
            <version>8.1.1.193</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>com.dameng</groupId>-->
<!--            <artifactId>DmJdbcDriver18</artifactId>-->
<!--            <version>8.1.1.193</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
src/main/java/com/lxzn/activiti/service/IAssignFileStreamService.java
@@ -8,6 +8,8 @@
import com.lxzn.framework.domain.activiti.request.AssignFileRequest;
import com.lxzn.framework.domain.activiti.request.AssignFileStreamQueryRequest;
import com.lxzn.framework.domain.activiti.response.ActivitiCode;
import com.lxzn.framework.domain.nc.DocInfo;
import com.lxzn.framework.domain.plm.PdmProgramSource;
import com.lxzn.framework.model.response.QueryPageResponseResult;
import com.lxzn.framework.model.response.ResponseResult;
@@ -117,4 +119,5 @@
                           String partsCode, String processCode,
                           String description,String id);
    boolean saveListNcFromPdm(DocInfo docInfo, PdmProgramSource source);
}
src/main/java/com/lxzn/activiti/service/IToEquipmentTaskService.java
@@ -3,5 +3,24 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.lxzn.framework.domain.activiti.ToEquipmentTask;
import java.util.List;
public interface IToEquipmentTaskService extends IService<ToEquipmentTask> {
    //发送文件到密标文件夹
    void updateNcFileFromTask();
    /**
     * æŸ¥è¯¢æŸä¸€ç±»æ–‡ä»¶
     * @param syncFlag
     * @return
     */
    List<ToEquipmentTask> selectTaskSyncFlag(Integer syncFlag);
    /**
     * é€šè¿‡æ–‡ä»¶åç§°ä¸ŽçŠ¶æ€ç¡®å®šæ˜¯å¦å¯ä»¥åˆ é™¤
     * @param filePath,fileEncodeName,yncFlag
     * @return
     */
    List<ToEquipmentTask> selectTaskByNameAndSyncFlag(String filePath,String fileEncodeName,Integer syncFlag);
}
src/main/java/com/lxzn/activiti/service/impl/AssignFileStreamServiceImpl.java
@@ -7,6 +7,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lxzn.activiti.dao.AssignFileStreamMapper;
import com.lxzn.activiti.service.IActivitiDefinitionService;
import com.lxzn.activiti.service.IAssignFileStreamService;
@@ -27,6 +29,7 @@
import com.lxzn.framework.domain.nc.*;
import com.lxzn.framework.domain.nc.response.DeviceCode;
import com.lxzn.framework.domain.nc.response.DocumentCode;
import com.lxzn.framework.domain.plm.PdmProgramSource;
import com.lxzn.framework.domain.ucenter.Department;
import com.lxzn.framework.domain.ucenter.response.UcenterCode;
import com.lxzn.framework.exception.ExceptionCast;
@@ -52,6 +55,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -107,6 +112,10 @@
    private String serverIp;
    @Value("${securedoc.serverPort}")
    private int serverPort;
    @Value("${ncPdm.file_path}")
    private String localFilePath;
    @Value("${fileHomePath}")
    private String fileHomePath;
    @Override
    @Transactional(rollbackFor = {Exception.class})
@@ -764,6 +773,7 @@
            dncLogService.save(dncLog);
            return false;
        }
        //工序天加逻辑
        processCode = processCode.split("_")[0];
        ProcessStream stream = processStreamService.findByProcessEquipment(equipmentId,
                processCode,description,compTotal.getComponentId(),part.getPartsId());
@@ -857,4 +867,142 @@
        dncLogService.save(dncLog);
        return synchronizedFlagService.updateFlag(0);
    }
    /**
     *
     * @param docInfo
     * @param source
     * @return
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean saveListNcFromPdm(DocInfo docInfo, PdmProgramSource source) {
        DncLog dncLog = new DncLog();
        DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo("PDMMES");
        if(deviceInfo == null) {
            dncLog.setRemarks("DNC中设备不存在,无此设备的程序下发_PDMMES" );
            dncLogService.save(dncLog);
            return false;
        }
        DocFile docFile = docFileService.getById(docInfo.getPublishFileId());
        if(docFile == null) {
            return false;
        }
        String id = IdWorker.getIdStr();
        String name = DateUtil.format(DateUtil.getNow(),DateUtil.STR_YEARMONTHDAY);
        String newPath = "/securedoc" + docFile.getFilePath();
        String loFilePath = fileHomePath + newPath +  "\\" + name +"_" + id;
        ObjectMapper mapper = new ObjectMapper();
        try {
            String json = mapper.writeValueAsString(source);
            try {
                FileUtil.fileWriterSql(loFilePath,json);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //插入文档到设备发送文档
        DocClassification classification = classificationService.getByCode(SEND_CODE);
        if(classification == null)
            return false;
        DocRelative docRelative = new DocRelative();
        docRelative.setDocId(docInfo.getDocId());
        docRelative.setClassificationId(classification.getClassificationId());
        docRelative.setAttributionType(4);
        docRelative.setAttributionId(deviceInfo.getDeviceId());
        boolean b = docRelativeService.save(docRelative);
        if(!b) {
            return false;
        }
        //复制文件,进行预定密
        b = FileUtil.copyFile(docFile.getFilePath(), newPath, docFile.getFileEncodeName());
        if(!b){
            return false;
        }
        String absPath = FileUtil.getFileAbsPath(newPath, docFile.getFileEncodeName());
        if(absPath == null){
            return false;
        }
        try {
            secureDocService.binByFileLable(absPath);
        } catch (Exception e) {
            return false;
        }
        try {
            secureDocService.editLabelByPath(absPath);
        }catch (Exception e) {
            return false;
        }
        //插入文件传输任务表
        ToEquipmentTask equipmentTask = new ToEquipmentTask();
        //不能直接从doc中拿fileId å’Œversion  å¯èƒ½ä¼šå­˜åœ¨å˜æ›´
        //equipmentTask.setFileId(docInfo.getPublishFileId());
        //equipmentTask.setDocVersion(docInfo.getPublishVersion());
        equipmentTask.setDocId(docInfo.getDocId());
        equipmentTask.setSyncFlag(1);
        equipmentTask.setDeviceNo(deviceInfo.getDeviceNo());
        equipmentTask.setDeviceId(deviceInfo.getDeviceId());
        equipmentTask.setDepartId(deviceInfo.getDepartId());
        //文件相关信息
        equipmentTask.setFileId(docFile.getFileId());
        equipmentTask.setDocVersion(docFile.getDocVersion());
        equipmentTask.setFileName(docInfo.getDocName());
        equipmentTask.setFileEncodeName(docFile.getFileEncodeName());
        equipmentTask.setFilePath(docFile.getFilePath());
        equipmentTask.setFileSuffix(docFile.getFileSuffix());
        equipmentTask.setFileSize(docFile.getFileSize());
        b = equipmentTaskService.save(equipmentTask);
        if(!b) {
            return false;
        }
        //TODO
        //复制文件,进行预定密
        String absPathTxt = FileUtil.getFileAbsPathTxt(loFilePath);
        if(absPathTxt == null){
            return false;
        }
        try {
            secureDocService.binByFileLable(absPathTxt);
        } catch (Exception e) {
            return false;
        }
        try {
            secureDocService.editLabelByPath(absPathTxt);
        }catch (Exception e) {
            return false;
        }
        ToEquipmentTask equipmentTaskTxt = new ToEquipmentTask();
        /*equipmentTaskTxt.setDocId(docInfo.getDocId());*/
        equipmentTaskTxt.setSyncFlag(1);
        equipmentTaskTxt.setDeviceNo(deviceInfo.getDeviceNo());
        equipmentTaskTxt.setDeviceId(deviceInfo.getDeviceId());
        equipmentTaskTxt.setDepartId(deviceInfo.getDepartId());
        //文件相关信息
        /*equipmentTaskTxt.setFileId(docFile.getFileId());*/
        equipmentTaskTxt.setDocVersion("a.1");
        equipmentTaskTxt.setFileName( name +"_" + id);
        equipmentTaskTxt.setFileEncodeName( name +"_" + id);
        equipmentTaskTxt.setFilePath(docFile.getFilePath());
        equipmentTaskTxt.setFileSuffix("txt");
        equipmentTaskTxt.setFileSize(FileUtil.selectFileSize(new File(loFilePath)));
        boolean txt = equipmentTaskService.save(equipmentTaskTxt);
        if(!txt) {
            return false;
        }
        dncLog.setIsSuccess(LogCodeUtil.success_is_true);
        dncLog.setRemarks("下发成功");
        dncLogService.save(dncLog);
        return synchronizedFlagService.updateFlag(0);
    }
}
src/main/java/com/lxzn/activiti/service/impl/ToEquipmentTaskServiceImpl.java
@@ -4,8 +4,120 @@
import com.lxzn.activiti.dao.ToEquipmentTaskMapper;
import com.lxzn.activiti.service.IToEquipmentTaskService;
import com.lxzn.framework.domain.activiti.ToEquipmentTask;
import com.lxzn.framework.domain.activiti.response.ActivitiCode;
import com.lxzn.framework.domain.nc.DeviceInfo;
import com.lxzn.framework.exception.ExceptionCast;
import com.lxzn.framework.utils.ValidateUtil;
import com.lxzn.framework.utils.file.FileUtil;
import com.lxzn.nc.service.IDeviceGroupService;
import com.lxzn.nc.service.IDeviceInfoService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ToEquipmentTaskServiceImpl extends ServiceImpl<ToEquipmentTaskMapper, ToEquipmentTask> implements IToEquipmentTaskService {
    @Autowired
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IDeviceGroupService deviceGroupService;
    @Override
    @Scheduled(cron = "${taskSync}")
    public void updateNcFileFromTask() {
        List<ToEquipmentTask> taskList = this.selectTaskSyncFlag(1);
        if (taskList == null || taskList.isEmpty()) {
            return;
        }
        List<ToEquipmentTask> successTasks = new ArrayList<>();
        for (ToEquipmentTask task : taskList) {
            DeviceInfo deviceInfo = deviceInfoService.getByDeviceNo(task.getDeviceNo());
            if (deviceInfo == null) {
                continue;
            }
            List<String> pathList = deviceGroupService.findListParentTreeAll(deviceInfo.getGroupId());
            if (pathList == null || pathList.isEmpty()) {
                continue;
            }
            String targetPath = StringUtils.join(pathList.toArray(), "/")
                    + "/" + deviceInfo.getDeviceNo()
                    + "/send/"
                    + task.getFileName();
            String sourceFilePath = task.getFilePath() + "/" + task.getFileEncodeName();
            Boolean copySuccess = FileUtil.copyFileUpName(sourceFilePath, targetPath, task.getFileSuffix());
            if (copySuccess) {
                task.setSyncFlag(2);
                successTasks.add(task);
            }
        }
        if (!successTasks.isEmpty()) {
            super.saveOrUpdateBatch(successTasks);
        }
        deleteSourceFilesAfterBatchUpdate(taskList);
    }
    /**
     * æ‰¹é‡æ›´æ–°åŽæ£€æŸ¥å¹¶åˆ é™¤æºæ–‡ä»¶
     */
    private void deleteSourceFilesAfterBatchUpdate(List<ToEquipmentTask> allTasks) {
        Map<String, String> filePathMap = new HashMap<>();
        for (ToEquipmentTask task : allTasks) {
            if (task.getSyncFlag() == 2) {
                String key = task.getFilePath() + "_" + task.getFileEncodeName();
                if (!filePathMap.containsKey(key)) {
                    filePathMap.put(key, task.getFilePath() + "/" + task.getFileEncodeName());
                }
            }
        }
        for (Map.Entry<String, String> entry : filePathMap.entrySet()) {
            String[] parts = entry.getKey().split("_");
            if (parts.length >= 2) {
                String filePath = parts[0];
                String fileEncodeName = parts[1];
                List<ToEquipmentTask> remainingTasks = this.selectTaskByNameAndSyncFlag(
                        filePath,
                        fileEncodeName,
                        1
                );
                if (remainingTasks == null || remainingTasks.isEmpty()) {
                    FileUtil.deleteNcFile(entry.getValue());
                }
            }
        }
    }
    @Override
    public List<ToEquipmentTask> selectTaskSyncFlag(Integer syncFlag) {
        if (!ValidateUtil.validateInteger(syncFlag)) {
            return null;
        }
        return super.lambdaQuery()
                .eq(ToEquipmentTask::getSyncFlag, syncFlag)
                .list();
    }
    @Override
    public List<ToEquipmentTask> selectTaskByNameAndSyncFlag(String filePath, String fileEncodeName, Integer syncFlag) {
        if (!ValidateUtil.validateInteger(syncFlag)
                || !ValidateUtil.validateString(filePath)
                || !ValidateUtil.validateString(fileEncodeName)) {
            return null;
        }
        return super.lambdaQuery()
                .eq(ToEquipmentTask::getSyncFlag, syncFlag)
                .eq(ToEquipmentTask::getFilePath, filePath)
                .eq(ToEquipmentTask::getFileEncodeName, fileEncodeName)
                .list();
    }
}
src/main/java/com/lxzn/auth/config/WebSecurityConfig.java
@@ -17,7 +17,7 @@
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/auth/user/login","/auth/user/logout","/auth/user/jwt", "/services/**","/auth//user/updatePd");
        web.ignoring().antMatchers("/auth/user/login","/auth/user/logout","/auth/user/jwt", "/services/**","/auth/user/updatePd");
    }
src/main/java/com/lxzn/config/SwaggerConfig.java
@@ -15,6 +15,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
 * @author joetao
@@ -43,6 +44,7 @@
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                //.securitySchemes(Arrays.asList(apiKey()))
                .securitySchemes(Collections.singletonList(securityScheme()))
                .securityContexts(Collections.singletonList(securityContext()));
    }
@@ -80,6 +82,7 @@
                .build();
    }
    /**
     * è¿™é‡Œæ˜¯å†™å…è®¸è®¤è¯çš„scope
     */
@@ -88,4 +91,21 @@
                new AuthorizationScope("all", "All scope is trusted!")
        };
    }
    private ApiKey apiKey() {
        return new ApiKey("apiKey", "api_key", "header");
    }
    /*private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.any())
                .build();
    }*/
    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Arrays.asList(new SecurityReference("apiKey", authorizationScopes));
    }
}
src/main/java/com/lxzn/framework/domain/activiti/response/ActivitiCode.java
@@ -23,7 +23,7 @@
    ACT_DOC_ID_NONE(false, 21014, "文档编号不存在!"),
    ACT_DOC_ERROR(false,21015,"启动流程失败,文档信息错误!"),
    ACT_DEVICE_DOC_ERROR(false,21016,"启动流程失败,设备已存在该文档!"),
    ACT_DEVICE_DOC_FILELABLE(false,21016,"密标系统异常!");
    ACT_DEVICE_DOC_FILELABLE(false,21017,"密标系统异常,!");
    //操作代码
    @ApiModelProperty(value = "操作是否成功", example = "true", required = true)
src/main/java/com/lxzn/framework/domain/plm/PdmProgramSource.java
@@ -66,6 +66,10 @@
    private String ae8ncModelNo;
    @TableField(value = "SQZT")
    private String sqzt;
    /**/
    @TableField(exist = false)
    private String fileName;
    @TableField(value = "create_time",  fill = FieldFill.INSERT)
    private Date createTime;
src/main/java/com/lxzn/framework/domain/plm/ext/PdmProgramInfoExt.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.lxzn.framework.domain.plm.ext;
/**
 * @author clown
 * * @date 2024/3/25
 */
public class PdmProgramInfoExt {
}
src/main/java/com/lxzn/framework/utils/date/DateUtil.java
@@ -22,6 +22,7 @@
    public static final String STR_DATE_TIME_FULL = "yyyyMMddHHmmssSSS";
    public static final String STR_DATE_TIME_SHE = "yyyyMMddHHmmss";
    public static final String STR_YEARMONTH = "yyyyMM";
    public static final String STR_YEARMONTHDAY = "yyyyMMdd";
    public static final String STR_YEAR = "yyyy";
    /**
src/main/java/com/lxzn/framework/utils/file/FileUtil.java
@@ -5,7 +5,6 @@
import com.lxzn.framework.exception.ExceptionCast;
import com.lxzn.framework.utils.SHA256Util;
import com.lxzn.framework.utils.date.DateUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
@@ -17,7 +16,9 @@
import java.net.URLEncoder;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Date;
@@ -28,6 +29,11 @@
public class FileUtil {
    private static String fileUploadFolder;
    private static String fileNcGateway;
    @Value("${fileNcGateway}")
    public void setFileNcGateway(String fileNcGateway) {
        FileUtil.fileNcGateway = fileNcGateway;
    }
    @Value("${fileHomePath}")
    public void setFileUploadFolder(String fileUploadFolder) {
@@ -62,6 +68,179 @@
        dto.setFileSize(fileSize);
        dto.setFileSuffix(suffix);
        return dto;
    }
    /**
     * æ–¹æ³•一:使用 FileWriter å†™æ–‡ä»¶
     * @param filepath æ–‡ä»¶ç›®å½•
     * @param content  å¾…写入内容
     * @throws IOException
     */
    public static void fileWriterSql(String filepath, String content) throws IOException {
        OutputStreamWriter outputStreamWriter = null;
        try {
            File file = new File(filepath);
            if (!file.exists()){
                file.createNewFile();
            }
            FileOutputStream outputStream = new FileOutputStream(file);
            if (outputStream != null){
                outputStreamWriter = new OutputStreamWriter(outputStream, "utf-8");
                outputStreamWriter.write(content);
                outputStreamWriter.flush();
            }
            try {
                if (outputStreamWriter != null){
                    outputStreamWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        catch (IOException e) {
            e.getMessage();
        }
        finally {
            try {
                if (outputStreamWriter != null){
                    outputStreamWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * åˆ é™¤æ–‡ä»¶
     *
     * @param filePath
     * @return
     */
    public static boolean deleteNcFile(String filePath) {
        String lastFileReName =  fileUploadFolder + "/" + filePath ;
        boolean flag = false;
        File file = new File(lastFileReName);
        if (!file.exists()) {
            return flag;
        }
        boolean b = file.delete();
        if (!b) {
            System.out.println("文件删除失败: " + filePath);
        }
        return true;
    }
    /**
     * å¤åˆ¶æ–‡ä»¶ï¼ˆå¸¦é‡è¯•、大小校验和MD5校验,确保复制完整性与可靠性)
     * ä»Ž fileUploadFolder ä¸‹çš„æºè·¯å¾„复制到 fileNcGateway ä¸‹çš„目标路径,可指定新的文件扩展名
     * @param lastFile æºæ–‡ä»¶çš„相对路径(相对于 fileUploadFolder)
     * @param newFile ç›®æ ‡æ–‡ä»¶çš„相对路径(相对于 fileNcGateway)
     * @param ncFix ï¼ˆå¯é€‰ï¼‰ç›®æ ‡æ–‡ä»¶çš„æ–°æ‰©å±•名(不带点,如 "txt"),传入 null æˆ–空字符串则不修改原扩展名
     * @return å¤åˆ¶æˆåŠŸè¿”å›ž true,否则返回 false
     */
    public static boolean copyFileUpName(String lastFile, String newFile, String ncFix) {
        // 1. æž„建源文件和目标文件的绝对路径
        String sourceFilePath = fileUploadFolder + "/" + lastFile;
        String targetFilePath = fileNcGateway + "/" + newFile;
        // 2. å¦‚果指定了新的扩展名,则附加到目标文件名
        if (StringUtils.isNotBlank(ncFix)) {
            targetFilePath = targetFilePath + "." + ncFix;
        }
        // 3. åˆ›å»ºç›®æ ‡æ–‡ä»¶å¤¹
        File targetFile = new File(targetFilePath);
        File targetParentDir = targetFile.getParentFile();
        if (!targetParentDir.exists() && !targetParentDir.mkdirs()) {
            log.error("无法创建目标文件夹: {}", targetParentDir.getAbsolutePath());
            return false;
        }
        // 4. èŽ·å–æºæ–‡ä»¶é¢„æœŸå¤§å°
        long expectedSize = -1;
        File sourceFile = new File(sourceFilePath);
        if (!sourceFile.exists()) {
            log.error("源文件不存在: {}", sourceFilePath);
            return false;
        }
        try {
            expectedSize = sourceFile.length();
            log.info("文件复制: æº={}, ç›®æ ‡={}, å¤§å°={}字节", sourceFilePath, targetFilePath, expectedSize);
        } catch (SecurityException e) {
            log.error("无法访问源文件: {}", sourceFilePath, e);
            return false;
        }
        // 5. å¤åˆ¶æ“ä½œï¼ˆæœ€å¤šé‡è¯•3次)
        int maxRetries = 3;
        int attempt = 0;
        boolean copySuccess = false;
        while (attempt < maxRetries && !copySuccess) {
            attempt++;
            try {
                log.info("---- å¼€å§‹ç¬¬{}次复制尝试 ----", attempt);
                // 6. æ‰§è¡Œå¤åˆ¶æ“ä½œï¼ˆä½¿ç”¨NIO FileChannel以提高效率)
                long startTime = System.currentTimeMillis();
                try (FileChannel in = new FileInputStream(sourceFilePath).getChannel();
                     FileChannel out = new FileOutputStream(targetFilePath).getChannel()) {
                    out.transferFrom(in, 0, in.size());
                }
                long endTime = System.currentTimeMillis();
                log.info("文件传输完成,耗时: {}毫秒", (endTime - startTime));
                // 7. æ–‡ä»¶å¤§å°éªŒè¯
                File copiedFile = new File(targetFilePath);
                long actualSize = copiedFile.length();
                if (expectedSize != actualSize) {
                    log.warn("大小不一致! é¢„期: {}B, å®žé™…: {}B (差值: {}B)",
                            expectedSize, actualSize, Math.abs(actualSize - expectedSize));
                } else {
                    log.info("文件大小验证成功: {}B", actualSize);
                    copySuccess = true;
                }
                // 8. MD5校验
                if (copySuccess) {
                    String sourceMd5 = calculateMD5(sourceFilePath);
                    String targetMd5 = calculateMD5(targetFilePath);
                    if (!sourceMd5.equals(targetMd5)) {
                        log.warn("MD5不一致! æº: {}, ç›®æ ‡: {}", sourceMd5, targetMd5);
                        copySuccess = false;
                    } else {
                        log.info("MD5验证成功");
                    }
                }
            } catch (IOException | SecurityException e) {
                log.error("第{}次复制失败", attempt, e);
            }
            // 9. é‡è¯•间隔处理
            if (!copySuccess && attempt < maxRetries) {
                try {
                    int delay = 200 * attempt; // é€’增延迟:200ms, 400ms
                    log.info("等待 {}ms åŽé‡è¯•", delay);
                    Thread.sleep(delay);
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                    log.warn("重试等待被中断", ie);
                    break; // å¦‚果线程被中断,则退出重试循环
                }
            }
        }
        if (copySuccess) {
            log.info("文件复制完成: {}", targetFilePath);
        } else {
            log.error("文件复制失败,已尝试{}次。源文件: {}, ç›®æ ‡æ–‡ä»¶: {}", maxRetries, sourceFilePath, targetFilePath);
        }
        return copySuccess;
    }
    public static FileUploadResult uploadFile(String fileName, InputStream fis) {
@@ -179,6 +358,54 @@
            log.error(e.getMessage());
        }
        return -1;
    }
    /**
     * åˆ é™¤æ–‡ä»¶
     *
     * @param filePath
     * @return
     */
    public static boolean deleteFile(String filePath) {
        boolean flag = false;
        File file = new File(filePath);
        if (!file.exists()) {
            return flag;
        }
        boolean b = file.delete();
        if (!b) {
            try {
                System.gc();
                Path path = Paths.get(filePath);
                Files.deleteIfExists(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }
    /**
     *
     * @param file
     * @return
     */
    public static long selectFileSize(File file) {
        try (FileInputStream fis = new FileInputStream(file)) {
            long size = 0;
            int read;
            byte[] buffer = new byte[1024];
            while ((read = fis.read(buffer)) != -1) {
                size += read;
            }
            return size;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 0;
    }
    /**
@@ -438,7 +665,6 @@
        }
    }
    public static String getFileAbsPath(String path, String fileName){
        path = fileUploadFolder + path;
        File file = new File(path, fileName);
@@ -448,5 +674,12 @@
        return null;
    }
    public static String getFileAbsPathTxt(String path){
        File file = new File(path);
        if(file.exists()){
            return file.getAbsolutePath();
        }
        return null;
    }
}
src/main/java/com/lxzn/nc/service/IDeviceGroupService.java
@@ -33,6 +33,21 @@
    boolean editDeviceGroup(String id, DeviceGroup deviceGroup);
    /**
     *  æŸ¥è¯¢æ‰€æœ‰çˆ¶èŠ‚ç‚¹å’Œæœ¬èŠ‚ç‚¹åç§°
     * @param groupId
     * @return
     */
    List<String> findListParentTreeAll(String groupId);
    /**
     *  æŸ¥è¯¢æ‰€æœ‰çˆ¶èŠ‚ç‚¹åç§°
     * @param parentId
     * @param stringList
     * @return
     */
    List<String> findListParentTree(String parentId,List<String> stringList);
    /**
     * åˆ é™¤è®¾å¤‡åˆ†ç»„
     * @param id
     * @return
src/main/java/com/lxzn/nc/service/impl/DeviceGroupServiceImpl.java
@@ -14,6 +14,7 @@
import com.lxzn.nc.dao.DeviceGroupMapper;
import com.lxzn.nc.service.*;
import com.lxzn.ucenter.service.IDepartmentService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -128,6 +129,48 @@
    }
    @Override
    public List<String> findListParentTreeAll(String groupId) {
        if ( StringUtils.isEmpty(groupId)) {
            return null;
        }
        List<String> strings = new ArrayList<>();
        DeviceGroup en = super.getById(groupId);
        if (en == null) {
            return null;
        }
        strings.add(en.getGroupName());
        if (StringUtils.isEmpty(en.getParentId())) {
            return strings;
        } else {
            return findListParentTree(en.getParentId(),strings);
        }
    }
    @Override
    public List<String> findListParentTree(String parentId,List<String> stringList){
        if (StringUtils.isEmpty(parentId)) {
            return null;
        }
        if (stringList == null || stringList.isEmpty()) {
            stringList = new ArrayList<>();
        }
        boolean p = true;
        if (p) {
            DeviceGroup en = super.getById(parentId);
            if (en != null) {
                stringList.add(0,en.getGroupName());
            }
            if (StringUtils.isNotBlank(en.getParentId())) {
                parentId = en.getParentId();
                findListParentTree(parentId,stringList);
            } else {
                p = false;
                return stringList;
            }
        }
        return stringList;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean deleteDeviceGroup(String id) {
        if(!ValidateUtil.validateString(id))
src/main/java/com/lxzn/plm/service/impl/PdmProgramSourceServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.lxzn.activiti.service.IAssignFileStreamService;
import com.lxzn.base.service.IDncLogService;
import com.lxzn.base.service.IEquipmentClassService;
import com.lxzn.framework.domain.base.DncLog;
@@ -88,6 +89,8 @@
    private IDncLogService dncLogService;
    @Autowired
    private IEquipmentClassService equipmentClassService;
    @Autowired
    private IAssignFileStreamService assignFileStreamService;
    @Value("${ncPdm.file_path}")
@@ -116,7 +119,7 @@
            JsonMapper mapper = new JsonMapper();
            try {
                Object[] objects = new  Object[]{ncLog.getSkgxId(),ncLog.getSkgxRevId(),ncLog.getSqzt(),"",""};
                //String program = "{\"code\":1,\"message\":\"\",\"response\":[{\"skgx_id\":\"CX信息中心10000070\",\"skgx_rev_id\":\"1\",\"skgx_name\":\"焊接数控程序\",\"sqzt\":\"S状态\",\"ae8nc_cxno\":\"CX信息中心10000070\",\"ae8nc_gfrev\":\"1\",\"ae8nc_sbno\":\"2240080\",\"ae8nc_jcid\":\"QJK006\",\"ae8nc_os\":\"华中数控-HNC848C\",\"ae8nc_filename\":\"107052PA5\",\"ae8nc_cxfz\":\"计算机仿真\",\"ae8nc_operator\":\"\",\"ae8nc_inspect\":\"\",\"ae8nc_acceptview\":\"\",\"ae8nc_cxno_unit\":\"信息中心\",\"ae8nc_filename_unit\":\"PA\",\"ae8gallery\":\"\",\"ae8nc_plant\":\"信息中心\",\"ae8nc_modelno\":\"jx\",\"ae8nc_batchno\":\"\",\"meop_id\":\"OPHJ000000000049108\",\"meop_rev_id\":\"A\",\"meop_name\":\"焊接\",\"meop_type\":\"AE8Operation Revision\",\"ae8gx_no\":\"5\",\"process_id\":\"JZG2022008107653\",\"process_rev_id\":\"1\",\"process_name\":\"107052\",\"ae8part_no\":\"107052\",\"ae8stageidentifying\":\"L\",\"ae8gy_type\":\"机加工艺设计\",\"ae8plant\":\"信息中心\",\"part_id\":\"1047051\",\"part_rev_id\":\"01\",\"part_name\":\"集成测试件\",\"create_by\":\"用户2(user2)\",\"create_date\":\"02-9月-22 17:15:14\",\"filename\":\"DNC-CX信息中心10000070-1.zip\",\"filepath\":\"http://192.168.2.234:8081/ncprogram/202209/DNC-CX信息中心10000070-1.zip\"}]}\n";
                //String program = "{\"code\":1,\"message\":\"\",\"response\":[{\"skgx_id\":\"CX信息中心10000070\",\"skgx_rev_id\":\"1\",\"skgx_name\":\"焊接数控程序\",\"sqzt\":\"S状态\",\"ae8nc_cxno\":\"CX信息中心10000070\",\"ae8nc_gfrev\":\"1\",\"ae8nc_sbno\":\"2240080\",\"ae8nc_jcid\":\"QJK006\",\"ae8nc_os\":\"华中数控-HNC848C\",\"ae8nc_filename\":\"107052PA5\",\"ae8nc_cxfz\":\"计算机仿真\",\"ae8nc_operator\":\"\",\"ae8nc_inspect\":\"\",\"ae8nc_acceptview\":\"\",\"ae8nc_cxno_unit\":\"信息中心\",\"ae8nc_filename_unit\":\"PA\",\"ae8gallery\":\"\",\"ae8nc_plant\":\"信息中心\",\"ae8nc_modelno\":\"jx\",\"ae8nc_batchno\":\"\",\"meop_id\":\"OPHJ000000000049108\",\"meop_rev_id\":\"A\",\"meop_name\":\"焊接\",\"meop_type\":\"AE8Operation Revision\",\"ae8gx_no\":\"5\",\"process_id\":\"JZG2022008107653\",\"process_rev_id\":\"1\",\"process_name\":\"107052\",\"ae8part_no\":\"107052\",\"ae8stageidentifying\":\"L\",\"ae8gy_type\":\"机加工艺设计\",\"ae8plant\":\"信息中心\",\"part_id\":\"1047051\",\"part_rev_id\":\"01\",\"part_name\":\"集成测试件\",\"create_by\":\"用户2(user2)\",\"create_date\":\"02-9月-22 17:15:14\",\"filename\":\"DNC-CX信息中心10000070-1.zip\",\"filepath\":\"http://localhost:9099/resources/images/login/bj_bak.png\"}]}\n";
                String program =pdmWebClientApi.queryNcProgramAttrInfo(objects);
                if (StringUtils.isEmpty(program)) {
                    log.error("======= æ—  "+ ncLog.getSkgxId()  +" æ–°å¢žè®°å½•=======");
@@ -301,8 +304,8 @@
        PdmProgramSource source = new PdmProgramSource();
        try {
            Object[] objects = new  Object[]{ncLog.getSkgxId(),ncLog.getSkgxRevId(),ncLog.getSqzt(),"",""};
            //String program = "{\"code\":1,\"message\":\"\",\"response\":[{\"skgx_id\":\"CX信息中心10000070\",\"skgx_rev_id\":\"1\",\"skgx_name\":\"焊接数控程序\",\"sqzt\":\"S状态\",\"ae8nc_cxno\":\"CX信息中心10000070\",\"ae8nc_gfrev\":\"1\",\"ae8nc_sbno\":\"2240080\",\"ae8nc_jcid\":\"QJK006\",\"ae8nc_os\":\"华中数控-HNC848C\",\"ae8nc_filename\":\"107052PA5\",\"ae8nc_cxfz\":\"计算机仿真\",\"ae8nc_operator\":\"\",\"ae8nc_inspect\":\"\",\"ae8nc_acceptview\":\"\",\"ae8nc_cxno_unit\":\"401\",\"ae8nc_filename_unit\":\"PA\",\"ae8gallery\":\"\",\"ae8nc_plant\":\"401\",\"ae8nc_modelno\":\"jx\",\"ae8nc_batchno\":\"\",\"meop_id\":\"OPHJ000000000049108\",\"meop_rev_id\":\"A\",\"meop_name\":\"焊接\",\"meop_type\":\"AE8Operation Revision\",\"ae8gx_no\":\"5\",\"process_id\":\"JZG2022008107653\",\"process_rev_id\":\"1\",\"process_name\":\"107052\",\"ae8part_no\":\"107052\",\"ae8stageidentifying\":\"L\",\"ae8gy_type\":\"机加工艺设计\",\"ae8plant\":\"信息中心\",\"part_id\":\"1047051\",\"part_rev_id\":\"01\",\"part_name\":\"集成测试件\",\"create_by\":\"用户2(user2)\",\"create_date\":\"02-9月-22 17:15:14\",\"filename\":\"DNC-CX信息中心10000070-1.zip\",\"filepath\":\"http://192.168.2.234:8081/ncprogram/202209/DNC-CX信息中心10000070-1.zip\"}]}\n";
            String program =pdmWebClientApi.queryNcProgramAttrInfo(objects);
            String program = "{\"code\":1,\"message\":\"\",\"response\":[{\"skgx_id\":\"CX信息中心10000070\",\"skgx_rev_id\":\"1\",\"skgx_name\":\"焊接数控程序\",\"sqzt\":\"S状态\",\"ae8nc_cxno\":\"CX信息中心10000070\",\"ae8nc_gfrev\":\"1\",\"ae8nc_sbno\":\"2240080\",\"ae8nc_jcid\":\"QJK006\",\"ae8nc_os\":\"华中数控-HNC848C\",\"ae8nc_filename\":\"107052PA5\",\"ae8nc_cxfz\":\"计算机仿真\",\"ae8nc_operator\":\"\",\"ae8nc_inspect\":\"\",\"ae8nc_acceptview\":\"\",\"ae8nc_cxno_unit\":\"信息中心\",\"ae8nc_filename_unit\":\"PA\",\"ae8gallery\":\"\",\"ae8nc_plant\":\"信息中心\",\"ae8nc_modelno\":\"jx\",\"ae8nc_batchno\":\"\",\"meop_id\":\"OPHJ000000000049108\",\"meop_rev_id\":\"A\",\"meop_name\":\"焊接\",\"meop_type\":\"AE8Operation Revision\",\"ae8gx_no\":\"5\",\"process_id\":\"JZG2022008107653\",\"process_rev_id\":\"1\",\"process_name\":\"107052\",\"ae8part_no\":\"107052\",\"ae8stageidentifying\":\"L\",\"ae8gy_type\":\"机加工艺设计\",\"ae8plant\":\"信息中心\",\"part_id\":\"1047051\",\"part_rev_id\":\"01\",\"part_name\":\"集成测试件\",\"create_by\":\"用户2(user2)\",\"create_date\":\"02-9月-22 17:15:14\",\"filename\":\"DNC-CX信息中心10000070-1.zip\",\"filepath\":\"http://localhost:9099/outer/test/download.xhtml\"}]}\n";
            //String program =pdmWebClientApi.queryNcProgramAttrInfo(objects);
            if (StringUtils.isEmpty(program)) {
                log.error("======= æ—  "+ ncLog.getSkgxId()  +" æ–°å¢žè®°å½•=======");
                return false;
@@ -592,6 +595,7 @@
                        if (suffix.contentEquals("docx") || suffix.contentEquals("pdf") ) {
                            continue;
                        }
                        source.setFileName(entry.getKey());
                        DocInfo docInfo = docInfoService.findByAttrAndDocName(FileUtil.getFilenameNonSuffix(entry.getKey()), 5,
                                stream.getProcessId(),suffix);
                        //新增
@@ -632,6 +636,7 @@
                            docInfo.setPublishVersion(docFile.getDocVersion());
                            docInfo.setPublishFileId(docFile.getFileId());
                            b =  docInfoService.save(docInfo);
                            boolean pdm =  assignFileStreamService.saveListNcFromPdm(docInfo,source);
                            if(!b){
                                return false;
                            }
@@ -651,6 +656,8 @@
                            docInfo.setPublishVersion(docFile.getDocVersion());
                            docInfo.setPublishFileId(docFile.getFileId());
                            b = docInfoService.updateById(docInfo);
                            //
                            boolean pdm = assignFileStreamService.saveListNcFromPdm(docInfo,source);
                            if(!b) {
                                return false;
                            }
src/main/java/com/lxzn/plm/service/impl/QueryNcProgramLogServiceImpl.java
@@ -57,8 +57,8 @@
        try {
            Map<String,String> map = new HashMap<>();
            Object[] objects = new  Object[]{returnLog.getStartDateNum(),returnLog.getEndDateNum(),"","","",""};
            //String name = "{\"code\": 1, \"message\": \"\", \"response\": [{ \"log_id\": \"20230213080002\", \"skgx_id\": \"CX408-1545\", \"skgx_rev_id\": \"1\", \"sqzt\": \"S状态\" }]}" ;
            String name = pdmWebClientApi.pdmDncProgram(objects);
            String name = "{\"code\": 1, \"message\": \"\", \"response\": [{ \"log_id\": \"20230213080002\", \"skgx_id\": \"CX408-1545\", \"skgx_rev_id\": \"1\", \"sqzt\": \"S状态\" }]}" ;
            //String name = pdmWebClientApi.pdmDncProgram(objects);
            if (StringUtils.isEmpty(name)) {
                log.error("无数据___空数据");
                return null;
src/main/resources/application.yml
@@ -10,10 +10,11 @@
        dialect: org.hibernate.dialect.Oracle10gDialect
      show-sql: ture
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://LOCALHOST:5236?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&schema=LXZN_NC_ADMIN_430
    username: SYSDBA
    password: Lyh10225217
    url: ${MSSQL_URL:jdbc:sqlserver://127.0.0.1:1433;databaseName=lxzn_nc_430}
    username: sa
    password:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
    initialSize: 5  #初始建立连接数量
    minIdle: 5  #最小连接数量
    maxActive: 20 #最大连接数量
@@ -83,6 +84,7 @@
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/uploadFiles/
fileHomePath: ${UPLOAD_FOLDER:d://lxzn_storage}
fileNcGateway: ${UPLOAD_FOLDER:d://abc}
#staticAccessPath: /api/file/** # å½“前项目的静态资源访问配置在nginx中
activiti:
  enable: true # true å¯ç”¨å®¡æ‰¹ false ä¸å¯ç”¨å®¡æ‰¹
@@ -99,8 +101,8 @@
    uri: http://192.168.2.234:8081/YZHTCNCProgram/PLMServices?wsdl
ncPdm:
 file_path:
    d://lxzn_storage/plm
   dnc//lxzn_storage/plm
 product:
    root: 1580366134186582017
    root: 1583346581232537602
user:
  userIdYml: 1254966905669160962
  userIdYml: 1583346581232537602
src/main/resources/scheduled.properties
@@ -1,2 +1,4 @@
####同步定时任务执行器参数
####??????????? 0*/2***?
plmCron=0 */2 * * * ?
####??????????? 20m
taskSync=0/20 * * * * ?