From 9ca7b463d2d92d8a11c2f06f96095d37727c9032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Thu, 13 Mar 2025 14:26:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9Ex=E3=80=81y=E3=80=81z?= =?UTF-8?q?=E5=9B=9E=E5=8E=9F=E7=82=B9=E4=B8=9A=E5=8A=A1=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E5=B9=B6=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=AE=9E=E7=8E=B0=E6=8E=A8?= =?UTF-8?q?=E5=85=A5=E9=80=80=E5=87=BA=E4=B8=9A=E5=8A=A1=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- matrix-spray.db | Bin 40960 -> 45056 bytes sql/init.sql | 13 +++ .../app/common/command/DeviceCommandGenerator.java | 119 ++++++++++++++++++--- .../com/qyft/ms/app/handler/impl/MotorXToHome.java | 59 ++++++++++ .../com/qyft/ms/app/handler/impl/MotorYToHome.java | 59 ++++++++++ .../com/qyft/ms/app/handler/impl/MotorZToHome.java | 59 ++++++++++ .../ms/app/handler/impl/NozzlePipelinePreFill.java | 6 ++ .../ms/app/handler/impl/NozzlePipelineWash.java | 24 +++++ .../com/qyft/ms/app/handler/impl/SlideTrayIn.java | 36 ++++++- .../com/qyft/ms/app/handler/impl/SlideTrayOut.java | 34 ++++++ .../ms/app/handler/impl/SprayPipelineWash.java | 30 ------ .../com/qyft/ms/app/model/entity/Position.java | 16 +++ src/main/resources/application.yml | 2 +- 13 files changed, 408 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/qyft/ms/app/handler/impl/MotorXToHome.java create mode 100644 src/main/java/com/qyft/ms/app/handler/impl/MotorYToHome.java create mode 100644 src/main/java/com/qyft/ms/app/handler/impl/MotorZToHome.java create mode 100644 src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelineWash.java delete mode 100644 src/main/java/com/qyft/ms/app/handler/impl/SprayPipelineWash.java create mode 100644 src/main/java/com/qyft/ms/app/model/entity/Position.java diff --git a/matrix-spray.db b/matrix-spray.db index fddba6e6bf4f06961da2564df20d7ed3f34233b7..595186b669b67e39bf55cd37c5bc19461370199a 100644 GIT binary patch delta 257 zcmZoTz|`=7X@a!iItB&?ZXkvM-ibQKvg;W1$~t)2of$Y-%^CP+@p2QaQ1PC zv6^pe+|6R&q{q!JE-TB}qF<7jl#^PJUz}NznV$!vxt)Vt9Yb6dLL8lZToquV3L3mz z3P6yVGWj8&vH*lrke``X5}%itn>tyaOVqYP0jSeQ!OuTL!7tRuM+c&)602wxy6EJ) tyrz=_IE5w)@G3L&a%oP^V7ouD@%&~nj#ty!ctKti*sQ3K&p&ZOHvm6qLi7Lt delta 152 zcmZp8z|?SnX@a!iS_TFNE+B>ho{2ifvTGUinjCo9of+8KG8p(~@p2QaQ1PC zv1M!)6nMirIfLy!o4C3UV4C8m|cXQn79 nD0upXxVpOr=}g|iAtT8J6i_HGNh~QX2C-nk({HmF$E)c8Fm@#k diff --git a/sql/init.sql b/sql/init.sql index b7b4d71..da0a559 100644 --- a/sql/init.sql +++ b/sql/init.sql @@ -101,3 +101,16 @@ VALUES (1, NULL, '玻片位置', 'slide_position', NULL), (12, 10, 'y轴速度', 'y_speed', 10), (13, 10, 'z轴速度', 'z_speed', 10), (14, NULL, '废液桶位置','waste_liquor', '173.08,75,70' ); + + + +-- 位置表,用来存储设备固定点位 +CREATE TABLE IF NOT EXISTS position ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + point_name TEXT NOT NULL, + x REAL NOT NULL, + y REAL NOT NULL, + z REAL NOT NULL, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file diff --git a/src/main/java/com/qyft/ms/app/common/command/DeviceCommandGenerator.java b/src/main/java/com/qyft/ms/app/common/command/DeviceCommandGenerator.java index 2742fab..23fb63a 100644 --- a/src/main/java/com/qyft/ms/app/common/command/DeviceCommandGenerator.java +++ b/src/main/java/com/qyft/ms/app/common/command/DeviceCommandGenerator.java @@ -3,6 +3,9 @@ package com.qyft.ms.app.common.command; import com.qyft.ms.app.model.bo.CMDToDevice; +import java.util.HashMap; +import java.util.Map; + /** * 生成给设备发送的指令 */ @@ -10,10 +13,10 @@ public class DeviceCommandGenerator { /** * { - * cmdName:'getInfoCmd' - * cmdId:'', - * device:'device', - * action:'get' + * cmdName:'getInfoCmd' + * cmdId:'', + * device:'device', + * action:'get' * } */ public static CMDToDevice device_status_get() { @@ -29,10 +32,10 @@ public class DeviceCommandGenerator { /** * 获取设备当前湿度 * { - * cmdName:'getInfoCmd' - * cmdId:'', - * device:'temperature', - * action:'get' + * cmdName:'getInfoCmd' + * cmdId:'', + * device:'temperature', + * action:'get' * } */ public static CMDToDevice humidity_get() { @@ -48,10 +51,10 @@ public class DeviceCommandGenerator { /** * 开启除湿阀 * { - * cmdName:'controlCmd' - * cmdId:'', - * device:'dehumidifier_valve', - * action:'open|close' + * cmdName:'controlCmd' + * cmdId:'', + * device:'dehumidifier_valve', + * action:'open|close' * } */ public static CMDToDevice dehumidifier_valve_control(String action) { @@ -97,13 +100,97 @@ public class DeviceCommandGenerator { return "matrix_spray_continue"; } - public static String slide_tray_in() { - return "slide_tray_in"; + /** + * 推入玻片托盘 + * { + * cmdName:'controlMotorCmd' + * cmdId:'', + * device:'x', + * action:'move', + * param:{ + * current:'',//电流 + * direction:'forward|backward', + * position:'根据坐标计算', + * speed:''//移动速度 + * } + * } + */ + public static CMDToDevice slide_tray_in(int current, int position, int speed) { + int cmdId = CyclicNumberGenerator.getInstance().generateNumber(); + CMDToDevice cmdToDevice = new CMDToDevice(); + cmdToDevice.setCmdId(cmdId); + cmdToDevice.setCmdName("controlMotorCmd"); + cmdToDevice.setDevice("y"); + cmdToDevice.setAction("move"); + Map params = new HashMap<>(); + params.put("current",current ); + params.put("direction", "forward"); + params.put("position", position); + params.put("speed", speed); + cmdToDevice.setParam(params); + return cmdToDevice; } - public static String slide_tray_out() { - return "slide_tray_out"; + /** + * 推入玻片托盘 + * { + * cmdName:'controlMotorCmd' + * cmdId:'', + * device:'x', + * action:'move', + * param:{ + * current:'',//电流 + * direction:'forward|backward', + * position:'根据坐标计算', + * speed:''//移动速度 + * } + * } + */ + public static CMDToDevice slide_tray_out(int current, int position, int speed) { + int cmdId = CyclicNumberGenerator.getInstance().generateNumber(); + CMDToDevice cmdToDevice = new CMDToDevice(); + cmdToDevice.setCmdId(cmdId); + cmdToDevice.setCmdName("controlMotorCmd"); + cmdToDevice.setDevice("y"); + cmdToDevice.setAction("move"); + Map params = new HashMap<>(); + params.put("current",current ); + params.put("direction", "forward"); + params.put("position", position); + params.put("speed", speed); + cmdToDevice.setParam(params); + return cmdToDevice; } + public static CMDToDevice motor_x_to_home() { + int cmdId = CyclicNumberGenerator.getInstance().generateNumber(); + CMDToDevice cmdToDevice = new CMDToDevice(); + cmdToDevice.setCmdId(cmdId); + cmdToDevice.setCmdName("controlMotorCmd"); + cmdToDevice.setDevice("x"); + cmdToDevice.setAction("origin"); + return cmdToDevice; + } + + public static CMDToDevice motor_y_to_home() { + int cmdId = CyclicNumberGenerator.getInstance().generateNumber(); + CMDToDevice cmdToDevice = new CMDToDevice(); + cmdToDevice.setCmdId(cmdId); + cmdToDevice.setCmdName("controlMotorCmd"); + cmdToDevice.setDevice("y"); + cmdToDevice.setAction("origin"); + return cmdToDevice; + } + + public static CMDToDevice motor_z_to_home() { + int cmdId = CyclicNumberGenerator.getInstance().generateNumber(); + CMDToDevice cmdToDevice = new CMDToDevice(); + cmdToDevice.setCmdId(cmdId); + cmdToDevice.setCmdName("controlMotorCmd"); + cmdToDevice.setDevice("z"); + cmdToDevice.setAction("origin"); + return cmdToDevice; + } + } diff --git a/src/main/java/com/qyft/ms/app/handler/impl/MotorXToHome.java b/src/main/java/com/qyft/ms/app/handler/impl/MotorXToHome.java new file mode 100644 index 0000000..ac8ff1a --- /dev/null +++ b/src/main/java/com/qyft/ms/app/handler/impl/MotorXToHome.java @@ -0,0 +1,59 @@ +package com.qyft.ms.app.handler.impl; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.qyft.ms.app.common.annotation.CommandMapping; +import com.qyft.ms.app.common.command.CommandFuture; +import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance; +import com.qyft.ms.app.common.command.DeviceCommandGenerator; +import com.qyft.ms.app.common.command.FrontCommandAck; +import com.qyft.ms.app.common.constant.CommandStatus; +import com.qyft.ms.app.handler.CommandHandler; +import com.qyft.ms.app.model.bo.CMDToDevice; +import com.qyft.ms.app.model.form.CMDFormV2; +import com.qyft.ms.device.client.TcpClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +/** + * x轴回原点 + */ +@Slf4j +@Component +@RequiredArgsConstructor +@Async("asyncExecutor") +@CommandMapping("motor_x_to_home")//业务指令注解 +public class MotorXToHome implements CommandHandler { + private final TcpClient deviceClient; + + @Override + public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + String frontCmdId = cmdForm.getCmdId(); + String frontCmdName = cmdForm.getCmdName(); + //向前端发送接收到指令 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); + CMDToDevice motorXToHomeCmdToDevice = DeviceCommandGenerator.motor_x_to_home();//生成指令 回原点 + + CommandFuture motorXToHomeCmdToDeviceFuture = new CommandFuture(); + motorXToHomeCmdToDeviceFuture.setCmdToDevice(motorXToHomeCmdToDevice); + Integer toDeviceCmdId = motorXToHomeCmdToDevice.getCmdId(); + CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, motorXToHomeCmdToDeviceFuture);//将指令放入map + deviceClient.sendToJSON(motorXToHomeCmdToDevice); //发送指令给设备 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了x轴回原点指令:" + JSONUtil.toJsonStr(motorXToHomeCmdToDevice)), MediaType.APPLICATION_JSON); + + motorXToHomeCmdToDeviceFuture.waitForContinue();//等待设备的反馈 + + JSONObject deviceResult = motorXToHomeCmdToDeviceFuture.getCallbackResult();//拿到设备返回结果 + CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除 + + if (motorXToHomeCmdToDeviceFuture.isReceived()) { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "x轴回原点指令设备反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } else { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "x轴回原点指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } + } +} diff --git a/src/main/java/com/qyft/ms/app/handler/impl/MotorYToHome.java b/src/main/java/com/qyft/ms/app/handler/impl/MotorYToHome.java new file mode 100644 index 0000000..1971f6f --- /dev/null +++ b/src/main/java/com/qyft/ms/app/handler/impl/MotorYToHome.java @@ -0,0 +1,59 @@ +package com.qyft.ms.app.handler.impl; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.qyft.ms.app.common.annotation.CommandMapping; +import com.qyft.ms.app.common.command.CommandFuture; +import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance; +import com.qyft.ms.app.common.command.DeviceCommandGenerator; +import com.qyft.ms.app.common.command.FrontCommandAck; +import com.qyft.ms.app.common.constant.CommandStatus; +import com.qyft.ms.app.handler.CommandHandler; +import com.qyft.ms.app.model.bo.CMDToDevice; +import com.qyft.ms.app.model.form.CMDFormV2; +import com.qyft.ms.device.client.TcpClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +/** + * z轴回原点 + */ +@Slf4j +@Component +@RequiredArgsConstructor +@Async("asyncExecutor") +@CommandMapping("motor_y_to_home")//业务指令注解 +public class MotorYToHome implements CommandHandler { + private final TcpClient deviceClient; + + @Override + public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + String frontCmdId = cmdForm.getCmdId(); + String frontCmdName = cmdForm.getCmdName(); + //向前端发送接收到指令 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); + CMDToDevice motorYToHomeCmdToDevice = DeviceCommandGenerator.motor_y_to_home();//生成指令 回原点 + + CommandFuture motorYToHomeCmdToDeviceFuture = new CommandFuture(); + motorYToHomeCmdToDeviceFuture.setCmdToDevice(motorYToHomeCmdToDevice); + Integer toDeviceCmdId = motorYToHomeCmdToDevice.getCmdId(); + CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, motorYToHomeCmdToDeviceFuture);//将指令放入map + deviceClient.sendToJSON(motorYToHomeCmdToDevice); //发送指令给设备 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了y轴回原点指令:" + JSONUtil.toJsonStr(motorYToHomeCmdToDevice)), MediaType.APPLICATION_JSON); + + motorYToHomeCmdToDeviceFuture.waitForContinue();//等待设备的反馈 + + JSONObject deviceResult = motorYToHomeCmdToDeviceFuture.getCallbackResult();//拿到设备返回结果 + CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除 + + if (motorYToHomeCmdToDeviceFuture.isReceived()) { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "y轴回原点指令设备反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } else { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "y轴回原点指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } + } +} diff --git a/src/main/java/com/qyft/ms/app/handler/impl/MotorZToHome.java b/src/main/java/com/qyft/ms/app/handler/impl/MotorZToHome.java new file mode 100644 index 0000000..e4bc14f --- /dev/null +++ b/src/main/java/com/qyft/ms/app/handler/impl/MotorZToHome.java @@ -0,0 +1,59 @@ +package com.qyft.ms.app.handler.impl; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.qyft.ms.app.common.annotation.CommandMapping; +import com.qyft.ms.app.common.command.CommandFuture; +import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance; +import com.qyft.ms.app.common.command.DeviceCommandGenerator; +import com.qyft.ms.app.common.command.FrontCommandAck; +import com.qyft.ms.app.common.constant.CommandStatus; +import com.qyft.ms.app.handler.CommandHandler; +import com.qyft.ms.app.model.bo.CMDToDevice; +import com.qyft.ms.app.model.form.CMDFormV2; +import com.qyft.ms.device.client.TcpClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +/** + * z轴回原点 + */ +@Slf4j +@Component +@RequiredArgsConstructor +@Async("asyncExecutor") +@CommandMapping("motor_z_to_home")//业务指令注解 +public class MotorZToHome implements CommandHandler { + private final TcpClient deviceClient; + + @Override + public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + String frontCmdId = cmdForm.getCmdId(); + String frontCmdName = cmdForm.getCmdName(); + //向前端发送接收到指令 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); + CMDToDevice motorZToHomeCmdToDevice = DeviceCommandGenerator.motor_z_to_home();//生成指令 回原点 + + CommandFuture motorZToHomeCmdToDeviceFuture = new CommandFuture(); + motorZToHomeCmdToDeviceFuture.setCmdToDevice(motorZToHomeCmdToDevice); + Integer toDeviceCmdId = motorZToHomeCmdToDevice.getCmdId(); + CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, motorZToHomeCmdToDeviceFuture);//将指令放入map + deviceClient.sendToJSON(motorZToHomeCmdToDevice); //发送指令给设备 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了z轴回原点指令:" + JSONUtil.toJsonStr(motorZToHomeCmdToDevice)), MediaType.APPLICATION_JSON); + + motorZToHomeCmdToDeviceFuture.waitForContinue();//等待设备的反馈 + + JSONObject deviceResult = motorZToHomeCmdToDeviceFuture.getCallbackResult();//拿到设备返回结果 + CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除 + + if (motorZToHomeCmdToDeviceFuture.isReceived()) { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "z轴回原点指令设备反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } else { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "z轴回原点指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } + } +} diff --git a/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelinePreFill.java b/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelinePreFill.java index 1026ac4..ff525cb 100644 --- a/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelinePreFill.java +++ b/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelinePreFill.java @@ -26,6 +26,12 @@ public class NozzlePipelinePreFill implements CommandHandler { @Override public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + String frontCmdId = cmdForm.getCmdId(); + String frontCmdName = cmdForm.getCmdName(); + Map param = cmdForm.getParam(); + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);//向前端发送接收到指令 + + } } diff --git a/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelineWash.java b/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelineWash.java new file mode 100644 index 0000000..c3c14e7 --- /dev/null +++ b/src/main/java/com/qyft/ms/app/handler/impl/NozzlePipelineWash.java @@ -0,0 +1,24 @@ +package com.qyft.ms.app.handler.impl; + +import com.qyft.ms.app.common.annotation.CommandMapping; +import com.qyft.ms.app.handler.CommandHandler; +import com.qyft.ms.app.model.form.CMDFormV2; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; + +/** + * 处理前端清洗喷嘴管路 + */ +@Component +@RequiredArgsConstructor +@Async("asyncExecutor") +@CommandMapping("nozzle_pipeline_wash")//业务指令注解 +public class NozzlePipelineWash implements CommandHandler { + + @Override + public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + + } +} \ No newline at end of file diff --git a/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayIn.java b/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayIn.java index 78aa00e..5dc3180 100644 --- a/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayIn.java +++ b/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayIn.java @@ -1,18 +1,23 @@ package com.qyft.ms.app.handler.impl; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.qyft.ms.app.common.annotation.CommandMapping; +import com.qyft.ms.app.common.command.CommandFuture; +import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance; +import com.qyft.ms.app.common.command.DeviceCommandGenerator; import com.qyft.ms.app.common.command.FrontCommandAck; import com.qyft.ms.app.common.constant.CommandStatus; import com.qyft.ms.app.handler.CommandHandler; +import com.qyft.ms.app.model.bo.CMDToDevice; import com.qyft.ms.app.model.form.CMDFormV2; -import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; +import com.qyft.ms.device.client.TcpClient; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; -import java.io.IOException; import java.util.Map; /** @@ -23,9 +28,36 @@ import java.util.Map; @Async("asyncExecutor") @CommandMapping("slide_tray_in")//业务指令注解 public class SlideTrayIn implements CommandHandler { + /** + * 设备通信client + */ + private final TcpClient deviceClient; + @Override public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + String frontCmdId = cmdForm.getCmdId(); + String frontCmdName = cmdForm.getCmdName(); + //向前端发送接收到指令 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); + CMDToDevice slideTrayInCmdToDevice = DeviceCommandGenerator.slide_tray_in(5, 0, 2);//生成指令 推入玻片托盘 + + CommandFuture slideTrayInCmdToDeviceFuture = new CommandFuture(); + slideTrayInCmdToDeviceFuture.setCmdToDevice(slideTrayInCmdToDevice); + Integer toDeviceCmdId = slideTrayInCmdToDevice.getCmdId(); + CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, slideTrayInCmdToDeviceFuture);//将指令放入map + deviceClient.sendToJSON(slideTrayInCmdToDevice); //发送指令给设备 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了推入玻片托盘指令:" + JSONUtil.toJsonStr(slideTrayInCmdToDevice)), MediaType.APPLICATION_JSON); + + slideTrayInCmdToDeviceFuture.waitForContinue();//等待设备的反馈 + + JSONObject deviceResult = slideTrayInCmdToDeviceFuture.getCallbackResult();//拿到设备返回结果 + CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除 + if (slideTrayInCmdToDeviceFuture.isReceived()) { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "推入玻片托盘指令设备反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + }else{ + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "推入玻片托盘指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } } } diff --git a/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayOut.java b/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayOut.java index 38e60ef..a7b8480 100644 --- a/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayOut.java +++ b/src/main/java/com/qyft/ms/app/handler/impl/SlideTrayOut.java @@ -1,10 +1,17 @@ package com.qyft.ms.app.handler.impl; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.qyft.ms.app.common.annotation.CommandMapping; +import com.qyft.ms.app.common.command.CommandFuture; +import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance; +import com.qyft.ms.app.common.command.DeviceCommandGenerator; import com.qyft.ms.app.common.command.FrontCommandAck; import com.qyft.ms.app.common.constant.CommandStatus; import com.qyft.ms.app.handler.CommandHandler; +import com.qyft.ms.app.model.bo.CMDToDevice; import com.qyft.ms.app.model.form.CMDFormV2; +import com.qyft.ms.device.client.TcpClient; import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -23,9 +30,36 @@ import java.util.Map; @Async("asyncExecutor") @CommandMapping("slide_tray_out")//业务指令注解 public class SlideTrayOut implements CommandHandler { + /** + * 设备通信client + */ + private final TcpClient deviceClient; @Override public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { + String frontCmdId = cmdForm.getCmdId(); + String frontCmdName = cmdForm.getCmdName(); + //向前端发送接收到指令 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); + //TODO 数值应该从数据库中获取 + CMDToDevice slideTrayOutCmdToDevice = DeviceCommandGenerator.slide_tray_out(5, 20, 2);//生成指令 推出玻片托盘 + CommandFuture slideTrayOutCmdToDeviceFuture = new CommandFuture(); + slideTrayOutCmdToDeviceFuture.setCmdToDevice(slideTrayOutCmdToDevice); + Integer toDeviceCmdId = slideTrayOutCmdToDevice.getCmdId(); + CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, slideTrayOutCmdToDeviceFuture);//将指令放入map + deviceClient.sendToJSON(slideTrayOutCmdToDevice); //发送指令给设备 + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了推出玻片托盘指令:" + JSONUtil.toJsonStr(slideTrayOutCmdToDevice)), MediaType.APPLICATION_JSON); + + slideTrayOutCmdToDeviceFuture.waitForContinue();//等待设备的反馈 + + JSONObject deviceResult = slideTrayOutCmdToDeviceFuture.getCallbackResult();//拿到设备返回结果 + CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除 + + if (slideTrayOutCmdToDeviceFuture.isReceived()) { + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "推出玻片托盘指令设备反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + }else{ + emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "推出玻片托盘指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON); + } } } \ No newline at end of file diff --git a/src/main/java/com/qyft/ms/app/handler/impl/SprayPipelineWash.java b/src/main/java/com/qyft/ms/app/handler/impl/SprayPipelineWash.java deleted file mode 100644 index 631bed2..0000000 --- a/src/main/java/com/qyft/ms/app/handler/impl/SprayPipelineWash.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.qyft.ms.app.handler.impl; - -import com.qyft.ms.app.common.annotation.CommandMapping; -import com.qyft.ms.app.common.command.FrontCommandAck; -import com.qyft.ms.app.common.constant.CommandStatus; -import com.qyft.ms.app.handler.CommandHandler; -import com.qyft.ms.app.model.form.CMDFormV2; -import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; -import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; - -import java.io.IOException; -import java.util.Map; -/** - * 处理前端清洗喷嘴管路 - */ -@Component -@RequiredArgsConstructor -@Async("asyncExecutor") -@CommandMapping("nozzle_pipeline_wash")//业务指令注解 -public class SprayPipelineWash implements CommandHandler { - - @Override - public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) throws Exception { - - } -} \ No newline at end of file diff --git a/src/main/java/com/qyft/ms/app/model/entity/Position.java b/src/main/java/com/qyft/ms/app/model/entity/Position.java new file mode 100644 index 0000000..1495fe3 --- /dev/null +++ b/src/main/java/com/qyft/ms/app/model/entity/Position.java @@ -0,0 +1,16 @@ +package com.qyft.ms.app.model.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qyft.ms.system.common.base.BaseEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = false) +@Schema(description = "位置信息") +@TableName("position") +@Data +public class Position extends BaseEntity { + + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2b2d726..5c2950c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -37,7 +37,7 @@ tcp: enable: true # 是否开启 TCP 连接 server-enable: true # 是否开启 TCP 连接 # host: 127.0.0.1 - host: 192.168.1.140 + host: 192.168.1.168 port: 9080 reconnect: 5000 # 断线重连间隔(单位:毫秒) timeout: 10000 # 连接超时时间(单位:毫秒)