踩坑系列 - 预警平台自定义预警条件无法保存成功原创
金蝶云社区-野生的指针
野生的指针
2人赞赏了该文章 499次浏览 未经作者许可,禁止转载编辑于2021年11月04日 19:51:54

场景:有小伙伴在预警平台中,自定义了预警条件对象(并按照文档实现了IEarlyWarnConditionForm接口),输入数据后点击保存,页面显示保存成功,但再次进入页面是数据却丢失了,这是为什么呢?

我们先来复现一下该bug:

第一步:新建一个单据,添加一个文本字段作为演示。

image.png

第二步:将实现了IEarlyWarnConditionForm接口的插件,注册到该单据中,代码如下:

image.png

public class TimePagePlugins20210901 extends AbstractFormPlugin implements IEarlyWarnConditionForm {
    @Override
    public Map<String, Object> getCustomParams() {
        IDataModel model = getModel();
        Object kdec_decimalfield = model.getValue("kdec_textfield");
        HashMap<String, Object> data = new HashMap<>();
        data.put("kdec_decimalfield", kdec_decimalfield);
        return data;
    }
    @Override
    public EarlyWarnConditionCheckResult checkCustomParams() {
        return EarlyWarnConditionCheckResult.success("success");
    }
}

第三步:

新增预警对象,选择上面创建的单据,数据源插件选择默认的kd.bos.service.earlywarn.impl.DefaultEarlyWarnBillDataSource

image.png

第四步:

创建一个监控方案(并填写好方案编码等必填信息),监控条件的文本字段输入“test...”,点击保存,显示保存成功

image.png

第五步:

再次进入该界面,发现数据没有成功保存

image.png


出错原因:

经过漫长的debug后发现,数据其实是保存成功的,只是没有显示在界面上。解决该问题最直接的方法,就是在beforeBindData方法中,将数据显示到页面上。也就是说,我们要修改注册在单据上的插件,修改后代码如下:

public class TimePagePlugins20210901 extends AbstractFormPlugin implements IEarlyWarnConditionForm {
    @Override
    public Map<String, Object> getCustomParams() {
        IDataModel model = getModel();
        Object kdec_decimalfield = model.getValue("kdec_textfield");
        HashMap<String, Object> data = new HashMap<>();
        data.put("kdec_textfield", kdec_decimalfield);
        return data;
    }
    @Override
    public EarlyWarnConditionCheckResult checkCustomParams() {
        return EarlyWarnConditionCheckResult.success("success");
    }
    
    @Override
    public void beforeBindData(EventObject e) {
        super.beforeBindData(e);
        Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
        for (String key : customParams.keySet()) {
            this.getView().getModel().setValue(key, customParams.get(key));
        }
    }
}


代码修改后,重新进入该方案,发现数据显示在页面上了...也证明数据其实是保存了的,只是没在前端显示

image.png



谢谢大家

赞 2