导入导出二次开发问题排查指南

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

导入导出二次开发问题排查指南

## 1 简介 为满足复杂多变的业务场景,导入导出提供丰富的二开方式,支持多种插件。 在导入导出过程中,二开可能导致导入导出中断、导入数据错误或未实现预期效果等问题,下面将按照实体业务规则、表单插件、导入操作插件、保存插件/校验规则、列表插件分别介绍排查思路。 ## 2 导入 导入实质是模拟保存,因此会受到单据实体业务规则、表单插件、导入操作插件、保存插件及校验规则的影响。如需了解详情,请参考:[导入导出插件总览](https://vip.kingdee.com/knowledge/specialDetail/228886918686445824?category=228887131757089024&id=377830755168450560&productLineId=29) ### 2.1 实体业务规则 场景1: 导入单据A,Excel中填写了字段x的值,导入完成后打开单据发现该值被修改为y或未导入。 场景2: 导入单据A,Excel中填写了字段x的值,该单据导入失败,提示:请填写字段x的值。 原因:表单中存在实体业务规则,当字段y值为空时,将字段y的值赋值给字段x。 解决方案:关闭或者调整为符合实际场景的业务规则。 **注意**:表单主实体存在业务规则,单据体实体同样存在。如遇到单据体字段存在类似问题,请同步检查。 ### 2.2 表单插件 场景1:导入时Excel填写的组织是A,导入失败,提示组织B不存在。 原因:表单插件重写了afterCreateNewData方法,该方法将组织A替换成组织B,如上面所述,导入是模拟保存,在导入过程中会模拟创建单据实体,触发该方法。 修改方案:建议按照实际业务场景判断,如导入不需要场景1中组织值替换的逻辑,可在afterCreateNewData方法判断后返回。 ``` //isFromImport为引入标识 if(BillModel.isFromImport()){ return; } ``` 场景2:受控基础资料A包含一个受控基础资料B字段,导入A时,未按照组织隔离策略判断B基础资料的使用权限。 原因: ①5.0及以下版本:配置工具-系统参数-公共参数-引入参数配置-【引入数据时校验基础资料权限】未开启 ![image20230209160715275.webp](/download/0100bdf2f908e6a14b6e81679379a13e574d.webp) 6.0版本:公共设置-系统参数-公共参数-引入参数配置-【引入数据时校验基础资料权限】未开启 6.0以上版本:公共设置-系统参数-公共参数-导入参数配置-【导入数据时校验基础资料权限】未开启 ②基础资料A未配置主业务组织 ![image20230209161242944.webp](/download/0100f1f75f1b254844ed95637b70894cd3ea.webp) ③基础资料B设置了使用组织(当前设置使用组织会导致引入时管控策略失效,修复版本正在测试中) 解决方案: 请先确认基础资料A及其引用的基础资料字段B是否均在管控策略中。 ![image20230209161630933.webp](/download/01001c1f8552f6aa47a3a77966119bdfc346.webp) 如确定,请将基础资料A设置主业务组织,且将基础资料B的使用组织移除(后续版本更新后可正常使用)。 场景3:重写了afterImportData方法,调用cancel方法取消该单导入时,错误文件中的提示与该单据数据所在行号不匹配。 原因:使用方法addCancelMessage添加错误信息时,入参错误。 解决方案:添加错误信息时,计算分录行号。 ```java //调用该方法,如Excel中存在多个分录及子分录,请计算后传入行号 public void addCancelMessage(entryRowIndex, subEntryRowIndex, cancelMessage) ``` ### 2.3 导入操作插件 场景1:重写initImportData方法,进行数据重复校验后,还是导入了重复数据。 原因:导入为提升性能,对数据进行了分批处理,如果重复数据在不同分批中,重复校验将失效。导入是生产消费模型,分批时,导入线程将先尝试从解析线程获取一条单据数据(即首批只导入一条单据),后续将批量导入(大小不定,默认不超过1000单),而initImportData方法是每批次开始导入时调用。 解决方案: ①在导入上下文ImportContext对象中,计算并存入单据部分字段计算后的唯一值,如计算组合字段的哈希值,每批数据都判断是否与该唯一值一致。 ②如能确认导入的数据量不大,可将分批大小适当调整并设置强制分批。 ```java getBatchImportSize(){ return 10000; } isForceBatch(){ return true; } ``` 场景2:重写save方法后,进度条页面显示的单据数有误。 原因:标准产品的save方法返回ApiResult对象,该对象包含当前批次单据导入结果集合,进度将根据该对象进行更新计算。 解决方案:重写save方法需要自行构建ApiResult对象返回,构建方式可参考 ```java ApiResult apiResult = new ApiResult(); apiResult.setSuccess(false); if (saveResult != null) { apiResult.setData(saveResult); } else if (convResults.size() > 0) { apiResult.setMessage(convResults.get(0).getMessage()); apiResult.setData(SingleBillResult.toMap(convResults.get(0))); } return apiResult; ``` ### 2.4 保存插件/校验规则 场景1:模板Excel未填写a字段,导入失败,提示a字段不存在 ![image20230209173638553.webp](/download/0100fb059aa128ed4635a422ce37bb2dbe38.webp) 原因:导入是模拟保存,在导入过程中会调用页面的保存操作,所以手工录单无法保存的场景,导入也无法保存。 解决方案:Excel中录入该值、修改校验规则或在表单插件/导入操作插件中对字段赋值。 场景2:导入失败,错误信息提示“xx”插件不存在。 原因:保存操作注册了服务插件,但是当前节点不存在该插件,插件无法实例化。 解决方案:检查保存插件部署情况。 ### 2.5 导入监控报告 如上述方式均未能定位问题,建议开启导入监控报告(导入数据量大时不建议开启),从报告中分析数据的变化过程。 ![image20230209180231430.webp](/download/0100f21600b057184903ade3568e20767cc5.webp) 详细使用方法请参考文档:[导入监控功能介绍](https://vip.kingdee.com/knowledge/specialDetail/228886918686445824?category=228887831618258176&id=380448153050453248&productLineId=29) ## 3 导出 导出只受列表插件(包含树形列表的插件)影响。 ### 3.1 列表插件 场景1:按模板导出时,出现中断。堆栈包含**ClassCastException**异常。 原因:重写了afterQueryOfExport方法,对动态对象直接使用set方式赋值,可能导致数据错位(动态对象底层使用数组存储值),在导出后续的格式转换中,产生中断。 解决方案:使用获取具体DynamicObjectType的方式赋值。 场景2:按模板导出时,导出的数据存在重复/缺失情况。 原因:列表使用自定义数据源或自行构建过滤条件,且没有设置默认的排序字段。按模板导出是分批进行的,多次使用相同过滤条件取数,可能获取重复数据,导致实际导出的数据与预期不符。 解决方案:对自定义取数方式加入默认的排序字段。

导入导出二次开发问题排查指南

## 1 简介为满足复杂多变的业务场景,导入导出提供丰富的二开方式,支持多种插件。在导入导出过程中,二开可能导致导入导出中断、导入...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息