[]
        
立即下载
(Showing Draft Content)

结构类型的返回结果

从章节支持返回结果中,我们已经了解到,通过给属性标注 @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;
    }
}

效果如下:

image

列表类型返回值

如果返回值是列表类型,同样可以通过实现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;
    }
}

效果如下:

  • 在普通命令中使用时

    image

  • 在循环命令的子命令中使用时

    image

也可以使用 itemPropertiesDescription 给每个元素的子属性设置描述