开发排错技巧之常见的调试入口
金蝶云社区-DC_W
DC_W
7人赞赏了该文章 1,258次浏览 未经作者许可,禁止转载编辑于2021年12月08日 19:27:47

标签:

调试入口、调试技巧

背景:

我们很大一部分开发工作是对标准产品的单据进行扩展开发,那可能由于不知道标准产品某段逻辑是用什么方式实现的,导致无从下手去扩展开发,或者遇到标准产品报错无法入手分析,那本文将以实际业务场景为例讲解一些常用调试入口,希望可以作为一个突破口,降低扩展开发的难度,以及提高排错效率。

一:弹框入口FormView.showForm(FormShowParameter)

示例:差旅费报销单添加行程信息打开弹框是哪里实现的,以及弹框的字段怎么回写到父单据的?

1.png

首先在kd.bos.mvc.form.FormView.showForm(FormShowParameter)打个断点,因为大多数弹框打开一个界面都是通过showform实现的。由下图可以看到是在插件TripBaseBillEdit实现弹框的,

2.png

并可以看到CloseCallBack的actionid是动态表单的formid即”er_tripentryedit”,则查看TripBaseBillEdit的CloseCallBack方法实现了什么逻辑,可看到并没有对行程信息弹框的回调做任何处理,那就可能是在行程信息弹框的动态表单插件实现了数据处理。4.png

5.png


通过showForm方法参数可以看到formId是”er_tripentryedit”,

6.png

另外查看弹框的formId,还有另外两种方法,一种是光标定位到该弹框,然后通过按快捷键【CTRL+ALT+G】打开设计器对应的界面,然后查看formid,另外一种是按F12看浏览器的请求响应参数,如图

7.png

知道弹框的表单标识后即可在设计器搜到该单据,并查看该动态表单的插件的大概逻辑,比如点确定才会处理数据,则查看click方法,可看到在该方法会给行程信息分录新增分录并赋值。如果需要在行程卡片增加字段并回填差旅报销单,则需要重写该插件。

8.png

9.png

二.新增分录调试入口kd.bos.entity.datamodel.AbstractFormDataModel.batchCreateNewEntryRow(String, DynamicObject, int)

示例:差旅费报销单增加行程信息后会自动生成4个默认的分录,如果想去掉其中一个分录应该怎么做呢?

当然你可以去社区搜差旅报销单相关的知识,看下有没有什么配置控制的,当然也可以从代码的角度去分析看下是如何实现新增默认分录的,从而进一步分析能不能实现去掉其中一个分录。

10.png

首先看报销金额字段所在分录的标识,可看到标识是“entryentity”然后kd.bos.entity.datamodel.AbstractFormDataModel.batchCreateNewEntryRow(String, DynamicObject, int)打条件断点,分录是“entryentity”才进入,看下哪个业务插件进行创建分录。

11.png


通过断点可看到创建交通工具报销金额的分录的插件是TripEntryEdit,并且可以看到根据所选择的交通工具查看是否有对应差旅项目才创建,

12.png

13.png

所以可以不需要该分录的话,可以将交通工具对应的差旅项目禁用掉或删除掉:

14.png

下一次进断点发现是kd.fi.er.business.servicehelper.CoreBaseBillServiceHelper.addDefaultTripExpenseEntry(IDataModel, int)创建了其他三个分录,并且根据查询的是可用并且isdefault是true才可以的差旅项目才会创建对应的分录。

15.png


打开差旅项目设计器的单据,找到isdefault对应的字段是【是否新增单据时显示】,则把对应的差旅项目的【是否新增单据时显示】取消即可不新增该项目对应分录。

16.png


17.png三.赋值调试入口,kd.bos.entity.datamodel.AbstractFormDataModel.setValue(String, Object, int, int)

示例:差旅报销单补助的天数如果想要改成行程结束时间-行程开始时间+1天,应该如何实现?

首先需要知道补助的天数是如何计算和赋值的,在AbstractFormDataModel.setValue(String, Object, int, int)打条件断点,条件是"caldaycount".equals(propName),赋值的字段标识可从开发平台设计器找。

18.png

从断点可以看到给caldaycount的值是用daycount计算而来的,可发现是通过参数控制是使用daycount值,还是基础上加一天或半天,可以去公共参数找费用核算(差旅费报销单是在费用核算应用下的)的参数即可找到控制计算补助天数的逻辑

19.png

20.png

21.png

daycount按道理就是根据行程的开始时间和结束时间计算而来的,我们可以通过打断点找到对应的计算逻辑

进入断点可看到是由于给daycount字段赋值触发了值更新事件从而给caldaycount字段赋值,

而daycount的值来源于tripday这个字段,所以继续把条件断点的字段改成tripday。

22.png


再次进入断点即可找到计算天数的逻辑结束日期-出发日期计算而来。

23.png


四.确认框调试入口kd.bos.form.AbstractFormView.showConfirm(String, MessageBoxOptions)

比如在操作单据时,界面弹出确认框,需要你点击确认再继续执行,这时候如果想了解满足什么条件会弹出确认框,或者取消确认框,则需要知道确认框是在哪里实现。通过在kd.bos.form.AbstractFormView.showConfirm(String, MessageBoxOptions)则可确认实现位置。

五.错误提示框调试入口kd.bos.form.AbstractFormView.showNotification(String, Integer, int)

当操作界面报出错误提示时导致单据不能操作,可以复制提示信息到社区搜索有无处理方案,如果没有的话也可以自己打断点排查是什么判断逻辑。
示例:在一个页面上点击按钮会弹出客户编辑页面(通过showform实现),修改保存后提示“不能修改本组织创建的数据”,然后看到创建组织跟当前登录组织是一致,那为什么还会有这个提示呢?

24.png


首先在kd.bos.form.AbstractFormView.showNotification(String, Integer, int)打断点,可见是useOrgID为空导致的,

25.png

 

useOrgID从FromShowParameter取出来的,那什么时候塞进去的呢?

26.png


在FromShowParameter的setCustomParam方法打断点,然后从客户列表界面打开一个能正常修改的客户,可看到从界面缓存取“createOrg”的值,

27.png

那界面缓存的“createOrg”又是从哪里来的呢

在PageCache的put方法打断点,可看到是在创建列表界面时放进去的,查看getAllUseOrg方法和getDefaultUseOrg方法可看到出默认组织是当前登录组织。

28.png

29.png

30.png


因此二开实现showform前可以将当前登录组织塞进FormShowParmeter的自定义参数里。

31.png


本文转载自:https://vip.kingdee.com/article/240510533097438208

作者:wbshcy

原文链接:https://vip.kingdee.com/article/240510533097438208

赞 7