Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
142eed88a0
  1. BIN
      app.db
  2. 29
      pom.xml
  3. 18
      src/main/java/a8k/MyApplicationRunner.java
  4. 17
      src/main/java/a8k/SpringBootBeanUtil.java
  5. 31
      src/main/java/a8k/extapi_controler/ExtApiControler.java
  6. 37
      src/main/java/a8k/extapi_controler/utils/EnginnerParamReader.java
  7. 3
      src/main/java/a8k/service/app/devicedriver/ctrl/ReactionPlatesTransmitCtrl.java
  8. 160
      src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java
  9. 104
      src/main/java/a8k/service/db/HardwareServiceSetting.java
  10. 10
      src/main/java/a8k/utils/AppService.java
  11. 9
      src/main/java/a8k/utils/AppServiceAction.java
  12. 69
      src/main/java/a8k/utils/AppServiceManager.java
  13. 3
      src/main/java/com/iflytop/a800/BoditechA800Application.java

BIN
app.db

29
pom.xml

@ -18,9 +18,32 @@
</properties>
<dependencies>
<dependency>
<groupId>com.iflytop</groupId>
<artifactId>uf</artifactId>
<version>0.0.66</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.45.2.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>

18
src/main/java/a8k/MyApplicationRunner.java

@ -1,18 +0,0 @@
package a8k;
import a8k.utils.AppServiceManager;
import jakarta.annotation.Resource;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(1)
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Resource
private AppServiceManager appServiceManager;
@Override
public void run(ApplicationArguments args) throws Exception {
this.appServiceManager.loadActions();
}
}

17
src/main/java/a8k/SpringBootBeanUtil.java

