
# 业务场景
在按模板导出数据时,对数据做干预(修改/移除)
场景1:按模板导出“采购申请单”,将物料编码为“NZL002”的分录数据移除,不参与导出
场景2:按模板导出“采购申请单”,将数据中物料编码“NZL002”替换成“NZL003”
# 解决方案
**通过派生列表插件基类AbstractListPlugin,重写afterQueryOfExport方法**
方法名:afterQueryOfExport
方法参数:ExportFileEvent
触发时机:系统按条件查询出待导出的数据后,即将执行导出流程时,触发当前事件
使用场景:用户可修改查询完毕的数据,如移除部分数据不作导出,或按自定义规则修改部分数据
| 方法名称 | 方法描述 | 返回值 |
| -------------- | ------------------------ | ------------ |
| getQueryValues | 获取待导出的动态对象数组 | 动态对象数组 |
| setQueryValues | 设置待导出的动态对象数组 | / |
| isCustomOrder | 是否按照用户顺序排序 | boolean |
| setCustomOrder | 设置是否按照用户顺序排序 | / |
# **示例代码**
场景1
```java
public class TestExportPlugin extends AbstractListPlugin {
public static final String ENTRYENTITY = "entryentity";
public static final String MATERIAL = "material";
@Override
public void afterQueryOfExport(AfterQueryOfExportEvent e) {
//获取待导出的单据动态对象数组
DynamicObject[] queryValues = e.getQueryValues();
List<DynamicObject> queryValueList = Arrays.stream(queryValues).collect(Collectors.toList());
Iterator<DynamicObject> iterator = queryValueList.iterator();
//遍历所有单据
while (iterator.hasNext()){
DynamicObject next = iterator.next();
//获取每个单据的分录数据集合
DynamicObjectCollection entryRows = next.getDynamicObjectCollection(ENTRYENTITY);
Iterator<DynamicObject> entryIterator = entryRows.iterator();
while (entryIterator.hasNext()){
DynamicObject entryRow = entryIterator.next();
if (entryRow.get(MATERIAL) != null &&((DynamicObject)entryRow.get(MATERIAL)).get("number").equals("NZL002")) {
//移除物料编码为“NZL002”的数据
entryIterator.remove();
}
}
}
//将处理后的数据转为数组
DynamicObject[] dynamicObjects = queryValueList.toArray(new DynamicObject[0]);
//按照当前数组顺序导出
e.setCustomOrder(true);
e.setQueryValues(dynamicObjects);
}
}
```
场景2
```java
public class TestExportPlugin extends AbstractListPlugin {
public static final String ENTRYENTITY = "entryentity";
public static final Str