zouyu
2025-12-09 866a3e6cbd2df9841dfbbd733e1128938cef3e00
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
package com.chinaztt.mes.docx.service.impl;
 
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import com.chinaztt.mes.docx.dto.GetFileDto;
import com.chinaztt.mes.docx.service.DocxService;
import com.chinaztt.mes.docx.util.R;
import com.chinaztt.mes.docx.util.TakeWords;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
 
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
 
@Service
public class DocxServiceImpl implements DocxService {
 
    @Override
    public R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
        String fileExtension = getFileDto.getFileExtension();
        if(StringUtils.equals(".pngInExcel",getFileDto.getFileExtension())){
            fileExtension = ".xls";
        }
        File file = getFileStart(getFileDto.getFilePath(), fileExtension);
        if (file != null && !file.exists()) {
            return R.failed("未查询到该路径:" + getFileDto.getFilePath() + "下存在:" + getFileDto.getFileExtension() + "结尾的文件!");
        }
        switch (getFileDto.getFileExtension()) {
            case ".docx":
                return R.ok(TakeWords.readWordFile(file));
            case ".pngInExcel":
                return R.ok(TakeWords.readPngContextInExcel(file));
            case ".xls":
            case ".xlsx":
                try {
                    return R.ok(TakeWords.readExcelFile(file));
                } catch (Exception e) {
                    return R.failed("另一个程序正在使用此文件,无法进行数据采集。");
                }
            case ".txt":
                return R.ok(TakeWords.readTxtFile(file));
            case ".csv":
                return R.ok(TakeWords.readCsvFile(file));
            case ".mdb":
                if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
                    return R.failed("未配置.mdb采集文件名称!");
                }
                return R.ok(TakeWords.readMdbFile(file, getFileDto));
            case ".db":
                if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
                    return R.failed("未配置.db采集文件名称!");
                }
                return R.ok(TakeWords.readDbFile(file, getFileDto));
            case ".mysql":
                if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
                    return R.failed("未配置.mysql采集文件名称!");
                }
                return R.ok(TakeWords.getMysqlFile(getFileDto));
            case ".png":
                return R.ok(TakeWords.readPngFile(file));
            case ".mqtt":
                return R.ok("mqtt---");
            default:
                return R.failed("后缀名配置错误!");
        }
    }
 
    @Override
    public R<?> moveFile(String startFilePath, String endFilePath, String fileType) {
        // 源文件路径
        File startFile= getFileStart(startFilePath, fileType);
        // 目的目录路径
        File endDirection=new File(endFilePath);
        // 如果目的目录路径不存在,则进行创建
        if(!endDirection.exists()) {
            endDirection.mkdirs();
        }
        // 目的文件路径=目的目录路径+源文件名称
        File endFile=new File(endDirection+ File.separator+ startFile.getName());
 
        try {
        // 调用File类的核心方法renameTo
            if (startFile.renameTo(endFile)) {
                return R.ok("文件移动成功!");
            } else {
                return R.failed("文件移动失败!");
            }
        }catch(Exception e) {
            return R.failed("文件移动出现异常!");
        }
    }
 
 
    public static File getLatestFile(List<File> files) {
        File latestFile = null;
        long latestTime = 0;
 
        for (File file : files) {
            long lastModified = file.lastModified();
            if (lastModified > latestTime) {
                latestTime = lastModified;
                latestFile = file;
            }
        }
 
        return latestFile;
    }
 
    public static File getFileStart(String filePath, String fileExtension) {
        List<File> files = FileUtil.loopFiles(filePath);
        List<File> list = new ArrayList<>();
        files.forEach(i -> {
            boolean b;
            switch (fileExtension) {
                case ".docx":
                    b = i.getName().endsWith(".docx") || i.getName().endsWith(".doc") || i.getName().endsWith(".DOCX") || i.getName().endsWith(".DOC");
                    break;
                case ".xlsx":
 
                    b = i.getName().endsWith(".xlsx") || i.getName().endsWith(".xls") || i.getName().endsWith(".XLSX") || i.getName().endsWith(".XLS");
                    break;
                default:
                    b = i.getName().endsWith(fileExtension);
                    break;
            }
            if (b) {
                list.add(i);
            }
        });
        return getLatestFile(list);
    }
 
    @Override
    public void test(){
        // 1. 获取所有可用的串口
        SerialPort[] ports = SerialPort.getCommPorts();
        if (ports.length == 0) {
            System.err.println("未找到可用的串口!");
            return;
        }
 
        // 打印所有可用串口(供用户选择)
        System.out.println("可用串口列表:");
        SerialPort targetPort = null;
        for (int i = 0; i < ports.length; i++) {
            if(ports[i].getSystemPortName().equals("COM7")){
                targetPort = ports[i];
            }
            System.out.printf("%d: %s (%s)\n", i + 1, ports[i].getSystemPortName(), ports[i].getPortDescription());
        }
 
        // 2. 选择目标串口(示例:选择第一个串口)
 
        System.out.println("\n选择的串口:" + targetPort.getSystemPortName());
 
        // 3. 配置串口参数(必须与设备一致,否则通信失败)
        targetPort.setComPortParameters(
                9600,                // 波特率(常见值:9600、19200、38400、115200)
                8,                   // 数据位(通常为 8)
                SerialPort.ONE_STOP_BIT,  // 停止位(1 位)
                SerialPort.NO_PARITY     // 校验位(无校验)
        );
        targetPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 100, 0); // 读取超时设置
 
        // 4. 打开串口
        if (!targetPort.openPort()) {
            System.err.println("串口打开失败!请检查端口是否被占用或权限是否足够。");
            return;
        }
        System.out.println("串口打开成功!");
 
        // 5. 注册数据监听(异步读取数据)
        SerialPort finalTargetPort = targetPort;
        targetPort.addDataListener(new SerialPortDataListener() {
            @Override
            public int getListeningEvents() {
                return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; // 监听数据可用事件
            }
 
            @Override
            public void serialEvent(SerialPortEvent event) {
                System.out.println("asasa"+event.toString());
                if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
                    return;
                }
 
                // 读取可用数据
                byte[] readBuffer = new byte[finalTargetPort.bytesAvailable()];
                int bytesRead = finalTargetPort.readBytes(readBuffer, readBuffer.length);
 
                if (bytesRead > 0) {
                    // 转换为字符串(根据设备编码调整,常见:UTF-8、GBK)
                    String data = new String(readBuffer, 0, bytesRead, StandardCharsets.UTF_8);
                    System.out.printf("收到数据(%d 字节):%s", bytesRead, data);
                }
            }
        });
 
        // 6. 保持程序运行(避免主线程退出)
        try {
            while (true) {
                Thread.sleep(1000); // 主线程休眠,不影响监听线程
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.out.println("程序被中断。");
        } finally {
            // 7. 关闭串口(程序退出时释放资源)
            targetPort.closePort();
            System.out.println("串口已关闭。");
        }
    }
 
}