值改变事件与即时触发值更新参数原创
金蝶云社区-靠谱的高峰老师
靠谱的高峰老师
9人赞赏了该文章 2202次浏览 未经作者许可,禁止转载编辑于2023年05月04日 17:43:24

今天的这篇文章,主要是围绕某客户现场二开时遇到的一个问题展开

【客户场景】

   你好,有个某某项目的问题想向你请教: 采用综合税率的合同,在做合同结算单、付款申请单、付款登记单时,由于系统中税率的精度只有2位小数,导致计算出来的税额、未税金额与实际的税额、未税金额有差异,可不可以将合同结算单、付款申请单、付款登记单上的税额、未税金额字段放开锁定,由操作员手工录入?   ”

【概念梳理】

    在了解如何解决现场这个问题之前我们需要先弄清楚几个概念:值改变事件即时触发值更新

1、值改变事件

    在苍穹平台下,元数据表单界面的字段的值发生了变化,在字段值改变后失去光标触发保存操作时,会根据字段的值是否发生变化进行相应的值更新逻辑处理,即进入执行propertyChanged方法中的逻辑。那么,字段值改变后失去光标时触发上述值更新逻辑即是所谓的即时触发值更新】,触发保存操作时才触发上述值更新逻辑即【即时触发值更新】,所以【即时触发值更新】参数,控制着字段值更新后同步更新其他字段值逻辑的触发时机。

2、即时触发值更新

    “即时”,立即,毫不拖延,立刻马上之意,也就是说修改的当前字段值变化了,同步更新的字段也立刻马上变化。在开发平台元数据设计器中,该参数是字段的属性参数是支持可配置的。目前该参数平台仅支持对单据头字段有效,单据体字段无效。


上传图片

【问题分析】

    弄清了上面两个概念,我们再回到现场的这个问题上来,总结一下现场的诉求即为:字段值改变后不引起其它同步字段的值变化,所以平台在元数据中的字段属性参数【即时触发值更新】开启与关闭无法解决该问题。

@Override
public void beforePropertyChanged(PropertyChangedArgs e) {}
@Override
public void propertyChanged(PropertyChangedArgs e) {}

原因是上面的接口IDataModelChangeListener(基类AbstractFormPlugin已实现该接口)中的beforePropertyChanged与propertyChanged这两个方法无法设置e.setCancel(true)来阻断,即使是直接在方法中return,也只能控制二开插件的逻辑不执行,但是原厂插件中的逻辑依然还是会执行。

【解决方案】

    将前端的值改变事件设置为不发送指令到后端插件代码即可,关键代码如下:

@Override
public void beforeFieldPostBack(BeforeFieldPostBackEvent e) {
    String filedKey = e.getKey();
        if ("需要禁用触发【字段值更新事件】的字段标识".equals(filedKey)) {
            //前端界面触发的值改变不发送到后端处理
            e.setCancel(true);
            }
}

    综上,现场需要二开新增一个表单插件,重写接口IFormPlugin(基类AbstractFormPlugin已实现该接口)的beforeFieldPostBack方法即可,原厂插件及二开插件中的值改变事件将都不会被触发,现场客户制单人或操作人员录入什么数据就是什么数据。

赞 9