diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java index c5ea6cc..741bf57 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java @@ -32,7 +32,6 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 组合搜索前端控制器 @@ -233,10 +232,8 @@ public class SearchController { String userId = auth.getPrincipal().toString(); MetaTableExport export = ExportCache.getCache(userId, null); if (export == null) { - int count = metadataDataService.count(metadata, condition); MetaTableExport newExport = new MetaTableExport(userId, metadata); - newExport.queryData((o) -> metadataDataService.queryDataByHandler(metadata, condition, newExport)); - newExport.setDataCount(count); + newExport.setQueryHandler((list) -> list.addAll(metadataDataService.list(metadata, condition))); export = newExport; ExportCache.startExport(export); } diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataDataService.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataDataService.java index 6d88860..cb9abc3 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataDataService.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataDataService.java @@ -6,6 +6,7 @@ import com.keyware.shandan.browser.entity.SearchConditionVo; import org.apache.ibatis.session.ResultHandler; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -19,5 +20,8 @@ public interface MetadataDataService { int count(MetadataBasicVo metadata, SearchConditionVo condition); + List> list(MetadataBasicVo metadata, SearchConditionVo condition); + void queryDataByHandler(MetadataBasicVo metadata, SearchConditionVo condition, ResultHandler> handler); + } diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/impl/MetadataDataServiceImpl.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/impl/MetadataDataServiceImpl.java index 9294a7a..8eb170d 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/impl/MetadataDataServiceImpl.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/impl/MetadataDataServiceImpl.java @@ -75,6 +75,15 @@ public class MetadataDataServiceImpl implements MetadataDataService { return dynamicDatasourceMapper.count(sql); } + @Override + public List> list(MetadataBasicVo metadata, SearchConditionVo condition) { + String sql = getQuerySql(metadata, condition); + sql += condition.getOrderBySql(); + List> list = dynamicDatasourceMapper.list(sql); + list.forEach(item-> item.entrySet().forEach(this::convertBigTextField)); + return list; + } + @Override public void queryDataByHandler(MetadataBasicVo metadata, SearchConditionVo condition, ResultHandler> handler) { String sql = getQuerySql(metadata, condition); diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/ExportProgress.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/ExportProgress.java index f073285..b9c370a 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/ExportProgress.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/ExportProgress.java @@ -60,7 +60,7 @@ public abstract class ExportProgress implements Runnable, Serializable { * @return */ public boolean getIsDone() { - return currentStep == getStepTotal(); + return currentStep >= getStepTotal() && this.currentStep > 0 && this.getStepTotal() > 0; } protected void setDone() { diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/MetaTableExport.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/MetaTableExport.java index 1d19e30..8fcf74c 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/MetaTableExport.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/export/MetaTableExport.java @@ -3,37 +3,32 @@ package com.keyware.shandan.bianmu.export; import cn.hutool.core.collection.CollUtil; import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.ExcelUtil; -import cn.hutool.poi.excel.ExcelWriter; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.keyware.shandan.bianmu.entity.MetadataBasicVo; import com.keyware.shandan.bianmu.service.MetadataService; -import com.keyware.shandan.common.util.StreamUtil; import com.keyware.shandan.common.util.StringUtils; import com.keyware.shandan.frame.config.component.AppContext; -import org.apache.ibatis.session.ResultContext; -import org.apache.ibatis.session.ResultHandler; import java.io.File; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.stream.Collectors; -public class MetaTableExport extends ExportProgress implements ResultHandler> { +public class MetaTableExport extends ExportProgress { private final MetadataBasicVo metadata; - private Consumer queryFunc; private final String fileName; - private JSONArray colsArray; private final MetadataService metadataService; // 所有行的集合 - private List> rowList = new ArrayList<>(); + private final List> rowList = new ArrayList<>(); // 字段列名集合 - private List colNameList = new ArrayList<>(); - private int dataTotal; + private final List colNameList = new ArrayList<>(); + private final List> datas = new ArrayList<>(); + private Consumer>> queryHandler; + private boolean isDone = false; public MetaTableExport(String userId, MetadataBasicVo metadata) { super(userId); @@ -49,7 +44,7 @@ public class MetaTableExport extends ExportProgress implements ResultHandler { @@ -60,26 +55,37 @@ public class MetaTableExport extends ExportProgress implements ResultHandler> rows = CollUtil.newArrayList(rowList); //通过工具类创建writer - ExcelWriter writer = ExcelUtil.getWriter(file); + BigExcelWriter writer = ExcelUtil.getBigWriter(file); + + this.setTitle("正在写入缓存"); + this.autoAddStep(); //一次性写出内容 writer.write(rows); - //关闭writer,释放内存 + + this.setTitle("正在写入文件"); + this.autoAddStep(); + //写入文件后关闭writer,释放内存 writer.close(); + + this.autoAddStep(); this.setTitle("数据文件准备完毕,开始下载"); - this.setDone(); + isDone = true; } catch (Exception e) { + e.printStackTrace(); this.error = true; this.setTitle("准备数据时出现异常"); this.clean(); @@ -88,7 +94,7 @@ public class MetaTableExport extends ExportProgress implements ResultHandler> context) { - Map data = context.getResultObject(); - // 遍历字段列名,获取对应数据并拼接成列的集合 - List cells = colNameList.stream().map(col -> { - Object value = data.get(col); - value = value == null ? "" : value; - return String.valueOf(value); - }).collect(Collectors.toList()); - rowList.add(cells); - this.autoAddStep(); + public void handleResult() { + for (Map data : this.datas) { + // 遍历字段列名,获取对应数据并拼接成列的集合 + List cells = colNameList.stream().map(col -> { + Object value = data.get(col); + value = value == null ? "" : value; + return String.valueOf(value); + }).collect(Collectors.toList()); + rowList.add(cells); + } } - public void queryData(Consumer query) { - this.queryFunc = query; + public void setQueryHandler(Consumer>> handler) { + this.queryHandler = handler; } - public void setDataCount(int count) { - this.dataTotal = count; + @Override + public boolean getIsDone() { + return isDone; } } diff --git a/shandan-system/src/main/java/com/keyware/shandan/datasource/mapper/DynamicDatasourceMapper.java b/shandan-system/src/main/java/com/keyware/shandan/datasource/mapper/DynamicDatasourceMapper.java index 802c0f2..8ff3d84 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/datasource/mapper/DynamicDatasourceMapper.java +++ b/shandan-system/src/main/java/com/keyware/shandan/datasource/mapper/DynamicDatasourceMapper.java @@ -25,6 +25,7 @@ import java.util.Map; public interface DynamicDatasourceMapper { @Select("${sql}") + @ResultType(HashMap.class) List> list(String sqlStr); @Select("${sql}")