master:档口标签功能;
parent
7ed9677076
commit
862b59bd64
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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<DailyStoreTag> {
|
||||
|
||||
}
|
||||
|
|
@ -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<DailyStoreTag> existList = this.dailyStoreTagMapper.selectList(new LambdaQueryWrapper<DailyStoreTag>()
|
||||
.eq(DailyStoreTag::getDelFlag, Constants.UNDELETED));
|
||||
if (CollectionUtils.isNotEmpty(existList)) {
|
||||
this.dailyStoreTagMapper.deleteByIds(existList.stream().map(DailyStoreTag::getId).collect(Collectors.toList()));
|
||||
}
|
||||
List<DailyStoreTag> 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<DailyStoreTag> tagList) {
|
||||
// 7. 打 经营年限 标签
|
||||
List<Store> storeList = this.storeMapper.selectList(new LambdaQueryWrapper<Store>()
|
||||
.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<StoreProduct> newProdList = this.storeProdMapper.selectList(new LambdaQueryWrapper<StoreProduct>()
|
||||
.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<DailyStoreTag> tagList) {
|
||||
List<DailyStoreTagDTO> 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<DailyStoreTag> tagList) {
|
||||
List<DailyStoreTagDTO> top10List = this.userFavMapper.selectTop10List();
|
||||
if (CollectionUtils.isEmpty(top10List)) {
|
||||
return;
|
||||
}
|
||||
// 提前计算公共值,减少重复计算
|
||||
int collectionRankValue = StoreTagType.COLLECTION_RANK.getValue();
|
||||
// 定义标签映射规则
|
||||
Map<Integer, String> 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<DailyStoreTag> tagList) {
|
||||
List<DailyStoreTagDTO> top10List = this.userSubsMapper.selectTop10List();
|
||||
if (CollectionUtils.isEmpty(top10List)) {
|
||||
return;
|
||||
}
|
||||
// 提前计算公共值,减少重复计算
|
||||
int attentionRankValue = StoreTagType.ATTENTION_RANK.getValue();
|
||||
// 定义标签映射规则
|
||||
Map<Integer, String> 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<DailyStoreTag> tagList) {
|
||||
List<DailyStoreTagDTO> 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<DailyStoreTag> tagList) {
|
||||
List<DailyStoreTagDTO> 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<DailyStoreTag> tagList) {
|
||||
// 统计最近一月数据。排名最优先 1. 销量榜 规则:销量排名第1,打标:销量第一 销量第2、第3,打标:销量前三 ;销量前5,打标:销量前五;销量第6-10,打标:销量前十
|
||||
List<DailyStoreTagDTO> saleTop10List = this.saleDetailMapper.selectTop10List(yesterday, oneMonthAgo);
|
||||
if (CollectionUtils.isEmpty(saleTop10List)) {
|
||||
return;
|
||||
}
|
||||
// 提前计算公共值,减少重复计算
|
||||
int salesRankValue = StoreTagType.SALES_RANK.getValue();
|
||||
// 定义标签映射规则
|
||||
Map<Integer, String> 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()));
|
||||
}*/
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<StoreProductStock> {
|
|||
*/
|
||||
List<StoreProdStockPageResDTO> selectStockPage(StoreProdStockPageDTO pageDTO);
|
||||
|
||||
/**
|
||||
* 筛选库存前10的档口
|
||||
* @param yesterday 昨天
|
||||
* @param oneMonthAgo 一月前
|
||||
* @return
|
||||
*/
|
||||
List<DailyStoreTagDTO> selectTop10List(@Param("yesterday") Date yesterday,@Param("oneMonthAgo") Date oneMonthAgo);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<StoreSaleDetail> {
|
||||
|
||||
/**
|
||||
* 查询档口销售明细
|
||||
*
|
||||
* @param id 档口销售明细主键
|
||||
* @return 档口销售明细
|
||||
*/
|
||||
public StoreSaleDetail selectStoreSaleDetailByStoreSaleDetailId(Long id);
|
||||
StoreSaleDetail selectStoreSaleDetailByStoreSaleDetailId(Long id);
|
||||
|
||||
/**
|
||||
* 查询档口销售明细列表
|
||||
|
|
@ -26,7 +30,7 @@ public interface StoreSaleDetailMapper extends BaseMapper<StoreSaleDetail> {
|
|||
* @param storeSaleDetail 档口销售明细
|
||||
* @return 档口销售明细集合
|
||||
*/
|
||||
public List<StoreSaleDetail> selectStoreSaleDetailList(StoreSaleDetail storeSaleDetail);
|
||||
List<StoreSaleDetail> selectStoreSaleDetailList(StoreSaleDetail storeSaleDetail);
|
||||
|
||||
/**
|
||||
* 新增档口销售明细
|
||||
|
|
@ -34,7 +38,7 @@ public interface StoreSaleDetailMapper extends BaseMapper<StoreSaleDetail> {
|
|||
* @param storeSaleDetail 档口销售明细
|
||||
* @return 结果
|
||||
*/
|
||||
public int insertStoreSaleDetail(StoreSaleDetail storeSaleDetail);
|
||||
int insertStoreSaleDetail(StoreSaleDetail storeSaleDetail);
|
||||
|
||||
/**
|
||||
* 修改档口销售明细
|
||||
|
|
@ -42,7 +46,7 @@ public interface StoreSaleDetailMapper extends BaseMapper<StoreSaleDetail> {
|
|||
* @param storeSaleDetail 档口销售明细
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateStoreSaleDetail(StoreSaleDetail storeSaleDetail);
|
||||
int updateStoreSaleDetail(StoreSaleDetail storeSaleDetail);
|
||||
|
||||
/**
|
||||
* 删除档口销售明细
|
||||
|
|
@ -50,7 +54,7 @@ public interface StoreSaleDetailMapper extends BaseMapper<StoreSaleDetail> {
|
|||
* @param id 档口销售明细主键
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteStoreSaleDetailByStoreSaleDetailId(Long id);
|
||||
int deleteStoreSaleDetailByStoreSaleDetailId(Long id);
|
||||
|
||||
/**
|
||||
* 批量删除档口销售明细
|
||||
|
|
@ -58,5 +62,30 @@ public interface StoreSaleDetailMapper extends BaseMapper<StoreSaleDetail> {
|
|||
* @param storeSaleDetailIds 需要删除的数据主键集合
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteStoreSaleDetailByStoreSaleDetailIds(Long[] storeSaleDetailIds);
|
||||
int deleteStoreSaleDetailByStoreSaleDetailIds(Long[] storeSaleDetailIds);
|
||||
|
||||
/**
|
||||
* 获取销量前十的档口
|
||||
* @param yesterday 昨天
|
||||
* @param oneMonthAgo 昨天往前推1个月
|
||||
* @return List<DailyStoreTagDTO>
|
||||
*/
|
||||
List<DailyStoreTagDTO> selectTop10List(@Param("yesterday") Date yesterday, @Param("oneMonthAgo") Date oneMonthAgo);
|
||||
|
||||
/**
|
||||
* 获取爆款频出的前50商品及档口
|
||||
* @param yesterday 昨天
|
||||
* @param oneMonthAgo 昨天往前推1个月
|
||||
* @return List<DailyStoreTagDTO>
|
||||
*/
|
||||
List<DailyStoreTagDTO> selectTop50List(@Param("yesterday") Date yesterday, @Param("oneMonthAgo") Date oneMonthAgo);
|
||||
|
||||
/**
|
||||
* 获取新款频出的前20名档口
|
||||
* @param yesterday 昨天
|
||||
* @param oneWeekAgo 一周前
|
||||
* @return List<DailyStoreTagDTO>
|
||||
*/
|
||||
List<DailyStoreTagDTO> selectTop20List(@Param("yesterday") Date yesterday, @Param("oneWeekAgo") Date oneWeekAgo);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<UserFavorites> {
|
||||
|
||||
/**
|
||||
* 查询用户收藏列表
|
||||
* @param pageDTO 收藏列表入参
|
||||
* @return List<UserFavoritePageResDTO>
|
||||
*/
|
||||
List<UserFavoritePageResDTO> selectUserFavPage(UserFavoritePageDTO pageDTO);
|
||||
|
||||
/**
|
||||
* 获取销量榜前100的档口
|
||||
* @return List<DailyStoreTagDTO>
|
||||
*/
|
||||
List<DailyStoreTagDTO> selectTop10List();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<UserSubscriptions> {
|
|||
*/
|
||||
List<UserSubscPageResDTO> selectUserSubscPage(@Param("userId") Long userId, @Param("storeName") String storeName);
|
||||
|
||||
/**
|
||||
* 获取档口关注前10
|
||||
* @return
|
||||
*/
|
||||
List<DailyStoreTagDTO> selectTop10List();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -173,4 +173,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
create_time DESC
|
||||
</select>
|
||||
|
||||
<select id="selectTop10List" resultType="com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO">
|
||||
SELECT
|
||||
sps.store_id,
|
||||
SUM(
|
||||
IFNULL(size_30, 0) +
|
||||
IFNULL(size_31, 0) +
|
||||
IFNULL(size_32, 0) +
|
||||
IFNULL(size_33, 0) +
|
||||
IFNULL(size_34, 0) +
|
||||
IFNULL(size_35, 0) +
|
||||
IFNULL(size_36, 0) +
|
||||
IFNULL(size_37, 0) +
|
||||
IFNULL(size_38, 0) +
|
||||
IFNULL(size_39, 0) +
|
||||
IFNULL(size_40, 0) +
|
||||
IFNULL(size_41, 0) +
|
||||
IFNULL(size_42, 0) +
|
||||
IFNULL(size_43, 0)
|
||||
) AS count
|
||||
FROM
|
||||
store_product_stock sps
|
||||
WHERE
|
||||
sps.del_flag = 0
|
||||
AND sps.create_time >= #{oneMonthAgo}
|
||||
AND sps.create_time <= #{yesterday}
|
||||
GROUP BY
|
||||
sps.store_id
|
||||
ORDER BY
|
||||
count DESC
|
||||
LIMIT 10
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
|
@ -118,4 +118,63 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
#{id}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<select id="selectTop10List" resultType="com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO">
|
||||
SELECT
|
||||
ss.store_id,
|
||||
SUM(IFNULL( ssd.quantity, 0 )) AS count
|
||||
FROM
|
||||
store_sale_detail ssd
|
||||
JOIN store_sale ss ON ssd.store_sale_id = ss.id
|
||||
WHERE
|
||||
ssd.del_flag = 0
|
||||
AND ssd.sale_type = 1
|
||||
AND ssd.voucher_date between #{oneMonthAgo} AND #{yesterday}
|
||||
GROUP BY
|
||||
ss.store_id
|
||||
ORDER BY
|
||||
SUM(IFNULL( ssd.quantity, 0 )) DESC
|
||||
LIMIT 10
|
||||
</select>
|
||||
|
||||
<select id="selectTop50List" resultType="com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO">
|
||||
SELECT
|
||||
ss.store_id,
|
||||
ssd.store_prod_id,
|
||||
SUM(IFNULL( ssd.quantity, 0 )) AS count
|
||||
FROM
|
||||
store_sale_detail ssd
|
||||
JOIN store_sale ss ON ssd.store_sale_id = ss.id
|
||||
WHERE
|
||||
ssd.del_flag = 0
|
||||
AND ssd.sale_type = 1
|
||||
AND ssd.voucher_date between #{oneMonthAgo} AND #{yesterday}
|
||||
GROUP BY
|
||||
ss.store_id,
|
||||
ssd.store_prod_id
|
||||
ORDER BY
|
||||
count DESC
|
||||
LIMIT 50
|
||||
</select>
|
||||
|
||||
<select id="selectTop20List" resultType="com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO">
|
||||
SELECT
|
||||
sp.store_id,
|
||||
SUM( id ) AS count
|
||||
FROM
|
||||
store_product sp
|
||||
WHERE
|
||||
sp.del_flag = 0
|
||||
AND sp.create_time between #{oneWeekAgo} AND #{yesterday}
|
||||
GROUP BY
|
||||
sp.store_id
|
||||
ORDER BY
|
||||
count DESC
|
||||
LIMIT 20
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</mapper>
|
||||
|
|
@ -35,5 +35,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
uf.del_flag = 0 AND uf.user_id = #{userId}
|
||||
</select>
|
||||
|
||||
<select id="selectTop10List" resultType="com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO">
|
||||
SELECT
|
||||
uf.store_id,
|
||||
COUNT( uf.id ) AS count
|
||||
FROM
|
||||
user_favorites uf
|
||||
WHERE
|
||||
uf.del_flag = 0
|
||||
GROUP BY
|
||||
uf.store_id
|
||||
ORDER BY
|
||||
count DESC
|
||||
LIMIT 10
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
|
@ -34,5 +34,19 @@
|
|||
<if test="storeName != null and storeName != ''">and s.store_name = #{storeName}</if>
|
||||
</select>
|
||||
|
||||
<select id="selectTop10List" resultType="com.ruoyi.xkt.dto.dailyStoreTag.DailyStoreTagDTO">
|
||||
SELECT
|
||||
us.store_id,
|
||||
SUM( us.id ) AS count
|
||||
FROM
|
||||
user_subscriptions us
|
||||
WHERE
|
||||
us.del_flag = 0
|
||||
GROUP BY
|
||||
us.store_id
|
||||
ORDER BY
|
||||
count DESC
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue