From c81ea9ebe72ef362546abedcc67bb6a892394014 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 28 Oct 2025 10:17:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=90=A5=E5=85=BB=E5=88=86=E6=9E=90-?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/vo/hard/PanelPorductVo.java | 2 +- .../panel/PanelNutritionController.java | 29 +++++++++++ .../controller/panel/PanelShopController.java | 16 ++++++ .../hard/mapper/order/HardOrderMapper.java | 2 + .../hard/service/PanelShopService.java | 5 ++ .../impl/panel/PanelCanteenServiceImpl.java | 2 +- .../impl/panel/PanelNutritionServiceImpl.java | 4 +- .../impl/panel/PanelShopServiceImpl.java | 50 +++++++++++++++++-- .../mapper/order/HardOrderMapper.xml | 22 ++++++++ 9 files changed, 124 insertions(+), 8 deletions(-) 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 64eacf256..b09f2291d 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 @@ -155,7 +155,7 @@ public class PanelPorductVo { private ProductTypeItemVo zs; } - public static List generatePanelCanteenList(LocalDateTime[] totalTimeList, DateRangeTypeEnum dateRangeType) { + public static List generatePanelPorductVoList(LocalDateTime[] totalTimeList, DateRangeTypeEnum dateRangeType) { List dateList = new LinkedList<>(); LocalDate startTime = totalTimeList[0].toLocalDate(); LocalDate endTime = totalTimeList[1].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 2e357573b..963f5036c 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 @@ -7,9 +7,14 @@ import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.DateRangeTool; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; import com.bsd.pjcloud.hard.api.vo.hard.PanelPorductVo; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderCsVo; +import com.bsd.pjcloud.hard.service.HardOrderTotalService; import com.bsd.pjcloud.hard.service.PanelNutritionService; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -21,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; @RestController @@ -31,6 +37,9 @@ import java.util.List; public class PanelNutritionController { private final PanelNutritionService panelNutritionService; + private final HardOrderTotalService hardOrderTotalService; + + private final RemoteMchService mchService; @PostMapping(value = "/class-count") @Operation(summary = "食堂用餐分类统计") @@ -113,4 +122,24 @@ public class PanelNutritionController { return R.ok(panelNutritionService.external(dto)); } + + @PostMapping(value = "/report") + @Operation(summary = "营养分析报表") + public R> canteenReport(@RequestBody HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SUPERMARKET.getType(), MerchantTypeEnum.SELF_SUPERMARKET.getType())); + List mchDtoIds = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + List mchList = mchService.getByParentId(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + List mchIds = mchList.stream().map(MchManageVo::getId).toList(); + mchDtoIds.add(dto.getMerchantId()); + mchDtoIds.addAll(mchIds); + dto.setMerchantId(null); + dto.setMchIds(mchDtoIds); + } + } + return R.ok(hardOrderTotalService.listCs(dto)); + } + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelShopController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelShopController.java index a64983ea0..be9a386b0 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelShopController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelShopController.java @@ -55,6 +55,7 @@ public class PanelShopController { } dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); dto.setHourTypeIsNull(YesNoEnum.YES.getCode()); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelShopService.mchPayPersonCount(dto)); } @@ -67,6 +68,7 @@ public class PanelShopController { }); dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); dto.setHourTypeIsNull(YesNoEnum.YES.getCode()); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelShopService.mchPayCount(dto)); } @@ -127,7 +129,21 @@ public class PanelShopController { dto.setLimit(5L); dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); dto.setHourTypeIsNull(YesNoEnum.YES.getCode()); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelShopService.mchPayCountTop(dto)); } + @PostMapping(value = "/today-trend") + @Operation(summary = "当天超市购买次数趋势统计") + public R> todayTrend(@RequestBody PanelProductDto dto) { + dto.setDateRangeType(DateRangeTypeEnum.TODAY); + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { + dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + dto.setHourTypeIsNull(YesNoEnum.YES.getCode()); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); + return R.ok(panelShopService.todayTrend(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 e688bff99..13b16f645 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 @@ -154,6 +154,8 @@ public interface HardOrderMapper extends PjcloudBaseMapper { */ List groupByMch(@Param("dto") PanelProductDto dto); + List shopGroupByMch(@Param("dto") PanelProductDto dto); + /** * 复购排行榜 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelShopService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelShopService.java index 4650cf240..71668485b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelShopService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelShopService.java @@ -21,4 +21,9 @@ public interface PanelShopService { * 排行榜 */ List mchPayCountTop(PanelProductDto dto); + + /** + * 当天超市购买次数趋势统计 + */ + List todayTrend(PanelProductDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelCanteenServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelCanteenServiceImpl.java index df0b7874a..ace37b127 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelCanteenServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelCanteenServiceImpl.java @@ -38,7 +38,7 @@ public class PanelCanteenServiceImpl implements PanelCanteenService { @Override public PanelPorductVo.HourTypeVo groupByTimeAndHourType(PanelProductDto dto) { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + List dateList = PanelPorductVo.generatePanelPorductVoList(dto.getTotalTimeList(), dto.getDateRangeType()); PanelPorductVo.HourTypeVo result = new PanelPorductVo.HourTypeVo(); List hourTypeList = List.of(HardHourTypeEnum.MORNING, HardHourTypeEnum.NOONING, HardHourTypeEnum.NIGHT); 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 c340d5b05..46e8d9070 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 @@ -104,7 +104,7 @@ public class PanelNutritionServiceImpl implements PanelNutritionService { PanelPorductVo.NutritionTypeVo result = new PanelPorductVo.NutritionTypeVo(); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + List dateList = PanelPorductVo.generatePanelPorductVoList(dto.getTotalTimeList(), dto.getDateRangeType()); List> futureList = nutritionSetting(); // 查询配置 HardPanelSettingEntity setting = panelSettingService.getSetting(); @@ -215,7 +215,7 @@ public class PanelNutritionServiceImpl implements PanelNutritionService { @Override public PanelPorductVo.HourTypeVo external(PanelProductDto dto) { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + List dateList = PanelPorductVo.generatePanelPorductVoList(dto.getTotalTimeList(), dto.getDateRangeType()); PanelPorductVo.HourTypeVo result = new PanelPorductVo.HourTypeVo(); List hourTypeList = List.of(HardHourTypeEnum.MORNING, HardHourTypeEnum.NOONING, HardHourTypeEnum.NIGHT); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelShopServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelShopServiceImpl.java index 494ed2402..27cb42f8f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelShopServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelShopServiceImpl.java @@ -15,10 +15,15 @@ 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.time.LocalDateTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; @Validated @Slf4j @@ -35,7 +40,7 @@ public class PanelShopServiceImpl implements PanelShopService { */ @Override public List mchPayPersonCount(PanelProductDto dto) { - List list = hardOrderMapper.groupByMch(dto); + List list = hardOrderMapper.shopGroupByMch(dto); disposePanelCanteenVoSetMchName(list); return list; } @@ -47,7 +52,7 @@ public class PanelShopServiceImpl implements PanelShopService { public List mchPayCount(PanelProductDto dto) { List result = new ArrayList<>(); // 处理时间 - List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + List dateList = PanelPorductVo.generatePanelPorductVoList(dto.getTotalTimeList(), dto.getDateRangeType()); // 查询商户 MchManageDto mchDto = new MchManageDto(); mchDto.setTypesList(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); @@ -59,7 +64,7 @@ public class PanelShopServiceImpl implements PanelShopService { return entity; }).toList(); // 查询商户订单 - List list = hardOrderMapper.groupByMch(dto); + List list = hardOrderMapper.shopGroupByMch(dto); for (PanelPorductVo.ProductTypeItemVo v : result) { List targetMchTotalList = list.stream().filter(item -> ObjectUtil.equals(v.getType(), String.valueOf(item.getMchId()))).toList(); if (ObjectUtil.isEmpty(targetMchTotalList)) { @@ -86,11 +91,48 @@ public class PanelShopServiceImpl implements PanelShopService { */ @Override public List mchPayCountTop(PanelProductDto dto) { - List list = hardOrderMapper.groupByMch(dto); + List list = hardOrderMapper.shopGroupByMch(dto); disposePanelCanteenVoSetMchName(list); return list; } + /** + * 当天超市购买次数趋势统计 + */ + @Override + public List todayTrend(PanelProductDto dto) { + List result = new ArrayList<>(); + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + LocalDateTime now = LocalDateTime.now(); + List> customHour = List.of( + // 早 + List.of(7, 8), + List.of(8, 9), + // 中 + List.of(11, 12), + List.of(12, 13), + // 晚 + List.of(17, 18), + List.of(18, 19) + ); + customHour.stream().map(customList -> CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + Integer targetHour = customList.get(0); + PanelProductDto queryDto = PanelProductDto + .builder() + .totalTimeList(new LocalDateTime[]{ + now.withHour(targetHour).withMinute(0).withSecond(0), + now.withHour(targetHour).withMinute(59).withSecond(59) + }) + .build(); + List sqlList = hardOrderMapper.shopGroupByTimeAndHourType(queryDto); + PanelPorductVo build = PanelPorductVo.builder().hourType(customList.get(0) + "-" + customList.get(1)).personCount(0L).order(targetHour).build(); + if (ObjectUtil.isNotEmpty(sqlList)) build.setPersonCount(sqlList.get(0).getPersonCount()); + result.add(build); + })).toList().forEach(CompletableFuture::join); + return result.stream().sorted(Comparator.comparingInt(PanelPorductVo::getOrder)).toList(); + } + private void disposePanelCanteenVoSetMchName(List list) { if (ObjectUtil.isEmpty(list)) return; // 商户名 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 840081362..b27a5e4cb 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 @@ -747,6 +747,28 @@ + +