From 812749393dfc804f1cece7b31111aec374e79860 Mon Sep 17 00:00:00 2001 From: ayan Date: Mon, 13 Jun 2022 15:38:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=99=E6=80=81=E6=96=87=E4=BB=B6=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/excel/DefaultImportExportService.java | 32 ++++++++++++++++++- .../io/excel/ImportExportService.java | 5 +++ .../notify-component/notify-email/pom.xml | 7 ++++ .../email/embedded/DefaultEmailNotifier.java | 26 +++++++++++---- .../DefaultEmailNotifierProvider.java | 9 ++++-- .../device/web/DeviceInstanceController.java | 6 ++-- 6 files changed, 73 insertions(+), 12 deletions(-) diff --git a/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/DefaultImportExportService.java b/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/DefaultImportExportService.java index da68b51d..9ff62ebb 100644 --- a/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/DefaultImportExportService.java +++ b/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/DefaultImportExportService.java @@ -1,7 +1,13 @@ package org.jetlinks.community.io.excel; +import org.hswebframework.reactor.excel.converter.RowWrapper; +import org.hswebframework.utils.StringUtils; import org.jetlinks.community.io.excel.easyexcel.ExcelReadDataListener; +import org.jetlinks.community.io.file.FileManager; +import org.jetlinks.community.io.utils.FileUtils; import org.springframework.core.io.Resource; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; @@ -11,6 +17,8 @@ import reactor.core.publisher.Mono; import java.io.FileInputStream; import java.io.InputStream; +import static org.hswebframework.reactor.excel.ReactorExcel.read; + /** * @author bsetfeng * @since 1.0 @@ -20,8 +28,12 @@ public class DefaultImportExportService implements ImportExportService { private WebClient client; - public DefaultImportExportService(WebClient.Builder builder) { + private final FileManager fileManager; + + public DefaultImportExportService(WebClient.Builder builder, + FileManager fileManager) { client = builder.build(); + this.fileManager = fileManager; } public Flux> doImport(Class clazz, String fileUrl) { @@ -34,6 +46,24 @@ public class DefaultImportExportService implements ImportExportService { return ExcelReadDataListener.of(stream, clazz); } + + @Override + public Flux readData(String fileUrl, String fileId, RowWrapper wrapper) { + if (!StringUtils.isNullOrEmpty(fileUrl)) { + return getInputStream(fileUrl) + .flatMapMany(inputStream -> read(inputStream, FileUtils.getExtension(fileUrl), wrapper)); + } else { + + return Mono + .zip(fileManager + .read(fileId) + .as(DataBufferUtils::join) + .map(DataBuffer::asInputStream), + fileManager.getFile(fileId)) + .flatMapMany(t2 -> read(t2.getT1(), t2.getT2().getExtension(), wrapper)); + } + } + public Mono getInputStream(String fileUrl) { return Mono.defer(() -> { diff --git a/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/ImportExportService.java b/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/ImportExportService.java index 256d023b..a4ef733c 100644 --- a/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/ImportExportService.java +++ b/jetlinks-components/io-component/src/main/java/org/jetlinks/community/io/excel/ImportExportService.java @@ -1,6 +1,7 @@ package org.jetlinks.community.io.excel; +import org.hswebframework.reactor.excel.converter.RowWrapper; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -19,4 +20,8 @@ public interface ImportExportService { Mono getInputStream(String fileUrl); + Flux readData(String fileUrl, String fileId, RowWrapper wrapper); + + + } diff --git a/jetlinks-components/notify-component/notify-email/pom.xml b/jetlinks-components/notify-component/notify-email/pom.xml index 69ac5b09..2dbf3c27 100644 --- a/jetlinks-components/notify-component/notify-email/pom.xml +++ b/jetlinks-components/notify-component/notify-email/pom.xml @@ -44,6 +44,13 @@ 1.14.3 + + org.jetlinks.community + io-component + ${project.version} + + + \ No newline at end of file diff --git a/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java b/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java index 69ac93e8..b9140d94 100644 --- a/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java +++ b/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java @@ -11,6 +11,7 @@ import org.hswebframework.web.id.IDGenerator; import org.hswebframework.web.utils.ExpressionUtils; import org.hswebframework.web.utils.TemplateParser; import org.hswebframework.web.validator.ValidatorUtils; +import org.jetlinks.community.io.file.FileManager; import org.jetlinks.community.notify.*; import org.jetlinks.community.notify.email.EmailProvider; import org.jetlinks.community.notify.template.TemplateManager; @@ -19,6 +20,7 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.springframework.core.io.*; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.MediaType; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -67,17 +69,23 @@ public class DefaultEmailNotifier extends AbstractNotifier { @Setter private boolean enableFileSystemAttachment = Boolean.getBoolean("email.attach.local-file.enabled"); + private final FileManager fileManager; + public static Scheduler scheduler = Schedulers.elastic(); - public DefaultEmailNotifier(NotifierProperties properties, TemplateManager templateManager) { + public DefaultEmailNotifier(NotifierProperties properties, + TemplateManager templateManager, + FileManager fileManager) { this(properties.getId(), new JSONObject(properties.getConfiguration()).toJavaObject(DefaultEmailProperties.class), - templateManager); + templateManager, + fileManager); } public DefaultEmailNotifier(String id, DefaultEmailProperties properties, - TemplateManager templateManager) { + TemplateManager templateManager, + FileManager fileManager) { super(templateManager); ValidatorUtils.tryValidate(properties); JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); @@ -89,6 +97,7 @@ public class DefaultEmailNotifier extends AbstractNotifier { this.notifierId = id; this.sender = properties.getSender(); this.javaMailSender = mailSender; + this.fileManager = fileManager; } @Nonnull @@ -152,7 +161,7 @@ public class DefaultEmailNotifier extends AbstractNotifier { } - protected Mono convertResource(String resource) { + protected Mono convertResource(String resource) { if (resource.startsWith("http")) { return WebClient .create() @@ -166,12 +175,17 @@ public class DefaultEmailNotifier extends AbstractNotifier { return Mono.just( new ByteArrayResource(Base64.decodeBase64(base64)) ); - } else if (enableFileSystemAttachment) { + } else if (enableFileSystemAttachment && resource.contains("/")) { return Mono.just( new FileSystemResource(resource) ); } else { - throw new UnsupportedOperationException("不支持的文件地址:" + resource); + return fileManager + .read(resource) + .as(DataBufferUtils::join) + .map(dataBuffer -> new ByteArrayResource(dataBuffer.asByteBuffer().array())) + .onErrorResume(e-> Mono.error(()-> new UnsupportedOperationException("不支持的文件地址:" + resource))) + .switchIfEmpty(Mono.error(()-> new UnsupportedOperationException("不支持的文件地址:" + resource))); } } diff --git a/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifierProvider.java b/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifierProvider.java index dc48bca3..1832a492 100644 --- a/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifierProvider.java +++ b/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifierProvider.java @@ -1,6 +1,7 @@ package org.jetlinks.community.notify.email.embedded; import com.alibaba.fastjson.JSON; +import org.jetlinks.community.io.file.FileManager; import org.jetlinks.community.notify.*; import org.jetlinks.community.notify.email.EmailProvider; import org.jetlinks.community.notify.template.TemplateManager; @@ -22,8 +23,12 @@ public class DefaultEmailNotifierProvider implements NotifierProvider, TemplateP private final TemplateManager templateManager; - public DefaultEmailNotifierProvider(TemplateManager templateManager) { + private final FileManager fileManager; + + public DefaultEmailNotifierProvider(TemplateManager templateManager, + FileManager fileManager) { this.templateManager = templateManager; + this.fileManager = fileManager; } @Nonnull @@ -111,7 +116,7 @@ public class DefaultEmailNotifierProvider implements NotifierProvider, TemplateP @Nonnull @Override public Mono createNotifier(@Nonnull NotifierProperties properties) { - return Mono.fromSupplier(() -> new DefaultEmailNotifier(properties, templateManager)); + return Mono.fromSupplier(() -> new DefaultEmailNotifier(properties, templateManager, fileManager)); } @Override diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java index 8a964927..e4241e81 100644 --- a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java @@ -446,7 +446,8 @@ public class DeviceInstanceController implements @SaveAction @Operation(summary = "导入设备数据") public Flux doBatchImportByProduct(@PathVariable @Parameter(description = "产品ID") String productId, - @RequestParam @Parameter(description = "文件地址,支持csv,xlsx文件格式") String fileUrl) { + @RequestParam(required = false) @Parameter(description = "文件地址,支持csv,xlsx文件格式") String fileUrl, + @RequestParam(required = false) @Parameter(description = "文件Id") String fileId) { return Authentication .currentReactive() .flatMapMany(auth -> { @@ -461,8 +462,7 @@ public class DeviceInstanceController implements .getDeviceProductDetail(productId) .map(tp4 -> Tuples.of(new DeviceWrapper(tp4.getT3().getTags(), tp4.getT4()), tp4.getT1())) .flatMapMany(wrapper -> importExportService - .getInputStream(fileUrl) - .flatMapMany(inputStream -> read(inputStream, FileUtils.getExtension(fileUrl), wrapper.getT1())) + .readData(fileUrl, fileId, wrapper.getT1()) .doOnNext(info -> info.setProductName(wrapper.getT2().getName())) ) .map(info -> {