提交 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,22 +59,47 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
// private Executor defaultExecutor;
@Override
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<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<>();
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++) {
......@@ -83,7 +108,9 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
@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;
}
});
......@@ -91,6 +118,9 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
}
endLock.await();
log.info("终于轮到我了1-" + queue.size());
log.info("终于轮到我了2-" + queue.size());
// 汇聚结果
for (Future<PageInfo<FinanceOrderDetail>> future : queue) {
// 获取结果
......@@ -100,18 +130,7 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
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();
}
PageInfo<FinanceBiListDto> pageInfo = new PageInfo<>();
BeanUtils.copyProperties(orderDetailPageInfo, pageInfo);
pageInfo.setPages(pages);
pageInfo.setTotal(total);
......@@ -139,37 +158,48 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
}
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()));
// 计算实际成本毛利 标准成本毛利
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();
}
}
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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论