diff --git a/README.md b/README.md
index 21598c0..5505a09 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# open-JSD-8101
-JSD-8101 异步流式导出(导出到服务器、异步下载)
\ No newline at end of file
+JSD-8101 异步流式导出(导出到服务器、异步下载)\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..a443f09
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,34 @@
+
+
+ com.fr.plugin.zk.jsd8101.excel
+
+ yes
+ 1.0.1
+ 10.0
+ 2020-08-20
+ fr.open
+
+
+
+ ]]>
+
+ com.fr.plugin.zk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/HttpHandlerProvider.java b/src/main/java/com/fr/plugin/zk/stream/excel/HttpHandlerProvider.java
new file mode 100644
index 0000000..29e939f
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/HttpHandlerProvider.java
@@ -0,0 +1,20 @@
+package com.fr.plugin.zk.stream.excel;
+
+import com.fr.decision.fun.HttpHandler;
+import com.fr.decision.fun.impl.AbstractHttpHandlerProvider;
+import com.fr.plugin.zk.stream.excel.provider.DownloadProvider;
+import com.fr.plugin.zk.stream.excel.provider.ExportProvider;
+import com.fr.plugin.zk.stream.excel.provider.MessageProvider;
+
+public class HttpHandlerProvider extends AbstractHttpHandlerProvider {
+
+ @Override
+ public HttpHandler[] registerHandlers() {
+ return new HttpHandler[]{
+ new ExportProvider(),
+ new MessageProvider(),
+ new DownloadProvider()
+ };
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/UrlAliasBridge.java b/src/main/java/com/fr/plugin/zk/stream/excel/UrlAliasBridge.java
new file mode 100644
index 0000000..024ed66
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/UrlAliasBridge.java
@@ -0,0 +1,17 @@
+package com.fr.plugin.zk.stream.excel;
+
+import com.fr.decision.fun.impl.AbstractURLAliasProvider;
+import com.fr.decision.webservice.url.alias.URLAlias;
+import com.fr.decision.webservice.url.alias.URLAliasFactory;
+
+public class UrlAliasBridge extends AbstractURLAliasProvider {
+ @Override
+ public URLAlias[] registerAlias() {
+ return new URLAlias[]{
+ URLAliasFactory.createPluginAlias("/stream/export", "/stream/export", false),
+ URLAliasFactory.createPluginAlias("/stream/message", "/stream/message", false),
+ URLAliasFactory.createPluginAlias("/stream/download", "/stream/download", false),
+ };
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/db/ExcelAccessProviderImpl.java b/src/main/java/com/fr/plugin/zk/stream/excel/db/ExcelAccessProviderImpl.java
new file mode 100644
index 0000000..5a8e3ee
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/db/ExcelAccessProviderImpl.java
@@ -0,0 +1,31 @@
+package com.fr.plugin.zk.stream.excel.db;
+
+import com.fr.db.fun.impl.AbstractDBAccessProvider;
+import com.fr.plugin.zk.stream.excel.db.dao.ExcelExportDao;
+import com.fr.plugin.zk.stream.excel.db.entity.ExcelExportEntity;
+import com.fr.plugin.zk.stream.excel.db.service.ExcelExportService;
+import com.fr.stable.db.accessor.DBAccessor;
+import com.fr.stable.db.dao.BaseDAO;
+import com.fr.stable.db.dao.DAOProvider;
+
+public class ExcelAccessProviderImpl extends AbstractDBAccessProvider {
+ @Override
+ public DAOProvider[] registerDAO() {
+ return new DAOProvider[]{new DAOProvider() {
+ @Override
+ public Class getEntityClass() {
+ return ExcelExportEntity.class;
+ }
+
+ @Override
+ public Class extends BaseDAO> getDAOClass() {
+ return ExcelExportDao.class;
+ }
+ }};
+ }
+
+ @Override
+ public void onDBAvailable(DBAccessor dbAccessor) {
+ ExcelExportService.getSingleton().init(dbAccessor);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/db/dao/ExcelExportDao.java b/src/main/java/com/fr/plugin/zk/stream/excel/db/dao/ExcelExportDao.java
new file mode 100644
index 0000000..57961e8
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/db/dao/ExcelExportDao.java
@@ -0,0 +1,18 @@
+package com.fr.plugin.zk.stream.excel.db.dao;
+
+import com.fr.plugin.zk.stream.excel.db.entity.ExcelExportEntity;
+import com.fr.stable.db.dao.BaseDAO;
+import com.fr.stable.db.session.DAOSession;
+
+
+public class ExcelExportDao extends BaseDAO {
+
+ public ExcelExportDao(DAOSession daoSession) {
+ super(daoSession);
+ }
+
+ @Override
+ protected Class getEntityClass() {
+ return ExcelExportEntity.class;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/db/entity/ExcelExportEntity.java b/src/main/java/com/fr/plugin/zk/stream/excel/db/entity/ExcelExportEntity.java
new file mode 100644
index 0000000..742ff53
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/db/entity/ExcelExportEntity.java
@@ -0,0 +1,136 @@
+package com.fr.plugin.zk.stream.excel.db.entity;
+
+import com.fr.stable.db.entity.BaseEntity;
+import com.fr.third.javax.persistence.Column;
+import com.fr.third.javax.persistence.Entity;
+import com.fr.third.javax.persistence.Lob;
+import com.fr.third.javax.persistence.Table;
+
+import java.util.Date;
+import java.util.UUID;
+
+
+@Entity
+@Table(name = "fine_export_stream_excel")
+public class ExcelExportEntity extends BaseEntity {
+
+ //模板路径
+ @Column(name = "path")
+ private String path;
+
+ //模板参数
+ @Lob
+ @Column(name = "parameters")
+ private String parameters;
+
+ //导出状态 导出中、完成、失败
+ @Column(name = "status")
+ private String status = "导出中";
+
+ @Column(name = "start_time")
+ private Date startTime;
+
+ @Column(name = "end_time")
+ private Date endTime;
+
+ @Column(name = "filename")
+ private String filename;
+
+ @Column(name = "file_path")
+ private String filePath;
+
+ @Column(name = "file_size")
+ private Integer fileSize;
+
+ @Lob
+ @Column(name = "message")
+ private String message;
+
+ @Column(name = "username")
+ private String username;
+
+ public ExcelExportEntity() {
+ this.setId(UUID.randomUUID().toString());
+ }
+
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public String getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(String parameters) {
+ this.parameters = parameters;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ public Date getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+ public Integer getFileSize() {
+ return fileSize;
+ }
+
+ public void setFileSize(Integer fileSize) {
+ this.fileSize = fileSize;
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public void setFilePath(String filePath) {
+ this.filePath = filePath;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getFilename() {
+ return filename;
+ }
+
+ public void setFilename(String filename) {
+ this.filename = filename;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/db/service/ExcelExportService.java b/src/main/java/com/fr/plugin/zk/stream/excel/db/service/ExcelExportService.java
new file mode 100644
index 0000000..77eadaf
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/db/service/ExcelExportService.java
@@ -0,0 +1,60 @@
+package com.fr.plugin.zk.stream.excel.db.service;
+
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.zk.stream.excel.db.dao.ExcelExportDao;
+import com.fr.plugin.zk.stream.excel.db.entity.ExcelExportEntity;
+import com.fr.stable.db.accessor.DBAccessor;
+import com.fr.stable.db.action.DBAction;
+import com.fr.stable.db.dao.DAOContext;
+import com.fr.stable.query.QueryFactory;
+import com.fr.stable.query.condition.QueryCondition;
+import com.fr.stable.query.restriction.impl.EqRestriction;
+
+public class ExcelExportService {
+
+ private ExcelExportService() {
+ }
+
+ private static class Hoder {
+ private static ExcelExportService excelExportService = new ExcelExportService();
+ }
+
+ public static ExcelExportService getSingleton() {
+ return Hoder.excelExportService;
+ }
+
+ private DBAccessor accessor = null;
+
+ public void init(DBAccessor accessor) {
+ this.accessor = accessor;
+ }
+
+
+ public void addOrUpdate(ExcelExportEntity entity) {
+ try {
+ accessor.runDMLAction(new DBAction() {
+ @Override
+ public Boolean run(DAOContext context) throws Exception {
+ context.getDAO(ExcelExportDao.class).addOrUpdate(entity);
+ return true;
+ }
+ });
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error("存储导出记录失败:" + e.getMessage(), e);
+ }
+ }
+
+ public ExcelExportEntity queryById(String id) throws Exception {
+ ExcelExportEntity entity = accessor.runQueryAction(new DBAction() {
+ @Override
+ public ExcelExportEntity run(DAOContext context) throws Exception {
+ QueryCondition queryCondition = QueryFactory.create();
+ queryCondition.addRestriction(new EqRestriction("id", id));
+ return context.getDAO(ExcelExportDao.class).findOne(queryCondition);
+ }
+ });
+ return entity;
+ }
+
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/dto/ExportDto.java b/src/main/java/com/fr/plugin/zk/stream/excel/dto/ExportDto.java
new file mode 100644
index 0000000..18ab78d
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/dto/ExportDto.java
@@ -0,0 +1,88 @@
+package com.fr.plugin.zk.stream.excel.dto;
+
+import com.fr.base.ServerConfig;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.zk.stream.excel.util.ExportUtil;
+import com.fr.stable.StringUtils;
+import com.fr.third.org.apache.commons.collections4.CollectionUtils;
+import com.fr.third.org.apache.commons.collections4.MapUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+/**
+ * @author fr.open
+ * @Project name finereport-gradle
+ * @description:
+ * @created on 2021-06-24 16:36.
+ * @Modified By
+ */
+public class ExportDto {
+
+ private String path;
+
+ private String filename;
+
+ private String username;
+
+ private String fullUrl;
+
+ private HashMap parameters = new HashMap<>();
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public HashMap getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(HashMap parameters) {
+ this.parameters = parameters;
+ }
+
+ public String getFilename() {
+ return filename;
+ }
+
+ public void setFilename(String filename) {
+ this.filename = filename;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public void setFullPath(HttpServletRequest req){
+ String path = getPath();
+ HashMap parameters = getParameters();
+ String root = ExportUtil.buildServerURL(req) + req.getContextPath() + "/" + ServerConfig.getInstance().getServletName();
+ String url = null;
+ if(StringUtils.isNotBlank(path)){
+ try {
+ url = root + "/view/report?viewlet=" + URLEncoder.encode(path, "UTF-8") + "&op=export&format=excel&extype=stream";
+ } catch (UnsupportedEncodingException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }else{
+ url = root + "/view/report?op=export&format=excel&extype=stream";
+ }
+ if(MapUtils.isNotEmpty(parameters)){
+ url = ExportUtil.appendUrlPara(url,getParameters());
+ }
+ this.fullUrl = url;
+ }
+
+ public String getFullUrl() {
+ return fullUrl;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/export/ExportAction.java b/src/main/java/com/fr/plugin/zk/stream/excel/export/ExportAction.java
new file mode 100644
index 0000000..beeaa7b
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/export/ExportAction.java
@@ -0,0 +1,103 @@
+package com.fr.plugin.zk.stream.excel.export;
+
+import com.fr.general.http.HttpClient;
+import com.fr.io.context.ResourceModuleContext;
+import com.fr.io.repository.ResourceRepository;
+import com.fr.io.repository.base.fs.FileSystemRepository;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.zk.stream.excel.db.entity.ExcelExportEntity;
+import com.fr.plugin.zk.stream.excel.db.service.ExcelExportService;
+import com.fr.plugin.zk.stream.excel.dto.ExportDto;
+import com.fr.plugin.zk.stream.excel.util.ExportUtil;
+import com.fr.stable.StringUtils;
+import com.fr.third.org.apache.poi.util.IOUtils;
+import com.fr.workspace.WorkContext;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.UUID;
+
+/**
+ * @author fr.open
+ * @Project finereport-gradle
+ * @description:
+ * @created on 2021-06-24 15:52.
+ * @Modified By
+ */
+public class ExportAction implements Runnable {
+
+ private HttpServletRequest req;
+ private ExportDto export;
+
+ public ExportAction(HttpServletRequest req, ExportDto exportDto) {
+ this.req = req;
+ this.export = exportDto;
+ }
+
+ @Override
+ public void run() {
+ String path = this.export.getPath();
+ HashMap parameters = this.export.getParameters();
+ String url = this.export.getFullUrl();
+ ExcelExportService excelExportService = ExcelExportService.getSingleton();
+ ExcelExportEntity entity = new ExcelExportEntity();
+ entity.setPath(path);
+ entity.setParameters(ExportUtil.writeToJson(parameters));
+ entity.setStartTime(new Date());
+ entity.setUsername(this.export.getUsername());
+ excelExportService.addOrUpdate(entity);
+ HttpClient client = new HttpClient(url);
+ client.asGet();
+ //file
+ String type = client.getHeaderField("extension");
+ if ("xlsx".equals(type)) {
+ try {
+ String filename = client.getHeaderField("Content-disposition").replace("attachment; filename=", "");
+ InputStream inputStream = client.getResponseStream();
+ Thread.sleep(1000);
+ filename = new String(filename.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
+ byte[] fileByte = new byte[inputStream.available()];
+ IOUtils.readFully(inputStream, fileByte);
+ inputStream.close();
+ String filepath = "/resources/excel/" + UUID.randomUUID().toString() + ".xlsx";
+ if (StringUtils.isNotBlank(this.export.getFilename())) {
+ entity.setFilename(this.export.getFilename());
+ } else {
+ entity.setFilename(filename.replace(".xlsx", ""));
+ }
+ entity.setStatus("完成");
+ entity.setFilePath(filepath);
+ entity.setFileSize(fileByte.length);
+ ResourceRepository repository = ResourceModuleContext.getManager().getCurrent();
+ if (repository instanceof FileSystemRepository) {
+ //本地 远程
+ WorkContext.getWorkResource().write(filepath, fileByte);
+ } else {
+ //集群 文件节点
+ ResourceModuleContext.getManager().getCurrent().write(filepath, fileByte);
+ }
+ entity.setEndTime(new Date());
+ excelExportService.addOrUpdate(entity);
+ } catch (Exception e) {
+ String message = "导出失败。详情:" + e.getMessage();
+ entity.setEndTime(new Date());
+ entity.setStatus("失败");
+ entity.setMessage(message);
+ FineLoggerFactory.getLogger().error(message, e);
+ }
+ } else {
+ // 存数据库
+ String text = client.getResponseText();
+ FineLoggerFactory.getLogger().error("导出失败。" + client.getResponseText());
+ entity.setEndTime(new Date());
+ entity.setStatus("失败");
+ entity.setMessage(text);
+ excelExportService.addOrUpdate(entity);
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/provider/DownloadProvider.java b/src/main/java/com/fr/plugin/zk/stream/excel/provider/DownloadProvider.java
new file mode 100644
index 0000000..4c9c25b
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/provider/DownloadProvider.java
@@ -0,0 +1,80 @@
+package com.fr.plugin.zk.stream.excel.provider;
+
+import com.fr.decision.fun.impl.BaseHttpHandler;
+import com.fr.io.context.ResourceModuleContext;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.zk.stream.excel.db.entity.ExcelExportEntity;
+import com.fr.plugin.zk.stream.excel.db.service.ExcelExportService;
+import com.fr.plugin.zk.stream.excel.util.ExportUtil;
+import com.fr.stable.StringUtils;
+import com.fr.third.springframework.web.bind.annotation.RequestMethod;
+import com.fr.third.v2.org.apache.poi.util.IOUtils;
+import com.fr.web.utils.WebUtils;
+import com.fr.workspace.WorkContext;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+public class DownloadProvider extends BaseHttpHandler {
+
+ @Override
+ public RequestMethod getMethod() {
+ return RequestMethod.GET;
+ }
+
+ @Override
+ public String getPath() {
+ return "/stream/download";
+ }
+
+ @Override
+ public boolean isPublic() {
+ return false;
+ }
+
+
+ @Override
+ public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception {
+ String username = ExportUtil.getLoginUserAndResponse(req, res);
+ if (StringUtils.isBlank(username)) {
+ return;
+ }
+ String id = WebUtils.getHTTPRequestParameter(req, "id");
+ ExcelExportEntity entity = ExcelExportService.getSingleton().queryById(id);
+ if (entity == null) {
+ res.setContentType("text/plain");
+ WebUtils.printAsString(res, "找不到对应数据");
+ } else {
+ try {
+ InputStream inputStream = read(entity.getFilePath());
+ if (inputStream == null) {
+ throw new Exception("找不到文件:" + entity.getFilePath());
+ }
+ res.setHeader("Content-Disposition", "attachment; filename="
+ + new String(entity.getFilename().concat(".xlsx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
+ res.setContentLength(entity.getFileSize());
+ res.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ IOUtils.copy(inputStream, res.getOutputStream());
+ } catch (Exception e) {
+ res.setContentType("text/plain");
+ WebUtils.printAsString(res, "找不到文件:" + entity.getFilePath());
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+ }
+
+ private InputStream read(String path) {
+ // 防止某些情况找不到文件
+ InputStream inputStream = ResourceModuleContext.getManager().getCurrent().read(path);
+ if (inputStream == null) {
+ inputStream = ResourceModuleContext.getManager().getCurrent().openStream(path);
+ }
+ if (inputStream == null) {
+ inputStream = WorkContext.getWorkResource().openStream(path);
+ }
+ return inputStream;
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/provider/ExportProvider.java b/src/main/java/com/fr/plugin/zk/stream/excel/provider/ExportProvider.java
new file mode 100644
index 0000000..e578a5d
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/provider/ExportProvider.java
@@ -0,0 +1,73 @@
+package com.fr.plugin.zk.stream.excel.provider;
+
+import com.fr.decision.fun.impl.BaseHttpHandler;
+import com.fr.decision.webservice.Response;
+import com.fr.decision.webservice.v10.user.UserService;
+import com.fr.intelli.record.Focus;
+import com.fr.intelli.record.Original;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.transform.ExecuteFunctionRecord;
+import com.fr.plugin.transform.FunctionRecorder;
+import com.fr.plugin.zk.stream.excel.dto.ExportDto;
+import com.fr.plugin.zk.stream.excel.export.ExportAction;
+import com.fr.plugin.zk.stream.excel.util.Constants;
+import com.fr.plugin.zk.stream.excel.util.ExportUtil;
+import com.fr.record.analyzer.EnableMetrics;
+import com.fr.stable.StringUtils;
+import com.fr.third.springframework.web.bind.annotation.RequestMethod;
+import com.fr.web.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@EnableMetrics
+@FunctionRecorder
+public class ExportProvider extends BaseHttpHandler {
+
+ @Override
+ public RequestMethod getMethod() {
+ return RequestMethod.POST;
+ }
+
+ @Override
+ public String getPath() {
+ return "/stream/export";
+ }
+
+ @Override
+ public boolean isPublic() {
+ return false;
+ }
+
+ @Focus(id = Constants.PLUGIN_ID, text = "Async export stream excel", source = Original.PLUGIN)
+ @ExecuteFunctionRecord
+ @Override
+ public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception {
+ res.setContentType("application/json; charset=UTF-8");
+ String username = ExportUtil.getLoginUserAndResponse(req, res);
+ if (StringUtils.isBlank(username)) {
+ return;
+ }
+ try {
+ String body = ExportUtil.requestBody2JsonString(req);
+ ExportDto exportDto = ExportUtil.OBJECT_MAPPER.readValue(body, ExportDto.class);
+ exportDto.setUsername(username);
+ exportDto.setFullPath(req);
+ ExecutorService service = Executors.newSingleThreadExecutor();
+ service.execute(new ExportAction(req, exportDto));
+ service.shutdown();
+ Response response = Response.success();
+ response.status(200);
+ WebUtils.printAsString(res, ExportUtil.OBJECT_MAPPER.writeValueAsString(response));
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error("获取参数失败:" + e.getMessage(), e);
+ Response response = Response.error(500, "", "获取参数失败,请填写正确的参数!");
+ WebUtils.printAsString(res, ExportUtil.OBJECT_MAPPER.writeValueAsString(response));
+ }
+
+ }
+
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/provider/MessageProvider.java b/src/main/java/com/fr/plugin/zk/stream/excel/provider/MessageProvider.java
new file mode 100644
index 0000000..53a31b4
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/provider/MessageProvider.java
@@ -0,0 +1,53 @@
+package com.fr.plugin.zk.stream.excel.provider;
+
+import com.fr.decision.fun.impl.BaseHttpHandler;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.zk.stream.excel.db.entity.ExcelExportEntity;
+import com.fr.plugin.zk.stream.excel.db.service.ExcelExportService;
+import com.fr.plugin.zk.stream.excel.util.ExportUtil;
+import com.fr.stable.StringUtils;
+import com.fr.third.springframework.web.bind.annotation.RequestMethod;
+import com.fr.web.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class MessageProvider extends BaseHttpHandler {
+
+ @Override
+ public RequestMethod getMethod() {
+ return RequestMethod.GET;
+ }
+
+ @Override
+ public String getPath() {
+ return "/stream/message";
+ }
+
+ @Override
+ public boolean isPublic() {
+ return false;
+ }
+
+ @Override
+ public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception {
+ String username = ExportUtil.getLoginUserAndResponse(req, res);
+ if (StringUtils.isBlank(username)) {
+ return;
+ }
+ String id = WebUtils.getHTTPRequestParameter(req, "id");
+ try {
+ ExcelExportEntity entity = ExcelExportService.getSingleton().queryById(id);
+ if (entity == null) {
+ WebUtils.printAsString(res, "找不到对应的消息");
+ } else {
+ res.setContentType("text/html; charset=gb2312");
+ WebUtils.printAsString(res, entity.getMessage()!=null?entity.getMessage():"无错误信息");
+ }
+ } catch (Exception e) {
+ WebUtils.printAsString(res, "找不到对应的消息");
+ FineLoggerFactory.getLogger().error(e.getMessage(),e);
+ }
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/util/Constants.java b/src/main/java/com/fr/plugin/zk/stream/excel/util/Constants.java
new file mode 100644
index 0000000..756b438
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/util/Constants.java
@@ -0,0 +1,9 @@
+package com.fr.plugin.zk.stream.excel.util;
+
+public interface Constants {
+ /***
+ * 插件id
+ */
+ String PLUGIN_ID = "com.fr.plugin.zk.jsd8101.excel";
+
+}
diff --git a/src/main/java/com/fr/plugin/zk/stream/excel/util/ExportUtil.java b/src/main/java/com/fr/plugin/zk/stream/excel/util/ExportUtil.java
new file mode 100644
index 0000000..188883d
--- /dev/null
+++ b/src/main/java/com/fr/plugin/zk/stream/excel/util/ExportUtil.java
@@ -0,0 +1,115 @@
+package com.fr.plugin.zk.stream.excel.util;
+
+import com.fr.decision.webservice.Response;
+import com.fr.decision.webservice.v10.user.UserService;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.CommonCodeUtils;
+import com.fr.stable.StringUtils;
+import com.fr.third.fasterxml.jackson.core.JsonProcessingException;
+import com.fr.third.fasterxml.jackson.databind.ObjectMapper;
+import com.fr.web.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * @author fr.open
+ * @Project name finereport-gradle
+ * @description:
+ * @created on 2021-06-24 16:01.
+ * @Modified By
+ */
+public class ExportUtil {
+
+ public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ public static String requestBody2JsonString(HttpServletRequest req) throws IOException {
+ String data = "";
+ StringBuffer stringBuffer = new StringBuffer();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(req.getInputStream(), StandardCharsets.UTF_8));
+ while (null != (data = reader.readLine())) {
+ stringBuffer.append(data);
+ }
+ return stringBuffer.toString();
+ }
+
+ public static String buildServerURL(HttpServletRequest req) {
+ StringBuffer serverURIBuf = new StringBuffer();
+ serverURIBuf.append("http");
+ serverURIBuf.append("://");
+ serverURIBuf.append("127.0.0.1");
+ serverURIBuf.append(':');
+ serverURIBuf.append(req.getServerPort());
+ return serverURIBuf.toString();
+ }
+
+ public static String writeToJson(Object o) {
+ try {
+ return OBJECT_MAPPER.writeValueAsString(o);
+ } catch (JsonProcessingException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return "";
+ }
+
+ public static String getLoginUserAndResponse(HttpServletRequest req, HttpServletResponse res) {
+ try {
+ res.setContentType("application/json; charset=UTF-8");
+ String username = UserService.getInstance().getUserByRequestCookie(req).getUserName();
+ if (StringUtils.isBlank(username)) {
+ Response response = Response.error(500, "", "用户未登录!");
+ WebUtils.printAsString(res, ExportUtil.OBJECT_MAPPER.writeValueAsString(response));
+ return null;
+ }
+ return username;
+ } catch (Exception e) {
+ res.setContentType("application/json; charset=UTF-8");
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ Response response = Response.error(500, "", "用户未登录!");
+ try {
+ WebUtils.printAsString(res, ExportUtil.OBJECT_MAPPER.writeValueAsString(response));
+ } catch (Exception exception) {
+ }
+ return null;
+ }
+ }
+
+ public static String appendUrlPara(String url,Map maps) {
+ if (maps != null) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(url);
+ Iterator iterator = maps.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry mapEntry = (Map.Entry) iterator.next();
+ builder.append('&');
+ builder.append(encodeString(mapEntry.getKey().toString(),true));
+ builder.append('=');
+ builder.append(encodeString(mapEntry.getValue().toString(),true));
+ }
+ return builder.toString();
+ }
+ return url;
+ }
+
+ public static String encodeString(String var1, boolean var2) {
+ String var3 = CommonCodeUtils.cjkEncode(var1);
+ if (!var2) {
+ return var3;
+ } else {
+ try {
+ return URLEncoder.encode(var3, "UTF-8");
+ } catch (UnsupportedEncodingException var5) {
+ return var3;
+ }
+ }
+ }
+
+}
diff --git a/使用说明文档.docx b/使用说明文档.docx
new file mode 100644
index 0000000..479b2e8
Binary files /dev/null and b/使用说明文档.docx differ