@ -5,6 +5,13 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.*;
import java.util.jar.JarEntry;
/**
* SpringBoot 普通类获取Spring容器中的bean工具类
* @author lvgang
@ -21,6 +28,7 @@ public class SpringBootBeanUtil implements ApplicationContextAware {
}
/**
* 获取applicationContext
* @return ApplicationContext
@ -57,4 +65,13 @@ public class SpringBootBeanUtil implements ApplicationContextAware {
return getContext().getBean(name, clazz);
}
public static List<Class<?>> getBeans() {
var beans = getContext().getBeansWithAnnotation(Component.class);
List<Class<?>> list = new ArrayList<>();
for (Object bean : beans.values()) {
list.add(bean.getClass());
}
return list;
}
}

31
src/main/java/a8k/extapi_controler/ExtApiControler.java

@ -1,11 +1,10 @@
package a8k.extapi_controler;
import a8k.SpringBootBeanUtil;
import a8k.extapi_controler.utils.*;
import a8k.type.appret.AppRet;
import a8k.service.db.HardwareServiceSetting;
import a8k.utils.*;
import com.iflytop.uf.UfApplication;
import com.iflytop.uf.util.UfClassHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -25,7 +24,7 @@ public class ExtApiControler {
@ResponseBody
public AppRet<Object> services() {
List<Map<String, Object>> services = new ArrayList<>();
var classes = UfClassHelper.getAllClassesInPackage("a8k");
var classes = SpringBootBeanUtil.getBeans();
for (var clazz : classes) {
var hardwareServiceAnnotation = clazz.getAnnotation(ExtApiTab.class);
if (null == hardwareServiceAnnotation || !hardwareServiceAnnotation.cfg().isDisplay()) {
@ -109,9 +108,9 @@ public class ExtApiControler {
}
if (!isSetterHasBeenFound) {
var options = HardwareServiceSetting.getOption(serviceKey, name);
options.setValue(value);
options.save();
// var options = HardwareServiceSetting.getOption(serviceKey, name);
// options.setValue(value);
// options.save();
}
}
return AppRet.success();
@ -120,8 +119,8 @@ public class ExtApiControler {
@PostMapping("/api/service-config/service-params-reset")
@ResponseBody
public AppRet<Object> serviceParamsReset(@RequestBody Map<String, Object> params) throws Exception {
String serviceKey = (String) params.get("serviceKey");
HardwareServiceSetting.deleteAllByServiceName(serviceKey);
// String serviceKey = (String) params.get("serviceKey");
// HardwareServiceSetting.deleteAllByServiceName(serviceKey);
return AppRet.success();
}
@ -130,7 +129,7 @@ public class ExtApiControler {
public AppRet<Object> serviceStatus(@RequestBody Map<String, Object> params) throws InvocationTargetException, IllegalAccessException {
String serviceKey = (String) params.get("serviceKey");
Class<?> serviceClass = null;
var classes = UfClassHelper.getAllClassesInPackage("a8k");
var classes = SpringBootBeanUtil.getBeans();
for (var clazz : classes) {
var hardwareServiceAnnotation = clazz.getAnnotation(ExtApiTab.class);
if (null == hardwareServiceAnnotation || !clazz.getSimpleName().equals(serviceKey)) {
@ -145,7 +144,7 @@ public class ExtApiControler {
return AppRet.success(statusList);
}
var service = UfApplication.getContext().getBean(serviceClass);
var service = SpringBootBeanUtil.getBean(serviceClass);
var methods = serviceClass.getMethods();
for (var method : methods) {
var statusAnnotation = method.getAnnotation(ExtApiStatu.class);
@ -169,7 +168,7 @@ public class ExtApiControler {
public AppRet<Object> serviceActionList(@RequestBody Map<String, Object> params) throws Exception {
String serviceKey = (String) params.get("serviceKey");
Class<?> serviceClass = null;
var classes = UfClassHelper.getAllClassesInPackage("a8k");
var classes = SpringBootBeanUtil.getBeans();
for (var clazz : classes) {
var hardwareServiceAnnotation = clazz.getAnnotation(ExtApiTab.class);
if (null == hardwareServiceAnnotation || !clazz.getSimpleName().equals(serviceKey)) {
@ -360,7 +359,7 @@ public class ExtApiControler {
// get service instance by service key
private Object getServiceInstanceByServiceKey(String serviceKey) {
Class<?> serviceClass = null;
var classes = UfClassHelper.getAllClassesInPackage("a8k");
var classes = SpringBootBeanUtil.getBeans();
for (var clazz : classes) {
var hardwareServiceAnnotation = clazz.getAnnotation(ExtApiTab.class);
if (null == hardwareServiceAnnotation || !clazz.getSimpleName().equals(serviceKey)) {
@ -372,12 +371,12 @@ public class ExtApiControler {
if (null == serviceClass) {
return null;
}
return UfApplication.getContext().getBean(serviceClass);
return SpringBootBeanUtil.getBean(serviceClass);
}
// get service param handler by given service key
private Object getServiceParamHandlerByServiceKey(String serviceKey) {
var classes = UfClassHelper.getAllClassesInPackage("a8k");
var classes = SpringBootBeanUtil.getBeans();
for (var clazz : classes) {
var hardwareServiceParamsAnnotation = clazz.getAnnotation(ExtApiParamsTab.class);
if (null == hardwareServiceParamsAnnotation) {
@ -387,7 +386,7 @@ public class ExtApiControler {
if (!serviceClass.getSimpleName().equals(serviceKey)) {
continue;
}
return UfApplication.getContext().getBean(clazz);
return SpringBootBeanUtil.getBean(clazz);
}
return null;
}

37
src/main/java/a8k/extapi_controler/utils/EnginnerParamReader.java

@ -1,37 +0,0 @@
package a8k.extapi_controler.utils;
import a8k.service.db.HardwareServiceSetting;
import a8k.type.exception.AppException;
public class EnginnerParamReader {
String serviceName;
public EnginnerParamReader(Class<?> cla) {
this.serviceName = cla.getSimpleName();
}
public Integer getInteger(String key, Integer defaultValue) {
return HardwareServiceSetting.getInteger(serviceName, key, defaultValue);
}
public <T> T getObject(String key, Class<T> clazs, T defaultVal) {
return HardwareServiceSetting.getObject(serviceName, key, clazs, defaultVal);
}
public <T> T getObject(String key, Class<T> clazs) throws AppException {
return HardwareServiceSetting.getObject(serviceName, key, clazs);
}
public void setInteger(String key, Integer value) {
HardwareServiceSetting.setInteger(serviceName, key, value);
}
public void setObject(String key, Object value) {
try {
HardwareServiceSetting.setOption(serviceName, key, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

3
src/main/java/a8k/service/app/devicedriver/ctrl/ReactionPlatesTransmitCtrl.java

@ -1,8 +1,6 @@
package a8k.service.app.devicedriver.ctrl;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.EnginnerParamReader;
import a8k.extapi_controler.utils.ExtApiFn;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.service.app.devicedriver.basectrl.StepMotorControler;
import a8k.service.app.devicedriver.basectrl.type.StepMotorMId;
@ -30,7 +28,6 @@ import java.util.List;
public class ReactionPlatesTransmitCtrl {
static Logger logger = LoggerFactory.getLogger(ReactionPlatesTransmitCtrl.class);
static final Integer overtime = 10000;
EnginnerParamReader hpReader = new EnginnerParamReader(ReactionPlatesTransmitCtrl.class);
@Resource

160
src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java

@ -1,76 +1,76 @@
package a8k.service.app.devicedriver.testscript;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.EnginnerParamReader;
import a8k.extapi_controler.utils.ExtApiFn;
import a8k.extapi_controler.utils.ExtApiTab;
import a8k.type.ConsumableGroup;
import a8k.type.exception.AppException;
import a8k.type.IncubatorPos;
import a8k.service.app.devicedriver.ctrl.TubePreProcesControler;
import a8k.service.app.devicedriver.ctrl.TubeTubeFeedingModule;
import a8k.hardware.A8kCanBusService;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler;
import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
@ExtApiTab(cfg = ExtApiTabConfig.TestScript)
public class TestScript {
static Logger logger = LoggerFactory.getLogger(TestScript.class);
static class ORDER {
static final int testTakeAllTipStop = 0;
static final int takeTipTestStep = 1;
static final int testTakeAllTip = 2;
static final int testAllLittleBottleBufferPos = 3;
static final int testAllDetectMaterialPos = 4;
static final int testAllBigBottleBufferPos = 5;
static final int pushAllPlateAndDrop = 6;
static final int testSamplePreProcessModule = 7;
}
@Resource
A8kCanBusService canBus;
@Resource
ApplicationContext appCxt;
@Resource
HbotBaseMoveControler hbotcs;
@Resource
ReactionPlatesTransmitCtrl reactionPlatesTransmitCtrl;
@Resource
TubePreProcesControler tubePreProcesControler;
@Resource
TubeTubeFeedingModule tubeTubeFeedingModule;
EnginnerParamReader settingReader = new EnginnerParamReader(HbotBaseMoveControler.class);
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 测试
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Boolean testScriptWorkFlag = false;
void checkTestScriptWorkFlag() throws AppException {
if (testScriptWorkFlag) {
testScriptWorkFlag = false;
throw new AppException(A8kEcode.TEST_SCRIP_ERROR_DEVICE_IS_BUSY);
}
}
@ExtApiFn(name = "停止测试脚本", group = "控制", order = ORDER.testTakeAllTipStop)
public void testTakeAllTipStop() {
testScriptWorkFlag = false;
}
//package a8k.service.app.devicedriver.testscript;
//
//import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
//import a8k.extapi_controler.utils.EnginnerParamReader;
//import a8k.extapi_controler.utils.ExtApiFn;
//import a8k.extapi_controler.utils.ExtApiTab;
//import a8k.type.ConsumableGroup;
//import a8k.type.exception.AppException;
//import a8k.type.IncubatorPos;
//import a8k.service.app.devicedriver.ctrl.TubePreProcesControler;
//import a8k.service.app.devicedriver.ctrl.TubeTubeFeedingModule;
//import a8k.hardware.A8kCanBusService;
//import a8k.hardware.type.a8kcanprotocol.A8kEcode;
//import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler;
//import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl;
//import jakarta.annotation.Resource;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.context.ApplicationContext;
//import org.springframework.stereotype.Component;
//
//@Component
//@ExtApiTab(cfg = ExtApiTabConfig.TestScript)
//public class TestScript {
// static Logger logger = LoggerFactory.getLogger(TestScript.class);
//
// static class ORDER {
// static final int testTakeAllTipStop = 0;
// static final int takeTipTestStep = 1;
// static final int testTakeAllTip = 2;
// static final int testAllLittleBottleBufferPos = 3;
// static final int testAllDetectMaterialPos = 4;
// static final int testAllBigBottleBufferPos = 5;
// static final int pushAllPlateAndDrop = 6;
// static final int testSamplePreProcessModule = 7;
// }
//
// @Resource
// A8kCanBusService canBus;
//
// @Resource
// ApplicationContext appCxt;
//
// @Resource
// HbotBaseMoveControler hbotcs;
//
// @Resource
// ReactionPlatesTransmitCtrl reactionPlatesTransmitCtrl;
//
// @Resource
// TubePreProcesControler tubePreProcesControler;
//
// @Resource
// TubeTubeFeedingModule tubeTubeFeedingModule;
//
// EnginnerParamReader settingReader = new EnginnerParamReader(HbotBaseMoveControler.class);
//
// // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// // 测试
// // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Boolean testScriptWorkFlag = false;
//
// void checkTestScriptWorkFlag() throws AppException {
// if (testScriptWorkFlag) {
// testScriptWorkFlag = false;
// throw new AppException(A8kEcode.TEST_SCRIP_ERROR_DEVICE_IS_BUSY);
// }
// }
//
// @ExtApiFn(name = "停止测试脚本", group = "控制", order = ORDER.testTakeAllTipStop)
// public void testTakeAllTipStop() {
// testScriptWorkFlag = false;
// }
// @ExtApiFn(name = "取放Tip-单步", group = "Hbot测试脚本", order = ORDER.takeTipTestStep)
// public AppRet<Boolean> takeTipTestStep(Integer tipgroup, Integer index) throws AppException {
@ -187,8 +187,8 @@ public class TestScript {
// testScriptWorkFlag = false;
// }
@ExtApiFn(name = "测试摇匀模组", group = "摇匀模组测试", order = ORDER.testSamplePreProcessModule)
public Object testSamplePreProcessModule() throws AppException {
// @ExtApiFn(name = "测试摇匀模组", group = "摇匀模组测试", order = ORDER.testSamplePreProcessModule)
// public Object testSamplePreProcessModule() throws AppException {
// checkTestScriptWorkFlag();
// testScriptWorkFlag = true;
@ -227,8 +227,8 @@ public class TestScript {
// testScriptWorkFlag = false;
// }
return null;
}
}
// return null;
//
// }
//
//}

104
src/main/java/a8k/service/db/HardwareServiceSetting.java

@ -1,104 +0,0 @@
package a8k.service.db;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.type.exception.AppException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.iflytop.uf.UfActiveRecord;
import com.iflytop.uf.UfActiveRecordField;
import com.iflytop.uf.util.UfJsonHelper;
import java.util.Map;
public class HardwareServiceSetting extends UfActiveRecord {
@UfActiveRecordField
public String key;
@UfActiveRecordField
public String serviceName; //属于哪个服务的, hardware目录下的类名
@UfActiveRecordField
public String valType;
@UfActiveRecordField
public String val;
public static String getTableName() {
return "zapp_hardware_services_setting";
}
public static void deleteAllByServiceName(String serviceName) {
var items = UfActiveRecord.find(HardwareServiceSetting.class, Map.of("ServiceName", serviceName));
for (var item : items) {
item.delete();
}
}
public void setValue(Object value) throws Exception {
if (value instanceof String) {
this.val = (String) value;
} else if (value instanceof Integer) {
this.val = String.valueOf((Integer) value);
} else if (value instanceof Map) {
this.val = UfJsonHelper.objectToJson(value);
} else {
this.val = UfJsonHelper.objectToJson(value);
}
}
public static HardwareServiceSetting getOption(String service, String key) {
var option = UfActiveRecord.findOne(HardwareServiceSetting.class, Map.of("serviceName", service, "key", key));
if (null == option) {
option = new HardwareServiceSetting();
option.serviceName = service;
option.key = key;
option.val = null;
}
return option;
}
public static void setOption(String service, String key, Object value) throws Exception {
var options = getOption(service, key);
options.setValue(value);
options.save();
}
public static <T> T getObject(String service, String key, Class<T> clazs) throws AppException {
var option = UfActiveRecord.findOne(HardwareServiceSetting.class, Map.of("serviceName", service, "key", key));
if (option == null) {
throw new AppException(A8kEcode.CODEERROR_GET_PARAM_FAIL);
}
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(option.val, clazs);
} catch (JsonProcessingException e) {
throw new AppException(A8kEcode.CODEERROR_PARSE_PARAM_FAIL);
}
}
public static <T> T getObject(String service, String key, Class<T> clazs, T defaultVal) {
var option = UfActiveRecord.findOne(HardwareServiceSetting.class, Map.of("serviceName", service, "key", key));
if (option == null) {
return defaultVal;
}
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(option.val, clazs);
} catch (JsonProcessingException e) {
return defaultVal;
}
}
public static Integer getInteger(String service, String key, Integer defaultValue) {
var option = HardwareServiceSetting.getOption(service, key);
if (null == option.val) {
return defaultValue;
}
return Integer.parseInt(option.val);
}
public static void setInteger(String service, String key, Integer value) {
var option = HardwareServiceSetting.getOption(service, key);
option.val = String.valueOf(value);
option.save();
}
}

10
src/main/java/a8k/utils/AppService.java

@ -1,10 +0,0 @@
package a8k.utils;
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 AppService {
String name();
}

9
src/main/java/a8k/utils/AppServiceAction.java

@ -1,9 +0,0 @@
package a8k.utils;
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.METHOD})
public @interface AppServiceAction {
}

69
src/main/java/a8k/utils/AppServiceManager.java

@ -1,69 +0,0 @@
package a8k.utils;
import com.iflytop.uf.UfApplication;
import com.iflytop.uf.util.UfClassHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Component
public class AppServiceManager {
public static final Logger LOG = LoggerFactory.getLogger(AppServiceManager.class);
// actions
public Map<String, Method> actions;
// services
public Map<Method, Class<?>> actionServices;
// load actions
public void loadActions() throws Exception {
this.actions = new HashMap<String, Method>();
this.actionServices = new HashMap<Method, Class<?>>();
var classList = UfClassHelper.getAllClassesInPackage("a8k");
for (var clazz : classList) {
var serviceAnnotation = clazz.getAnnotation(AppService.class);
if (serviceAnnotation == null) {
continue ;
}
var methods = clazz.getMethods();
for (var method : methods) {
if (!method.isAnnotationPresent(AppServiceAction.class)) {
continue ;
}
String actionKey = String.format("%s.%s", serviceAnnotation.name(), method.getName());
if (this.actions.containsKey(actionKey)) {
throw new Exception(String.format("重复action '%s'", actionKey));
}
this.actions.put(actionKey, method);
this.actionServices.put(method, clazz);
LOG.info("load app action : {}", actionKey);
}
}
}
// execute action
public Object executeAction(String action, Map<String, Object> params) throws Exception {
var method = actions.get(action);
if (method == null) {
throw new Exception("不存在");
}
var actionParamDefs = method.getParameters();
Object[] args = new Object[actionParamDefs.length];
for ( var i=0; i<actionParamDefs.length; i++ ) {
var name = actionParamDefs[i].getName();
var value = params.get(name);
args[i] = value;
}
var serviceClass = this.actionServices.get(method);
var service = UfApplication.getContext().getBean(serviceClass);
if ( method.getReturnType().equals(Void.TYPE)) {
method.invoke(service, args);
return null;
} else {
return method.invoke(service, args);
}
}
}

3
src/main/java/com/iflytop/a800/BoditechA800Application.java

@ -6,8 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan({"com.iflytop.uf", "com.iflytop.a800", "a8k"})
@MapperScan({"com.iflytop.uf"})
@ComponentScan({ "com.iflytop.a800", "a8k"})
public class BoditechA800Application {
public static void main(String[] args) {
SpringApplication.run(BoditechA800Application.class, args);

Loading…
Cancel
Save