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

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

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