Commit 4b1d4a85 authored by hcing's avatar hcing

统计综合导出修改获取数据方式,多次异步循环调用分页接口

parent 32574599
...@@ -14,6 +14,7 @@ import com.yeejoin.amos.boot.biz.common.entity.DataDictionary; ...@@ -14,6 +14,7 @@ import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.excel.ExcelUtil; import com.yeejoin.amos.boot.biz.common.excel.ExcelUtil;
import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl; import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils; import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.biz.common.utils.RequestContextWrapper;
import com.yeejoin.amos.boot.module.common.api.dto.TechParamItem; import com.yeejoin.amos.boot.module.common.api.dto.TechParamItem;
import com.yeejoin.amos.boot.module.common.api.entity.ESEquipmentInfo; import com.yeejoin.amos.boot.module.common.api.entity.ESEquipmentInfo;
import com.yeejoin.amos.boot.module.common.biz.utils.TechParamUtil; import com.yeejoin.amos.boot.module.common.biz.utils.TechParamUtil;
...@@ -71,6 +72,10 @@ import java.time.LocalDate; ...@@ -71,6 +72,10 @@ import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -111,6 +116,8 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -111,6 +116,8 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
private final String or = "or"; private final String or = "or";
private final String and = "and"; private final String and = "and";
private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
@Autowired @Autowired
EquipmentCategoryMapper equipmentCategoryMapper; EquipmentCategoryMapper equipmentCategoryMapper;
...@@ -1907,10 +1914,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1907,10 +1914,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
// 开始下载提醒 // 开始下载提醒
this.startDownLoadMsg(fileName, uuid); this.startDownLoadMsg(fileName, uuid);
// 查询数据 // 查询数据
JSONObject jsonData = this.queryForPage(filter); JSONArray records = this.exportDataAsyncBatchSerach(filter);
// 获取 result -> pageData -> records
JSONObject pageData = jsonData.getJSONObject("pageData");
JSONArray records = pageData.getJSONArray("records");
MultipartFile templateExcelFile; MultipartFile templateExcelFile;
// 数据转化 + 附件生成 // 数据转化 + 附件生成
if (StatisticalAnalysisEnum.equip.getCode().equals(businessType)) { if (StatisticalAnalysisEnum.equip.getCode().equals(businessType)) {
...@@ -1931,6 +1935,50 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1931,6 +1935,50 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
.fluentPut("time", new Date().getTime())); .fluentPut("time", new Date().getTime()));
} }
public JSONArray exportDataAsyncBatchSerach(JSONObject filter) {
JSONArray result = new JSONArray();
int PAGE_SIZE = 1000;
// 查询首页数据
filter.fluentPut("size", PAGE_SIZE).fluentPut("current", 1);
JSONObject jsonData1 = this.queryForPage(filter);
// 获取 result -> pageData -> records
JSONObject pageData1 = jsonData1.getJSONObject("pageData");
JSONArray records1 = pageData1.getJSONArray("records");
result.addAll(records1);
long total = pageData1.getLong("total");
int totalPage = (int) Math.ceil((double) total / PAGE_SIZE);
// 用于收集所有分页结果
List<CompletableFuture<JSONArray>> futures = new ArrayList<>();
RequestContextWrapper contextWrapper = RequestContextWrapper.capture();
// 多线程处理从第2页开始的数据
for (int i = 2; i <= totalPage; i++) {
int pageIndex = i;
CompletableFuture<JSONArray> future = CompletableFuture.supplyAsync(() -> {
// 恢复上下文到子线程
contextWrapper.apply();
filter.fluentPut("size", PAGE_SIZE).fluentPut("current", pageIndex);
JSONObject jsonData2 = this.queryForPage(filter);
// 获取 result -> pageData -> records
JSONObject pageData2 = jsonData2.getJSONObject("pageData");
return pageData2.getJSONArray("records");
}, executorService);
futures.add(future);
}
// 等待所有线程完成
for (CompletableFuture<JSONArray> future : futures) {
try {
result.addAll(future.get());
} catch (InterruptedException | ExecutionException e) {
log.error("分页查询线程执行失败", e);
}
}
return result;
}
private static MultipartFile getEquipMultipartFile(JSONArray records, String fileName, String sheetName) { private static MultipartFile getEquipMultipartFile(JSONArray records, String fileName, String sheetName) {
MultipartFile templateExcelFile; MultipartFile templateExcelFile;
List<EquipInfoVo> exportData = new ArrayList<>(); List<EquipInfoVo> exportData = new ArrayList<>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment