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.constant.CommandStatus; |
|||
import com.qyft.ms.app.model.form.CMDFormV2; |
|||
import com.qyft.ms.device.device.DeviceInstance; |
|||
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2; |
|||
import org.springframework.http.MediaType; |
|||
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.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.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.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.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.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.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.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.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