From 862b59bd646713c28021c496537142a1a53c7ee2 Mon Sep 17 00:00:00 2001 From: liujiang <569804566@qq.com> Date: Fri, 18 Apr 2025 20:50:48 +0800 Subject: [PATCH] =?UTF-8?q?master=EF=BC=9A=E6=A1=A3=E5=8F=A3=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E5=8A=9F=E8=83=BD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DailySaleController.java | 6 + .../ruoyi/quartz/domain/DailyStoreTag.java | 50 ++++ .../quartz/mapper/DailyStoreTagMapper.java | 13 + .../java/com/ruoyi/quartz/task/XktTask.java | 249 +++++++++++++++++- .../ruoyi/xkt/domain/UserSubscriptions.java | 2 +- .../dto/dailyStoreTag/DailyStoreTagDTO.java | 26 ++ .../com/ruoyi/xkt/enums/StoreTagType.java | 49 ++++ .../xkt/mapper/StoreProductStockMapper.java | 10 + .../xkt/mapper/StoreSaleDetailMapper.java | 41 ++- .../ruoyi/xkt/mapper/UserFavoritesMapper.java | 9 + .../xkt/mapper/UserSubscriptionsMapper.java | 7 + .../mapper/StoreProductStockMapper.xml | 33 +++ .../mapper/StoreSaleDetailMapper.xml | 59 +++++ .../resources/mapper/UserFavoritesMapper.xml | 15 ++ .../mapper/UserSubscriptionsMapper.xml | 14 + 15 files changed, 569 insertions(+), 14 deletions(-) create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/DailyStoreTag.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DailyStoreTagMapper.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/dto/dailyStoreTag/DailyStoreTagDTO.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/enums/StoreTagType.java diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailySaleController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailySaleController.java index 72d9e5ffb..c00ea3627 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailySaleController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailySaleController.java @@ -45,4 +45,10 @@ public class DailySaleController extends BaseController { return R.ok(); } + @PostMapping("/store-tag") + public R dailyStoreTag(SysJob sysJob) { + task.dailyStoreTag(); + return R.ok(); + } + } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/DailyStoreTag.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/DailyStoreTag.java new file mode 100644 index 000000000..018c29cc0 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/DailyStoreTag.java @@ -0,0 +1,50 @@ +package com.ruoyi.quartz.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.XktBaseEntity; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 档口每天销售数据统计 daily_sale + * + * @author ruoyi + * @date 2025-03-26 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@Builder +public class DailyStoreTag extends XktBaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 每日标签统计ID + */ + @TableId + private Long id; + /** + * 档口ID + */ + private Long storeId; + /** + * 标签类型 + */ + private Integer type; + /** + * 具体标签 + */ + private String tag; + /** + * 统计时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date voucherDate; + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DailyStoreTagMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DailyStoreTagMapper.java new file mode 100644 index 000000000..6cdeb6911 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/DailyStoreTagMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.quartz.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.quartz.domain.DailyStoreTag; + +/** + * 调度任务信息 数据层 + * + * @author ruoyi + */ +public interface DailyStoreTagMapper extends BaseMapper { + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java index 96fd7e07c..3a69d87b8 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java @@ -9,20 +9,23 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.quartz.domain.DailySale; import com.ruoyi.quartz.domain.DailySaleCustomer; import com.ruoyi.quartz.domain.DailySaleProduct; +import com.ruoyi.quartz.domain.DailyStoreTag; import com.ruoyi.quartz.dto.DailySaleCusDTO; import com.ruoyi.quartz.dto.DailySaleDTO; import com.ruoyi.quartz.dto.DailySaleProdDTO; import com.ruoyi.quartz.dto.WeekCateSaleDTO; -import com.ruoyi.quartz.mapper.DailySaleCustomerMapper; -import com.ruoyi.quartz.mapper.DailySaleMapper; -import com.ruoyi.quartz.mapper.DailySaleProductMapper; -import com.ruoyi.quartz.mapper.WeekCateSaleMapper; +import com.ruoyi.quartz.mapper.*; import com.ruoyi.system.mapper.SysProductCategoryMapper; -import com.ruoyi.xkt.mapper.StoreProductStorageMapper; -import com.ruoyi.xkt.mapper.StoreSaleDetailMapper; -import com.ruoyi.xkt.mapper.StoreSaleMapper; +import com.ruoyi.xkt.domain.Store; +import com.ruoyi.xkt.domain.StoreProduct; +import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; +import com.ruoyi.xkt.enums.EProductStatus; +import com.ruoyi.xkt.enums.StoreStatus; +import com.ruoyi.xkt.enums.StoreTagType; +import com.ruoyi.xkt.mapper.*; import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -48,6 +51,12 @@ public class XktTask { final DailySaleProductMapper dailySaleProdMapper; final SysProductCategoryMapper prodCateMapper; final WeekCateSaleMapper weekCateSaleMapper; + final DailyStoreTagMapper dailyStoreTagMapper; + final UserSubscriptionsMapper userSubsMapper; + final UserFavoritesMapper userFavMapper; + final StoreProductStockMapper stockMapper; + final StoreMapper storeMapper; + final StoreProductMapper storeProdMapper; /** * 每晚1点同步档口销售数据 @@ -161,6 +170,232 @@ public class XktTask { this.prodCateMapper.updateById(updateList); } + /** + * 每天更新档口的标签 + */ + @Transactional + public void dailyStoreTag() { + // 先删除所有的档口标签,保证数据唯一性 + List existList = this.dailyStoreTagMapper.selectList(new LambdaQueryWrapper() + .eq(DailyStoreTag::getDelFlag, Constants.UNDELETED)); + if (CollectionUtils.isNotEmpty(existList)) { + this.dailyStoreTagMapper.deleteByIds(existList.stream().map(DailyStoreTag::getId).collect(Collectors.toList())); + } + List tagList = new ArrayList<>(); + // 根据LocalDate 获取当前日期前一天 + final Date yesterday = Date.from(LocalDate.now().minusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant()); + // 使用LocalDate 获取当前日期前一天的前一周,并转为 Date 格式 + final Date oneWeekAgo = Date.from(LocalDate.now().minusDays(8).atStartOfDay(ZoneId.systemDefault()).toInstant()); + // 使用LocalDate 获取当前日期前一天的前一个月 + final Date oneMonthAgo = Date.from(LocalDate.now().minusDays(1).minusMonths(1).atStartOfDay(ZoneId.systemDefault()).toInstant()); + // 1. 打 销量榜 标签,这个是最重要标签 + this.tagSaleRank(yesterday, oneMonthAgo, tagList); + // 2. 打 爆款频出 标签,根据销量前50的商品中 档口 先后顺序排列 + this.tagHotRank(yesterday, oneMonthAgo, tagList); + // 3. 打 新款频出 标签,根据最近一周档口商品上新速度,先后排序 + this.tagNewProd(yesterday, oneWeekAgo, tagList); + // 4. 打 关注榜 标签,根据关注量,进行排序 + this.tagAttentionRank(yesterday, tagList); + // 5. 打 收藏榜 标签,根据收藏量,进行排序 + this.tagCollectionRank(yesterday, tagList); + // 6. 打 库存榜 标签,根据库存量,进行排序 + this.tagStockTag(yesterday, oneMonthAgo, tagList); + // 打基础标签 + this.tagBasicTag(yesterday, oneWeekAgo, tagList); + if (CollectionUtils.isEmpty(tagList)) { + return; + } + this.dailyStoreTagMapper.insert(tagList); + } + + private void tagBasicTag(Date yesterday, Date oneWeekAgo, List tagList) { + // 7. 打 经营年限 标签 + List storeList = this.storeMapper.selectList(new LambdaQueryWrapper() + .eq(Store::getDelFlag, Constants.UNDELETED) + .in(Store::getStoreStatus, Arrays.asList(StoreStatus.TRIAL_PERIOD.getValue(), StoreStatus.FORMAL_USE.getValue()))); + storeList.forEach(x -> { + final Integer operateYears = ObjectUtils.defaultIfNull(x.getOperateYears(), 0); + tagList.add(DailyStoreTag.builder().storeId(x.getId()).type(StoreTagType.OPERATE_YEARS_RANK.getValue()) + .tag(operateYears < 3 ? operateYears + "年新店" : operateYears + "年老店").voucherDate(yesterday).build()); + }); + // 8. 打 七日上新 标签 + List newProdList = this.storeProdMapper.selectList(new LambdaQueryWrapper() + .eq(StoreProduct::getDelFlag, Constants.UNDELETED) + .in(StoreProduct::getProdStatus, Collections.singletonList(EProductStatus.ON_SALE.getValue())) + .between(StoreProduct::getCreateTime, oneWeekAgo, yesterday)); + if (CollectionUtils.isEmpty(newProdList)) { + return; + } + newProdList.stream().map(StoreProduct::getStoreId).distinct().forEach(x -> { + tagList.add(DailyStoreTag.builder().storeId(x).type(StoreTagType.SEVEN_DAY_NEW_RANK.getValue()) + .tag("七日上新").voucherDate(yesterday).build()); + }); + } + + private void tagStockTag(Date yesterday, Date oneMonthAgo, List tagList) { + List top10List = this.stockMapper.selectTop10List(yesterday, oneMonthAgo); + if (CollectionUtils.isEmpty(top10List)) { + return; + } + tagList.addAll(top10List.stream().map(x -> DailyStoreTag.builder().storeId(x.getStoreId()).type(StoreTagType.STOCK_RANK.getValue()) + .tag("库存充足").voucherDate(yesterday).build()).collect(Collectors.toList())); + } + + private void tagCollectionRank(Date yesterday, List tagList) { + List top10List = this.userFavMapper.selectTop10List(); + if (CollectionUtils.isEmpty(top10List)) { + return; + } + // 提前计算公共值,减少重复计算 + int collectionRankValue = StoreTagType.COLLECTION_RANK.getValue(); + // 定义标签映射规则 + Map rankTags = new HashMap<>(); + rankTags.put(0, "收藏榜第一"); + rankTags.put(1, "收藏榜第二"); + rankTags.put(2, "收藏榜前三"); + rankTags.put(3, "收藏榜前五"); + rankTags.put(4, "收藏榜前五"); + // 遍历 top10List 并生成标签 + for (int i = 0; i < Math.min(10, top10List.size()); i++) { // 确保不会超出 top10List 的大小 + DailyStoreTagDTO storeTagDTO = top10List.get(i); + if (ObjectUtils.isNotEmpty(storeTagDTO)) { + String tag = rankTags.getOrDefault(i, "收藏榜前十"); + tagList.add(DailyStoreTag.builder() + .storeId(storeTagDTO.getStoreId()) + .type(collectionRankValue) + .tag(tag) + .voucherDate(yesterday) + .build()); + } + } + + /* if (ObjectUtils.isNotEmpty(top10List.get(0))) { + tagList.add(DailyStoreTag.builder().storeId(top10List.get(0).getStoreId()).type(StoreTagType.COLLECTION_RANK.getValue()) + .tag("收藏榜第一").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(top10List.get(1))) { + tagList.add(DailyStoreTag.builder().storeId(top10List.get(1).getStoreId()).type(StoreTagType.COLLECTION_RANK.getValue()) + .tag("收藏榜第二").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(top10List.get(2))) { + tagList.add(DailyStoreTag.builder().storeId(top10List.get(2).getStoreId()).type(StoreTagType.COLLECTION_RANK.getValue()) + .tag("收藏榜前三").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(top10List.get(3))) { + tagList.add(DailyStoreTag.builder().storeId(top10List.get(3).getStoreId()).type(StoreTagType.COLLECTION_RANK.getValue()) + .tag("收藏榜前五").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(top10List.get(4))) { + tagList.add(DailyStoreTag.builder().storeId(top10List.get(4).getStoreId()).type(StoreTagType.COLLECTION_RANK.getValue()) + .tag("收藏榜前五").voucherDate(yesterday).build()); + } + if (CollectionUtils.isNotEmpty(top10List.stream().skip(5).collect(Collectors.toList()))) { + tagList.addAll(top10List.stream().skip(5).map(x -> DailyStoreTag.builder().storeId(x.getStoreId()) + .type(StoreTagType.COLLECTION_RANK.getValue()).tag("收藏榜前十").voucherDate(yesterday).build()) + .collect(Collectors.toList())); + }*/ + } + + private void tagAttentionRank(Date yesterday, List tagList) { + List top10List = this.userSubsMapper.selectTop10List(); + if (CollectionUtils.isEmpty(top10List)) { + return; + } + // 提前计算公共值,减少重复计算 + int attentionRankValue = StoreTagType.ATTENTION_RANK.getValue(); + // 定义标签映射规则 + Map rankTags = new HashMap<>(); + rankTags.put(0, "关注榜第一"); + rankTags.put(1, "关注榜第二"); + rankTags.put(2, "关注榜前三"); + rankTags.put(3, "关注榜前五"); + rankTags.put(4, "关注榜前五"); + // 遍历 top10List 并生成标签 + for (int i = 0; i < Math.min(top10List.size(), 10); i++) { // 确保不会超出 top10List 的大小 + // 构建 DailyStoreTag 对象并添加到 tagList + tagList.add(DailyStoreTag.builder() + .storeId(top10List.get(i).getStoreId()) + .type(attentionRankValue) + .tag(rankTags.getOrDefault(i, "关注榜前十")) + .voucherDate(yesterday) + .build()); + } + } + + private void tagNewProd(Date yesterday, Date oneWeekAgo, List tagList) { + List top20List = this.saleDetailMapper.selectTop20List(yesterday, oneWeekAgo); + if (CollectionUtils.isEmpty(top20List)) { + return; + } + tagList.addAll(top20List.stream().map(DailyStoreTagDTO::getStoreId).distinct().map(storeId -> DailyStoreTag.builder() + .storeId(storeId).type(StoreTagType.NEW_PRODUCT.getValue()).tag("新款频出").voucherDate(yesterday).build()) + .collect(Collectors.toList())); + } + + private void tagHotRank(Date yesterday, Date oneMonthAgo, List tagList) { + List top50List = this.saleDetailMapper.selectTop50List(yesterday, oneMonthAgo); + if (CollectionUtils.isEmpty(top50List)) { + return; + } + tagList.addAll(top50List.stream().map(DailyStoreTagDTO::getStoreId).distinct().map(storeId -> DailyStoreTag.builder() + .storeId(storeId).type(StoreTagType.HOT_RANK.getValue()).tag("爆款频出").voucherDate(yesterday).build()) + .collect(Collectors.toList())); + } + + private void tagSaleRank(Date yesterday, Date oneMonthAgo, List tagList) { + // 统计最近一月数据。排名最优先 1. 销量榜 规则:销量排名第1,打标:销量第一 销量第2、第3,打标:销量前三 ;销量前5,打标:销量前五;销量第6-10,打标:销量前十 + List saleTop10List = this.saleDetailMapper.selectTop10List(yesterday, oneMonthAgo); + if (CollectionUtils.isEmpty(saleTop10List)) { + return; + } + // 提前计算公共值,减少重复计算 + int salesRankValue = StoreTagType.SALES_RANK.getValue(); + // 定义标签映射规则 + Map rankTags = new HashMap<>(); + rankTags.put(0, "销量第一"); + rankTags.put(1, "销量第二"); + rankTags.put(2, "销量前三"); + rankTags.put(3, "销量前五"); + rankTags.put(4, "销量前五"); + // 遍历 saleTop10List 并生成标签 + for (int i = 0; i < Math.min(10, saleTop10List.size()); i++) { // 确保不会超出 saleTop10List 的大小 + DailyStoreTagDTO storeTagDTO = saleTop10List.get(i); + if (ObjectUtils.isNotEmpty(storeTagDTO)) { + String tag = rankTags.getOrDefault(i, "销量前十"); + tagList.add(DailyStoreTag.builder() + .storeId(storeTagDTO.getStoreId()) + .type(salesRankValue) + .tag(tag) + .voucherDate(yesterday) + .build()); + } + } + /*if (ObjectUtils.isNotEmpty(saleTop10List.get(0))) { + tagList.add(DailyStoreTag.builder().storeId(saleTop10List.get(0).getStoreId()).type(StoreTagType.SALES_RANK.getValue()) + .tag("销量第一").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(saleTop10List.get(1))) { + tagList.add(DailyStoreTag.builder().storeId(saleTop10List.get(1).getStoreId()).type(StoreTagType.SALES_RANK.getValue()) + .tag("销量第二").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(saleTop10List.get(2))) { + tagList.add(DailyStoreTag.builder().storeId(saleTop10List.get(2).getStoreId()).type(StoreTagType.SALES_RANK.getValue()) + .tag("销量前三").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(saleTop10List.get(3))) { + tagList.add(DailyStoreTag.builder().storeId(saleTop10List.get(3).getStoreId()).type(StoreTagType.SALES_RANK.getValue()) + .tag("销量前五").voucherDate(yesterday).build()); + } + if (ObjectUtils.isNotEmpty(saleTop10List.get(4))) { + tagList.add(DailyStoreTag.builder().storeId(saleTop10List.get(4).getStoreId()).type(StoreTagType.SALES_RANK.getValue()) + .tag("销量前五").voucherDate(yesterday).build()); + } + if (CollectionUtils.isNotEmpty(saleTop10List.stream().skip(5).collect(Collectors.toList()))) { + tagList.addAll(saleTop10List.stream().skip(5).map(x -> DailyStoreTag.builder().storeId(x.getStoreId()).type(StoreTagType.SALES_RANK.getValue()) + .tag("销量前十").voucherDate(yesterday).build()).collect(Collectors.toList())); + }*/ + } + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/UserSubscriptions.java b/xkt/src/main/java/com/ruoyi/xkt/domain/UserSubscriptions.java index 97b2f1940..569aa05d0 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/UserSubscriptions.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/UserSubscriptions.java @@ -9,7 +9,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** - * 用户关注u档口对象 user_subscriptions + * 用户关注档口对象 user_subscriptions * * @author ruoyi * @date 2025-03-26 diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/dailyStoreTag/DailyStoreTagDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/dailyStoreTag/DailyStoreTagDTO.java new file mode 100644 index 000000000..7b2216f05 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/dailyStoreTag/DailyStoreTagDTO.java @@ -0,0 +1,26 @@ +package com.ruoyi.xkt.dto.dailyStoreTag; + +import lombok.Data; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/4/16 23:06 + */ +@Data +public class DailyStoreTagDTO { + + /** + * 档口ID + */ + private Long storeId; + /** + * 档口商品ID + */ + private Long storeProdId; + /** + * 销售数量 + */ + private Integer count; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/enums/StoreTagType.java b/xkt/src/main/java/com/ruoyi/xkt/enums/StoreTagType.java new file mode 100644 index 000000000..b82ba744c --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/enums/StoreTagType.java @@ -0,0 +1,49 @@ +package com.ruoyi.xkt.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 档口标签类型 + * @author liujiang + * @date 2025-04-02 23:42 + */ +@Getter +@AllArgsConstructor +public enum StoreTagType { + + // 销量榜 + SALES_RANK(1, "销量榜"), + // 爆款频出 + HOT_RANK(2, "爆款频出"), + // 新款频出 + NEW_PRODUCT(3, "新款频出"), + // 关注榜 + ATTENTION_RANK(4, "关注榜"), + // 收藏榜 + COLLECTION_RANK(5, "收藏榜"), + // 库存榜 + STOCK_RANK(6, "库存榜"), + // 经营年限榜 + OPERATE_YEARS_RANK(7, "经营年限榜"), + // 七日上新 + SEVEN_DAY_NEW_RANK(8, "七日上新"), + // 基础信息榜 + BASIC_RANK(100, "基础榜"), + + + ; + + + private final Integer value; + private final String label; + + public static StoreTagType of(Integer value) { + for (StoreTagType e : StoreTagType.values()) { + if (e.getValue().equals(value)) { + return e; + } + } + return null; + } +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductStockMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductStockMapper.java index 6ee8527c4..648541d57 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductStockMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreProductStockMapper.java @@ -2,10 +2,13 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.StoreProductStock; +import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; import com.ruoyi.xkt.dto.storeProdStorage.StoreProdStoragePageResDTO; import com.ruoyi.xkt.dto.storeProductStock.StoreProdStockPageDTO; import com.ruoyi.xkt.dto.storeProductStock.StoreProdStockPageResDTO; +import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -70,4 +73,11 @@ public interface StoreProductStockMapper extends BaseMapper { */ List selectStockPage(StoreProdStockPageDTO pageDTO); + /** + * 筛选库存前10的档口 + * @param yesterday 昨天 + * @param oneMonthAgo 一月前 + * @return + */ + List selectTop10List(@Param("yesterday") Date yesterday,@Param("oneMonthAgo") Date oneMonthAgo); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreSaleDetailMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreSaleDetailMapper.java index 62043a014..845babac5 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreSaleDetailMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreSaleDetailMapper.java @@ -2,7 +2,10 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.StoreSaleDetail; +import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; +import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -12,13 +15,14 @@ import java.util.List; * @date 2025-03-26 */ public interface StoreSaleDetailMapper extends BaseMapper { + /** * 查询档口销售明细 * * @param id 档口销售明细主键 * @return 档口销售明细 */ - public StoreSaleDetail selectStoreSaleDetailByStoreSaleDetailId(Long id); + StoreSaleDetail selectStoreSaleDetailByStoreSaleDetailId(Long id); /** * 查询档口销售明细列表 @@ -26,7 +30,7 @@ public interface StoreSaleDetailMapper extends BaseMapper { * @param storeSaleDetail 档口销售明细 * @return 档口销售明细集合 */ - public List selectStoreSaleDetailList(StoreSaleDetail storeSaleDetail); + List selectStoreSaleDetailList(StoreSaleDetail storeSaleDetail); /** * 新增档口销售明细 @@ -34,7 +38,7 @@ public interface StoreSaleDetailMapper extends BaseMapper { * @param storeSaleDetail 档口销售明细 * @return 结果 */ - public int insertStoreSaleDetail(StoreSaleDetail storeSaleDetail); + int insertStoreSaleDetail(StoreSaleDetail storeSaleDetail); /** * 修改档口销售明细 @@ -42,7 +46,7 @@ public interface StoreSaleDetailMapper extends BaseMapper { * @param storeSaleDetail 档口销售明细 * @return 结果 */ - public int updateStoreSaleDetail(StoreSaleDetail storeSaleDetail); + int updateStoreSaleDetail(StoreSaleDetail storeSaleDetail); /** * 删除档口销售明细 @@ -50,7 +54,7 @@ public interface StoreSaleDetailMapper extends BaseMapper { * @param id 档口销售明细主键 * @return 结果 */ - public int deleteStoreSaleDetailByStoreSaleDetailId(Long id); + int deleteStoreSaleDetailByStoreSaleDetailId(Long id); /** * 批量删除档口销售明细 @@ -58,5 +62,30 @@ public interface StoreSaleDetailMapper extends BaseMapper { * @param storeSaleDetailIds 需要删除的数据主键集合 * @return 结果 */ - public int deleteStoreSaleDetailByStoreSaleDetailIds(Long[] storeSaleDetailIds); + int deleteStoreSaleDetailByStoreSaleDetailIds(Long[] storeSaleDetailIds); + + /** + * 获取销量前十的档口 + * @param yesterday 昨天 + * @param oneMonthAgo 昨天往前推1个月 + * @return List + */ + List selectTop10List(@Param("yesterday") Date yesterday, @Param("oneMonthAgo") Date oneMonthAgo); + + /** + * 获取爆款频出的前50商品及档口 + * @param yesterday 昨天 + * @param oneMonthAgo 昨天往前推1个月 + * @return List + */ + List selectTop50List(@Param("yesterday") Date yesterday, @Param("oneMonthAgo") Date oneMonthAgo); + + /** + * 获取新款频出的前20名档口 + * @param yesterday 昨天 + * @param oneWeekAgo 一周前 + * @return List + */ + List selectTop20List(@Param("yesterday") Date yesterday, @Param("oneWeekAgo") Date oneWeekAgo); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserFavoritesMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserFavoritesMapper.java index 57a6b9640..fa0ce688e 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserFavoritesMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserFavoritesMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.UserFavorites; +import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; import com.ruoyi.xkt.dto.userFavorite.UserFavoritePageDTO; import com.ruoyi.xkt.dto.userFavorite.UserFavoritePageResDTO; @@ -14,10 +15,18 @@ import java.util.List; * @date 2025-03-26 */ public interface UserFavoritesMapper extends BaseMapper { + /** * 查询用户收藏列表 * @param pageDTO 收藏列表入参 * @return List */ List selectUserFavPage(UserFavoritePageDTO pageDTO); + + /** + * 获取销量榜前100的档口 + * @return List + */ + List selectTop10List(); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java index 63345d94f..10d3ef510 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/UserSubscriptionsMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.UserSubscriptions; +import com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO; import com.ruoyi.xkt.dto.userSubscriptions.UserSubscPageResDTO; import org.apache.ibatis.annotations.Param; @@ -24,4 +25,10 @@ public interface UserSubscriptionsMapper extends BaseMapper { */ List selectUserSubscPage(@Param("userId") Long userId, @Param("storeName") String storeName); + /** + * 获取档口关注前10 + * @return + */ + List selectTop10List(); + } diff --git a/xkt/src/main/resources/mapper/StoreProductStockMapper.xml b/xkt/src/main/resources/mapper/StoreProductStockMapper.xml index 9f0a307b8..3f1cef40c 100644 --- a/xkt/src/main/resources/mapper/StoreProductStockMapper.xml +++ b/xkt/src/main/resources/mapper/StoreProductStockMapper.xml @@ -173,4 +173,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time DESC + + + \ No newline at end of file diff --git a/xkt/src/main/resources/mapper/StoreSaleDetailMapper.xml b/xkt/src/main/resources/mapper/StoreSaleDetailMapper.xml index 212506b4d..522bc3a72 100644 --- a/xkt/src/main/resources/mapper/StoreSaleDetailMapper.xml +++ b/xkt/src/main/resources/mapper/StoreSaleDetailMapper.xml @@ -118,4 +118,63 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + + + + + + + + + \ No newline at end of file diff --git a/xkt/src/main/resources/mapper/UserFavoritesMapper.xml b/xkt/src/main/resources/mapper/UserFavoritesMapper.xml index 8571f89af..30617411f 100644 --- a/xkt/src/main/resources/mapper/UserFavoritesMapper.xml +++ b/xkt/src/main/resources/mapper/UserFavoritesMapper.xml @@ -35,5 +35,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" uf.del_flag = 0 AND uf.user_id = #{userId} + + \ No newline at end of file diff --git a/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml b/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml index c660c5afa..07a99f134 100644 --- a/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml +++ b/xkt/src/main/resources/mapper/UserSubscriptionsMapper.xml @@ -34,5 +34,19 @@ and s.store_name = #{storeName} + + \ No newline at end of file