diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelCanteenDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java similarity index 89% rename from pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelCanteenDto.java rename to pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java index 6382c7323..7f146d3f9 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelCanteenDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java @@ -13,7 +13,7 @@ import java.util.List; @Builder @AllArgsConstructor @NoArgsConstructor -public class PanelCanteenDto { +public class PanelProductDto { private DateRangeTypeEnum dateRangeType = DateRangeTypeEnum.YESTERDAY; @@ -21,6 +21,8 @@ public class PanelCanteenDto { private List mchTypeCodes; + private String hourTypeIsNull; + private String hourType; private Long limit; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelCanteenVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelCanteenVo.java deleted file mode 100644 index e7431c336..000000000 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelCanteenVo.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.bsd.pjcloud.hard.api.vo.hard; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDate; -import java.util.List; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class PanelCanteenVo { - - /** - * 商品名 - */ - private String productName; - - /** - * 商家ID - */ - private Long mchId; - - /** - * 商家名称 - */ - private String mchName; - - /** - * 用餐时间段(早中晚) - */ - private String hourType; - - /** - * 商品名 - */ - private String productStr; - - /** - * 用餐人数 - */ - private Long personCount; - - /** - * 购买次数 - */ - private Long buyCount; - - /** - * 购买商品数量 - */ - private Long buyProductCount; - - /** - * 购买总金额(分) - */ - private Long totalPrice; - - /** - * 时间 - */ - private LocalDate time; - - /** - * 时间字符串 - */ - private LocalDate timeStr; - - /** - * 周几 - */ - private String weekStr; - - /** - * 排序 - */ - private int order; - - @Data - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class HourTypeItemVo { - - private String type; - - private String typeStr; - - private List list; - - } - - @Data - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class HourTypeVo { - - /** - * 早 - */ - private HourTypeItemVo morning; - - /** - * 中 - */ - private HourTypeItemVo noon; - - /** - * 晚 - */ - private HourTypeItemVo evening; - } - -} 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 new file mode 100644 index 000000000..8cddbf723 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/hard/PanelPorductVo.java @@ -0,0 +1,150 @@ +package com.bsd.pjcloud.hard.api.vo.hard; + +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.common.core.constant.enums.DateRangeTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.LinkedList; +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PanelPorductVo { + + /** + * 商品名 + */ + private String productName; + + /** + * 商家ID + */ + private Long mchId; + + /** + * 商家名称 + */ + private String mchName; + + /** + * 用餐时间段(早中晚) + */ + private String hourType; + + /** + * 商品名 + */ + private String productStr; + + /** + * 用餐人数 + */ + private Long personCount; + + /** + * 购买次数 + */ + private Long buyCount; + + /** + * 购买商品数量 + */ + private Long buyProductCount; + + /** + * 购买总金额(分) + */ + private Long totalPrice; + + /** + * 时间 + */ + private LocalDate time; + + /** + * 时间字符串 + */ + private LocalDate timeStr; + + /** + * 周几 + */ + private String weekStr; + + /** + * 排序 + */ + private int order; + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class ProductTypeItemVo { + + private String type; + + private String typeStr; + + private List list; + + } + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class HourTypeVo { + + /** + * 早 + */ + private ProductTypeItemVo morning; + + /** + * 中 + */ + private ProductTypeItemVo noon; + + /** + * 晚 + */ + private ProductTypeItemVo evening; + } + + public static List generatePanelCanteenList(LocalDateTime[] totalTimeList, DateRangeTypeEnum dateRangeType) { + List dateList = new LinkedList<>(); + LocalDate startTime = totalTimeList[0].toLocalDate(); + LocalDate endTime = totalTimeList[1].toLocalDate(); + LocalDate currentDate = startTime; + while (!currentDate.isAfter(endTime)) { + PanelPorductVo entity = new PanelPorductVo(); + entity.setPersonCount(0L); + entity.setBuyCount(0L); + entity.setBuyProductCount(0L); + if (ObjectUtil.equals(dateRangeType, DateRangeTypeEnum.THIS_YEAR)) { + entity.setTime(currentDate.withDayOfMonth(1)); + entity.setWeekStr(""); + } else { + entity.setTime(currentDate); + entity.setWeekStr(LocalDateTimeUtil.dayOfWeek(currentDate).toChinese()); + } + dateList.add(entity); + if (ObjectUtil.equals(dateRangeType, DateRangeTypeEnum.THIS_YEAR)) { + currentDate = currentDate.plusMonths(1); + } else { + currentDate = currentDate.plusDays(1); + } + } + return dateList; + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelCanteenController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelCanteenController.java index 71db0d7a1..f9f51c083 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelCanteenController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelCanteenController.java @@ -2,14 +2,14 @@ package com.bsd.pjcloud.hard.controller.panel; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.bsd.pjcloud.common.core.constant.enums.DateRangeTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +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.PanelCanteenDto; -import com.bsd.pjcloud.hard.api.vo.hard.PanelCanteenVo; +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.api.vo.order.HardOrderVo; import com.bsd.pjcloud.hard.service.HardOrderService; @@ -48,53 +48,53 @@ public class PanelCanteenController { @PostMapping(value = "/group/by-time-and-hour-type") @Operation(summary = "用餐数据统计(根据时间段和日期分类统计)") - public R groupByTimeAndHourType(@RequestBody PanelCanteenDto dto) { + public R groupByTimeAndHourType(@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(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); return R.ok(panelCanteenService.groupByTimeAndHourType(dto)); } @PostMapping(value = "/group/by-time-and-custom-hour") @Operation(summary = "用餐数据统计(根据自定义时间段和日期分类统计)") - public R> groupByTimeAndCustomHour(@RequestBody PanelCanteenDto dto) { + public R> groupByTimeAndCustomHour(@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(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); return R.ok(panelCanteenService.groupByTimeAndCustomHour(dto)); } @PostMapping(value = "/mch-pay-person-count") @Operation(summary = "各个食堂的用餐人数") - public R> mchPayPersonCount(@RequestBody PanelCanteenDto dto) { + public R> mchPayPersonCount(@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(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); return R.ok(panelCanteenService.mchPayPersonCount(dto)); } @PostMapping(value = "/pay-person-count-trend") @Operation(summary = "各个食堂的用餐人数(趋势)") - public R payPersonCountTrend(@RequestBody PanelCanteenDto dto) { + public R payPersonCountTrend(@RequestBody PanelProductDto dto) { dto.setTotalTimeList(new LocalDateTime[]{ LocalDateTime.now().minusDays(8).withHour(0).withMinute(0).withSecond(0), LocalDateTime.now().withHour(23).withMinute(59).withSecond(59) }); - dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); return R.ok(panelCanteenService.groupByTimeAndHourType(dto)); } @PostMapping(value = "/mch-pay-count-top") @Operation(summary = "排行榜") - public R> mchPayCountTop(@RequestBody PanelCanteenDto dto) { + public R> mchPayCountTop(@RequestBody PanelProductDto dto) { if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } dto.setLimit(5L); - dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); return R.ok(panelCanteenService.mchPayCountTop(dto)); } @@ -102,7 +102,7 @@ public class PanelCanteenController { @Operation(summary = "食堂报表") public R> canteenReport(@RequestBody HardOrderDto dto) { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); - dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); List mchDtoIds = new ArrayList<>(); if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { List mchList = mchService.getByParentId(dto.getMerchantId()).getData(); @@ -123,7 +123,7 @@ public class PanelCanteenController { if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getCreateTimeList())) { dto.setCreateTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } - dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); return R.ok(hardwareOrderService.scopePageList(page, dto, null)); } @@ -138,7 +138,7 @@ public class PanelCanteenController { HardOrderDto dto = new HardOrderDto(); dto.setCreateTimeList(localDate); - dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType(), MerchantTypeEnum.SUPERMARKET.getType())); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); List list = hardwareOrderService.scopeList(dto, null); if (ObjectUtil.isEmpty(list)) { return R.ok(); 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 new file mode 100644 index 000000000..b03b48eb4 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelShopController.java @@ -0,0 +1,132 @@ +package com.bsd.pjcloud.hard.controller.panel; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.constant.enums.DateRangeTypeEnum; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +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.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.HardOrderTotalService; +import com.bsd.pjcloud.hard.service.PanelShopService; +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; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +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 +@RequiredArgsConstructor +@RequestMapping("/panel-shop") +@Tag(description = "panel-shop", name = "超市统计") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class PanelShopController { + + private final PanelShopService panelShopService; + + private final HardOrderService hardwareOrderService; + private final HardOrderTotalService hardOrderTotalService; + + private final RemoteMchService mchService; + + @PostMapping(value = "/mch-pay-count") + @Operation(summary = "各个超市的购买数量统计") + public R> mchPayPersonCount(@RequestBody PanelProductDto dto) { + 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()); + return R.ok(panelShopService.mchPayPersonCount(dto)); + } + + @PostMapping(value = "/mch-pay-count-trend") + @Operation(summary = "各个自营超市的统计数据(趋势)") + public R> mchPayCountTrend(@RequestBody PanelProductDto dto) { + dto.setTotalTimeList(new LocalDateTime[]{ + LocalDateTime.now().minusDays(8).withHour(0).withMinute(0).withSecond(0), + LocalDateTime.now().withHour(23).withMinute(59).withSecond(59) + }); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + dto.setHourTypeIsNull(YesNoEnum.YES.getCode()); + return R.ok(panelShopService.mchPayCount(dto)); + } + + @PostMapping(value = "/report") + @Operation(summary = "食堂报表") + public R> canteenReport(@RequestBody HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + dto.setMchTypeCodes(List.of(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)); + } + + @PostMapping(value = "/new-page") + @Operation(summary = "最新的超市数据") + public R> newPage(@ParameterObject Page page, @RequestBody HardOrderDto dto) { + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getCreateTimeList())) { + dto.setCreateTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + return R.ok(hardwareOrderService.scopePageList(page, dto, null)); + } + + @PostMapping(value = "/recently") + @Operation(summary = "最近超市购买数据") + public R recently() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime[] localDate = new LocalDateTime[]{ + now.minusMinutes(1), + now.plusMinutes(1) + }; + HardOrderDto dto = new HardOrderDto(); + dto.setCreateTimeList(localDate); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + List list = hardwareOrderService.scopeList(dto, null); + if (ObjectUtil.isEmpty(list)) { + return R.ok(); + } + return R.ok(list.get(0)); + } + + @PostMapping(value = "/mch-pay-count-top") + @Operation(summary = "排行榜") + public R> mchPayCountTop(@RequestBody PanelProductDto dto) { + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { + dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setLimit(5L); + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + dto.setHourTypeIsNull(YesNoEnum.YES.getCode()); + return R.ok(panelShopService.mchPayCountTop(dto)); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelSupermarketController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelSupermarketController.java deleted file mode 100644 index 9ae6238cd..000000000 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/panel/PanelSupermarketController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.bsd.pjcloud.hard.controller.panel; - -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/panel-mch") -@Tag(description = "panel-mch", name = "超市统计") -@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class PanelSupermarketController { - -} 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 caf190c34..c0d5f8d1a 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 @@ -10,10 +10,10 @@ import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; 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.order.HardOrderSumAndCountDto; -import com.bsd.pjcloud.hard.api.dto.panel.PanelCanteenDto; +import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; -import com.bsd.pjcloud.hard.api.vo.hard.PanelCanteenVo; +import com.bsd.pjcloud.hard.api.vo.hard.PanelPorductVo; import com.bsd.pjcloud.hard.api.vo.order.*; import com.github.yulichang.wrapper.MPJLambdaWrapper; @@ -139,12 +139,12 @@ public interface HardOrderMapper extends PjcloudBaseMapper { /** * 用餐数据统计(根据时间段和日期分类统计) */ - List groupByTimeAndHourType(@Param("dto") PanelCanteenDto dto); + List groupByTimeAndHourType(@Param("dto") PanelProductDto dto); - List groupByMonthAndHourType(@Param("dto") PanelCanteenDto dto); + List groupByMonthAndHourType(@Param("dto") PanelProductDto dto); /** * 用餐数据统计(根据商户统计) */ - List groupByMch(@Param("dto") PanelCanteenDto dto); + List groupByMch(@Param("dto") PanelProductDto dto); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelCanteenService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelCanteenService.java index 103b704b6..6b174de32 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelCanteenService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelCanteenService.java @@ -1,7 +1,7 @@ package com.bsd.pjcloud.hard.service; -import com.bsd.pjcloud.hard.api.dto.panel.PanelCanteenDto; -import com.bsd.pjcloud.hard.api.vo.hard.PanelCanteenVo; +import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; +import com.bsd.pjcloud.hard.api.vo.hard.PanelPorductVo; import java.util.List; @@ -10,20 +10,20 @@ public interface PanelCanteenService { /** * 用餐数据统计(根据时间段和日期分类统计) */ - PanelCanteenVo.HourTypeVo groupByTimeAndHourType(PanelCanteenDto dto); + PanelPorductVo.HourTypeVo groupByTimeAndHourType(PanelProductDto dto); /** * 各个食堂的用餐人数 */ - List mchPayPersonCount(PanelCanteenDto dto); + List mchPayPersonCount(PanelProductDto dto); /** * 用餐数据统计(根据自定义时间段和日期分类统计) */ - List groupByTimeAndCustomHour(PanelCanteenDto dto); + List groupByTimeAndCustomHour(PanelProductDto dto); /** * 排行榜 */ - List mchPayCountTop(PanelCanteenDto dto); + List mchPayCountTop(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 new file mode 100644 index 000000000..4650cf240 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelShopService.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.hard.service; + +import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; +import com.bsd.pjcloud.hard.api.vo.hard.PanelPorductVo; + +import java.util.List; + +public interface PanelShopService { + + /** + * 各个超市的购买人数 + */ + List mchPayPersonCount(PanelProductDto dto); + + /** + * 各个自营超市的统计数据(趋势) + */ + List mchPayCount(PanelProductDto dto); + + /** + * 排行榜 + */ + List mchPayCountTop(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 189f8d536..420f8260d 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 @@ -1,26 +1,23 @@ package com.bsd.pjcloud.hard.service.impl.panel; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.common.core.constant.enums.DateRangeTypeEnum; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.hard.api.constant.order.HardHourTypeEnum; -import com.bsd.pjcloud.hard.api.dto.panel.PanelCanteenDto; -import com.bsd.pjcloud.hard.api.vo.hard.PanelCanteenVo; +import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; +import com.bsd.pjcloud.hard.api.vo.hard.PanelPorductVo; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.PanelCanteenService; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.parameters.P; 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.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -39,25 +36,25 @@ public class PanelCanteenServiceImpl implements PanelCanteenService { * 用餐数据统计(根据时间段和日期分类统计) */ @Override - public PanelCanteenVo.HourTypeVo groupByTimeAndHourType(PanelCanteenDto dto) { + public PanelPorductVo.HourTypeVo groupByTimeAndHourType(PanelProductDto dto) { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - List dateList = generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); - PanelCanteenVo.HourTypeVo result = new PanelCanteenVo.HourTypeVo(); + List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + PanelPorductVo.HourTypeVo result = new PanelPorductVo.HourTypeVo(); List hourTypeList = List.of(HardHourTypeEnum.MORNING, HardHourTypeEnum.NOONING, HardHourTypeEnum.NIGHT); for (CompletableFuture voidCompletableFuture : hourTypeList.stream().map(hourType -> CompletableFuture.runAsync(() -> { RequestContextHolder.setRequestAttributes(requestAttributes); - PanelCanteenDto queryDto = BeanUtil.toBean(dto, PanelCanteenDto.class); + PanelProductDto queryDto = BeanUtil.toBean(dto, PanelProductDto.class); queryDto.setHourType(hourType.getType()); - List sqlList = new ArrayList<>(); + List sqlList = new ArrayList<>(); if (ObjectUtil.equals(dto.getDateRangeType(), DateRangeTypeEnum.THIS_YEAR.getType())) { sqlList = hardOrderMapper.groupByMonthAndHourType(queryDto); } else { sqlList = hardOrderMapper.groupByTimeAndHourType(queryDto); } // 处理查询出来的数据 - List resultList = BeanUtil.copyToList(dateList, PanelCanteenVo.class); - for (PanelCanteenVo v : resultList) { + 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()); @@ -67,7 +64,7 @@ public class PanelCanteenServiceImpl implements PanelCanteenService { }); } // 组装数据 - PanelCanteenVo.HourTypeItemVo vo = PanelCanteenVo.HourTypeItemVo.builder().list(resultList).type(hourType.getType()).typeStr(hourType.getDescription()).build(); + PanelPorductVo.ProductTypeItemVo vo = PanelPorductVo.ProductTypeItemVo.builder().list(resultList).type(hourType.getType()).typeStr(hourType.getDescription()).build(); switch (hourType) { case MORNING: result.setMorning(vo); @@ -89,8 +86,8 @@ public class PanelCanteenServiceImpl implements PanelCanteenService { * 各个食堂的用餐人数 */ @Override - public List mchPayPersonCount(PanelCanteenDto dto) { - List list = hardOrderMapper.groupByMch(dto); + public List mchPayPersonCount(PanelProductDto dto) { + List list = hardOrderMapper.groupByMch(dto); disposePanelCanteenVoSetMchName(list); return list; } @@ -99,8 +96,8 @@ public class PanelCanteenServiceImpl implements PanelCanteenService { * 用餐数据统计(根据时间段和日期分类统计) */ @Override - public List groupByTimeAndCustomHour(PanelCanteenDto dto) { - List result = new ArrayList<>(); + public List groupByTimeAndCustomHour(PanelProductDto dto) { + List result = new ArrayList<>(); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); LocalDateTime now = LocalDateTime.now(); @@ -120,66 +117,39 @@ public class PanelCanteenServiceImpl implements PanelCanteenService { RequestContextHolder.setRequestAttributes(requestAttributes); Integer targetHour = customList.get(0); - PanelCanteenDto queryDto = PanelCanteenDto + 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.groupByTimeAndHourType(queryDto); - PanelCanteenVo build = PanelCanteenVo.builder().hourType(customList.get(0) + "-" + customList.get(1)).personCount(0L).order(targetHour).build(); + List sqlList = hardOrderMapper.groupByTimeAndHourType(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(PanelCanteenVo::getOrder)).toList(); + return result.stream().sorted(Comparator.comparingInt(PanelPorductVo::getOrder)).toList(); } /** * 排行榜 */ @Override - public List mchPayCountTop(PanelCanteenDto dto) { - List list = hardOrderMapper.groupByMch(dto); + public List mchPayCountTop(PanelProductDto dto) { + List list = hardOrderMapper.groupByMch(dto); disposePanelCanteenVoSetMchName(list); return list; } - private List generatePanelCanteenList(LocalDateTime[] totalTimeList, DateRangeTypeEnum dateRangeType) { - List dateList = new LinkedList<>(); - LocalDate startTime = totalTimeList[0].toLocalDate(); - LocalDate endTime = totalTimeList[1].toLocalDate(); - LocalDate currentDate = startTime; - while (!currentDate.isAfter(endTime)) { - PanelCanteenVo entity = new PanelCanteenVo(); - entity.setPersonCount(0L); - entity.setBuyCount(0L); - entity.setBuyProductCount(0L); - if (ObjectUtil.equals(dateRangeType, DateRangeTypeEnum.THIS_YEAR)) { - entity.setTime(currentDate.withDayOfMonth(1)); - entity.setWeekStr(""); - } else { - entity.setTime(currentDate); - entity.setWeekStr(LocalDateTimeUtil.dayOfWeek(currentDate).toChinese()); - } - dateList.add(entity); - if (ObjectUtil.equals(dateRangeType, DateRangeTypeEnum.THIS_YEAR)) { - currentDate = currentDate.plusMonths(1); - } else { - currentDate = currentDate.plusDays(1); - } - } - return dateList; - } - - private void disposePanelCanteenVoSetMchName(List list) { + private void disposePanelCanteenVoSetMchName(List list) { if (ObjectUtil.isEmpty(list)) return; // 商户名 - List mchIds = list.stream().map(PanelCanteenVo::getMchId).distinct().filter(ObjectUtil::isNotEmpty).toList(); + List mchIds = list.stream().map(PanelPorductVo::getMchId).distinct().filter(ObjectUtil::isNotEmpty).toList(); List mchList = remoteMchService.getByIds(mchIds).getData(); if (ObjectUtil.isNotEmpty(mchList)) { Map mchMap = CollectionUtils.convertMap(mchList, MchManageVo::getId); - for (PanelCanteenVo i : list) { + for (PanelPorductVo i : list) { MchManageVo mch = mchMap.get(i.getMchId()); if (ObjectUtil.isNotEmpty(mch)) i.setMchName(mch.getName()); } 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 new file mode 100644 index 000000000..bdb4f68a6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/panel/PanelShopServiceImpl.java @@ -0,0 +1,106 @@ +package com.bsd.pjcloud.hard.service.impl.panel; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.util.CollectionUtils; +import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; +import com.bsd.pjcloud.hard.api.vo.hard.PanelPorductVo; +import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; +import com.bsd.pjcloud.hard.service.PanelShopService; +import com.bsd.pjcloud.wallet.api.dto.MchManageDto; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class PanelShopServiceImpl implements PanelShopService { + + private final HardOrderMapper hardOrderMapper; + + private final RemoteMchService remoteMchService; + + /** + * 各个超市的购买人数 + */ + @Override + public List mchPayPersonCount(PanelProductDto dto) { + List list = hardOrderMapper.groupByMch(dto); + disposePanelCanteenVoSetMchName(list); + return list; + } + + /** + * 各个自营超市的统计数据(趋势) + */ + @Override + public List mchPayCount(PanelProductDto dto) { + List result = new ArrayList<>(); + // 处理时间 + List dateList = PanelPorductVo.generatePanelCanteenList(dto.getTotalTimeList(), dto.getDateRangeType()); + // 查询商户 + MchManageDto mchDto = new MchManageDto(); + mchDto.setTypesList(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + List mchList = remoteMchService.list(mchDto).getData(); + result = mchList.stream().map(v -> { + PanelPorductVo.ProductTypeItemVo entity = new PanelPorductVo.ProductTypeItemVo(); + entity.setType(String.valueOf(v.getId())); + entity.setTypeStr(v.getName()); + return entity; + }).toList(); + // 查询商户订单 + List list = hardOrderMapper.groupByMch(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)) continue; + // 处理时间 + List resultList = BeanUtil.copyToList(dateList, PanelPorductVo.class); + for (PanelPorductVo i : resultList) { + targetMchTotalList.stream().filter(item -> ObjectUtil.equals(item.getTime(), i.getTime())).forEach(target -> { + i.setHourType(target.getHourType()); + i.setPersonCount(target.getPersonCount()); + i.setBuyCount(target.getBuyCount()); + i.setBuyProductCount(target.getBuyProductCount()); + i.setTotalPrice(target.getTotalPrice()); + }); + } + v.setList(resultList); + } + return result; + } + + /** + * 排行榜 + */ + @Override + public List mchPayCountTop(PanelProductDto dto) { + List list = hardOrderMapper.groupByMch(dto); + disposePanelCanteenVoSetMchName(list); + return list; + } + + private void disposePanelCanteenVoSetMchName(List list) { + if (ObjectUtil.isEmpty(list)) return; + // 商户名 + List mchIds = list.stream().map(PanelPorductVo::getMchId).distinct().filter(ObjectUtil::isNotEmpty).toList(); + List mchList = remoteMchService.getByIds(mchIds).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + Map mchMap = CollectionUtils.convertMap(mchList, MchManageVo::getId); + for (PanelPorductVo i : list) { + MchManageVo mch = mchMap.get(i.getMchId()); + if (ObjectUtil.isNotEmpty(mch)) i.setMchName(mch.getName()); + } + } + } + +} 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 986c3ad9a..187e4f146 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,7 +550,7 @@ - select date(o.create_time) as time, o.hour_type as hourType, @@ -584,8 +584,8 @@ - + select date(o.create_time) as time, o.hour_type as hourType, SUM(a.product_count) as buyProductCount, @@ -618,7 +618,7 @@ - select o.merchant_id as mchId, sum(a.product_count) as buyProductCount, SUM(a.total_price) as totalPrice, @@ -626,8 +626,10 @@ count(distinct o.user_id) as personCount from hard_car a inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' - inner join hard_order o on o.parent_car_id = p.id and o.del_flag = '0' and o.hour_type is not null and - o.hour_type not in ('-1', 'null') + inner join hard_order o on o.parent_car_id = p.id and o.del_flag = '0' + + and o.hour_type is not null and o.hour_type not in ('-1', 'null') + a.del_flag = '0' diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java index b451d7360..5392e47d3 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java @@ -4,9 +4,12 @@ import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -14,6 +17,10 @@ import java.util.List; @FeignClient(contextId = "remoteMchService", value = ServiceNameConstants.WALLET_SERVICE) public interface RemoteMchService { + @NoToken + @PostMapping("/mch-manage/list") + R> list(@RequestBody MchManageDto body); + @NoToken @GetMapping("/mch-manage/get-by-types") R> getByTypes(@RequestParam List types); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java index d96f46247..73520a18e 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java @@ -54,6 +54,13 @@ public class MchManageController { private final RemoteUserService remoteUserService; /* ************************************* start 远程调用 start ************************************* */ + @Inner + @PostMapping("/list") + public R> remoteList(@RequestBody MchManageDto body) { + List list = mchManageService.list(body); + return R.ok(list); + } + @Inner @GetMapping("/get-by-types") public R> getByTypes(@RequestParam List types) {