本文描述了在一个项目中,单据实体加入当前审核人字段后,生产环境运行一年后部分用户出现错误的情况。错误发生在点击详情页时,提示某属性不存在。分析发现部分用户配置了已选行合计导致。根本原因是合计计算复用了列表加载代码,但字段获取不同。暂时解决方案是关闭合计字段,根本方案是改进代码以判断当前场景是否应赋值。同时,提及了最初动态展示审批人信息的方案调整及动态赋值限制。
背景:
单据实体中加入了当前审核人的一个文本字段,列表中动态取到当前实际的审批人,赋值给该字段。生产环境运行了一年左右的时间了,突然有部分用户报错了。列表展示不报错,当点击进入详情的时候才报错。
异常信息:实体类型QueryObject中不存在名为XXXXX的属性。
目前项目只有源码,没有可运行调试的开发环境,只能对着代码分析。
分析:
直接感觉,是否用户个性化配置了隐藏该字段。查看发现并没有。而且如果隐藏了,列表显示也会报错了,排除.
代码异常,看了代码发现这里获取到列表数据,并给自定义列数据赋值的时候报错了。(这里的逻辑就是取到所有的列表的列,然后setDataForCustomColumn(collection)方法会取到异常的XXXX字段列进行赋值)
但是目前的情况:1.列表实际展示数据是正常的。2.只有部分用户有异常。3.进入详情页面为什么会走到列表插件?
于是求助平台开发老师,提示可能是配置了已选行合计,最终发现部分用户配置了已选行合计字段,取消已选行合计就可以了。
大致原因(因为没有调试代码,具体的细节不太清楚):
列表合计或者其他场景,是复用了列表加载的执行代码,拿合计为例。
当有选中行的时候,会计算合计。(本次点击进入详情其实是触发了选中,测试验证其他选中行或者点击任何单元格都会报错)
为了保证性能,计算合计的代码会只获取合计字段,不获取其他字段。
计算合计的代码复用了列表加载数据的代码,不过加载的字段改动了。如果没有二开,是完全没有问题的。
二开了加载数据的逻辑,正常列表加载是没有问题的,但计算合计的时候也会进入这块逻辑,合计时只有具体的合计列字段,没有其他列,所以二开代码在dynamicObject.set(指定列, Value);赋值的时候,报错列找不到
解决:
直接方案就是先把合计字段关闭,就不报错了。但是只是暂时解决,不能解决根本。
本质方案可以在设置指定列的值的时候,判断下当前数据包是否有需要赋值的指定列。如果是列表加载,那么会有该列,正常赋值。如果是合计,就不赋值。
额外:
本次需求是想在列表中动态展示当前审批人信息,最早是通过列表动态添加列的方式,但是最终在列表引出的时候发生异常了,最后方案改成了,实体上加一个当前审批人的文本字段,列表上也加入,然后在列表加载的时候动态给每一行当前审批人字段赋值。
动态赋值仅限简单类型字段,如文本、整数等。复杂类型字段,如基础资料字段,不建议动态赋值。