动态设置运行时元数据上数值类型控件限定范围的示例原创
金蝶云社区-靠谱的高峰老师
靠谱的高峰老师
3人赞赏了该文章 463次浏览 未经作者许可,禁止转载编辑于2023年01月18日 11:26:07

【场景】

计划管理应用中进行任务汇报进度时,当前汇报进度不能小于上一次汇报进度;

【解决方案】

【方案一】用户输入值后失去光标时,进行Tips提示校验;

优点:可自定义提示信息,操作异常更明确

缺点:代码实现逻辑复杂,校验不通过时需要代码还原旧值

image.png

【代码示例】在propertyChanged方法中

DynamicObject task = model.getDynamicObject(ProgressReportConstant.Task);
 if(task != null) {
     //获取最新的汇报记录
    DynamicObject latestReportRecord = this.getLatestTaskReportRecord(task.getPkValue());
    if (latestReportRecord != null) {
        //获取最新汇报记录中的汇报进度
        String minValue = latestReportRecord.getString(TaskConstant.Percent);
        BigDecimal percentNewValue = new BigDecimal(newValue.toString());
        BigDecimal percentOldValue = new BigDecimal(minValue).setScale(percentNewValue.scale(), RoundingMode.HALF_UP);
        if (percentNewValue.compareTo(percentOldValue) < 0) {
            this.getView().showErrorNotification(String.format("当前汇报进度%s%%不能小于完成进度%s%%。" percentNewValue, percentOldValue));
            this.getModel().beginInit();
            this.getModel().setValue(ProgressReportConstant.Percent, percentOldValue);
            this.getModel().endInit();
            return;
           }
       }
    }


【方案二】用户输入时仅做元数据上的限定范围设置的校验,最终在保存、提交操作时做字段值合规性校验

优点:使用了平台默认操作时字段值合规性校验

缺点:交互体验不好,校验不通过时,不会还原到旧值

image.png

image.png

【代码示例】在afterBindData方法中

//获取最新的汇报记录
DynamicObject latestReportRecord = this.getLatestTaskReportRecord(taskIdValue);
if (latestReportRecord != null) {
    //获取最新汇报记录中的汇报进度
    String minValue = latestReportRecord.getString(TaskConstant.Percent);
    if (minValue != null) {
        DecimalProp decimalProp = ((DecimalProp) ((DecimalEdit) this.getControl("percent")).getProperty());
        String dataScope = String.format("[%s,%s]", minValue, decimalProp.getMax());
        decimalProp.setDataScope(dataScope);
        decimalProp.setMin(new BigDecimal(minValue));
    }
}


【方案三】用户输入前重新设置元数据的限定范围并更新到前端,输入数据时实时进行限定范围提示

优点:使用了平台默认的前端字段值合规性校验

缺点:无

image.png

【代码示例】在afterBindData方法中

//获取最新的汇报记录
DynamicObject latestReportRecord = this.getLatestTaskReportRecord(taskIdValue);
if (latestReportRecord != null) {
    //获取最新汇报记录中的汇报进度
    String minValue = latestReportRecord.getString(TaskConstant.Percent);
    Map<String, Object> items = new HashMap<>(1);
    items.put(ClientProperties.MinValue, minValue);
    Map<String, Object> params = new HashMap<>(1);
    params.put("item", items);
    this.getView().updateControlMetadata(ProgressReportConstant.Percent, params);
}

【注意】设置前端控件属性时,建议使用常量类kd.bos.form.ClientProperties

图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0