
## 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及以下版本:配置工具-系统参数-公共参数-引入参数配置-【引入数据时校验基础资料权限】未开启

6.0版本:公共设置-系统参数-公共参数-引入参数配置-【引入数据时校验基础资料权限】未开启
6.0以上版本:公共设置-系统参数-公共参数-导入参数配置-【导入数据时校验基础资料权限】未开启
②基础资料A未配置主业务组织

③基础资料B设置了使用组织(当前设置使用组织会导致引入时管控策略失效,修复版本正在测试中)
解决方案:
请先确认基础资料A及其引用的基础资料字段B是否均在管控策略中。

如确定,请将基础资料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方法后,