sige 1 year ago
parent
commit
de14cbf117
  1. 75
      src/main/java/a8k/hardware/controler/Controler.java
  2. 5
      src/main/java/a8k/service/db/dao/HbotControlParamsDao.java
  3. 8
      src/main/java/a8k/service/db/entity/HardwareServiceSetting.java
  4. 32
      src/main/java/a8k/utils/MyClassHelper.java

75
src/main/java/a8k/hardware/controler/Controler.java

@ -40,28 +40,13 @@ public class Controler {
public AppRet<Object> serviceParams( @RequestBody Map<String, Object> params )
throws InvocationTargetException, IllegalAccessException {
String serviceKey = (String)params.get("serviceKey");
Class<?> paramClass = null;
var classes = UfClassHelper.getAllClassesInPackage("a8k");
for (var clazz : classes) {
var hardwareServiceParamsAnnotation = clazz.getAnnotation(HardwareServiceParams.class);
if (null == hardwareServiceParamsAnnotation) {
continue ;
}
var serviceClass = hardwareServiceParamsAnnotation.service();
if (!serviceClass.getSimpleName().equals(serviceKey)) {
continue ;
}
paramClass = clazz;
break;
}
var paramService = this.getServiceParamHandlerByServiceKey(serviceKey);
List<Map<String,Object>> list = new ArrayList<>();
if ( null == paramClass ) {
if ( null == paramService ) {
return AppRet.success(list);
}
var paramService = UfApplication.getContext().getBean(paramClass);
var methods = paramClass.getMethods();
var methods = paramService.getClass().getMethods();
for ( var method : methods ) {
var methodName = method.getName();
if ( !methodName.startsWith("get") ) {
@ -88,12 +73,39 @@ public class Controler {
public AppRet<Object> serviceParamsUpdate( @RequestBody Map<String, Object> params ) throws Exception {
String serviceKey = (String)params.get("serviceKey");
Map<String,Object> newParams = (Map<String,Object>)params.get("params");
var paramService = this.getServiceParamHandlerByServiceKey(serviceKey);
assert paramService != null;
var paramServiceClass = paramService.getClass();
for ( var param : newParams.entrySet() ) {
var name = param.getKey();
var value = param.getValue();
var options = HardwareServiceSetting.getOption(serviceKey, name);
options.setValue(value);
options.save();
var setterName = String.format("set%s", name);
var methods = paramServiceClass.getMethods();
var isSetterHasBeenFound = false;
for ( var method : methods ) {
if ( !setterName.equals(method.getName()) || 1 < method.getParameterTypes().length ) {
continue ;
}
var setParam = method.getParameters()[0];
if ( !setParam.getType().isAssignableFrom(value.getClass())) {
if ( !(value instanceof Map) ) {
continue ;
}
var objValue = MyClassHelper.initializeByMap(setParam.getType(), (Map<String, Object>)value);
method.invoke(paramService, objValue);
} else {
method.invoke(paramService, value);
}
isSetterHasBeenFound = true;
}
if ( !isSetterHasBeenFound ) {
var options = HardwareServiceSetting.getOption(serviceKey, name);
options.setValue(value);
options.save();
}
}
return AppRet.success();
}
@ -172,6 +184,10 @@ public class Controler {
var actionParam = new HashMap<String, Object>();
actionParam.put("key", param.getName());
actionParam.put("type", param.getType().getName());
actionParam.put("value", null);
if ( param.getType().equals(Boolean.class) ) {
actionParam.put("value", false);
}
if ( param.getType().isEnum() ) {
actionParam.put("type", "Enum");
actionParam.put("typeEnum", param.getType().getName());
@ -257,6 +273,23 @@ public class Controler {
return AppRet.success(struct);
}
// get service param handler by given service key
private Object getServiceParamHandlerByServiceKey( String serviceKey ) {
var classes = UfClassHelper.getAllClassesInPackage("a8k");
for (var clazz : classes) {
var hardwareServiceParamsAnnotation = clazz.getAnnotation(HardwareServiceParams.class);
if (null == hardwareServiceParamsAnnotation) {
continue ;
}
var serviceClass = hardwareServiceParamsAnnotation.service();
if (!serviceClass.getSimpleName().equals(serviceKey)) {
continue ;
}
return UfApplication.getContext().getBean(clazz);
}
return null;
}
// fill up struct info
private void classStructInfoFill( Class<?> clazz, List<Map<String,Object>> struct ) {
var fields = clazz.getFields();

5
src/main/java/a8k/service/db/dao/HbotControlParamsDao.java

@ -14,6 +14,11 @@ public class HbotControlParamsDao {
return this.getOption("ReactionPos", Pos3d.class);
}
// set reaction pos
public void setReactionPos(Pos3d pos) throws Exception {
HardwareServiceSetting.setOption("HbotControlService", "ReactionPos", pos);
}
@HardwareServiceParam(name="TIP组位置信息", group="TIP组位置信息")
public TipPickUpPosInfo getTipPickUpPosInfo() throws Exception {
return this.getOption("TipPickUpPosInfo", TipPickUpPosInfo.class);

8
src/main/java/a8k/service/db/entity/HardwareServiceSetting.java

@ -25,7 +25,7 @@ public class HardwareServiceSetting extends UfActiveRecord {
} else if ( value instanceof Map ) {
this.val = UfJsonHelper.objectToJson(value);
} else {
throw new Exception("不支持的配置数据类型");
this.val = UfJsonHelper.objectToJson(value);
}
}
@ -33,6 +33,12 @@ public class HardwareServiceSetting extends UfActiveRecord {
return "HardwareServiceSetting" + "Table";
}
public static void setOption( String service, String key, Object value ) throws Exception {
var options = getOption(service, key);
options.setValue(value);
options.save();
}
public static HardwareServiceSetting getOption( String service, String key ) {
var option = UfActiveRecord.findOne(HardwareServiceSetting.class, Map.of(
"serviceName", service,

32
src/main/java/a8k/utils/MyClassHelper.java

@ -0,0 +1,32 @@
package a8k.utils;
import java.util.Map;
public class MyClassHelper {
// initialize by map
public static <T> T initializeByMap( Class<T> clazz, Map<String,Object> src ) throws Exception {
var constructor = clazz.getDeclaredConstructor();
var instance = constructor.newInstance();
for (var entry : src.entrySet()) {
var key = entry.getKey();
var value = entry.getValue();
var field = clazz.getField(key);
field.setAccessible(true);
if ( field.getType().isAssignableFrom(value.getClass()) ) {
field.set(instance, value);
continue;
}
if ( value.getClass().isInstance(Map.class) ) {
var subValue = initializeByMap(clazz, (Map<String, Object>) value);
field.set(instance, subValue);
continue;
}
String messageTemplate = "属性【%s.%s(%s)】无法接受 %s 类型值";
String message = String.format(messageTemplate, clazz.getName(), field.getName(), field.getType().getName(), value.getClass().getName());
throw new Exception(message);
}
return instance;
}
}
Loading…
Cancel
Save