diff --git a/db/810pjcloudx_wallet_act.sql b/db/810pjcloudx_wallet_act.sql index 96592a588..66da835a7 100644 --- a/db/810pjcloudx_wallet_act.sql +++ b/db/810pjcloudx_wallet_act.sql @@ -1,3 +1,27 @@ +-- ---------------------------- +-- Table structure for act_cancel +-- ---------------------------- +DROP TABLE IF EXISTS act_cancel; +CREATE TABLE act_cancel +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '活动项id', + mch_id bigint NOT NULL COMMENT '活动商户id', + notice_id bigint NOT NULL COMMENT '公告id', + active_org_price int DEFAULT NULL COMMENT '活动原价', + active_cancel_price int NOT NULL COMMENT '活动核销价', + expire_time datetime NOT NULL COMMENT '到期时间', + act_status char(32) NOT NULL COMMENT '活动状态(1:正常 2:关闭)', + act_title char(32) NOT NULL COMMENT '活动标题', + act_content char(32) DEFAULT NULL COMMENT '活动内容', + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB COMMENT ='核销活动'; + -- ---------------------------- -- Table structure for act_cancel_item -- ---------------------------- diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java index 8994bb334..fe2d93a6e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/panel/PanelProductDto.java @@ -25,6 +25,13 @@ public class PanelProductDto { private List excludeClassifyIds; + private List orderStatus; + + /** + * 排除当天在食堂吃饭的数据 + */ + private String excludeCanteenPay; + private String hourTypeIsNull; private String hourType; 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..e0a3fbe5e 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 @@ -113,6 +113,20 @@ public class PanelPorductVo { } + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class ProductListByTimeItemVo { + + private String timeStr; + + private LocalDateTime time; + + private List list; + + } + @Data @Builder @AllArgsConstructor @@ -155,7 +169,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 73ed0436e..d7c7c6df0 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 @@ -3,11 +3,18 @@ package com.bsd.pjcloud.hard.controller.panel; import cn.hutool.core.util.ObjectUtil; 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.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; @@ -19,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 @@ -29,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 = "食堂用餐分类统计") @@ -37,6 +48,7 @@ public class PanelNutritionController { dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelNutritionService.classCount(dto)); } @@ -47,6 +59,7 @@ public class PanelNutritionController { dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelNutritionService.cuisineTop(dto)); } @@ -57,6 +70,7 @@ public class PanelNutritionController { dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelNutritionService.nutritionByTime(dto)); } @@ -67,6 +81,7 @@ public class PanelNutritionController { dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelNutritionService.nutritionTotal(dto)); } @@ -78,19 +93,53 @@ public class PanelNutritionController { LocalDateTime.now().withHour(23).withMinute(59).withSecond(59) }); dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); return R.ok(panelNutritionService.nutritionByTime(dto)); } @PostMapping(value = "/repurchase") @Operation(summary = "复购排行榜") public R> repurchase(@RequestBody PanelProductDto dto) { - dto.setDateRangeType(DateRangeTypeEnum.THIS_YEAR); + dto.setDateRangeType(DateRangeTypeEnum.TODAY); if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); } dto.setMchTypeCodes(List.of(MerchantTypeEnum.CANTEEN.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); dto.setLimit(5L); return R.ok(panelNutritionService.repurchase(dto)); } + @PostMapping(value = "/external") + @Operation(summary = "外部就餐情况(合作商家)") + public R external(@RequestBody PanelProductDto dto) { + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { + dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SUPERMARKET.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); + dto.setExcludeCanteenPay(YesNoEnum.YES.getCode()); + 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 b03b48eb4..d5b9b49d5 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)); } @@ -120,13 +122,43 @@ public class PanelShopController { @PostMapping(value = "/mch-pay-count-top") @Operation(summary = "排行榜") public R> mchPayCountTop(@RequestBody PanelProductDto dto) { + dto.setDateRangeType(DateRangeTypeEnum.TODAY); 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()); + 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)); + } + + + @PostMapping(value = "/hot-product") + @Operation(summary = "热卖商品") + public R> hotProduct(@RequestBody PanelProductDto dto) { + dto.setDateRangeType(DateRangeTypeEnum.THIS_WEEK); + if (ObjectUtil.isNotEmpty(dto.getDateRangeType()) && ObjectUtil.isEmpty(dto.getTotalTimeList())) { + dto.setTotalTimeList(DateRangeTool.transitionDateTypeToDateTimeList(dto.getDateRangeType())); + } + dto.setMchTypeCodes(List.of(MerchantTypeEnum.SELF_SUPERMARKET.getType())); + dto.setOrderStatus(HardOrderStatusEnum.getPayPrice()); + dto.setLimit(10L); + return R.ok(panelShopService.hotProduct(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 ac43e58ee..2c6d75541 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,8 +154,20 @@ public interface HardOrderMapper extends PjcloudBaseMapper { */ List groupByMch(@Param("dto") PanelProductDto dto); + List shopGroupByMch(@Param("dto") PanelProductDto dto); + /** * 复购排行榜 */ List repurchase(@Param("dto") PanelProductDto dto); + + /** + * 超市数据统计(根据时间段和日期分类统计) + * 订单表位主表,商品表为从表 + */ + List shopGroupByMonthAndHourType(@Param("dto") PanelProductDto dto); + + List shopGroupByTimeAndHourType(@Param("dto") PanelProductDto dto); + + List shopGroupByProduct(@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/PanelNutritionService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/PanelNutritionService.java index d93ed2508..45377b12d 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 @@ -35,4 +35,9 @@ public interface PanelNutritionService { * 复购排行榜 */ List repurchase(PanelProductDto dto); + + /** + * 外部就餐情况(合作商家) + */ + PanelPorductVo.HourTypeVo external(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..ab4bcfd0c 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,14 @@ public interface PanelShopService { * 排行榜 */ List mchPayCountTop(PanelProductDto dto); + + /** + * 当天超市购买次数趋势统计 + */ + List todayTrend(PanelProductDto dto); + + /** + * 热卖商品 + */ + List hotProduct(PanelProductDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java index 530c531c5..6ba685927 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java @@ -426,12 +426,19 @@ public class HardCarServiceImpl extends ServiceImpl spuList = remoteMallProductService.getSkusWithSpuBySkuIds(productIds).getData(); for (HardCreateCarDto v : productList) { HardCarEntity item = HardCarEntity.builder().parentCarId(parentCarId).build(); - spuList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + spu: + for (MallProductDetailAppVo spu : spuList) { + if (ObjectUtil.isEmpty(spu) || ObjectUtil.isEmpty(spu.getSkuList())) { + continue spu; + } + MallProductSkuAppVo sku = spu.getSkuList().stream().filter(_item -> ObjectUtil.equals(_item.getId(), v.getProductId())).findFirst().orElse(null); + if (ObjectUtil.isEmpty(sku)) { + continue spu; + } if (ObjectUtil.isEmpty(spu.getSkuList())) { throw new RuntimeException("共富商城商品无SKU信息商品名字:" + spu.getTitle() + "商品ID:" + spu.getId() + "请联系管理员"); } - MallProductSkuAppVo skuDetail = spu.getSkuList().get(0); - Integer price = skuDetail.getPrice(); + Integer price = sku.getPrice(); int totalPrice = 0; if (ObjectUtil.isNotEmpty(v.getProductCount()) && !ObjectUtil.equals(v.getProductCount(), 0)) { // 按数量 @@ -440,7 +447,7 @@ public class HardCarServiceImpl extends ServiceImpl 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 69208b4bb..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 @@ -4,6 +4,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.canteen.api.feign.RemoteCanteenCategoryService; import com.bsd.pjcloud.canteen.entity.CanteenCategoryEntity; +import com.bsd.pjcloud.common.core.constant.enums.DateRangeTypeEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardHourTypeEnum; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductByClassifyDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppProductLikeTopDto; import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; @@ -102,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(); @@ -207,6 +209,55 @@ public class PanelNutritionServiceImpl implements PanelNutritionService { return list; } + /** + * 外部就餐情况(合作商家) + */ + @Override + public PanelPorductVo.HourTypeVo external(PanelProductDto dto) { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + List dateList = PanelPorductVo.generatePanelPorductVoList(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); + PanelProductDto queryDto = BeanUtil.toBean(dto, PanelProductDto.class); + List sqlList = new ArrayList<>(); + if (ObjectUtil.equals(dto.getDateRangeType(), DateRangeTypeEnum.THIS_YEAR)) { + sqlList = hardOrderMapper.shopGroupByMonthAndHourType(queryDto); + } else { + sqlList = hardOrderMapper.shopGroupByTimeAndHourType(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(hourType.getType()).typeStr(hourType.getDescription()).build(); + switch (hourType) { + case MORNING: + result.setMorning(vo); + break; + case NOONING: + result.setNoon(vo); + break; + case NIGHT: + result.setEvening(vo); + break; + } + })).toList()) { + voidCompletableFuture.join(); + } + return result; + } + private void disposeRepurchaseList(List list, PanelProductDto dto) { if (ObjectUtil.isEmpty(list)) return; // 处理菜品分类 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..c8d3fd377 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,56 @@ 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(); + } + + /** + * 热卖商品 + */ + @Override + public List hotProduct(PanelProductDto dto) { + return hardOrderMapper.shopGroupByProduct(dto); + } + 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 91866ecc7..150d45bb3 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 @@ -592,40 +592,56 @@ + + c.del_flag = '0' + + and o.create_time between #{dto.totalTimeList[0]} and #{dto.totalTimeList[1]} + + + and o.hour_type = #{dto.hourType} + + + and o.merchant_type in + + #{v} + + + + and s.category_id in + + #{v} + + + + and s.category_id not in + + #{v} + + + + and o.order_status in + + #{v} + + + + @@ -633,38 +649,20 @@ select date(o.create_time) as time, o.hour_type as hourType, - SUM(a.product_count) as buyProductCount, - SUM(a.total_price) as totalPrice, + SUM(c.product_count) as buyProductCount, + SUM(c.total_price) as totalPrice, count(distinct o.id) as buyCount, count(distinct o.user_id) as personCount, s.category_id as classifyId - from hard_car a - inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' + from hard_car c + inner join hard_parent_car p on c.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') - left join pjcloudx_canteen.canteen_spu s on a.product_id = s.id + left join pjcloudx_canteen.canteen_spu s on c.product_id = s.id - a.del_flag = '0' - - and o.create_time between #{dto.totalTimeList[0]} and #{dto.totalTimeList[1]} - - - and o.hour_type = #{dto.hourType} - - - and o.merchant_type in - - #{v} - - - - and s.category_id in - - #{v} - - + group by date(o.create_time) order by date(o.create_time) desc @@ -677,38 +675,20 @@ select date(o.create_time) as time, o.hour_type as hourType, - SUM(a.product_count) as buyProductCount, - SUM(a.total_price) as totalPrice, + SUM(c.product_count) as buyProductCount, + SUM(c.total_price) as totalPrice, count(distinct o.id) as buyCount, count(distinct o.user_id) as personCount, s.category_id as classifyId - from hard_car a - inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' + from hard_car c + inner join hard_parent_car p on c.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') - left join pjcloudx_canteen.canteen_spu s on a.product_id = s.id + left join pjcloudx_canteen.canteen_spu s on c.product_id = s.id - a.del_flag = '0' - - and o.create_time between #{dto.totalTimeList[0]} and #{dto.totalTimeList[1]} - - - and o.hour_type = #{dto.hourType} - - - and o.merchant_type in - - #{v} - - - - and s.category_id in - - #{v} - - + group by date(o.create_time), o.hour_type order by date(o.create_time) desc @@ -721,38 +701,20 @@ select date(o.create_time) as time, o.hour_type as hourType, - SUM(a.product_count) as buyProductCount, - SUM(a.total_price) as totalPrice, + SUM(c.product_count) as buyProductCount, + SUM(c.total_price) as totalPrice, count(distinct o.id) as buyCount, count(distinct o.user_id) as personCount, s.category_id as classifyId - from hard_car a - inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' + from hard_car c + inner join hard_parent_car p on c.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') - left join pjcloudx_canteen.canteen_spu s on a.product_id = s.id + left join pjcloudx_canteen.canteen_spu s on c.product_id = s.id - a.del_flag = '0' - - and o.create_time between #{dto.totalTimeList[0]} and #{dto.totalTimeList[1]} - - - and o.hour_type = #{dto.hourType} - - - and o.merchant_type in - - #{v} - - - - and s.category_id in - - #{v} - - + group by date_format(o.create_time, '%Y-%m'), o.hour_type order by date_format(o.create_time, '%Y-%m') desc @@ -763,41 +725,45 @@ + + select o.merchant_id as mchId, - a.product_name as productName, - sum(a.product_count) as buyProductCount, - SUM(a.total_price) as totalPrice, + c.product_name as productName, + sum(c.product_count) as buyProductCount, + SUM(c.total_price) as totalPrice, count(distinct o.id) as buyCount, count(distinct o.user_id) as personCount, s.category_id as classifyId - from hard_car a - inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' + from hard_car c + inner join hard_parent_car p on c.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') - left join pjcloudx_canteen.canteen_spu s on a.product_id = s.id + left join pjcloudx_canteen.canteen_spu s on c.product_id = s.id - a.del_flag = '0' - - and o.create_time between #{dto.totalTimeList[0]} and #{dto.totalTimeList[1]} - - - and o.hour_type = #{dto.hourType} - - - and o.merchant_type in - - #{v} - - - - and s.category_id in - - #{v} - - - - and s.category_id not in - - #{v} - - + - GROUP BY a.product_id, o.user_id, o.hour_type + GROUP BY c.product_id, o.user_id, o.hour_type having COUNT(DISTINCT o.id) >= 2 - order by sum(a.product_count) desc + order by sum(c.product_count) desc limit #{dto.limit} + + + + + \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/config/QnOssConfig.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/config/QnOssConfig.java new file mode 100644 index 000000000..46aa681d5 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/config/QnOssConfig.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.admin.api.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "qn") +@Data +public class QnOssConfig { + + private Oss oss; + + @Data + public static class Oss { + + private String accessKey; + + private String secretKey; + + private String bucketName; + + private String domain; + + } + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/third/QnUploadVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/third/QnUploadVo.java new file mode 100644 index 000000000..1e9990b10 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/third/QnUploadVo.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.admin.api.vo.third; + +import lombok.Data; + +@Data +public class QnUploadVo { + + public String fileHash; + + public String fileName; + + public String fullUrl; + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/pom.xml b/pjcloud-upms/pjcloud-upms-biz/pom.xml index a1516b609..4ec10d336 100644 --- a/pjcloud-upms/pjcloud-upms-biz/pom.xml +++ b/pjcloud-upms/pjcloud-upms-biz/pom.xml @@ -33,6 +33,11 @@ pjcloud 通用用户权限管理系统业务处理模块 + + com.qiniu + qiniu-java-sdk + [7.19.0, 7.19.99] + com.bsd diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java index a7ca77cef..55dedf43c 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysFileController.java @@ -42,6 +42,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.Map; import java.util.Objects; /** @@ -122,6 +123,14 @@ public class SysFileController { return sysFileService.uploadFile(file, dir, groupId, type); } + /** + * 七牛云上传 + */ + @PostMapping(value = "/qn/upload") + public R> qnUpload(@RequestPart("file") MultipartFile file, @RequestParam(value = "dir", required = false) String dir, @RequestParam(value = "groupId", required = false) Long groupId, @RequestParam(value = "type", required = false) String type) { + return sysFileService.qnUpload(file, dir, groupId, type); + } + /** * 获取文件 * diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/QnOssService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/QnOssService.java new file mode 100644 index 000000000..844368d3e --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/QnOssService.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.admin.service; + + +import com.bsd.pjcloud.admin.api.vo.third.QnUploadVo; +import org.springframework.web.multipart.MultipartFile; + +public interface QnOssService { + + QnUploadVo upload(MultipartFile file, String fileName); + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java index ad3174886..f7c1c15d4 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysFileService.java @@ -27,6 +27,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; /** * 文件管理 @@ -36,57 +37,66 @@ import java.util.List; */ public interface SysFileService extends IService { - /** - * 上传文件 - * @param file 文件流 - * @param dir 文件夹 - * @param groupId 分组ID - * @param type 类型 - * @return - */ - R uploadFile(MultipartFile file, String dir, Long groupId, String type); + /** + * 上传文件 + * + * @param file 文件流 + * @param dir 文件夹 + * @param groupId 分组ID + * @param type 类型 + * @return + */ + R uploadFile(MultipartFile file, String dir, Long groupId, String type); - R innerUpload(MultipartFile file, String dir, Long groupId, String type); + R innerUpload(MultipartFile file, String dir, Long groupId, String type); - /** - * 读取文件 - * @param fileName 文件名称 - * @param response 输出流 - */ - void getFile(String fileName, HttpServletResponse response); + R> qnUpload(MultipartFile file, String dir, Long groupId, String type); - /** - * 删除文件 - * @param id - * @return - */ - Boolean deleteFile(Long id); + /** + * 读取文件 + * + * @param fileName 文件名称 + * @param response 输出流 + */ + void getFile(String fileName, HttpServletResponse response); - /** - * 查询文件组列表 - * @param fileGroup SysFileGroup对象,用于筛选条件 - * @return 包含文件组列表的Tree对象列表 - */ - List> listFileGroup(SysFileGroup fileGroup); + /** + * 删除文件 + * + * @param id + * @return + */ + Boolean deleteFile(Long id); - /** - * 添加或更新文件组 - * @param fileGroup SysFileGroup对象,要添加或更新的文件组信息 - * @return 添加或更新成功返回true,否则返回false - */ - Boolean saveOrUpdateGroup(SysFileGroup fileGroup); + /** + * 查询文件组列表 + * + * @param fileGroup SysFileGroup对象,用于筛选条件 + * @return 包含文件组列表的Tree对象列表 + */ + List> listFileGroup(SysFileGroup fileGroup); - /** - * 删除文件组 - * @param id 待删除文件组的ID - * @return 删除成功返回true,否则返回false - */ - Boolean deleteGroup(Long id); + /** + * 添加或更新文件组 + * + * @param fileGroup SysFileGroup对象,要添加或更新的文件组信息 + * @return 添加或更新成功返回true,否则返回false + */ + Boolean saveOrUpdateGroup(SysFileGroup fileGroup); - /** - * 移动文件组 - * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 - * @return 移动成功返回true,否则返回false - */ - Boolean moveFileGroup(SysFileGroupDTO fileGroupDTO); + /** + * 删除文件组 + * + * @param id 待删除文件组的ID + * @return 删除成功返回true,否则返回false + */ + Boolean deleteGroup(Long id); + + /** + * 移动文件组 + * + * @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息 + * @return 移动成功返回true,否则返回false + */ + Boolean moveFileGroup(SysFileGroupDTO fileGroupDTO); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java index 29f8355aa..cc023e513 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysFileServiceImpl.java @@ -29,11 +29,14 @@ import cn.hutool.crypto.SecureUtil; import com.amazonaws.services.s3.model.S3Object; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.config.QnOssConfig; import com.bsd.pjcloud.admin.api.dto.SysFileGroupDTO; import com.bsd.pjcloud.admin.api.entity.SysFile; import com.bsd.pjcloud.admin.api.entity.SysFileGroup; +import com.bsd.pjcloud.admin.api.vo.third.QnUploadVo; import com.bsd.pjcloud.admin.mapper.SysFileGroupMapper; import com.bsd.pjcloud.admin.mapper.SysFileMapper; +import com.bsd.pjcloud.admin.service.QnOssService; import com.bsd.pjcloud.admin.service.SysFileService; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.util.R; @@ -70,6 +73,10 @@ public class SysFileServiceImpl extends ServiceImpl impl private final FileProperties properties; + private final QnOssConfig qnOssConfig; + + private final QnOssService qnOssService; + /** * 上传文件 * @@ -116,10 +123,25 @@ public class SysFileServiceImpl extends ServiceImpl impl return R.ok(resultMap); } + /** + * 七牛云上传 + */ + @Override + public R> qnUpload(MultipartFile file, String dir, Long groupId, String type) { + String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename()); + Map resultMap = new HashMap<>(4); + + QnUploadVo upload = qnOssService.upload(file, fileName); + + resultMap.put("bucketName", qnOssConfig.getOss().getBucketName()); + resultMap.put("fileName", fileName); + resultMap.put("url", upload.getFullUrl()); + return R.ok(resultMap); + } + /** * 读取文件 * - * @param bucket * @param fileName * @param response */ diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/third/QnOssServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/third/QnOssServiceImpl.java new file mode 100644 index 000000000..0ec765818 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/third/QnOssServiceImpl.java @@ -0,0 +1,54 @@ +package com.bsd.pjcloud.admin.service.impl.third; + +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.bsd.pjcloud.admin.api.config.QnOssConfig; +import com.bsd.pjcloud.admin.api.vo.third.QnUploadVo; +import com.bsd.pjcloud.admin.service.QnOssService; +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; + + +@Slf4j +@Service +@RequiredArgsConstructor +public class QnOssServiceImpl implements QnOssService { + + private final QnOssConfig qnOssConfig; + + @Override + public QnUploadVo upload(MultipartFile file, String fileName) { + QnOssConfig.Oss oss = qnOssConfig.getOss(); + + Auth auth = Auth.create(oss.getAccessKey(), oss.getSecretKey()); + String upToken = auth.uploadToken(oss.getBucketName()); + + Configuration config = Configuration.create(Region.region0()); + config.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2; + UploadManager uploadManager = new UploadManager(config); + + try (InputStream inputStream = file.getInputStream()) { + Response response = uploadManager.put(inputStream, fileName, upToken, null, null); + DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + QnUploadVo result = new QnUploadVo(); + result.setFileHash(putRet.hash); + result.setFileName(fileName); + result.setFullUrl(oss.getDomain() + "/" + putRet.key); + return result; + } catch (Exception e) { + e.printStackTrace(); + log.error("七牛云上传视频错误:{}", e.getMessage()); + return null; + } + } + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml index 40fc40aab..c8c768d9b 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/application.yml @@ -18,4 +18,9 @@ spring: - optional:nacos:${spring.application.name}-@profiles.active@.yml - +qn: + oss: + accessKey: IVrAjjdrTeZi14pqDd2s5kb_iAIGXATEMtOgmQUF + secretKey: SNhPscR3_xqX3E_B1XtMMWmLMrz7ipcguzNykQvo + bucketName: bizcabinet + domain: https://bizcabinet.zianxin.com \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java index 9bbf0c09f..a9cd679d3 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java @@ -18,7 +18,6 @@ public enum ActCancelStatusEnum { CANCEL_EXPIRE("3", "已过期"), ; private final String code; - private final String desc; public static ActCancelStatusEnum valueOfByType(String code) { diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActStatusEnum.java new file mode 100644 index 000000000..bb94f0985 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActStatusEnum.java @@ -0,0 +1,35 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 核销活动状体啊 + */ +@Getter +@AllArgsConstructor +public enum ActStatusEnum { + + ACT_OPEN("1", "开启"), + ACT_CANCEL("2", "关闭活动"), + ; + + private final String code; + private final String desc; + + public static ActStatusEnum valueOfByType(String code) { + return Arrays.stream(ActStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().get(); + } + + public static ActStatusEnum descOf(String description) { + return Arrays.stream(ActStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelDto.java new file mode 100644 index 000000000..9da345a6b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelDto.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import lombok.Data; + +@Data +public class ActCancelDto extends ActCancelEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCancelEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCancelEntity.java new file mode 100644 index 000000000..81af4e11a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCancelEntity.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.wallet.api.entity.act; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 核销活动 + */ +@Data +@TenantTable +@TableName("act_cancel") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "核销活动") +public class ActCancelEntity extends Model { + + + /** + * 活动项id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "活动项id") + private Long id; + + /** + * 活动商户id + */ + @Schema(description = "活动商户id") + private Long mchId; + + /** + * 公告id + */ + @Schema(description = "公告id") + private Long noticeId; + + /** + * 活动原价 + */ + @Schema(description = "活动原价") + private Integer activeOrgPrice; + + /** + * 活动核销价 + */ + @Schema(description = "活动核销价") + private Integer activeCancelPrice; + + /** + * 到期时间 + */ + @Schema(description = "到期时间") + private LocalDateTime expireTime; + + /** + * 活动状态(1:正常 2:关闭) + */ + @Schema(description = "活动状态(1:正常 2:关闭)") + private String actStatus; + + /** + * 活动标题 + */ + @Schema(description = "活动标题") + private String actTitle; + + /** + * 活动内容 + */ + @Schema(description = "活动内容") + private String actContent; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCancelVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCancelVo.java new file mode 100644 index 000000000..b8ae483f4 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCancelVo.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface; +import lombok.Data; + +@Data +public class ActCancelVo extends ActCancelEntity implements BaseMchInterface { + + /** + * 商户相关 + */ + private Long merchantId; + + private String merchantName; + + private String logoPic; + + private String merchantType; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelController.java new file mode 100644 index 000000000..11fa7467a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelController.java @@ -0,0 +1,72 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.dto.act.ActCancelDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import com.bsd.pjcloud.wallet.service.ActCancelService; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + + +/** + * 核销活动 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act/act-cancel") +@Tag(description = "act-cancel", name = "核销活动管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActCancelController { + + private final ActCancelService actCancelService; + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actCancel_view')") + public R getActCancelPage(@ParameterObject Page page, @ParameterObject ActCancelDto dto) { + return R.ok(actCancelService.scopePageJoin(page, dto, DataScope.of())); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actCancel_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(actCancelService.getById(id)); + } + + @Operation(summary = "新增核销活动", description = "新增核销活动") + @SysLog("新增核销活动") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_actCancel_add')") + public R save(@RequestBody ActCancelDto dto) { + return R.ok(actCancelService.create(dto)); + } + + @Operation(summary = "修改核销活动", description = "修改核销活动") + @SysLog("修改核销活动") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_actCancel_edit')") + public R updateById(@RequestBody ActCancelEntity actCancel) { + return R.ok(actCancelService.updateById(actCancel)); + } + + @Operation(summary = "通过id删除核销活动", description = "通过id删除核销活动") + @SysLog("通过id删除核销活动") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actCancel_del')") + public R removeById(@RequestBody Long[] ids) { + actCancelService.delByIds(CollUtil.toList(ids)); + return R.ok(); + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelMapper.java new file mode 100644 index 000000000..b1b23fcd9 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelMapper.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.wallet.mapper.act; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.act.ActCancelDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCancelVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ActCancelMapper extends PjcloudBaseMapper { + + List scopePageJoin(Page page, @Param("dto") ActCancelDto dto, DataScope dataScope); + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelService.java new file mode 100644 index 000000000..93f55215f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelService.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.wallet.api.dto.act.ActCancelDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCancelVo; + +import java.util.ArrayList; +import java.util.List; + +public interface ActCancelService extends IService { + + /** + * 分页查询 + */ + List scopePageJoin(Page page, ActCancelDto dto, DataScope dataScope); + + /** + * 新增 + */ + Long create(ActCancelDto dto); + + /** + * 根据ids删除 + */ + void delByIds(ArrayList list); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelServiceImpl.java new file mode 100644 index 000000000..2d136e349 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelServiceImpl.java @@ -0,0 +1,73 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.wallet.api.constant.act.ActStatusEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCancelDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelItemEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCancelVo; +import com.bsd.pjcloud.wallet.mapper.act.ActCancelItemMapper; +import com.bsd.pjcloud.wallet.mapper.act.ActCancelMapper; +import com.bsd.pjcloud.wallet.service.ActCancelService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 核销活动 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ActCancelServiceImpl extends ServiceImpl implements ActCancelService { + + private final ActCancelItemMapper actCancelItemMapper; + + /** + * 分页查询 + */ + @Override + public List scopePageJoin(Page page, ActCancelDto dto, DataScope dataScope) { + return baseMapper.scopePageJoin(page, dto, dataScope); + } + + /** + * 新增 + */ + @Override + public Long create(ActCancelDto dto) { + ActCancelEntity savObj = BeanUtils.toBean(dto, ActCancelEntity.class); + if (ObjectUtil.isEmpty(savObj.getActStatus())) { + savObj.setActStatus(ActStatusEnum.ACT_OPEN.getCode()); + } + baseMapper.insert(savObj); + return savObj.getId(); + } + + /** + * 根据ids删除 + */ + @Override + public void delByIds(ArrayList actIds) { + if (ObjectUtil.isEmpty(actIds)) return; + List list = baseMapper.selectList(new LambdaQueryWrapper().in(ActCancelEntity::getId, actIds)); + if (ObjectUtil.isEmpty(list)) return; + for (ActCancelEntity v : list) { + if (ObjectUtil.equals(v.getActStatus(), ActStatusEnum.ACT_OPEN.getCode())) { + throw new RuntimeException("<" + v.getActTitle() + ">,该活动未关闭,无法删除!"); + } + Long cout = actCancelItemMapper.selectCount(new LambdaQueryWrapper().eq(ActCancelItemEntity::getActId, v.getId())); + if (ObjectUtil.isNotEmpty(cout) && cout > 0) { + throw new RuntimeException("<" + v.getActTitle() + ">,该活动已有人参加活动,无法删除!"); + } + } + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelMapper.xml new file mode 100644 index 000000000..f2ffa68a3 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelMapper.xml @@ -0,0 +1,52 @@ + + + + + + select a.id, + a.mch_id, + a.notice_id, + a.active_org_price, + a.active_cancel_price, + a.expire_time, + a.act_status, + a.act_title, + a.act_content, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.mch_id = #{dto.mchId} + + + and a.notice_id = #{dto.noticeId} + + + and a.act_status = #{dto.noticeId} + + + and a.actTitle LIKE concat('%',#{dto.actTitle},'%') + + + + + + \ No newline at end of file