diff --git a/klp-ui/src/views/wms/print/index.vue b/klp-ui/src/views/wms/print/index.vue
index d7ef7954..9f5ca690 100644
--- a/klp-ui/src/views/wms/print/index.vue
+++ b/klp-ui/src/views/wms/print/index.vue
@@ -9,13 +9,13 @@
清空所有
-
打印预览
-
+ -->
添加二维码
@@ -74,7 +74,15 @@
-
+ {
+ const prefix = value == 'in' ? '入库' : value == 'out' ? '出库' : value == 'transfer' ? '移库' : ''
+ cfg.text = prefix + '二维码' + new Date().getTime()
+ }"
+ >
@@ -82,7 +90,11 @@
-
+
{
this.$message.error({
@@ -195,6 +194,8 @@ export default {
})
.finally(() => {
this.isSubmitting = false;
+ // 提交成功后重置表单,方便下一次操作
+ this.handleReset();
});
},
handleReset() {
diff --git a/scaner/src/main/java/org/example/Back.java b/scaner/src/main/java/org/example/Back.java
new file mode 100644
index 00000000..d5efc9ae
--- /dev/null
+++ b/scaner/src/main/java/org/example/Back.java
@@ -0,0 +1,262 @@
+//package org.example;
+//
+//import java.io.File;
+//import java.io.FileOutputStream;
+//import java.io.IOException;
+//import java.io.OutputStream;
+//import java.util.ArrayList;
+//
+//import org.glassfish.tyrus.server.Server;
+//
+//import MvCodeReaderCtrlWrapper.*;
+//import MvCodeReaderCtrlWrapper.MvCodeReaderCtrlDefine.*;
+//
+//public class Back {
+// static HttpRequestUtil http = null;
+//
+// // 保存所有读取到的设备列表
+// private static ArrayList allDevices = new ArrayList<>();
+//
+// // 保存正在监听的设备列表
+// private static final ArrayList activeDevices = new ArrayList<>();
+// private static byte[] pdata;
+//
+// // 获取所有读取到的设备列表JSON(推送给前端)
+// public static String getAllDevicesJson() {
+// org.json.JSONObject obj = new org.json.JSONObject();
+// obj.put("type", "allDevices");
+// org.json.JSONArray arr = new org.json.JSONArray();
+//
+// for (MV_CODEREADER_DEVICE_INFO camInfo : allDevices) {
+// org.json.JSONObject dev = new org.json.JSONObject();
+// dev.put("id", camInfo.stGigEInfo.chSerialNumber); // 序列号
+// dev.put("name", camInfo.stGigEInfo.chUserDefinedName != null ?
+// camInfo.stGigEInfo.chUserDefinedName : camInfo.stGigEInfo.chModelName);
+// dev.put("model", camInfo.stGigEInfo.chModelName); // 型号
+// dev.put("manufacturer", camInfo.stGigEInfo.chManufacturerName); // 制造商
+// dev.put("ip", getIpAddress(camInfo.stGigEInfo.nCurrentIp)); // IP地址
+// dev.put("version", camInfo.stGigEInfo.chDeviceVersion); // 设备版本
+// dev.put("isActive", isDeviceActive(camInfo)); // 是否正在监听
+// arr.put(dev);
+// }
+//
+// obj.put("devices", arr);
+// obj.put("totalCount", allDevices.size()); // 设备总数
+// obj.put("activeCount", activeDevices.size()); // 活跃设备数
+// return obj.toString();
+// }
+//
+// // 检查设备是否正在监听
+// private static boolean isDeviceActive(MV_CODEREADER_DEVICE_INFO device) {
+// for (MV_CODEREADER_DEVICE_INFO active : activeDevices) {
+// if (active.stGigEInfo.chSerialNumber.equals(device.stGigEInfo.chSerialNumber)) {
+// return true;
+// }
+// }
+// return false;
+// }
+//
+// // 将IP整数转换为字符串格式
+// private static String getIpAddress(int ipInt) {
+// return ((ipInt & 0xff000000) >> 24) + "." +
+// ((ipInt & 0x00ff0000) >> 16) + "." +
+// ((ipInt & 0x0000ff00) >> 8) + "." +
+// (ipInt & 0x000000ff);
+// }
+//
+// public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName) {
+// OutputStream os = null;
+//
+// try {
+// // 创建保存目录
+// File tempFile = new File("saveImg");
+// if (!tempFile.exists()) {
+// tempFile.mkdirs();
+// }
+//
+// os = new FileOutputStream("saveImg/" + fileName);
+// os.write(dataToSave, 0, dataSize);
+// System.out.println("图像保存成功: " + fileName);
+// } catch (IOException e) {
+// e.printStackTrace();
+// } finally {
+// // 关闭文件流
+// try {
+// if (os != null) {
+// os.close();
+// }
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// }
+// }
+//
+// // 回调函数, 当扫码枪扫码后触发
+// private static void printImgCBInfo(byte[] pdata, MV_CODEREADER_IMAGE_OUT_INFO_EX2 stOutInfo) {
+// Main.pdata = pdata;
+// if (null == stOutInfo) {
+// System.out.println("stOutInfo is null");
+// return;
+// }
+//
+// System.out.print("/**CBpstOutInfo***************************************/\n");
+//
+// System.out.printf("获取一帧: nEventID[%d], nChannelID[%d], nWidth[%d], nHeight[%d], nFrameNum[%d], nTriggerIndex[%d], nFrameLen[%d], "
+// + " nCodeNumber[%d] \r\n",
+// stOutInfo.nEventID, stOutInfo.nChannelID, stOutInfo.nWidth, stOutInfo.nHeight, stOutInfo.nFrameNum,
+// stOutInfo.nTriggerIndex, stOutInfo.nFrameLen, stOutInfo.pstCodeListEx.nCodeNum);
+//
+// System.out.print("解码状态: bIsGetCode[" + stOutInfo.bIsGetCode + "]\r\n");
+//
+// System.out.print("像素类型: MvCodeReaderGvspPixelType[" + stOutInfo.enPixelType + "]\r\n");
+//
+// // 打印解码信息
+// for (int a = 0; a < stOutInfo.pstCodeListEx.nCodeNum; a++) {
+// org.json.JSONObject obj = new org.json.JSONObject();
+// obj.put("type", "scanMessage");
+// // 解析码中的数据,用下划线分割,第一个为物料类型,第二个为物料id
+// String code = stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).chCode;
+//// String[] parts = code.split("__");
+//// if (parts.length >= 2) {
+//// String itemType = parts[0];
+//// String itemId = parts[1];
+//// obj.put("itemType", itemType);
+//// obj.put("itemId", itemId);
+//// } else {
+//// obj.put("rawCode", code);
+//// obj.put("error", "格式不正确");
+//// }
+// // 直接将解析出的数据返回到页面上
+//// WsServer.broadcast(code);
+// // 发送http请求,存储信息
+// try {
+// String s = HttpRequestUtil.postJson("http://140.143.206.120:8080/wms/stockIoDetail", code);
+// System.out.println("返回值" + s);
+// System.out.println("明细记录创建成功" + code);
+// } catch (Exception e) {
+// throw new RuntimeException(e);
+// }
+//
+//
+// System.out.printf("解码信息: TheCodeID[%d], CodeString[%s], nCodeLen[%d], nAngle[%d], nBarType[%d],"
+// + "sAlgoCost[%d], nIDRScore[%d], n1DIsGetQuality[%d]\r\n",
+// a, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).chCode, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nLen,
+// stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nAngle, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nBarType,
+// stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).sAlgoCost, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nIDRScore,
+// stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).n1DIsGetQuality);
+// }
+// }
+//
+// private static void PrintDeviceInfo(MV_CODEREADER_DEVICE_INFO stCamInfo) {
+// if (stCamInfo.nTLayerType == MvCodeReaderCtrlDefine.MV_CODEREADER_GIGE_DEVICE) {
+// System.out.print("IP地址: " + getIpAddress(stCamInfo.stGigEInfo.nCurrentIp) + "\r\n");
+// System.out.printf("设备信息: 自定义名称:[%s], 序列号:[%s], 型号:[%s] \r\n\r\n",
+// stCamInfo.stGigEInfo.chUserDefinedName,
+// stCamInfo.stGigEInfo.chSerialNumber,
+// stCamInfo.stGigEInfo.chModelName);
+// }
+// }
+//
+//
+// public static void main(String[] args) throws InterruptedException {
+// System.out.print(" ***************程序开始****************** \r\n");
+//
+//// String strVersion = MvCodeReaderCtrl.MV_CODEREADER_GetSDKVersion();
+//// System.out.print("SDK版本: " + strVersion + "\r\n");
+////
+//// // 枚举所有设备
+//// allDevices = MvCodeReaderCtrl.MV_CODEREADER_EnumDevices();
+//// if (allDevices == null || allDevices.isEmpty()) {
+//// System.out.print("未发现任何设备!\r\n");
+//// } else {
+//// System.out.print("发现" + allDevices.size() + "个设备:\r\n");
+//// for (MV_CODEREADER_DEVICE_INFO device : allDevices) {
+//// PrintDeviceInfo(device);
+//// }
+//// }
+////
+//// ArrayList handleList = new ArrayList<>();
+//// // 尝试打开并启动所有发现的设备
+//// for (int i = 0; i < allDevices.size(); i++) {
+//// MV_CODEREADER_DEVICE_INFO camInfo = allDevices.get(i);
+//// System.out.print("处理设备 " + i + ": " + camInfo.stGigEInfo.chSerialNumber + "\r\n");
+////
+//// Handle handle = null;
+//// try {
+//// handle = MvCodeReaderCtrl.MV_CODEREADER_CreateHandle(camInfo);
+//// } catch (ParameterException e) {
+//// System.out.print("创建句柄失败: " + e.getMessage() + "\r\n");
+//// continue;
+//// }
+////
+//// if (handle == null) {
+//// System.out.print("创建句柄失败 for device " + i + "!\r\n");
+//// continue;
+//// }
+////
+//// int nRet = MvCodeReaderCtrl.MV_CODEREADER_OpenDevice(handle);
+//// if (nRet != 0) {
+//// System.out.print("打开设备失败 for device " + i + "! 错误码[" + String.format("0x%x", nRet) + "]\r\n");
+//// continue;
+//// }
+////
+//// nRet = MvCodeReaderCtrl.MV_CODEREADER_RegisterImageCallBackEx2(handle, new ImageCallBack() {
+//// @Override
+//// public int OnImageCallBack(byte[] pdata, MV_CODEREADER_IMAGE_OUT_INFO_EX2 stOutInfo) {
+//// printImgCBInfo(pdata, stOutInfo);
+//// return 0;
+//// }
+//// });
+////
+//// if (nRet != 0) {
+//// System.out.print("注册回调失败 for device " + i + "! 错误码[" + String.format("0x%x", nRet) + "]\r\n");
+//// MvCodeReaderCtrl.MV_CODEREADER_CloseDevice(handle);
+//// continue;
+//// }
+////
+//// nRet = MvCodeReaderCtrl.MV_CODEREADER_StartGrabbing(handle);
+//// if (nRet != 0) {
+//// System.out.print("启动抓取失败 for device " + i + "! 错误码[" + String.format("0x%x", nRet) + "]\r\n");
+//// MvCodeReaderCtrl.MV_CODEREADER_CloseDevice(handle);
+//// continue;
+//// }
+////
+//// // 如果所有步骤都成功,添加到活跃设备列表
+//// handleList.add(handle);
+//// activeDevices.add(camInfo);
+//// System.out.print("设备 " + i + " 启动成功,开始监听!\r\n");
+//// }
+////
+//// System.out.println("所有设备处理完毕。活跃设备数量: " + activeDevices.size() + "\r\n");
+//
+// // 输入自己的身份并保存,每次请求时将其附加在json中,createBy字段
+//
+//// 改为监听键盘输入,当监听到一个以##开头,!!结尾的字符串时,提取中间的部分
+// http = new HttpRequestUtil();
+// System.out.println("http请求工具创建完成");
+// // 启动WebSocket服务器,用于向前端推送设备列表和扫描结果
+// Server server = new Server("localhost", 9000, "/", null, WsServer.class);
+// try {
+// server.start();
+// System.out.println("WebSocket服务器已启动,端口9000");
+// System.out.println("按Enter键退出程序...");
+// System.in.read(); // 阻塞主线程直到回车
+// } catch (Exception e) {
+// System.out.println("WebSocket服务器错误: " + e.getMessage());
+// e.printStackTrace();
+// } finally {
+// // 停止所有设备
+// System.out.println("停止所有设备...");
+// for (Handle handle : handleList) {
+// MvCodeReaderCtrl.MV_CODEREADER_StopGrabbing(handle);
+// MvCodeReaderCtrl.MV_CODEREADER_CloseDevice(handle);
+// }
+// server.stop();
+// System.out.println("程序已退出");
+// }
+// }
+//
+// public static byte[] getPdata() {
+// return pdata;
+// }
+//}
diff --git a/scaner/src/main/java/org/example/Main.java b/scaner/src/main/java/org/example/Main.java
index 186cbad0..6c034408 100644
--- a/scaner/src/main/java/org/example/Main.java
+++ b/scaner/src/main/java/org/example/Main.java
@@ -1,259 +1,241 @@
package org.example;
-import java.io.File;
-import java.io.FileOutputStream;
+import java.awt.AWTException;
+import java.awt.Robot;
+import java.io.BufferedReader;
import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
+import java.io.InputStreamReader;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
-import org.glassfish.tyrus.server.Server;
-
-import MvCodeReaderCtrlWrapper.*;
-import MvCodeReaderCtrlWrapper.MvCodeReaderCtrlDefine.*;
+import org.json.JSONException;
+import org.json.JSONObject;
public class Main {
static HttpRequestUtil http = null;
-
- // 保存所有读取到的设备列表
- private static ArrayList allDevices = new ArrayList<>();
-
- // 保存正在监听的设备列表
- private static final ArrayList activeDevices = new ArrayList<>();
- private static byte[] pdata;
-
- // 获取所有读取到的设备列表JSON(推送给前端)
- public static String getAllDevicesJson() {
- org.json.JSONObject obj = new org.json.JSONObject();
- obj.put("type", "allDevices");
- org.json.JSONArray arr = new org.json.JSONArray();
-
- for (MV_CODEREADER_DEVICE_INFO camInfo : allDevices) {
- org.json.JSONObject dev = new org.json.JSONObject();
- dev.put("id", camInfo.stGigEInfo.chSerialNumber); // 序列号
- dev.put("name", camInfo.stGigEInfo.chUserDefinedName != null ?
- camInfo.stGigEInfo.chUserDefinedName : camInfo.stGigEInfo.chModelName);
- dev.put("model", camInfo.stGigEInfo.chModelName); // 型号
- dev.put("manufacturer", camInfo.stGigEInfo.chManufacturerName); // 制造商
- dev.put("ip", getIpAddress(camInfo.stGigEInfo.nCurrentIp)); // IP地址
- dev.put("version", camInfo.stGigEInfo.chDeviceVersion); // 设备版本
- dev.put("isActive", isDeviceActive(camInfo)); // 是否正在监听
- arr.put(dev);
- }
-
- obj.put("devices", arr);
- obj.put("totalCount", allDevices.size()); // 设备总数
- obj.put("activeCount", activeDevices.size()); // 活跃设备数
- return obj.toString();
- }
-
- // 检查设备是否正在监听
- private static boolean isDeviceActive(MV_CODEREADER_DEVICE_INFO device) {
- for (MV_CODEREADER_DEVICE_INFO active : activeDevices) {
- if (active.stGigEInfo.chSerialNumber.equals(device.stGigEInfo.chSerialNumber)) {
- return true;
- }
- }
- return false;
- }
-
- // 将IP整数转换为字符串格式
- private static String getIpAddress(int ipInt) {
- return ((ipInt & 0xff000000) >> 24) + "." +
- ((ipInt & 0x00ff0000) >> 16) + "." +
- ((ipInt & 0x0000ff00) >> 8) + "." +
- (ipInt & 0x000000ff);
- }
-
- public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName) {
- OutputStream os = null;
-
- try {
- // 创建保存目录
- File tempFile = new File("saveImg");
- if (!tempFile.exists()) {
- tempFile.mkdirs();
- }
-
- os = new FileOutputStream("saveImg/" + fileName);
- os.write(dataToSave, 0, dataSize);
- System.out.println("图像保存成功: " + fileName);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- // 关闭文件流
- try {
- if (os != null) {
- os.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- // 回调函数, 当扫码枪扫码后触发
- private static void printImgCBInfo(byte[] pdata, MV_CODEREADER_IMAGE_OUT_INFO_EX2 stOutInfo) {
- Main.pdata = pdata;
- if (null == stOutInfo) {
- System.out.println("stOutInfo is null");
- return;
- }
-
- System.out.print("/**CBpstOutInfo***************************************/\n");
-
- System.out.printf("获取一帧: nEventID[%d], nChannelID[%d], nWidth[%d], nHeight[%d], nFrameNum[%d], nTriggerIndex[%d], nFrameLen[%d], "
- + " nCodeNumber[%d] \r\n",
- stOutInfo.nEventID, stOutInfo.nChannelID, stOutInfo.nWidth, stOutInfo.nHeight, stOutInfo.nFrameNum,
- stOutInfo.nTriggerIndex, stOutInfo.nFrameLen, stOutInfo.pstCodeListEx.nCodeNum);
-
- System.out.print("解码状态: bIsGetCode[" + stOutInfo.bIsGetCode + "]\r\n");
-
- System.out.print("像素类型: MvCodeReaderGvspPixelType[" + stOutInfo.enPixelType + "]\r\n");
-
- // 打印解码信息
- for (int a = 0; a < stOutInfo.pstCodeListEx.nCodeNum; a++) {
- org.json.JSONObject obj = new org.json.JSONObject();
- obj.put("type", "scanMessage");
- // 解析码中的数据,用下划线分割,第一个为物料类型,第二个为物料id
- String code = stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).chCode;
-// String[] parts = code.split("__");
-// if (parts.length >= 2) {
-// String itemType = parts[0];
-// String itemId = parts[1];
-// obj.put("itemType", itemType);
-// obj.put("itemId", itemId);
-// } else {
-// obj.put("rawCode", code);
-// obj.put("error", "格式不正确");
-// }
- // 直接将解析出的数据返回到页面上
-// WsServer.broadcast(code);
- // 发送http请求,存储信息
- try {
- String s = HttpRequestUtil.postJson("http://140.143.206.120:8080/wms/stockIoDetail", code);
- System.out.println("返回值" + s);
- System.out.println("明细记录创建成功" + code);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
-
- System.out.printf("解码信息: TheCodeID[%d], CodeString[%s], nCodeLen[%d], nAngle[%d], nBarType[%d],"
- + "sAlgoCost[%d], nIDRScore[%d], n1DIsGetQuality[%d]\r\n",
- a, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).chCode, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nLen,
- stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nAngle, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nBarType,
- stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).sAlgoCost, stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).nIDRScore,
- stOutInfo.pstCodeListEx.stBcrInfoEx.get(a).n1DIsGetQuality);
- }
- }
-
- private static void PrintDeviceInfo(MV_CODEREADER_DEVICE_INFO stCamInfo) {
- if (stCamInfo.nTLayerType == MvCodeReaderCtrlDefine.MV_CODEREADER_GIGE_DEVICE) {
- System.out.print("IP地址: " + getIpAddress(stCamInfo.stGigEInfo.nCurrentIp) + "\r\n");
- System.out.printf("设备信息: 自定义名称:[%s], 序列号:[%s], 型号:[%s] \r\n\r\n",
- stCamInfo.stGigEInfo.chUserDefinedName,
- stCamInfo.stGigEInfo.chSerialNumber,
- stCamInfo.stGigEInfo.chModelName);
- }
- }
-
+ private static String userIdentity;
+ // 存储扫码枪输入的字符
+ private static final BlockingQueue inputQueue = new ArrayBlockingQueue<>(4096);
+ // 扫码枪结束符(回车)的ASCII值
+ private static final int ENTER_ASCII = 13; // \r的ASCII值
+ private static final int NEWLINE_ASCII = 10; // \n的ASCII值
+ private static volatile boolean isExit = false;
public static void main(String[] args) throws InterruptedException {
System.out.print(" ***************程序开始****************** \r\n");
- String strVersion = MvCodeReaderCtrl.MV_CODEREADER_GetSDKVersion();
- System.out.print("SDK版本: " + strVersion + "\r\n");
+ lockEnglishInputMethod();
- // 枚举所有设备
- allDevices = MvCodeReaderCtrl.MV_CODEREADER_EnumDevices();
- if (allDevices == null || allDevices.isEmpty()) {
- System.out.print("未发现任何设备!\r\n");
- } else {
- System.out.print("发现" + allDevices.size() + "个设备:\r\n");
- for (MV_CODEREADER_DEVICE_INFO device : allDevices) {
- PrintDeviceInfo(device);
- }
- }
-
- ArrayList handleList = new ArrayList<>();
- // 尝试打开并启动所有发现的设备
- for (int i = 0; i < allDevices.size(); i++) {
- MV_CODEREADER_DEVICE_INFO camInfo = allDevices.get(i);
- System.out.print("处理设备 " + i + ": " + camInfo.stGigEInfo.chSerialNumber + "\r\n");
-
- Handle handle = null;
- try {
- handle = MvCodeReaderCtrl.MV_CODEREADER_CreateHandle(camInfo);
- } catch (ParameterException e) {
- System.out.print("创建句柄失败: " + e.getMessage() + "\r\n");
- continue;
- }
-
- if (handle == null) {
- System.out.print("创建句柄失败 for device " + i + "!\r\n");
- continue;
- }
-
- int nRet = MvCodeReaderCtrl.MV_CODEREADER_OpenDevice(handle);
- if (nRet != 0) {
- System.out.print("打开设备失败 for device " + i + "! 错误码[" + String.format("0x%x", nRet) + "]\r\n");
- continue;
- }
-
- nRet = MvCodeReaderCtrl.MV_CODEREADER_RegisterImageCallBackEx2(handle, new ImageCallBack() {
- @Override
- public int OnImageCallBack(byte[] pdata, MV_CODEREADER_IMAGE_OUT_INFO_EX2 stOutInfo) {
- printImgCBInfo(pdata, stOutInfo);
- return 0;
- }
- });
-
- if (nRet != 0) {
- System.out.print("注册回调失败 for device " + i + "! 错误码[" + String.format("0x%x", nRet) + "]\r\n");
- MvCodeReaderCtrl.MV_CODEREADER_CloseDevice(handle);
- continue;
- }
-
- nRet = MvCodeReaderCtrl.MV_CODEREADER_StartGrabbing(handle);
- if (nRet != 0) {
- System.out.print("启动抓取失败 for device " + i + "! 错误码[" + String.format("0x%x", nRet) + "]\r\n");
- MvCodeReaderCtrl.MV_CODEREADER_CloseDevice(handle);
- continue;
- }
-
- // 如果所有步骤都成功,添加到活跃设备列表
- handleList.add(handle);
- activeDevices.add(camInfo);
- System.out.print("设备 " + i + " 启动成功,开始监听!\r\n");
- }
-
- System.out.println("所有设备处理完毕。活跃设备数量: " + activeDevices.size() + "\r\n");
-
- http = new HttpRequestUtil();
- System.out.println("http请求工具创建完成");
- // 启动WebSocket服务器,用于向前端推送设备列表和扫描结果
- Server server = new Server("localhost", 9000, "/", null, WsServer.class);
+ // 使用BufferedReader获取用户身份,避免关闭System.in
+ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
- server.start();
- System.out.println("WebSocket服务器已启动,端口9000");
- System.out.println("按Enter键退出程序...");
- System.in.read(); // 阻塞主线程直到回车
- } catch (Exception e) {
- System.out.println("WebSocket服务器错误: " + e.getMessage());
- e.printStackTrace();
- } finally {
- // 停止所有设备
- System.out.println("停止所有设备...");
- for (Handle handle : handleList) {
- MvCodeReaderCtrl.MV_CODEREADER_StopGrabbing(handle);
- MvCodeReaderCtrl.MV_CODEREADER_CloseDevice(handle);
+ System.out.print("请输入您的身份标识(如:admin): ");
+ userIdentity = reader.readLine().trim();
+ while (userIdentity.isEmpty()) {
+ System.out.print("身份标识不能为空,请重新输入: ");
+ userIdentity = reader.readLine().trim();
}
- server.stop();
- System.out.println("程序已退出");
+ System.out.println("已保存身份信息: " + userIdentity + "\n");
+ } catch (IOException e) {
+ System.out.println("读取用户身份时出错: " + e.getMessage());
+ System.exit(1);
+ }
+
+ // 启动输入监听和数据处理线程
+ startRawInputListener();
+ startScanDataProcessor();
+
+ // 初始化HTTP请求工具
+ http = new HttpRequestUtil();
+ System.out.println("HTTP请求工具创建完成");
+ System.out.println("提示:1. 使用扫码枪扫描JSON数据;2. 输入 'exit' 并回车退出程序\n");
+
+ // 主线程阻塞(直到isExit被标记为true)
+ while (!isExit) {
+ Thread.sleep(100);
+ }
+
+ // 程序退出清理
+ System.out.println("\n开始停止所有服务...");
+ isExit = true;
+ System.out.println("程序已正常退出");
+ }
+
+ /**
+ * 输入监听线程:记录所有接收的字符
+ */
+ private static void startRawInputListener() {
+ Thread inputThread = new Thread(() -> {
+ try {
+ int byteData;
+ while (!isExit && (byteData = System.in.read()) != -1) {
+ char c = (char) byteData;
+ // 打印每个接收的字符(含ASCII值),用于调试
+ System.out.printf("[接收字符] 内容: '%c' ASCII: %d%n",
+ (c == '\r' ? '\\' + 'r' : c == '\n' ? '\\' + 'n' : c),
+ (int) c);
+
+ inputQueue.put(c);
+ }
+ } catch (IOException e) {
+ if (!isExit) {
+ System.out.println("输入监听异常: " + e.getMessage());
+ e.printStackTrace();
+ }
+ } catch (InterruptedException e) {
+ System.out.println("输入监听线程被中断");
+ Thread.currentThread().interrupt();
+ }
+ });
+ inputThread.setDaemon(true);
+ inputThread.start();
+ }
+
+ /**
+ * 数据处理线程:通过回车符判断扫码结束
+ */
+ private static void startScanDataProcessor() {
+ Thread processorThread = new Thread(() -> {
+ StringBuilder inputBuffer = new StringBuilder();
+
+ try {
+ while (!isExit) {
+ // 取出队列中的字符
+ char c = inputQueue.take();
+ int ascii = (int) c;
+
+ // 判断是否为结束符(回车或换行)
+ if (ascii == ENTER_ASCII || ascii == NEWLINE_ASCII) {
+ // 缓冲区不为空时才处理(避免空输入)
+ if (inputBuffer.length() > 0) {
+ String scanInput = inputBuffer.toString().trim();
+ System.out.println("===== 扫码原始数据(完整) =====");
+ System.out.println(scanInput);
+ System.out.println("================================\n");
+
+ // 检查退出命令
+ if ("exit".equalsIgnoreCase(scanInput)) {
+ isExit = true;
+ System.out.println("\n已接收到退出指令,程序将关闭...");
+ break;
+ }
+
+ // 校验JSON格式
+ if (isValidJson(scanInput)) {
+ System.out.println("JSON格式校验通过,开始处理...");
+ sendDataToServer(scanInput);
+ } else {
+ System.out.println("错误:输入不是有效JSON格式\n");
+ }
+
+ // 清空缓冲区,准备下一次扫码
+ inputBuffer.setLength(0);
+ }
+ } else {
+ // 非结束符则添加到缓冲区
+ inputBuffer.append(c);
+ }
+ }
+ } catch (InterruptedException e) {
+ System.out.println("数据处理线程被中断");
+ Thread.currentThread().interrupt();
+ }
+ });
+ processorThread.setDaemon(true);
+ processorThread.start();
+ }
+
+ /**
+ * 校验字符串是否为有效JSON
+ */
+ private static boolean isValidJson(String input) {
+ try {
+ new JSONObject(input);
+ return true;
+ } catch (JSONException e) {
+ System.out.println("JSON解析失败原因: " + e.getMessage());
+ return false;
}
}
- public static byte[] getPdata() {
- return pdata;
+ /**
+ * 锁定英文输入法(Windows系统专用)
+ */
+ private static void lockEnglishInputMethod() {
+ try {
+ String powerShellCmd = "powershell -Command \"$im = Get-WinUserLanguageList | Where-Object LanguageTag -eq 'en-US'; " +
+ "if ($im) { Set-WinUserLanguageList -LanguageList $im -Force; Write-Host 'Success' }\"";
+
+ Process process = Runtime.getRuntime().exec(powerShellCmd);
+ process.waitFor();
+
+ if (process.exitValue() == 0) {
+ System.out.println("英文输入法已锁定(en-US)");
+ } else {
+ System.out.println("PowerShell切换输入法失败,尝试备选方案(Ctrl+空格)");
+ sendKeyStroke(0x11, 0x20);
+ }
+ } catch (Exception e) {
+ System.out.println("设置英文输入法异常: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 发送键盘组合键(用于输入法切换备选方案)
+ */
+ private static void sendKeyStroke(int modifier, int key) {
+ try {
+ Robot robot = new Robot();
+ robot.keyPress(modifier);
+ robot.keyPress(key);
+ robot.keyRelease(key);
+ robot.keyRelease(modifier);
+ System.out.println("已尝试Ctrl+空格切换输入法");
+ } catch (AWTException e) {
+ System.out.println("发送键盘事件失败: " + e.getMessage());
+ }
+ }
+
+ /**
+ * 处理JSON数据并发送POST请求
+ */
+ private static void sendDataToServer(String jsonInput) {
+ try {
+ JSONObject json = new JSONObject(jsonInput);
+ json.put("createBy", userIdentity);
+ String finalJson = json.toString(2);
+
+ System.out.println("最终发送的JSON数据: ");
+ System.out.println(finalJson + "\n");
+
+ // 取消注释以下代码以启用HTTP请求
+ String response = HttpRequestUtil.postJson(
+ "http://140.143.206.120:8080/wms/stockIoDetail",
+ finalJson
+ );
+
+ if (response == null || response.isEmpty()) {
+ System.out.println("服务器无响应,请检查接口连接\n");
+ } else {
+ System.out.println("服务器返回结果: ");
+ String formattedResponse = isJson(response) ? new JSONObject(response).toString(2) : response;
+ System.out.println(formattedResponse + "\n");
+ }
+
+ } catch (JSONException e) {
+ System.out.println("JSON处理异常: " + e.getMessage() + "\n");
+ } catch (Exception e) {
+ System.out.println("发送请求异常: " + e.getMessage() + "\n");
+ }
+ }
+
+ /**
+ * 判断字符串是否为JSON格式
+ */
+ private static boolean isJson(String str) {
+ if (str == null || str.isEmpty()) return false;
+ str = str.trim();
+ return (str.startsWith("{") && str.endsWith("}")) || (str.startsWith("[") && str.endsWith("]"));
}
}
diff --git a/scaner/src/main/java/org/example/WsServer.java b/scaner/src/main/java/org/example/WsServer.java
index 0cd5de4e..af5bad8a 100644
--- a/scaner/src/main/java/org/example/WsServer.java
+++ b/scaner/src/main/java/org/example/WsServer.java
@@ -18,13 +18,13 @@ public class WsServer {
sessions.add(session);
System.out.println("WebSocket连接已建立: " + session.getId());
// 推送所有扫码枪列表给前端(使用修改后的方法名)
- String deviceListJson = Main.getAllDevicesJson();
- try {
- System.out.println("发送设备列表到前端: " + deviceListJson);
- session.getBasicRemote().sendText(deviceListJson);
- } catch (IOException e) {
- e.printStackTrace();
- }
+// String deviceListJson = Main.getAllDevicesJson();
+// try {
+// System.out.println("发送设备列表到前端: " + deviceListJson);
+// session.getBasicRemote().sendText(deviceListJson);
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
}
@OnMessage
@@ -32,8 +32,8 @@ public class WsServer {
System.out.println("收到消息: " + message);
// 可以根据前端需求,在这里处理命令(比如刷新设备列表)
if ("refreshDevices".equals(message)) {
- String deviceListJson = Main.getAllDevicesJson();
- session.getBasicRemote().sendText(deviceListJson);
+// String deviceListJson = Main.getAllDevicesJson();
+// session.getBasicRemote().sendText(deviceListJson);
} else {
session.getBasicRemote().sendText("服务器已收到: " + message);
}