mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
分析页统计:1、小板数量/面积接口没有数据情况下异常处理;2、大板数量接口完善;
This commit is contained in:
+83
-56
@@ -1,5 +1,6 @@
|
|||||||
package com.cf.imes.module.executor.service.order;
|
package com.cf.imes.module.executor.service.order;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
||||||
import co.elastic.clients.elasticsearch._types.FieldValue;
|
import co.elastic.clients.elasticsearch._types.FieldValue;
|
||||||
@@ -13,6 +14,7 @@ import co.elastic.clients.elasticsearch.core.SearchResponse;
|
|||||||
import co.elastic.clients.json.JsonData;
|
import co.elastic.clients.json.JsonData;
|
||||||
import co.elastic.clients.util.NamedValue;
|
import co.elastic.clients.util.NamedValue;
|
||||||
import com.cf.imes.framework.common.enums.OrderStatusEnum;
|
import com.cf.imes.framework.common.enums.OrderStatusEnum;
|
||||||
|
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
|
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateRespVO;
|
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsPlateRespVO;
|
||||||
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsAreaRespVO;
|
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderStatisticsAreaRespVO;
|
||||||
@@ -85,6 +87,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
private static final String ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME = "goods_count";
|
private static final String ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME = "goods_count";
|
||||||
private static final String DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH = "yyyy-M";
|
private static final String DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH = "yyyy-M";
|
||||||
private static final String DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH_DAY = "yyyy-M-d";
|
private static final String DATE_TIME_FORMATTER_PATTERN_YEAR_MONTH_DAY = "yyyy-M-d";
|
||||||
|
private static final String ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME = "goodsId";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Integer orderCount() {
|
public Integer orderCount() {
|
||||||
@@ -241,9 +244,13 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
// 前十goods_id基于时间分组
|
// 前十goods_id基于时间分组
|
||||||
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateCountListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
|
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = new HashMap<>();
|
||||||
.sorted(Comparator.naturalOrder())
|
if (CollUtil.isNotEmpty(topTenCountGoodsId)) {
|
||||||
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
|
orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateCountListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
|
||||||
|
.sorted(Comparator.naturalOrder())
|
||||||
|
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 获取所有商品{goodsId:respvo},根据top10排序
|
// 获取所有商品{goodsId:respvo},根据top10排序
|
||||||
Map<Long, OrderGoodsPlateRespVO> goodsMap = new LinkedHashMap<>();
|
Map<Long, OrderGoodsPlateRespVO> goodsMap = new LinkedHashMap<>();
|
||||||
@@ -308,11 +315,14 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
.map(OrderGoodsPlateRespVO::getGoodsId)
|
.map(OrderGoodsPlateRespVO::getGoodsId)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = new HashMap<>();
|
||||||
|
if (CollUtil.isNotEmpty(topTenCountGoodsId)) {
|
||||||
|
// 前十goods_id基于时间分组
|
||||||
|
orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateAreaListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
|
||||||
|
.sorted(Comparator.naturalOrder())
|
||||||
|
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
// 前十goods_id基于时间分组
|
|
||||||
Map<String, List<OrderGoodsPlateRespVO>> orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateAreaListGroupByOrderDate(topTenCountGoodsId, reqVO).stream()
|
|
||||||
.sorted(Comparator.naturalOrder())
|
|
||||||
.collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList()));
|
|
||||||
|
|
||||||
// 获取所有商品{goodsId:respvo},根据top10排序
|
// 获取所有商品{goodsId:respvo},根据top10排序
|
||||||
Map<Long, OrderGoodsPlateRespVO> goodsMap = new LinkedHashMap<>();
|
Map<Long, OrderGoodsPlateRespVO> goodsMap = new LinkedHashMap<>();
|
||||||
@@ -385,7 +395,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
.lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter))))
|
.lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter))))
|
||||||
)
|
)
|
||||||
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME,
|
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME,
|
||||||
agg -> agg.terms(terms -> terms.field("id").size(10).order(new NamedValue<>(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, SortOrder.Desc)))
|
agg -> agg.terms(terms -> terms.field(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).size(10).order(new NamedValue<>(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, SortOrder.Desc)))
|
||||||
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, sumAgg -> sumAgg.sum(sum -> sum.field("boardCount")))
|
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, sumAgg -> sumAgg.sum(sum -> sum.field("boardCount")))
|
||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
@@ -395,55 +405,57 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
Map<String, Aggregate> goodsCountAggMap = response.aggregations();
|
Map<String, Aggregate> goodsCountAggMap = response.aggregations();
|
||||||
Aggregate goodsCountAgg = goodsCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME);
|
Aggregate goodsCountAgg = goodsCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME);
|
||||||
|
|
||||||
List<FieldValue> goodsIds = new ArrayList<>();
|
List<Long> goodsIds = new ArrayList<>();
|
||||||
|
// 构建map:{日期:{goodsId、count}}
|
||||||
|
Map<String, List<OrderGoodsPlateRespVO>> goodsDateGroupMap = new HashMap<>();
|
||||||
/**
|
/**
|
||||||
* 获取数量最大前十的goodsId列表
|
* 获取数量最大前十的goodsId列表
|
||||||
*/
|
*/
|
||||||
goodsCountAgg.sterms().buckets().array().forEach(e -> goodsIds.add(e.key()));
|
goodsCountAgg.lterms().buckets().array().forEach(e -> goodsIds.add(e.key()));
|
||||||
// 查询创建时间段内,数量最多的goods_id前十下的数据,按goods_id和日期分组
|
|
||||||
SearchRequest dateGroupRequest = new SearchRequest.Builder()
|
|
||||||
.size(0)
|
|
||||||
.index(OptimizePlanService.ORDER_REMAIN_PLATE_MODEL)
|
|
||||||
.query(q -> q.range(r -> r.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME)
|
|
||||||
.gte(JsonData.of(reqVO.getCreateTime()[0].format(dateTimeFormatter)))
|
|
||||||
.lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter))))
|
|
||||||
)
|
|
||||||
.query(q -> q.bool(b -> b.must(m -> m.terms(t -> t.field("goods_id").terms(tv -> tv.value(goodsIds))))))
|
|
||||||
.query(q -> q.match(m -> m.field("organId").query(SecurityFrameworkUtils.getUserOrganId())))
|
|
||||||
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME,
|
|
||||||
agg -> agg.terms(terms -> terms.field("id").order(new NamedValue<>(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, SortOrder.Desc)))
|
|
||||||
.aggregations("date_group", dateAgg -> dateAgg.dateHistogram(date -> getDateHistogram(unit, date.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME))))
|
|
||||||
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, sumAgg -> sumAgg.sum(sum -> sum.field("boardCount")))
|
|
||||||
)
|
|
||||||
.build();
|
|
||||||
response = client.search(dateGroupRequest, Map.class);
|
|
||||||
Map<String, Aggregate> goodsDateCountAggMap = response.aggregations();
|
|
||||||
Aggregate goodsDateAgg = goodsDateCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME);
|
|
||||||
|
|
||||||
// 构建map:{日期:{goodsId、count}}
|
if (CollUtil.isNotEmpty(goodsIds)) {
|
||||||
Map<String, List<OrderGoodsPlateRespVO>> goodsDateGroupMap = new HashMap<>();
|
List<FieldValue> goodsIdFieldValueList = goodsIds.stream().map(FieldValue::of).toList();
|
||||||
goodsDateAgg.sterms().buckets().array().forEach(goodsDateAggBucket -> {
|
// 查询创建时间段内,数量最多的goods_id前十下的数据,按goods_id和日期分组
|
||||||
String goodsId = goodsDateAggBucket.key().stringValue();
|
SearchRequest dateGroupRequest = new SearchRequest.Builder()
|
||||||
// todo 目前没有发现好的es统计月周的方式,先把年月日查出来转周,后续优化
|
.size(0)
|
||||||
String dateStr = dateToWeekMonth(goodsDateAggBucket.aggregations().get("date_group").dateHistogram().buckets().array().get(0).keyAsString(), unit);
|
.index(OptimizePlanService.ORDER_REMAIN_PLATE_MODEL)
|
||||||
double goodsCount = goodsDateAggBucket.aggregations().get(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME).sum().value();
|
.query(q -> q.range(r -> r.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME)
|
||||||
OrderGoodsPlateRespVO vo = OrderGoodsPlateRespVO.builder().goodsId(Long.parseLong(goodsId)).orderDate(dateStr).orderCount((int) goodsCount).build();
|
.gte(JsonData.of(reqVO.getCreateTime()[0].format(dateTimeFormatter)))
|
||||||
List<OrderGoodsPlateRespVO> orderGoodsPlateRespVOS = goodsDateGroupMap.get(dateStr);
|
.lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter))))
|
||||||
if (ObjectUtil.isNotNull(orderGoodsPlateRespVOS)) {
|
)
|
||||||
orderGoodsPlateRespVOS.add(vo);
|
.query(q -> q.bool(b -> b.must(m -> m.terms(t -> t.field(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).terms(tv -> tv.value(goodsIdFieldValueList))))))
|
||||||
} else {
|
.query(q -> q.match(m -> m.field("organId").query(SecurityFrameworkUtils.getUserOrganId())))
|
||||||
ArrayList<OrderGoodsPlateRespVO> goodsPlateRespVOS = new ArrayList<>();
|
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME,
|
||||||
goodsPlateRespVOS.add(vo);
|
agg -> agg.terms(terms -> terms.field(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).order(new NamedValue<>(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, SortOrder.Desc)))
|
||||||
goodsDateGroupMap.put(dateStr, goodsPlateRespVOS);
|
.aggregations("date_group", dateAgg -> dateAgg.dateHistogram(date -> getDateHistogram(unit, date.field(ORDER_REMAIN_PLATE_MODEL_CREATE_TIME_FIELDNAME))))
|
||||||
}
|
.aggregations(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME, sumAgg -> sumAgg.sum(sum -> sum.field("boardCount")))
|
||||||
});
|
)
|
||||||
|
.build();
|
||||||
|
response = client.search(dateGroupRequest, Map.class);
|
||||||
|
Map<String, Aggregate> goodsDateCountAggMap = response.aggregations();
|
||||||
|
Aggregate goodsDateAgg = goodsDateCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME);
|
||||||
|
|
||||||
|
|
||||||
|
goodsDateAgg.lterms().buckets().array().forEach(goodsDateAggBucket -> {
|
||||||
|
Long goodsId = goodsDateAggBucket.key();
|
||||||
|
// todo 目前没有发现好的es统计月周的方式,先把年月日查出来转周,后续优化
|
||||||
|
String dateStr = dateToWeekMonth(goodsDateAggBucket.aggregations().get("date_group").dateHistogram().buckets().array().get(0).keyAsString(), unit);
|
||||||
|
double goodsCount = goodsDateAggBucket.aggregations().get(ORDER_REMAIN_PLATE_MODEL_GOODS_COUNT_NAME).sum().value();
|
||||||
|
OrderGoodsPlateRespVO vo = OrderGoodsPlateRespVO.builder().goodsId(goodsId).orderDate(dateStr).orderCount((int) goodsCount).build();
|
||||||
|
List<OrderGoodsPlateRespVO> orderGoodsPlateRespVOS = goodsDateGroupMap.get(dateStr);
|
||||||
|
if (ObjectUtil.isNotNull(orderGoodsPlateRespVOS)) {
|
||||||
|
orderGoodsPlateRespVOS.add(vo);
|
||||||
|
} else {
|
||||||
|
ArrayList<OrderGoodsPlateRespVO> goodsPlateRespVOS = new ArrayList<>();
|
||||||
|
goodsPlateRespVOS.add(vo);
|
||||||
|
goodsDateGroupMap.put(dateStr, goodsPlateRespVOS);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 遍历所有goods_id
|
// 遍历所有goods_id
|
||||||
List<Map<String, Object>> series = new ArrayList<>();
|
List<Map<String, Object>> series = new ArrayList<>();
|
||||||
for (FieldValue goodsIdFieldValue : goodsIds) {
|
for (Long goodsId : goodsIds) {
|
||||||
String goodsIdStr = goodsIdFieldValue.stringValue();
|
|
||||||
Long goodsId = Long.parseLong(goodsIdStr);
|
|
||||||
Map<String, Object> seriesItem = new HashMap<>();
|
Map<String, Object> seriesItem = new HashMap<>();
|
||||||
int[] countArr = new int[dateList.size()];
|
int[] countArr = new int[dateList.size()];
|
||||||
|
|
||||||
@@ -465,17 +477,16 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
seriesItem.put("data", countArr);
|
seriesItem.put("data", countArr);
|
||||||
seriesItem.put("id", goodsId);
|
seriesItem.put("id", goodsId);
|
||||||
// 材质-商品名称-颜色-纹理-宽-高-厚-品牌
|
// 材质-商品名称-颜色-纹理-宽-高-厚-品牌
|
||||||
PlateGoodDO plateGoodDO = plateGoodMapper.selectById(goodsId);
|
List<PlateGoodDO> plateGoodDOList = plateGoodMapper.selectList(new LambdaQueryWrapperX<PlateGoodDO>().eq(PlateGoodDO::getGoodsId, goodsId));
|
||||||
if (ObjectUtil.isNull(plateGoodDO)) {
|
if (CollUtil.isEmpty(plateGoodDOList)) {
|
||||||
// 没有对应大板不展示
|
// 没有对应大板不展示
|
||||||
log.error("[getBigPlateCountGroup][统计大板数量,查询大板{} 不存在]", goodsId);
|
log.error("[getBigPlateCountGroup][统计大板数量,查询大板{} 不存在]", goodsId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 获取纹路描述
|
// 任意取一个类型
|
||||||
DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(plateGoodDO.getTexture())).getData();
|
PlateGoodDO plateGoodDO = plateGoodDOList.get(0);
|
||||||
String texture = ObjectUtil.isNotNull(grainDTO) ? grainDTO.getLabel() : "";
|
|
||||||
seriesItem.put("name", plateGoodDO.getMaterial() + "-" + plateGoodDO.getGoodsName() +
|
seriesItem.put("name", plateGoodDO.getMaterial() + "-" + plateGoodDO.getGoodsName() +
|
||||||
"-" + plateGoodDO.getColor() + "-" + texture + "-" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getWidth())) +
|
"-" + plateGoodDO.getColor() + "-" + getTextureFromDict(plateGoodDO) + "-" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getWidth())) +
|
||||||
"×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getHeight())) + "×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getThickness())) + "-" + plateGoodDO.getBrand());
|
"×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getHeight())) + "×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getThickness())) + "-" + plateGoodDO.getBrand());
|
||||||
series.add(seriesItem);
|
series.add(seriesItem);
|
||||||
}
|
}
|
||||||
@@ -487,6 +498,22 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService {
|
|||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据纹路枚举获取字典中纹路描述
|
||||||
|
* @param plateGoodDO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String getTextureFromDict(PlateGoodDO plateGoodDO) {
|
||||||
|
// 获取纹路描述
|
||||||
|
DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(plateGoodDO.getTexture())).getData();
|
||||||
|
if (ObjectUtil.isNotNull(grainDTO)) {
|
||||||
|
return grainDTO.getLabel();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据统计维度获取es分组的dateHistogram
|
* 根据统计维度获取es分组的dateHistogram
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user