yangys
3 天以前 0ecd5acd3b9f320a487c68df2ea6234b4dacb12c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
 
package org.springblade.mdm.program.filewatch;
 
 
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.tool.api.R;
import org.springblade.mdm.commons.contants.ParamContants;
import org.springblade.mdm.flow.service.CureFlowService;
import org.springblade.mdm.machineback.entity.MachineBackFile;
import org.springblade.mdm.machineback.filewatch.*;
import org.springblade.mdm.program.entity.DncBackFile;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.service.DncBackFileService;
import org.springblade.mdm.program.service.NcNodeService;
import org.springblade.mdm.program.service.NcProgramService;
import org.springblade.system.feign.ISysClient;
import org.springframework.stereotype.Service;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
 
/**
 * DNC回传及监控
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class ProgramBackMonitor {
    private final DirectorLockService directorLockService;
    private final NcNodeService ncNodeService;
    private final NcProgramService ncProgramService;
    private final CureFlowService cureFlowService;
    private final NcProgramExchangeMapper ncProgramExchangeMapper;
    private final ISysClient sysClient;
    private final DynamicDirectoryWatcher directoryWatcher;
    private final OssTemplate ossTemplate;
    private final DncBackFileService dncBackFileService;
    private final String DEFAULT_MONITOR_DIR = "programback";
 
    /**
     * 监控回传目录(手动回传)
     */
    public void monitorDir(){
        boolean locked = directorLockService.acquireLock();
        if (!locked) {
            log.info("回传接收目录已经被其他部署点位锁定,直接返回");
            return;
        }
        List<String> monitorDirList = getMonitorDirs();
 
        for (String dir : monitorDirList) {
            Path dirPath = Paths.get(dir);
            try {
                if(!dirPath.toFile().exists()) {
                    dirPath.toFile().mkdirs();
                }
                directoryWatcher.addDirectory(dirPath,getListener());
            } catch (Exception e) {
                log.error("添加监控目录异常",e);
            }
        }
    }
 
    List<String> getMonitorDirs(){
        R<String> monitorDirRes = sysClient.getParamValue(ParamContants.PROGRAM_MONITOR_DIR_KEY);
        String dirStr = monitorDirRes.getData();
        if(StringUtils.isNotEmpty(dirStr)){
            dirStr = DEFAULT_MONITOR_DIR;
        }
        String[] dirs = StringUtils.split(dirStr,",");
 
        return Arrays.asList(dirs);
    }
 
 
    FileWatcherService.FileChangeListener getListener() {
        return new FileWatcherService.FileChangeListener() {
            @Override
            public void onFileCreated(Path filePath) {
                log.info("文件创建,处理");
            }
 
            @Override
            public void onFileModified(Path filePath) {
                try {
                    if(FileLockChecker.isFileComplete(filePath)){
                        log.info("文件[{}]传输完成,开始处理",filePath);
 
                        String programName = filePath.getFileName().toFile().getName();
                        NcProgram prog = ncProgramService.getByName(programName);
                        if(prog == null){
                            log.warn("文件名无法匹配到数控程序,{}",filePath);
                            return;
                        }
                        //保存文件到css,避免后续不同部署节点拿不到文件
                        String ossName;
                        String url;
                        try(FileInputStream fins = new FileInputStream(filePath.toFile());){
                            BladeFile bfile = ossTemplate.putFile(programName, fins);
                            ossName = bfile.getName();
                            url = bfile.getLink();
 
                        }
 
                        prog.setOssName(ossName);
                        prog.setUrl(url);
                        //TODO,是否删除原来的文件?
                        ncProgramService.updateById(prog);
 
                        cureFlowService.startOne(prog);//启动一个程序的固化流程
                        /*
                        DncBackFile backFile = new DncBackFile();
                        backFile.setNcProgramId(prog.getId());
                        //保存文件到css,避免后续不同部署节点拿不到文件
                        try(FileInputStream fins = new FileInputStream(filePath.toFile());){
                            BladeFile bfile = ossTemplate.putFile(programName, fins);
                            backFile.setOssName(bfile.getName());
                            backFile.setUrl(bfile.getLink());
                        }
                        dncBackFileService.save(backFile);
 
                         */
                    }else{
                        log.warn("文件传输中,后续再操作:{}",filePath);
                    }
                } catch (IOException e) {
                    log.error("回传文件操作IO错误",e);
                    throw new RuntimeException(e);
                } catch (InterruptedException e) {
                    log.error("sleep出错",e);
                } catch (Exception e) {
                    log.error("机床回传文件处理异常",e);
                }
            }
 
            @Override
            public void onFileDeleted(Path filePath) {
                log.info("文件删除,不处理");
            }
        };
    }
}