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

1、增加店铺筛选,

2、增加多线程优化
上级 33f9deec
......@@ -11,7 +11,7 @@ import com.link.bi.domain.wq.FinanceCostWq;
*/
public interface IFinanceOrderDetailDao {
PageInfo<FinanceOrderDetail> selectBiFinanceCostList(FinanceCostWq qw);
PageInfo<FinanceOrderDetail> selectBiFinanceCostList(FinanceCostWq wq);
PageInfo<FinanceOrderDetail> selectBiFinanceCostDetailList(FinanceCostWq qw);
PageInfo<FinanceOrderDetail> selectBiFinanceCostDetailList(FinanceCostWq wq);
}
......@@ -5,13 +5,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 旺店通订单明细表 wangdiantong_order_detail
......@@ -290,142 +286,9 @@ public class FinanceOrderDetail {
@TableField(exist = false)
private String queryType;
/**
* 是否删除标志0未删除1已删除
*/
private String delFlag;
public String getFenxiaoId(FinanceOrder order, Long tradeId) {
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(order.getFenxiaoNick())) {
String id = extractDistributorId(order.getFenxiaoNick());
return id;
}
return "";
}
/**
* 从输入字符串中提取分销商 ID
*
* @param input 包含分销商 ID 的字符串
* @return 提取出的分销商 ID,如果未找到则返回空字符串
*/
public String extractDistributorId(String input) {
// 使用正则表达式匹配id
Pattern pattern = Pattern.compile("id:(\\d+);");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
public String extractDistributorName(String input) {
// 使用正则表达式匹配逗号后面的字符
Pattern pattern = Pattern.compile(";(.*)】");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
/**
* 根据订单和交易 ID 获取分销商名称
*
* @param order 订单
* @param tradeId 交易 ID
* @return 分销商名称,如果未找到则返回空字符串
*/
public String getFenxiaoName(FinanceOrder order, Long tradeId) {
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(order.getFenxiaoNick())) {
String id = extractDistributorName(order.getFenxiaoNick());
return id;
}
return "";
}
public String getFenxiaoNick(FinanceOrder order) {
return order.getFenxiaoNick();
}
public String extractByRegex(String input, String regex) {
// 使用正则表达式匹配逗号后面的字符
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
public String getZbjName(String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjName())) {
return sameDetail.getZbjName();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("直播")) {
return extractByRegex(remark, "“【直播】”([^;;]*)");
}
return null;
}
public String getZbjId(String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjId())) {
return sameDetail.getZbjId();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("直播间id")) {
return extractByRegex(remark, "直播间id:([^;;]\\d+)");
}
return null;
}
/**
* 根据分销商和remark备注信息获取主播Id
* @param fenxiaoId
* @param remark
* @param sameDetail
* @return
*/
public String getZbjZbId(String fenxiaoId, String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(fenxiaoId)) {
return fenxiaoId;
}
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjZbId())) {
return sameDetail.getZbjZbId();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("主播id")) {
return extractByRegex(remark, "主播id:([^;;]\\d+)");
}
return null;
}
public String getZbjSaleType(String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjSaleType())) {
return sameDetail.getZbjSaleType();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("销售类型:")) {
return extractByRegex(remark, "销售类型:([^;;]*);");
}
return null;
}
public String getZbjQdType(String fenxiaoId, String zbjZbId, Map<String, String> baseZbjType) {
if (ObjectUtils.isNotEmpty(fenxiaoId)) {
zbjZbId = fenxiaoId;
}
String zbjType = baseZbjType.get(zbjZbId);
if (ObjectUtils.isNotEmpty(zbjZbId) && ObjectUtils.isEmpty(zbjType)) {
return baseZbjType.get("其他分销名称");
}
return zbjType;
}
}
......@@ -7,6 +7,10 @@ import java.util.List;
@Data
public class FinanceCostVo {
// 平台id
private String platformId;
// 商铺
private List<String> shopNo;
// 入参 分页当前页
private Integer pageNum = 1;
......
......@@ -35,10 +35,9 @@ 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.Collection;
import java.util.Date;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
......@@ -55,28 +54,130 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
@Autowired
IFinanceOrderDetailDao detailDao;
// @Autowired
// private Executor defaultExecutor;
@Override
public PageInfo<FinanceBiListDto> selectBiFinanceCostList(FinanceCostVo financeCostVo) {
FinanceCostWq qw = covertFinanceCostWq(financeCostVo);
// 多线程,设置不同线程的参数
// 多线程查询
// 创建一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 创建一个任务列表
List<Callable<PageInfo<FinanceOrderDetail>>> tasks = new ArrayList<>();
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();
}
PageInfo<FinanceOrderDetail> orderDetailPageInfo = detailDao.selectBiFinanceCostList(qw);
PageInfo<FinanceBiListDto> pageInfo = new PageInfo<>();
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()));
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(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())) {
key = key + "#" + item.getZbjQdType();
}
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())) {
key = key + "#" + item.getSpecName();
}
if (ObjectUtil.equals(Boolean.TRUE, financeCostVo.getSeriesAll()) ||
ObjectUtil.isNotEmpty(financeCostVo.getSeries())) {
key = key + "#" + item.getSeries();
}
if (ObjectUtil.isEmpty(key)) {
key = item.getZbjQdType();
}
return key;
}
private FinanceCostWq covertFinanceCostWq(FinanceCostVo financeCostVo) {
FinanceCostWq qw = new FinanceCostWq();
BeanUtils.copyProperties(financeCostVo, qw);
......@@ -92,6 +193,29 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
return qw;
}
/**
* 转换成
*
* @param financeCostVo
* @param intervals
* @param i
* @return
*/
private FinanceCostWq covertFinanceCostThreadWq(FinanceCostVo financeCostVo, List<Date[]> intervals, int i) {
FinanceCostWq qw = new FinanceCostWq();
BeanUtils.copyProperties(financeCostVo, qw);
// 初始化开始日期和结束日期
if (ObjectUtil.isNotEmpty(intervals)) {
qw.setStartDate(DateUtils.dateStart(DateUtils.dateStart(intervals.get(i)[0])));
qw.setEndDate(DateUtils.dateStart(DateUtils.dateStart(DateUtils.addDays(intervals.get(i)[1], 1))));
} else {
//默认 t-1 天的数据查询
qw.setEndDate(DateUtils.dateStart(new Date()));
qw.setStartDate(DateUtils.dateStart(DateUtils.addDays(new Date(), -1)));
}
return qw;
}
@Override
public PageInfo<FinanceOrderDetailListDto> selectBiFinanceCostDetailPage(FinanceCostVo financeCostVo) {
FinanceCostWq qw = covertFinanceCostWq(financeCostVo);
......@@ -104,7 +228,7 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
BeanUtils.copyProperties(item, dto);
// 转换数据
// 交易时间 毫秒转时间
dto.setTradeTime(DateUtil.format(new Date(Long.parseLong(dto.getTradeTime())),"yyyy-MM-dd HH:mm:ss"));
dto.setTradeTime(DateUtil.format(new Date(Long.parseLong(dto.getTradeTime())), "yyyy-MM-dd HH:mm:ss"));
// 订单状态 转换 96 成本确认 110 已完成
if (dto.getTradeStatus().equals("96")) {
dto.setTradeStatus("成本确认");
......@@ -142,10 +266,10 @@ 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"),
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(new Date(), "MMdd"));
// 文件名中文名需要转义
String fileName = null;
try {
......@@ -228,10 +352,10 @@ 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"),
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(new Date(), "MMdd"));
// 文件名中文名需要转义
String fileName = null;
try {
......@@ -294,10 +418,10 @@ public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetai
//获取数据填充
.doWrite(dataList);
} catch (UnsupportedEncodingException e) {
log.error("编码异常"+e.getMessage(),e);
log.error("编码异常" + e.getMessage(), e);
throw new RuntimeException(e);
} catch (IOException e) {
log.error("IO异常"+e.getMessage(),e);
log.error("IO异常" + e.getMessage(), e);
throw new RuntimeException(e);
}
}
......
......@@ -6,29 +6,29 @@
<!-- 根据 聚合类型和值 查询聚合记录 -->
<select id="selectBiFinanceCostList" resultMap="BaseResultMap">
select
<if test=" (wq.zbjQdType == null or wq.zbjQdType.isEmpty() )
and (wq.goodsName== null or wq.goodsName.isEmpty() )
and (wq.specName== null or wq.specName.isEmpty() )
and (wq.flavor== null or wq.flavor.isEmpty() )
and (wq.series== null or wq.series.isEmpty() ) ">
zbj_qd_type,
</if>
<if test="wq.zbjQdType!= null and !wq.zbjQdType.isEmpty() ">
zbj_qd_type,
<!-- <if test=" (wq.zbjQdType == null or wq.zbjQdType.isEmpty() )-->
<!-- and (wq.goodsName== null or wq.goodsName.isEmpty() )-->
<!-- and (wq.specName== null or wq.specName.isEmpty() )-->
<!-- and (wq.flavor== null or wq.flavor.isEmpty() )-->
<!-- and (wq.series== null or wq.series.isEmpty() ) ">-->
<!-- zbj_qd_type,-->
<!-- </if>-->
zbj_qd_type,
<if test="wq.zbjQdType!= null and !wq.zbjQdType.isEmpty() ">
<if test="wq.subType!= null and wq.subType == 0 ">
fenxiao_id, fenxiao_name,
</if>
</if>
<if test="wq.goodsName!= null and !wq.goodsName.isEmpty() ">
<if test="(wq.goodsName!= null and !wq.goodsName.isEmpty() ) or wq.goodsNameAll == true ">
goods_no,goods_name,
</if>
<if test="wq.specName!= null and !wq.specName.isEmpty() ">
<if test="(wq.specName!= null and !wq.specName.isEmpty() ) or wq.specNameAll == true ">
spec_name_erp,
</if>
<if test="wq.flavor!= null and !wq.flavor.isEmpty() ">
<if test="(wq.flavor!= null and !wq.flavor.isEmpty() ) or wq.flavorAll == true ">
flavor_erp,
</if>
<if test="wq.series!= null and !wq.series.isEmpty() ">
<if test="(wq.series!= null and !wq.series.isEmpty() ) or wq.seriesAll == true ">
series,
<if test="wq.subType!= null and wq.subType == 0 ">
goods_no,goods_name,
......@@ -39,6 +39,7 @@
sum(sum_standard_cost) as sum_standard_cost_sum
from finance_order_detail fod
<where>
shop_no IN ( '016', '070', '091')
<if test="(wq.zbjQdTypeAll == null or wq.zbjQdTypeAll == false) and (wq.zbjQdType!= null and !wq.zbjQdType.isEmpty() )">
and fod.zbj_qd_type in
<foreach collection="wq.zbjQdType" item="item" index="index" open="(" separator="," close=")">
......@@ -77,33 +78,44 @@
</where>
group by
<trim suffixOverrides="," suffix="">
<if test=" (wq.zbjQdType == null or wq.zbjQdType .isEmpty() )
and (wq.goodsName== null or wq.goodsName.isEmpty() )
and (wq.specName== null or wq.specName.isEmpty() )
and (wq.flavor== null or wq.flavor.isEmpty() )
and (wq.series== null or wq.series.isEmpty() ) ">
zbj_qd_type,
</if>
zbj_qd_type,
<if test="wq.zbjQdType!= null and !wq.zbjQdType.isEmpty() ">
zbj_qd_type,
<if test="wq.subType!= null and wq.subType == 0 ">
fenxiao_id, fenxiao_name,
</if>
</if>
<if test="wq.goodsName!= null and !wq.goodsName.isEmpty() ">
<if test="(wq.goodsName!= null and !wq.goodsName.isEmpty()) or wq.goodsNameAll == true">
goods_no ,goods_name,
</if>
<if test="wq.specName!= null and !wq.specName.isEmpty() ">
<if test="(wq.specName!= null and !wq.specName.isEmpty()) or wq.specNameAll == true">
spec_name_erp,
</if>
<if test="wq.flavor!= null and !wq.flavor.isEmpty() ">
<if test="(wq.flavor!= null and !wq.flavor.isEmpty()) or wq.flavorAll == true ">
flavor_erp,
</if>
<if test="wq.series!= null and !wq.series.isEmpty() ">
<if test="(wq.series!= null and !wq.series.isEmpty() ) or wq.seriesAll == true ">
series,
</if>
</trim>
order by
<trim suffixOverrides="," suffix="">
<if test=" (wq.zbjQdType == null or wq.zbjQdType .isEmpty() )
and (wq.goodsName== null or wq.goodsName.isEmpty() )
and (wq.specName== null or wq.specName.isEmpty() )
and (wq.flavor== null or wq.flavor.isEmpty() )
and (wq.series== null or wq.series.isEmpty() ) ">
zbj_qd_type desc,
</if>
<if test="wq.zbjQdType!= null and !wq.zbjQdType.isEmpty() ">
zbj_qd_type desc,
<if test="wq.subType!= null and wq.subType == 0 ">
fenxiao_id desc ,
</if>
</if>
<if test="(wq.flavor!= null and !wq.flavor.isEmpty()) or wq.flavorAll == true ">
flavor_erp desc,
</if>
</trim>
</select>
<!-- 根据 类型和聚合的值 查询详情记录 -->
......@@ -112,12 +124,14 @@
<include refid="Base_Column_List"/>
from finance_order_detail fod
<where>
shop_no IN ( '016', '070', '091')
<if test="wq.startDate!= null ">
and fod.consign_time between #{wq.startDate} and #{wq.endDate}
</if>
<if test="wq.fenxiaoId!= null and wq.fenxiaoId!='' ">
and fod.fenxiao_id = #{wq.fenxiaoId}
and fod.fenxiao_id = #{wq.fenxiaoId}
</if>
<if test="wq.zbjQdType!= null and !wq.zbjQdType.isEmpty() ">
and fod.zbj_qd_type in
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论