From 2f1de57e171c033bfa1bf2ac9f8c35fbba3d2cdb Mon Sep 17 00:00:00 2001 From: liujiang <569804566@qq.com> Date: Thu, 17 Apr 2025 21:56:31 +0800 Subject: [PATCH] =?UTF-8?q?master=EF=BC=9A=E6=AF=8F=E6=97=A5=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=9B=B4=E6=96=B0=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E7=9A=84=E6=8E=92=E5=88=97=E9=A1=BA=E5=BA=8F=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DailySaleController.java | 6 ++ .../com/ruoyi/quartz/dto/WeekCateSaleDTO.java | 22 +++++++ .../quartz/mapper/WeekCateSaleMapper.java | 17 ++++++ .../java/com/ruoyi/quartz/task/XktTask.java | 59 ++++++++++++++++++- .../mapper/quartz/WeekCateSaleMapper.xml | 23 ++++++++ .../impl/SysProductCategoryServiceImpl.java | 9 ++- 6 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/dto/WeekCateSaleDTO.java create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/WeekCateSaleMapper.java create mode 100644 ruoyi-quartz/src/main/resources/mapper/quartz/WeekCateSaleMapper.xml 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 92b7ae07f..72d9e5ffb 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 @@ -39,4 +39,10 @@ public class DailySaleController extends BaseController { return R.ok(); } + @PostMapping("/cate-sort") + public R dailyCateSort(SysJob sysJob) { + task.categorySort(); + return R.ok(); + } + } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/dto/WeekCateSaleDTO.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/dto/WeekCateSaleDTO.java new file mode 100644 index 000000000..06b0ecdbc --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/dto/WeekCateSaleDTO.java @@ -0,0 +1,22 @@ +package com.ruoyi.quartz.dto; + +import lombok.Data; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/4/16 23:06 + */ +@Data +public class WeekCateSaleDTO { + + /** + * 档口ID + */ + private Long prodCateId; + /** + * 销售数量 + */ + private Integer count; + +} diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/WeekCateSaleMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/WeekCateSaleMapper.java new file mode 100644 index 000000000..8b9b433c3 --- /dev/null +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/WeekCateSaleMapper.java @@ -0,0 +1,17 @@ +package com.ruoyi.quartz.mapper; + +import com.ruoyi.quartz.dto.WeekCateSaleDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 调度任务信息 数据层 + * + * @author ruoyi + */ +public interface WeekCateSaleMapper { + + List selectWeekCateSale(@Param("yesterday") Date yesterday, @Param("pastDate") Date pastDate); +} 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 b667cf892..96fd7e07c 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 @@ -3,15 +3,21 @@ package com.ruoyi.quartz.task; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.entity.SysProductCategory; +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.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.system.mapper.SysProductCategoryMapper; import com.ruoyi.xkt.mapper.StoreProductStorageMapper; import com.ruoyi.xkt.mapper.StoreSaleDetailMapper; import com.ruoyi.xkt.mapper.StoreSaleMapper; @@ -22,8 +28,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.ZoneId; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -41,6 +46,8 @@ public class XktTask { final StoreProductStorageMapper storageMapper; final DailySaleCustomerMapper dailySaleCusMapper; final DailySaleProductMapper dailySaleProdMapper; + final SysProductCategoryMapper prodCateMapper; + final WeekCateSaleMapper weekCateSaleMapper; /** * 每晚1点同步档口销售数据 @@ -106,7 +113,55 @@ public class XktTask { } this.dailySaleProdMapper.insert(saleList.stream().map(x -> BeanUtil.toBean(x, DailySaleProduct.class) .setVoucherDate(yesterday)).collect(Collectors.toList())); + } + @Transactional + public void categorySort() { + // 系统所有的商品分类 + List cateList = this.prodCateMapper.selectList(new LambdaQueryWrapper() + .eq(SysProductCategory::getDelFlag, Constants.UNDELETED).eq(SysProductCategory::getStatus, Constants.UNDELETED)); + if (CollectionUtils.isEmpty(cateList)) { + throw new ServiceException("商品分类不存在!", HttpStatus.ERROR); + } + // 根据LocalDate 获取当前日期前一天 + final Date yesterday = Date.from(LocalDate.now().minusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant()); + // 及当前日期前一天的前一周,并转为 Date 格式 + final Date pastDate = Date.from(LocalDate.now().minusDays(8).atStartOfDay(ZoneId.systemDefault()).toInstant()); + // 获取各项子分类最近一周的销售数量 + List weekCateSaleList = this.weekCateSaleMapper.selectWeekCateSale(yesterday, pastDate); + if (CollectionUtils.isEmpty(weekCateSaleList)) { + return; + } + // 将各个小项销售数量转化为map + Map itemCateCountMap = weekCateSaleList.stream().collect(Collectors.toMap(WeekCateSaleDTO::getProdCateId, WeekCateSaleDTO::getCount)); + // 按照大类对应的各小类以此进行数量统计及排序 + List sortList = new ArrayList<>(); + cateList.stream() + // 过滤掉父级为0的分类,以及父级为1的分类(父级为1的为子分类) + .filter(x -> !Objects.equals(x.getParentId(), 0L) && !Objects.equals(x.getParentId(), 1L)) + .collect(Collectors.groupingBy(SysProductCategory::getParentId)) + .forEach((parentId, itemList) -> sortList.add(new WeekCateSaleDTO() {{ + setCount(itemList.stream().mapToInt(x -> itemCateCountMap.getOrDefault(x.getId(), 0)).sum()); + setProdCateId(parentId); + }})); + // 按照大类的数量倒序排列 + sortList.sort(Comparator.comparing(WeekCateSaleDTO::getCount).reversed()); + Map topCateSortMap = new LinkedHashMap<>(); + // 按照sortList的顺序,结合 topCateMap 依次更新SysProductCategory 的 sortNum的排序 + for (int i = 0; i < sortList.size(); i++) { + topCateSortMap.put(sortList.get(i).getProdCateId(), i + 1); + } + // 顶级分类的数量 + Integer topCateSize = Math.toIntExact(cateList.stream().filter(x -> Objects.equals(x.getParentId(), 1L)).count()); + // 次级分类列表 + List updateList = cateList.stream().filter(x -> Objects.equals(x.getParentId(), 1L)) + // 如果存在具体销售数量,则按照具体销售数量排序,否则将排序置为最大值 + .peek(x -> x.setOrderNum(topCateSortMap.getOrDefault(x.getId(), topCateSize))) + .collect(Collectors.toList()); + this.prodCateMapper.updateById(updateList); } } + + + diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/WeekCateSaleMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/WeekCateSaleMapper.xml new file mode 100644 index 000000000..165996237 --- /dev/null +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/WeekCateSaleMapper.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysProductCategoryServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysProductCategoryServiceImpl.java index 26a532659..e8d510cd5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysProductCategoryServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysProductCategoryServiceImpl.java @@ -18,10 +18,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import static com.ruoyi.common.utils.SecurityUtils.getUsername; @@ -110,8 +107,10 @@ public class SysProductCategoryServiceImpl implements ISysProductCategoryService @Transactional(readOnly = true) public List selectList(ProdCateListDTO listDTO) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + // 筛选第一级菜单 + .ne(SysProductCategory::getParentId, 0L) .eq(SysProductCategory::getDelFlag, Constants.UNDELETED) - .orderByAsc(SysProductCategory::getOrderNum); + .orderByAsc(Arrays.asList(SysProductCategory::getOrderNum, SysProductCategory::getId)); if (StringUtils.isNotBlank(listDTO.getName())) { queryWrapper.like(SysProductCategory::getName, listDTO.getName()); }