提交 d4c86aa5 authored 作者: 吕本才's avatar 吕本才

1、区分多线程和单线程查询

上级 3e75da50
......@@ -35,6 +35,7 @@ import org.springframework.util.MimeType;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.*;
......@@ -46,7 +47,6 @@ import java.util.stream.Collectors;
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
// 指定不同的数据源
@Slf4j
@Service
public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetailMapper, FinanceOrderDetail> implements FinanceOrderDetailService {
......@@ -59,117 +59,147 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
// private Executor defaultExecutor;
@Override
public PageInfo<FinanceBiListDto> selectBiFinanceCostList(FinanceCostVo financeCostVo) {
PageInfo<FinanceBiListDto> pageInfo = new PageInfo<>();
// 多线程,设置不同线程的参数
// 多线程查询
// 创建一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 创建一个任务列表
List<Callable<PageInfo<FinanceOrderDetail>>> tasks = new ArrayList<>();
log.info("多线程开始");
log.info("00000000000000");
List<Date[]> dates = DateUtils.splitTimeInterval(financeCostVo.getStartDate(), financeCostVo.getEndDate());
CountDownLatch endLock = new CountDownLatch(dates.size()); // 假设我们有多个查询条件,每个条件对应一个任务
BlockingQueue<Future<PageInfo<FinanceOrderDetail>>> queue = new LinkedBlockingQueue<>();
PageInfo<FinanceOrderDetail> orderDetailPageInfo = new PageInfo<>();
long total = 0;
int pages = 1;
List<FinanceOrderDetail> aggregatedResult = new ArrayList<>();
try {
for (int i = 0; i < dates.size(); i++) {
FinanceCostWq wq = covertFinanceCostThreadWq(financeCostVo, dates, i);
Future<PageInfo<FinanceOrderDetail>> future = executorService.submit(new Callable<PageInfo<FinanceOrderDetail>>() {
@Override
public PageInfo<FinanceOrderDetail> call() throws Exception {
PageInfo<FinanceOrderDetail> detailPageInfo = detailDao.selectBiFinanceCostList(wq);
endLock.countDown();
return detailPageInfo;
}
});
queue.add(future);
}
endLock.await();
// 汇聚结果
for (Future<PageInfo<FinanceOrderDetail>> future : queue) {
// 获取结果
PageInfo<FinanceOrderDetail> financeOrderDetailPageInfo = future.get();
orderDetailPageInfo = financeOrderDetailPageInfo;
pages = Math.max(pages, financeOrderDetailPageInfo.getPages());
total = Math.max(total, financeOrderDetailPageInfo.getTotal());
aggregatedResult.addAll(financeOrderDetailPageInfo.getList());
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
log.error(e.getMessage(), e);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
} finally {
// 关闭线程池
executorService.shutdown();
if (dates.size() == 0) {
return pageInfo;
}
PageInfo<FinanceBiListDto> pageInfo = new PageInfo<>();
BeanUtils.copyProperties(orderDetailPageInfo, pageInfo);
pageInfo.setPages(pages);
pageInfo.setTotal(total);
// 分组求和aggregatedResult
Set<String> preSet = new HashSet<>();
Map<String, FinanceBiListDto> existMap = new HashMap<>();
for (int i = 0; i < aggregatedResult.size(); i++) {
FinanceOrderDetail item = aggregatedResult.get(i);
// 判断几个字段 组合
String key = getKey(item, financeCostVo);
if (preSet.contains(key)) {
// 直接继续求和
FinanceBiListDto dto = existMap.get(key);
dto.setShareAmountSum(dto.getShareAmountSum().add(item.getShareAmountSum()));
dto.setActualCostSum(dto.getActualCostSum().add(item.getSumActualCostSum()));
dto.setStandardCostSum(dto.getStandardCostSum().add(item.getSumStandardCostSum()));
} else {
if (dates.size() == 1) {
FinanceCostWq qw = covertFinanceCostWq(financeCostVo);
PageInfo<FinanceOrderDetail> orderDetailPageInfo = detailDao.selectBiFinanceCostList(qw);
BeanUtils.copyProperties(orderDetailPageInfo, pageInfo);
pageInfo.setList(orderDetailPageInfo.getList().stream().map(item -> {
FinanceBiListDto dto = new FinanceBiListDto();
BeanUtils.copyProperties(item, dto);
dto.setActualCostSum(item.getSumActualCostSum());
dto.setStandardCostSum(item.getSumStandardCostSum());
dto.setShareAmountSum(item.getShareAmountSum().setScale(2, BigDecimal.ROUND_HALF_UP));
dto.setActualCostGrossProfitSum(dto.getShareAmountSum().subtract(dto.getActualCostSum()).setScale(2, BigDecimal.ROUND_HALF_UP));
dto.setStandardCostGrossProfitSum(dto.getShareAmountSum().subtract(dto.getStandardCostSum()).setScale(2, BigDecimal.ROUND_HALF_UP));
dto.setUid(IdUtil.simpleUUID());
existMap.put(key, dto);
return dto;
}).collect(Collectors.toList()));
return pageInfo;
}
if (dates.size() > 1) {
// 多线程查询
// 创建一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(20);
// 创建一个任务列表
List<Callable<PageInfo<FinanceOrderDetail>>> tasks = new ArrayList<>();
final CountDownLatch endLock = new CountDownLatch(dates.size()); // 假设我们有多个查询条件,每个条件对应一个任务
BlockingQueue<Future<PageInfo<FinanceOrderDetail>>> queue = new LinkedBlockingQueue<>();
PageInfo<FinanceOrderDetail> orderDetailPageInfo = new PageInfo<>();
long total = 0;
int pages = 1;
log.info("1111111");
List<FinanceOrderDetail> aggregatedResult = new ArrayList<>();
try {
for (int i = 0; i < dates.size(); i++) {
FinanceCostWq wq = covertFinanceCostThreadWq(financeCostVo, dates, i);
Future<PageInfo<FinanceOrderDetail>> future = executorService.submit(new Callable<PageInfo<FinanceOrderDetail>>() {
@Override
public PageInfo<FinanceOrderDetail> call() throws Exception {
PageInfo<FinanceOrderDetail> detailPageInfo = detailDao.selectBiFinanceCostList(wq);
log.info("dddddddd");
endLock.countDown();
log.info("{} has finished the job!");
return detailPageInfo;
}
});
queue.add(future);
}
endLock.await();
log.info("终于轮到我了1-" + queue.size());
log.info("终于轮到我了2-" + queue.size());
// 汇聚结果
for (Future<PageInfo<FinanceOrderDetail>> future : queue) {
// 获取结果
PageInfo<FinanceOrderDetail> financeOrderDetailPageInfo = future.get();
orderDetailPageInfo = financeOrderDetailPageInfo;
pages = Math.max(pages, financeOrderDetailPageInfo.getPages());
total = Math.max(total, financeOrderDetailPageInfo.getTotal());
aggregatedResult.addAll(financeOrderDetailPageInfo.getList());
}
BeanUtils.copyProperties(orderDetailPageInfo, pageInfo);
pageInfo.setPages(pages);
pageInfo.setTotal(total);
// 分组求和aggregatedResult
Set<String> preSet = new HashSet<>();
Map<String, FinanceBiListDto> existMap = new HashMap<>();
for (int i = 0; i < aggregatedResult.size(); i++) {
FinanceOrderDetail item = aggregatedResult.get(i);
// 判断几个字段 组合
String key = getKey(item, financeCostVo);
if (preSet.contains(key)) {
// 直接继续求和
FinanceBiListDto dto = existMap.get(key);
dto.setShareAmountSum(dto.getShareAmountSum().add(item.getShareAmountSum()));
dto.setActualCostSum(dto.getActualCostSum().add(item.getSumActualCostSum()));
dto.setStandardCostSum(dto.getStandardCostSum().add(item.getSumStandardCostSum()));
} else {
FinanceBiListDto dto = new FinanceBiListDto();
BeanUtils.copyProperties(item, dto);
dto.setActualCostSum(item.getSumActualCostSum());
dto.setStandardCostSum(item.getSumStandardCostSum());
dto.setUid(IdUtil.simpleUUID());
existMap.put(key, dto);
}
}
List<FinanceBiListDto> valueList = new ArrayList<>(existMap.values());
pageInfo.setList(valueList);
// 计算实际成本毛利 标准成本毛利
pageInfo.setList(valueList.stream().map(item -> {
FinanceBiListDto dto = new FinanceBiListDto();
BeanUtils.copyProperties(item, dto);
dto.setShareAmountSum(item.getShareAmountSum().setScale(2, BigDecimal.ROUND_HALF_UP));
dto.setActualCostGrossProfitSum(dto.getShareAmountSum().subtract(dto.getActualCostSum()).setScale(2, BigDecimal.ROUND_HALF_UP));
dto.setStandardCostGrossProfitSum(dto.getShareAmountSum().subtract(dto.getStandardCostSum()).setScale(2, BigDecimal.ROUND_HALF_UP));
dto.setUid(IdUtil.simpleUUID());
return dto;
}).collect(Collectors.toList()));
log.info("完成数据整合");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
log.error(e.getMessage(), e);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage(), e);
} finally {
// endLock.countDown();
// 关闭线程池
executorService.shutdown();
}
}
List<FinanceBiListDto> valueList = new ArrayList<>(existMap.values());
pageInfo.setList(valueList);
// pageInfo.setList(aggregatedResult.stream().map(item -> {
// FinanceBiListDto dto = new FinanceBiListDto();
// BeanUtils.copyProperties(item, dto);
// dto.setActualCostSum(item.getSumActualCostSum());
// dto.setStandardCostSum(item.getSumStandardCostSum());
// dto.setShareAmountSum(item.getShareAmountSum().setScale(2, BigDecimal.ROUND_HALF_UP));
// dto.setActualCostGrossProfitSum(dto.getShareAmountSum().subtract(dto.getActualCostSum()).setScale(2, BigDecimal.ROUND_HALF_UP));
// dto.setStandardCostGrossProfitSum(dto.getShareAmountSum().subtract(dto.getStandardCostSum()).setScale(2, BigDecimal.ROUND_HALF_UP));
// dto.setUid(IdUtil.simpleUUID());
// return dto;
// }).collect(Collectors.toList()));
return pageInfo;
}
private String getKey(FinanceOrderDetail item, FinanceCostVo financeCostVo) {
//根据入参条件决定key
String key = "";
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getZbjQdTypeAll()) ||
ObjectUtil.isNotEmpty(financeCostVo.getZbjQdType())) {
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getZbjQdTypeAll()) || ObjectUtil.isNotEmpty(financeCostVo.getZbjQdType())) {
key = key + "#" + item.getZbjQdType();
}
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getFlavorAll()) ||
ObjectUtil.isNotEmpty(financeCostVo.getFlavor())) {
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getFlavorAll()) || ObjectUtil.isNotEmpty(financeCostVo.getFlavor())) {
key = key + "#" + item.getFlavorErp();
}
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getSpecNameAll()) ||
ObjectUtil.isNotEmpty(financeCostVo.getSpecName())) {
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getSpecNameAll()) || ObjectUtil.isNotEmpty(financeCostVo.getSpecName())) {
key = key + "#" + item.getSpecName();
}
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getSeriesAll()) ||
ObjectUtil.isNotEmpty(financeCostVo.getSeries())) {
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getSeriesAll()) || ObjectUtil.isNotEmpty(financeCostVo.getSeries())) {
key = key + "#" + item.getSeries();
}
if (ObjectUtil.isEmpty(key)) {
......@@ -266,10 +296,7 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
financeCostVo.setPageSize(1000000);
PageInfo<FinanceOrderDetailListDto> financeBiListDtoPageInfo = this.selectBiFinanceCostDetailPage(financeCostVo);
// easyExcel导出数据
String fileNameOri = String.format("王小卤成本核算%s-%s%s信息-%s.xlsx", DateUtil.format(financeCostVo.getStartDate(), "yyyyMMdd"),
DateUtil.format(financeCostVo.getEndDate(), "yyyyMMdd"),
financeCostVo.getTypeName(),
DateUtil.format(new Date(), "MMdd"));
String fileNameOri = String.format("王小卤成本核算%s-%s%s信息-%s.xlsx", DateUtil.format(financeCostVo.getStartDate(), "yyyyMMdd"), DateUtil.format(financeCostVo.getEndDate(), "yyyyMMdd"), financeCostVo.getTypeName(), DateUtil.format(new Date(), "MMdd"));
// 文件名中文名需要转义
String fileName = null;
try {
......@@ -320,15 +347,10 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
//设置 水平居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
Collection<?> dataList = financeBiListDtoPageInfo.getList();
EasyExcel.write(response.getOutputStream(), FinanceExportOrderDetailListDto.class)
.autoCloseStream(Boolean.TRUE)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//自动列宽策略
EasyExcel.write(response.getOutputStream(), FinanceExportOrderDetailListDto.class).autoCloseStream(Boolean.TRUE).excelType(ExcelTypeEnum.XLSX).registerWriteHandler(horizontalCellStyleStrategy).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//自动列宽策略
.sheet(financeCostVo.getTypeName())
//获取数据填充
.doWrite(dataList);
......@@ -352,10 +374,7 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
PageInfo<FinanceBiListDto> financeBiListDtoPageInfo = this.selectBiFinanceCostList(financeCostVo);
// easyExcel导出数据
String fileNameOri = String.format("王小卤成本核算%s-%s%s-%s.xlsx", DateUtil.format(financeCostVo.getStartDate(), "yyyyMMdd"),
DateUtil.format(financeCostVo.getEndDate(), "yyyyMMdd"),
financeCostVo.getTypeName(),
DateUtil.format(new Date(), "MMdd"));
String fileNameOri = String.format("王小卤成本核算%s-%s%s-%s.xlsx", DateUtil.format(financeCostVo.getStartDate(), "yyyyMMdd"), DateUtil.format(financeCostVo.getEndDate(), "yyyyMMdd"), financeCostVo.getTypeName(), DateUtil.format(new Date(), "MMdd"));
// 文件名中文名需要转义
String fileName = null;
try {
......@@ -405,15 +424,10 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
contentWriteCellStyle.setWriteFont(contentWriteFont);
//设置 水平居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
Collection<?> dataList = financeBiListDtoPageInfo.getList();
EasyExcel.write(response.getOutputStream(), FinanceExportBiListDto.class)
.autoCloseStream(Boolean.TRUE)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//自动列宽策略
EasyExcel.write(response.getOutputStream(), FinanceExportBiListDto.class).autoCloseStream(Boolean.TRUE).excelType(ExcelTypeEnum.XLSX).registerWriteHandler(horizontalCellStyleStrategy).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())//自动列宽策略
.sheet(financeCostVo.getTypeName())
//获取数据填充
.doWrite(dataList);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论