本文讨论了某客户在使用系统时遇到的税率精度问题,导致税额、未税金额计算差异。提出放开税额、未税金额字段锁定,由人工录入。通过分析值改变事件与即时触发值更新的概念,发现原设置无法解决问题。最终提出解决方案:在前端阻止值改变事件发送至后端插件,通过重写接口方法实现。
今天的这篇文章,主要是围绕某客户现场二开时遇到的一个问题展开
【客户场景】
“ 你好,有个某某项目的问题想向你请教: 采用综合税率的合同,在做合同结算单、付款申请单、付款登记单时,由于系统中税率的精度只有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方法即可,原厂插件及二开插件中的值改变事件将都不会被触发,现场客户制单人或操作人员录入什么数据就是什么数据。