class DeviceExcelImporter extends AbstractImporter<DeviceExcelInfo> {

    @Getter
    private final DeviceProductEntity product;

    private final Map<String, PropertyMetadata> tagMapping = new HashMap<>();

    private final Map<String, ConfigPropertyMetadata> configMapping = new HashMap<>();

    private final Authentication auth;

    public DeviceExcelImporter(FileManager fileManager,
                               WebClient client,
                               DeviceProductEntity product,
                               List<ConfigPropertyMetadata> configs,
                               Authentication auth) {
        super(fileManager, client);
        this.product = product;
        this.auth = auth;
        List<PropertyMetadata> tags = product.parseMetadata().getTags();
        for (PropertyMetadata tag : tags) {
            tagMapping.put(tag.getName(), tag);
        }
        for (ConfigPropertyMetadata config : configs) {
            configMapping.put(config.getName(), config);
        }
    }

    @Override
    protected Mono<Void> handleData(Flux<DeviceExcelInfo> data) {
        return data
            .doOnNext(ValidatorUtils::tryValidate)
            .map(deviceExcelInfo -> deviceExcelInfo.initDeviceInstance(product, auth))
            .then();
    }

    @Override
    protected DeviceExcelInfo newInstance() {
        DeviceExcelInfo deviceExcelInfo = new DeviceExcelInfo();
        deviceExcelInfo.setTagMapping(tagMapping);
        deviceExcelInfo.setConfigMapping(configMapping);
        return deviceExcelInfo;
    }

    @Override
    protected void customImport(ImportHelper<DeviceExcelInfo> helper) {<FILL_FUNCTION_BODY>}
}

        helper.fallbackSingle(true);
        for (PropertyMetadata tag : tagMapping.values()) {
            helper.addHeader(tag.getId(), tag.getName());
        }
        for (ConfigPropertyMetadata config : configMapping.values()) {
            helper.addHeader(config.getProperty(), config.getName());
        }
    
<methods>public non-sealed void <init>() ,public Flux<ImportResult<org.jetlinks.community.device.web.excel.DeviceExcelInfo>> doImport(java.lang.String, java.lang.String) ,public Flux<ImportResult<org.jetlinks.community.device.web.excel.DeviceExcelInfo>> doImport(java.lang.String) <variables>protected final non-sealed org.springframework.web.reactive.function.client.WebClient client,protected final non-sealed org.jetlinks.community.io.file.FileManager fileManager