29 changed files with 809 additions and 656 deletions
-
12src/main/java/com/qyft/ms/app/common/annotation/CommandMapping.java
-
23src/main/java/com/qyft/ms/app/config/AsyncConfig.java
-
98src/main/java/com/qyft/ms/app/controller/FrontCmdController.java
-
8src/main/java/com/qyft/ms/app/controller/frontcommandhandle/CommandHandler.java
-
52src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SprayPipelineWash.java
-
61src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/DehumidifierStart.java
-
3src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayChangeParam.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayContinue.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayPause.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayStart.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/MatrixSprayStop.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/NozzlePipelinePreFill.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SlideTrayIn.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SlideTrayOut.java
-
46src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SprayPipelineWash.java
-
2src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/SyringePipelineWash.java
-
47src/main/java/com/qyft/ms/app/controller/frontcommandhandle/impl/TestDemoHandler.java
-
43src/main/java/com/qyft/ms/app/core/registry/CommandHandlerRegistry.java
-
8src/main/java/com/qyft/ms/device/client/TcpClient.java
@ -0,0 +1,12 @@ |
|||||
|
package com.qyft.ms.app.common.annotation; |
||||
|
|
||||
|
import java.lang.annotation.ElementType; |
||||
|
import java.lang.annotation.Retention; |
||||
|
import java.lang.annotation.RetentionPolicy; |
||||
|
import java.lang.annotation.Target; |
||||
|
|
||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||
|
@Target(ElementType.TYPE) |
||||
|
public @interface CommandMapping { |
||||
|
String value(); |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package com.qyft.ms.app.config; |
||||
|
|
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.scheduling.annotation.EnableAsync; |
||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
||||
|
|
||||
|
import java.util.concurrent.Executor; |
||||
|
|
||||
|
@Configuration |
||||
|
@EnableAsync |
||||
|
public class AsyncConfig { |
||||
|
// 可选:配置线程池 Bean |
||||
|
@Bean("asyncExecutor") |
||||
|
public Executor asyncExecutor() { |
||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
||||
|
executor.setCorePoolSize(5); |
||||
|
executor.setMaxPoolSize(10); |
||||
|
executor.setQueueCapacity(25); |
||||
|
executor.initialize(); |
||||
|
return executor; |
||||
|
} |
||||
|
} |
@ -0,0 +1,8 @@ |
|||||
|
package com.qyft.ms.app.controller.frontcommandhandle; |
||||
|
|
||||
|
import com.qyft.ms.app.model.form.CMDFormV2; |
||||
|
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; |
||||
|
|
||||
|
public interface CommandHandler { |
||||
|
void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter); |
||||
|
} |
@ -1,52 +0,0 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
|
||||
import cn.hutool.json.JSONObject; |
|
||||
import cn.hutool.json.JSONUtil; |
|
||||
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.model.bo.CMDToDevice; |
|
||||
import com.qyft.ms.app.model.form.CMDFormV2; |
|
||||
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; |
|
||||
import org.springframework.http.MediaType; |
|
||||
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; |
|
||||
|
|
||||
import java.io.IOException; |
|
||||
import java.util.Map; |
|
||||
/** |
|
||||
* 处理前端清洗喷嘴管路 |
|
||||
*/ |
|
||||
public class SprayPipelineWash { |
|
||||
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) { |
|
||||
|
|
||||
String frontCmdId = cmdForm.getCmdId(); |
|
||||
String frontCmdName = cmdForm.getCmdName(); |
|
||||
Map<String, Object> param = cmdForm.getParam(); |
|
||||
|
|
||||
new Thread(() -> { |
|
||||
try { |
|
||||
|
|
||||
//向前端发送接收到指令 |
|
||||
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
} catch (IOException e) { |
|
||||
emitter.completeWithError(e); |
|
||||
} |
|
||||
}).start(); |
|
||||
|
|
||||
|
|
||||
//对返回结果处理 |
|
||||
emitter.complete(); |
|
||||
} |
|
||||
} |
|
@ -1,9 +1,8 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
||||
import com.qyft.ms.app.model.form.CMDFormV2; |
import com.qyft.ms.app.model.form.CMDFormV2; |
||||
import com.qyft.ms.device.device.DeviceInstance; |
|
||||
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; |
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; |
||||
import org.springframework.http.MediaType; |
import org.springframework.http.MediaType; |
||||
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; |
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -0,0 +1,46 @@ |
|||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
|
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
|
import com.qyft.ms.app.common.constant.CommandStatus; |
||||
|
import com.qyft.ms.app.model.form.CMDFormV2; |
||||
|
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; |
||||
|
import org.springframework.http.MediaType; |
||||
|
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
import java.util.Map; |
||||
|
/** |
||||
|
* 处理前端清洗喷嘴管路 |
||||
|
*/ |
||||
|
public class SprayPipelineWash { |
||||
|
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) { |
||||
|
|
||||
|
String frontCmdId = cmdForm.getCmdId(); |
||||
|
String frontCmdName = cmdForm.getCmdName(); |
||||
|
Map<String, Object> param = cmdForm.getParam(); |
||||
|
|
||||
|
new Thread(() -> { |
||||
|
try { |
||||
|
|
||||
|
//向前端发送接收到指令 |
||||
|
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
} catch (IOException e) { |
||||
|
emitter.completeWithError(e); |
||||
|
} |
||||
|
}).start(); |
||||
|
|
||||
|
|
||||
|
//对返回结果处理 |
||||
|
emitter.complete(); |
||||
|
} |
||||
|
} |
@ -1,4 +1,4 @@ |
|||||
package com.qyft.ms.app.controller.frontcommandhandle; |
|
||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
import com.qyft.ms.app.common.command.FrontCommandAck; |
import com.qyft.ms.app.common.command.FrontCommandAck; |
||||
import com.qyft.ms.app.common.constant.CommandStatus; |
import com.qyft.ms.app.common.constant.CommandStatus; |
@ -0,0 +1,47 @@ |
|||||
|
package com.qyft.ms.app.controller.frontcommandhandle.impl; |
||||
|
|
||||
|
import cn.hutool.json.JSONUtil; |
||||
|
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.controller.frontcommandhandle.CommandHandler; |
||||
|
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; |
||||
|
|
||||
|
@Slf4j |
||||
|
@Component |
||||
|
@RequiredArgsConstructor |
||||
|
@CommandMapping("test_test")//指令 |
||||
|
public class TestDemoHandler implements CommandHandler { |
||||
|
/** |
||||
|
* 设备通信client |
||||
|
*/ |
||||
|
private final TcpClient deviceClient; |
||||
|
|
||||
|
@Override |
||||
|
public void handle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) { |
||||
|
asyncHandle(cmdForm, emitter); |
||||
|
} |
||||
|
|
||||
|
@Async("asyncExecutor") |
||||
|
public void asyncHandle(CMDFormV2 cmdForm, ResponseBodyEmitter emitter) { |
||||
|
String frontCmdId = cmdForm.getCmdId(); |
||||
|
String frontCmdName = cmdForm.getCmdName(); |
||||
|
try { |
||||
|
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令1"), MediaType.APPLICATION_JSON); |
||||
|
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令2"), MediaType.APPLICATION_JSON); |
||||
|
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令3"), MediaType.APPLICATION_JSON); |
||||
|
} catch (Exception e) { |
||||
|
log.error("指令执行失败:{}", JSONUtil.toJsonStr(cmdForm), e); |
||||
|
emitter.completeWithError(e); |
||||
|
return; |
||||
|
} |
||||
|
emitter.complete(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
package com.qyft.ms.app.core.registry; |
||||
|
|
||||
|
import com.qyft.ms.app.common.annotation.CommandMapping; |
||||
|
import com.qyft.ms.app.controller.frontcommandhandle.CommandHandler; |
||||
|
import io.micrometer.common.lang.NonNull; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import org.springframework.aop.support.AopUtils; |
||||
|
import org.springframework.beans.BeansException; |
||||
|
import org.springframework.context.ApplicationContext; |
||||
|
import org.springframework.context.ApplicationContextAware; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
@Component |
||||
|
public class CommandHandlerRegistry implements ApplicationContextAware { |
||||
|
|
||||
|
private ApplicationContext applicationContext; |
||||
|
private final Map<String, CommandHandler> handlerMap = new HashMap<>(); |
||||
|
|
||||
|
@Override |
||||
|
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { |
||||
|
this.applicationContext = applicationContext; |
||||
|
} |
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
Map<String, Object> beans = applicationContext.getBeansWithAnnotation(CommandMapping.class); |
||||
|
for (Object bean : beans.values()) { |
||||
|
// 获取实际目标类,而不是代理类 |
||||
|
Class<?> targetClass = AopUtils.getTargetClass(bean); |
||||
|
CommandMapping mapping = targetClass.getAnnotation(CommandMapping.class); |
||||
|
if (mapping != null && bean instanceof CommandHandler) { |
||||
|
handlerMap.put(mapping.value(), (CommandHandler) bean); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public CommandHandler getHandler(String command) { |
||||
|
return handlerMap.get(command); |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue