diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java index ccb8c2f99..c5d0ae2cf 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java @@ -1,5 +1,6 @@ package com.cf.imes.module.executor.service.order; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import co.elastic.clients.elasticsearch.ElasticsearchClient; 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.util.NamedValue; 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.module.executor.controller.admin.order.vo.order.OrderGoodsPlateRespVO; 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 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 ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME = "goodsId"; @Override public Integer orderCount() { @@ -241,9 +244,13 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { .toList(); // 前十goods_id基于时间分组 - Map> orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateCountListGroupByOrderDate(topTenCountGoodsId, reqVO).stream() - .sorted(Comparator.naturalOrder()) - .collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList())); + Map> orderGoodsPlateRespMap = new HashMap<>(); + if (CollUtil.isNotEmpty(topTenCountGoodsId)) { + orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateCountListGroupByOrderDate(topTenCountGoodsId, reqVO).stream() + .sorted(Comparator.naturalOrder()) + .collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList())); + } + // 获取所有商品{goodsId:respvo},根据top10排序 Map goodsMap = new LinkedHashMap<>(); @@ -308,11 +315,14 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { .map(OrderGoodsPlateRespVO::getGoodsId) .toList(); + Map> 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> orderGoodsPlateRespMap = orderPlateStatisticsMapper.selectTopTenPlateAreaListGroupByOrderDate(topTenCountGoodsId, reqVO).stream() - .sorted(Comparator.naturalOrder()) - .collect(Collectors.groupingBy(OrderGoodsPlateRespVO::getOrderDate, LinkedHashMap::new, Collectors.toList())); // 获取所有商品{goodsId:respvo},根据top10排序 Map goodsMap = new LinkedHashMap<>(); @@ -385,7 +395,7 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { .lte(JsonData.of(reqVO.getCreateTime()[1].format(dateTimeFormatter)))) ) .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"))) ) .build(); @@ -395,55 +405,57 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { Map goodsCountAggMap = response.aggregations(); Aggregate goodsCountAgg = goodsCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME); - List goodsIds = new ArrayList<>(); - + List goodsIds = new ArrayList<>(); + // 构建map:{日期:{goodsId、count}} + Map> goodsDateGroupMap = new HashMap<>(); /** * 获取数量最大前十的goodsId列表 */ - goodsCountAgg.sterms().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 goodsDateCountAggMap = response.aggregations(); - Aggregate goodsDateAgg = goodsDateCountAggMap.get(ORDER_REMAIN_PLATE_MODEL_GOODS_GROUP_NAME); + goodsCountAgg.lterms().buckets().array().forEach(e -> goodsIds.add(e.key())); - // 构建map:{日期:{goodsId、count}} - Map> goodsDateGroupMap = new HashMap<>(); - goodsDateAgg.sterms().buckets().array().forEach(goodsDateAggBucket -> { - String goodsId = goodsDateAggBucket.key().stringValue(); - // 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(Long.parseLong(goodsId)).orderDate(dateStr).orderCount((int) goodsCount).build(); - List orderGoodsPlateRespVOS = goodsDateGroupMap.get(dateStr); - if (ObjectUtil.isNotNull(orderGoodsPlateRespVOS)) { - orderGoodsPlateRespVOS.add(vo); - } else { - ArrayList goodsPlateRespVOS = new ArrayList<>(); - goodsPlateRespVOS.add(vo); - goodsDateGroupMap.put(dateStr, goodsPlateRespVOS); - } - }); + if (CollUtil.isNotEmpty(goodsIds)) { + List goodsIdFieldValueList = goodsIds.stream().map(FieldValue::of).toList(); + // 查询创建时间段内,数量最多的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(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).terms(tv -> tv.value(goodsIdFieldValueList)))))) + .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(ORDER_REMAIN_PLATE_MODEL_GOODS_ID_NAME).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 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 orderGoodsPlateRespVOS = goodsDateGroupMap.get(dateStr); + if (ObjectUtil.isNotNull(orderGoodsPlateRespVOS)) { + orderGoodsPlateRespVOS.add(vo); + } else { + ArrayList goodsPlateRespVOS = new ArrayList<>(); + goodsPlateRespVOS.add(vo); + goodsDateGroupMap.put(dateStr, goodsPlateRespVOS); + } + }); + } // 遍历所有goods_id List> series = new ArrayList<>(); - for (FieldValue goodsIdFieldValue : goodsIds) { - String goodsIdStr = goodsIdFieldValue.stringValue(); - Long goodsId = Long.parseLong(goodsIdStr); + for (Long goodsId : goodsIds) { Map seriesItem = new HashMap<>(); int[] countArr = new int[dateList.size()]; @@ -465,17 +477,16 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { seriesItem.put("data", countArr); seriesItem.put("id", goodsId); // 材质-商品名称-颜色-纹理-宽-高-厚-品牌 - PlateGoodDO plateGoodDO = plateGoodMapper.selectById(goodsId); - if (ObjectUtil.isNull(plateGoodDO)) { + List plateGoodDOList = plateGoodMapper.selectList(new LambdaQueryWrapperX().eq(PlateGoodDO::getGoodsId, goodsId)); + if (CollUtil.isEmpty(plateGoodDOList)) { // 没有对应大板不展示 log.error("[getBigPlateCountGroup][统计大板数量,查询大板{} 不存在]", goodsId); continue; } - // 获取纹路描述 - DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(plateGoodDO.getTexture())).getData(); - String texture = ObjectUtil.isNotNull(grainDTO) ? grainDTO.getLabel() : ""; + // 任意取一个类型 + PlateGoodDO plateGoodDO = plateGoodDOList.get(0); 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()); series.add(seriesItem); } @@ -487,6 +498,22 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { 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 *