diff --git a/src/main/java/a8k/hardware/controler/Controler.java b/src/main/java/a8k/hardware/controler/Controler.java index 39f2593..f88d069 100644 --- a/src/main/java/a8k/hardware/controler/Controler.java +++ b/src/main/java/a8k/hardware/controler/Controler.java @@ -40,28 +40,13 @@ public class Controler { public AppRet serviceParams( @RequestBody Map 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> 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 serviceParamsUpdate( @RequestBody Map params ) throws Exception { String serviceKey = (String)params.get("serviceKey"); Map newParams = (Map)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)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(); 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> struct ) { var fields = clazz.getFields(); diff --git a/src/main/java/a8k/service/db/dao/HbotControlParamsDao.java b/src/main/java/a8k/service/db/dao/HbotControlParamsDao.java index eeb409b..0f816a7 100644 --- a/src/main/java/a8k/service/db/dao/HbotControlParamsDao.java +++ b/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); diff --git a/src/main/java/a8k/service/db/entity/HardwareServiceSetting.java b/src/main/java/a8k/service/db/entity/HardwareServiceSetting.java index 54ad04b..65ca50a 100644 --- a/src/main/java/a8k/service/db/entity/HardwareServiceSetting.java +++ b/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, diff --git a/src/main/java/a8k/utils/MyClassHelper.java b/src/main/java/a8k/utils/MyClassHelper.java new file mode 100644 index 0000000..fe4d699 --- /dev/null +++ b/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 initializeByMap( Class clazz, Map 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) 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; + } +}