导入导出二次开发问题排查指南
## 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 简介为满足复杂多变的业务场景,导入导出提供丰富的二开方式,支持多种插件。在导入导出过程中,二开可能导致导入导出中断、导入...
点击下载文档
上一篇:导入导出过程中,进度条卡住不更新问题分析下一篇:导入失败的解决方法
本文2024-09-23 00:36:12发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-140526.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章