From a4ace0f6e63fea6e56e9599a4a5131353fd51cad Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 15 Oct 2025 14:11:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=90=A5=E5=85=BB=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/panel/HardPanelSettingShare.java | 15 +++ .../hard/api/vo/hard/PanelPorductVo.java | 27 ++++- .../panel/PanelNutritionController.java | 20 ++++ .../hard/mapper/order/HardOrderMapper.java | 4 + .../hard/service/PanelNutritionService.java | 9 ++ .../impl/panel/PanelNutritionServiceImpl.java | 107 ++++++++++++++++++ .../mapper/order/HardOrderMapper.xml | 77 ++++++++++++- 7 files changed, 254 insertions(+), 5 deletions(-) diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/panel/HardPanelSettingShare.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/panel/HardPanelSettingShare.java index 5931b6a8c..e38e18fd5 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/panel/HardPanelSettingShare.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/panel/HardPanelSettingShare.java @@ -24,6 +24,21 @@ public class HardPanelSettingShare { */ private List topExcludeCategoryIds; + /** + * 荤菜菜品分类id + */ + private List hcCategoryIds; + + /** + * 素菜菜品分类id + */ + private List scCategoryIds; + + /** + * 主食菜品分类id + */ + private List zsCategoryIds; + } } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelPorductVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelPorductVo.java index ae6172905..64eacf256 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelPorductVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelPorductVo.java @@ -24,6 +24,11 @@ public class PanelPorductVo { */ private String classifyName; + /** + * 分类key + */ + private String classifyKey; + /** * 分类ID */ @@ -113,7 +118,6 @@ public class PanelPorductVo { @AllArgsConstructor @NoArgsConstructor public static class HourTypeVo { - /** * 早 */ @@ -130,6 +134,27 @@ public class PanelPorductVo { private ProductTypeItemVo evening; } + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class NutritionTypeVo { + /** + * 荤菜 + */ + private ProductTypeItemVo hc; + + /** + * 素菜 + */ + private ProductTypeItemVo sc; + + /** + * 主食 + */ + private ProductTypeItemVo zs; + } + public static List generatePanelCanteenList(LocalDateTime[] totalTimeList, DateRangeTypeEnum dateRangeType) { List dateList = new LinkedList<>(); LocalDate startTime = totalTimeList[0].toLocalDate(); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelNutritionController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelNutritionController.java index 5e353c9b9..c8c486862 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelNutritionController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelNutritionController.java @@ -48,4 +48,24 @@ public class PanelNutritionController { return R.ok(panelNutritionService.cuisineTop(dto)); } + @PostMapping(value = "/nutrition/by-time") + @Operation(summary = "营养分析(按照购买时间统计)") + public R nutritionByTime(@RequestBody PanelProductDto dto) { + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { + dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + return R.ok(panelNutritionService.nutritionByTime(dto)); + } + + @PostMapping(value = "/nutrition/total") + @Operation(summary = "营养分析(总数统计)") + public R> nutritionTotal(@RequestBody PanelProductDto dto) { + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { + dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + return R.ok(panelNutritionService.nutritionTotal(dto)); + } + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java index c0d5f8d1a..7f5ea38d6 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java @@ -139,6 +139,10 @@ public interface HardOrderMapper extends PjcloudBaseMapper { /** * 用餐数据统计(根据时间段和日期分类统计) */ + PanelPorductVo groupCount(@Param("dto") PanelProductDto dto); + + List groupByTime(@Param("dto") PanelProductDto dto); + List groupByTimeAndHourType(@Param("dto") PanelProductDto dto); List groupByMonthAndHourType(@Param("dto") PanelProductDto dto); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelNutritionService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelNutritionService.java index 4404892bb..85bbbd587 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelNutritionService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelNutritionService.java @@ -21,4 +21,13 @@ public interface PanelNutritionService { */ List cuisineTop(PanelProductDto dto); + /** + * 营养分析(按照购买时间统计) + */ + PanelPorductVo.NutritionTypeVo nutritionByTime(PanelProductDto dto); + + /** + * 营养分析(总数统计) + */ + List nutritionTotal(PanelProductDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelNutritionServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelNutritionServiceImpl.java index 85eb1e566..fb4ad50f3 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelNutritionServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelNutritionServiceImpl.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.hard.service.impl.panel; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByClassifyDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; @@ -18,8 +19,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; @Validated @Slf4j @@ -80,4 +86,105 @@ public class PanelNutritionServiceImpl implements PanelNutritionService { }).toList(); } + /** + * 营养分析(按照购买时间统计) + */ + @Override + public PanelPorductVo.NutritionTypeVo nutritionByTime(PanelProductDto dto) { + PanelPorductVo.NutritionTypeVo result = new PanelPorductVo.NutritionTypeVo(); + + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + List> futureList = nutritionSetting(); + // 查询配置 + HardPanelSettingEntity setting = panelSettingService.getSetting(); + if (ObjectUtil.isNotEmpty(setting) && ObjectUtil.isNotEmpty(setting.getNutritionSetting())) { + HardPanelSettingShare.NutritionSetting nutritionSetting = setting.getNutritionSetting(); + if (ObjectUtil.isNotEmpty(nutritionSetting)) { + if (ObjectUtil.isNotEmpty(nutritionSetting.getHcCategoryIds())) { + futureList.get(0).put("classify", nutritionSetting.getHcCategoryIds()); + } + if (ObjectUtil.isNotEmpty(nutritionSetting.getScCategoryIds())) { + futureList.get(1).put("classify", nutritionSetting.getScCategoryIds()); + } + if (ObjectUtil.isNotEmpty(nutritionSetting.getZsCategoryIds())) { + futureList.get(2).put("classify", nutritionSetting.getZsCategoryIds()); + } + } + } + + for (CompletableFuture voidCompletableFuture : futureList.stream().map(map -> CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + String key = (String) map.get("key"); + String name = (String) map.get("name"); + List classify = (List) map.get("classify"); + PanelProductDto queryDto = BeanUtil.toBean(dto, PanelProductDto.class); + queryDto.setClassifyIds(classify); + List sqlList = hardOrderMapper.groupByTime(queryDto); + // 处理查询出来的数据 + List resultList = BeanUtil.copyToList(dateList, PanelPorductVo.class); + for (PanelPorductVo v : resultList) { + sqlList.stream().filter(item -> ObjectUtil.equals(item.getTime(), v.getTime())).forEach(target -> { + v.setHourType(target.getHourType()); + v.setPersonCount(target.getPersonCount()); + v.setBuyCount(target.getBuyCount()); + v.setBuyProductCount(target.getBuyProductCount()); + v.setTotalPrice(target.getTotalPrice()); + }); + } + // 组装数据 + PanelPorductVo.ProductTypeItemVo vo = PanelPorductVo.ProductTypeItemVo.builder().list(resultList).type(key).typeStr(name).build(); + switch (key) { + case "hc": + result.setHc(vo); + break; + case "sc": + result.setSc(vo); + break; + case "zs": + result.setZs(vo); + break; + } + })).toList()) { + voidCompletableFuture.join(); + } + + return result; + } + + /** + * 营养分析(总数统计) + */ + @Override + public List nutritionTotal(PanelProductDto dto) { + List list = new ArrayList<>(); + + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + List> futureList = nutritionSetting(); + + for (CompletableFuture voidCompletableFuture : futureList.stream().map(map -> CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + String key = (String) map.get("key"); + String name = (String) map.get("name"); + List classify = (List) map.get("classify"); + PanelProductDto queryDto = BeanUtil.toBean(dto, PanelProductDto.class); + queryDto.setClassifyIds(classify); + PanelPorductVo totalVo = hardOrderMapper.groupCount(queryDto); + totalVo.setClassifyName(name); + totalVo.setClassifyKey(key); + list.add(totalVo); + })).toList()) { + voidCompletableFuture.join(); + } + return null; + } + + private List> nutritionSetting() { + return List.of( + Map.of("key", "hc", "name", "荤菜", "classify", new ArrayList(), "order", 0), + Map.of("key", "sc", "name", "素菜", "classify", new ArrayList(), "order", 1), + Map.of("key", "zs", "name", "主食", "classify", new ArrayList(), "order", 2) + ); + } + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index 187e4f146..8940864d9 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -550,6 +550,71 @@ + + + +