[]
从章节支持返回结果中,我们已经了解到,通过给属性标注 @ResultToProperty, 可以在命令执行后生成一个或多个返回结果,以便后续命令使用。
如果希望生成复杂的对象类型返回结果,或者生成数组类型的返回结果,通过标注@ResultToProperty,也是可以实现的,但是再后续的属性提示中,用户无法快捷的了解返回的对象有哪些子属性。只能通过点操作符硬取值。
例如以下代码:
public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide {
@FormulaProperty
@DisplayName("学生id")
private Object studentId;
@ResultToProperty
@DisplayName("查询结果")
private String resultTo = "结果";
@Override
public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
ColumnValuePair columnValuePair = new ColumnValuePair();
columnValuePair.setColumnName("ID");
columnValuePair.setValue(Integer.parseInt(studentId.toString()));
Map<String, Object> studentInfo = dataContext.getDataAccess().getTableData("学生表", columnValuePair);
dataContext.getParameters().put(resultTo, studentInfo);
return new ExecuteResult();
}
@Override
public String toString() {
return "我的服务端命令插件";
}
}
假设,命令执行后,会返回学生对象。包含了姓名和年龄属性,但是再后续命令使用结果时只会提示,结果变量,而如果需要获取子属性值,必须用户手动,准确输入,用户体验较差。
如果希望同时提示子属性,可以通过实现 IServerCommandParamGenerator 接口实现
public class MyPluginServerCommand extends Command implements ICommandExecutableInServerSide, IServerCommandParamGenerator {
@FormulaProperty
@DisplayName("学生id")
private Object studentId;
@ResultToProperty
@DisplayName("查询结果")
private String resultTo = "结果";
@Override
public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
ColumnValuePair columnValuePair = new ColumnValuePair();
columnValuePair.setColumnName("ID");
columnValuePair.setValue(Integer.parseInt(studentId.toString()));
Map<String, Object> studentInfo = dataContext.getDataAccess().getTableData("学生表",columnValuePair);
dataContext.getParameters().put(resultTo,studentInfo);
return new ExecuteResult();
}
@Override
public String toString() {
return "我的服务端命令插件";
}
@Override
public List<GenerateParam> getGenerateParams() {
List<GenerateParam> params = new ArrayList<>();
GenerateObjectParam objectParam = new GenerateObjectParam();
objectParam.setParamName(resultTo);
objectParam.setParamScope(CommandScope.ExecutableInServer);
objectParam.setDescription("查询学生的详细信息结果");
Map<String,String> subPropertiesDescription = new HashMap<>();
subPropertiesDescription.put("姓名","学生姓名");
subPropertiesDescription.put("年龄","学生年龄");
objectParam.setSubPropertiesDescription(subPropertiesDescription);
params.add(objectParam);
return params;
}
}
效果如下:
如果返回值是列表类型,同样可以通过实现IServerCommandParamGenerator解决。
public class MyPluginServerCommand3 extends Command implements ICommandExecutableInServerSide, IServerCommandParamGenerator {
@ResultToProperty
@DisplayName("查询结果")
private String resultTo = "结果";
@Override
public ExecuteResult execute(IServerCommandExecuteContext dataContext) {
Object students = dataContext.getDataAccess().getTableData("学生表");
dataContext.getParameters().put(resultTo,students);
return new ExecuteResult();
}
@Override
public String toString() {
return "我的服务端命令-列表类型返回值";
}
@Override
public List<GenerateParam> getGenerateParams() {
List<GenerateParam> params = new ArrayList<>();
GenerateListParam listParam = new GenerateListParam();
listParam.setParamName(resultTo);
listParam.setParamScope(CommandScope.ExecutableInServer);
listParam.setDescription("查询学生的详细信息结果");
List<String> itemNames = new ArrayList<>();
itemNames.add("姓名");
itemNames.add("年龄");
listParam.setItemProperties(itemNames);
params.add(listParam);
return params;
}
}
效果如下:
在普通命令中使用时
在循环命令的子命令中使用时
也可以使用 itemPropertiesDescription 给每个元素的子属性设置描述