Ver Fonte

新增库存和销售看板接口

fgd há 1 ano atrás
pai
commit
9870f41115
23 ficheiros alterados com 1542 adições e 0 exclusões
  1. 124 0
      sd-business/src/main/java/com/sd/business/controller/board/InventoryBoardController.java
  2. 164 0
      sd-business/src/main/java/com/sd/business/controller/board/SalesBoardController.java
  3. 53 0
      sd-business/src/main/java/com/sd/business/entity/board/dto/InOutStorageBoardSelectDto.java
  4. 48 0
      sd-business/src/main/java/com/sd/business/entity/board/dto/SalesBoardSelectDto.java
  5. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/BomSalesAmountRankingVo.java
  6. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/BomSalesRankingVo.java
  7. 46 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/HazardousInventoryVo.java
  8. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/InOutStorageBoardVo.java
  9. 46 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/InTransitBomVo.java
  10. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/InventoryTurnoverRateVo.java
  11. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/PurchaseInStorageVo.java
  12. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesAmountRankingVo.java
  13. 46 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesGrowthRateRankingVo.java
  14. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesRankingVo.java
  15. 39 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesRegionRankingVo.java
  16. 53 0
      sd-business/src/main/java/com/sd/business/mapper/board/InventoryBoardMapper.java
  17. 67 0
      sd-business/src/main/java/com/sd/business/mapper/board/SalesBoardMapper.java
  18. 49 0
      sd-business/src/main/java/com/sd/business/service/board/InventoryBoardService.java
  19. 58 0
      sd-business/src/main/java/com/sd/business/service/board/SalesBoardService.java
  20. 116 0
      sd-business/src/main/java/com/sd/business/service/board/impl/InventoryBoardServiceImpl.java
  21. 138 0
      sd-business/src/main/java/com/sd/business/service/board/impl/SalesBoardServiceImpl.java
  22. 93 0
      sd-business/src/main/resources/mapper/board/InventoryBoardMapper.xml
  23. 129 0
      sd-business/src/main/resources/mapper/board/SalesBoardMapper.xml

+ 124 - 0
sd-business/src/main/java/com/sd/business/controller/board/InventoryBoardController.java

@@ -0,0 +1,124 @@
+package com.sd.business.controller.board;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.board.dto.InOutStorageBoardSelectDto;
+import com.sd.business.entity.board.dto.SalesBoardSelectDto;
+import com.sd.business.entity.board.vo.HazardousInventoryVo;
+import com.sd.business.entity.board.vo.InOutStorageBoardVo;
+import com.sd.business.entity.board.vo.InTransitBomVo;
+import com.sd.business.entity.board.vo.InventoryTurnoverRateVo;
+import com.sd.business.service.board.InventoryBoardService;
+import com.sd.framework.util.excel.util.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+
+/**
+ * <p>
+ * 库存看板 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-11-16
+ */
+@RestController
+@RequestMapping("/inventoryBoard")
+public class InventoryBoardController {
+
+    @Autowired
+    private InventoryBoardService inventoryBoardService;
+
+    /**
+     * 获取bom危险库存列表分页
+     * @return
+     */
+    @PostMapping("/getHazardousInventoryPage")
+    public Page<HazardousInventoryVo> getHazardousInventoryPage(@RequestBody SalesBoardSelectDto dto) {
+        return inventoryBoardService.getHazardousInventoryPage(dto);
+    }
+
+    /**
+     * bom危险库存列表导出
+     * @return
+     */
+    @PostMapping("/hazardousInventoryExportExcel")
+    public void hazardousInventoryExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<HazardousInventoryVo> page = inventoryBoardService.getHazardousInventoryPage(dto);
+        List<HazardousInventoryVo> list = page.getRecords();
+        ExcelUtil.export(response,"危险库存", "危险库存数据", list, HazardousInventoryVo.class);
+    }
+
+    /**
+     * 获取bom在途列表分页
+     * @return
+     */
+    @PostMapping("/getInTransitBomPage")
+    public Page<InTransitBomVo> getInTransitBomPage(@RequestBody SalesBoardSelectDto dto) {
+        return inventoryBoardService.getInTransitBomPage(dto);
+    }
+
+    /**
+     * bom在途列表导出
+     * @return
+     */
+    @PostMapping("/inTransitBomExportExcel")
+    public void inTransitBomExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<InTransitBomVo> page = inventoryBoardService.getInTransitBomPage(dto);
+        List<InTransitBomVo> list = page.getRecords();
+        ExcelUtil.export(response,"在途物料", "在途物料列表", list, InTransitBomVo.class);
+    }
+
+    /**
+     * 获取库存周转率列表分页
+     * @return
+     */
+    @PostMapping("/getTurnoverRatePage")
+    public Page<InventoryTurnoverRateVo> getTurnoverRatePage(@RequestBody SalesBoardSelectDto dto) {
+        return inventoryBoardService.getTurnoverRatePage(dto);
+    }
+
+    /**
+     * 库存周转率列表导出
+     * @return
+     */
+    @PostMapping("/turnoverRateExportExcel")
+    public void turnoverRateExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<InventoryTurnoverRateVo> page = inventoryBoardService.getTurnoverRatePage(dto);
+        List<InventoryTurnoverRateVo> list = page.getRecords();
+        ExcelUtil.export(response,"库存周转率", "库存周转率列表", list, InventoryTurnoverRateVo.class);
+    }
+
+    /**
+     * 获取采购入库列表分页
+     * @return
+     */
+    @PostMapping("/getInOutStoragePage")
+    public Page<InOutStorageBoardVo> getInOutStoragePage(@RequestBody InOutStorageBoardSelectDto dto) {
+        return inventoryBoardService.getInOutStoragePage(dto);
+    }
+
+    /**
+     * 出入库列表导出
+     * @return
+     */
+    @PostMapping("/inOutStorageExportExcel")
+    public void inOutStorageExportExcel(HttpServletResponse response, @RequestBody InOutStorageBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<InOutStorageBoardVo> page = inventoryBoardService.getInOutStoragePage(dto);
+        List<InOutStorageBoardVo> list = page.getRecords();
+        ExcelUtil.export(response,"出入库数据", "导出数据", list, InOutStorageBoardVo.class);
+    }
+}

+ 164 - 0
sd-business/src/main/java/com/sd/business/controller/board/SalesBoardController.java

@@ -0,0 +1,164 @@
+package com.sd.business.controller.board;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.board.dto.SalesBoardSelectDto;
+import com.sd.business.entity.board.vo.*;
+import com.sd.business.service.board.SalesBoardService;
+import com.sd.framework.util.excel.util.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 销售看板 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-11-16
+ */
+@RestController
+@RequestMapping("/salesBoard")
+public class SalesBoardController {
+
+    @Autowired
+    private SalesBoardService salesBoardService;
+
+    /**
+     * 获取sku销量排名列表分页
+     * @return
+     */
+    @PostMapping("/getSkuSalesRankingPage")
+    public Page<SkuSalesRankingVo> getSkuSalesRankingPage(@RequestBody SalesBoardSelectDto dto) {
+        return salesBoardService.getSkuSalesRankingPage(dto);
+    }
+
+    /**
+     * sku销量排名列表导出
+     * @return
+     */
+    @PostMapping("/skuSalesRankingExportExcel")
+    public void skuSalesRankingExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<SkuSalesRankingVo> page = salesBoardService.getSkuSalesRankingPage(dto);
+        List<SkuSalesRankingVo> list = page.getRecords();
+        ExcelUtil.export(response,"sku销量排行", "sku销量排行数据", list, SkuSalesRankingVo.class);
+    }
+
+    /**
+     * 获取sku销售额排名列表分页
+     * @return
+     */
+    @PostMapping("/getSkuSalesAmountRankingPage")
+    public Page<SkuSalesAmountRankingVo> getSkuSalesAmountRankingPage(@RequestBody SalesBoardSelectDto dto) {
+        return salesBoardService.getSkuSalesAmountRankingPage(dto);
+    }
+
+    /**
+     * sku销售额排名列表导出
+     * @return
+     */
+    @PostMapping("/skuSalesAmountRankingExportExcel")
+    public void skuSalesAmountRankingExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<SkuSalesAmountRankingVo> page = salesBoardService.getSkuSalesAmountRankingPage(dto);
+        List<SkuSalesAmountRankingVo> list = page.getRecords();
+        ExcelUtil.export(response,"sku销售额排行", "sku销售额排行数据", list, SkuSalesAmountRankingVo.class);
+    }
+
+    /**
+     * 获取bom销量排名列表分页
+     * @return
+     */
+    @PostMapping("/getBomSalesRankingPage")
+    public Page<BomSalesRankingVo> getBomSalesRankingPage(@RequestBody SalesBoardSelectDto dto) {
+        return salesBoardService.getBomSalesRankingPage(dto);
+    }
+
+    /**
+     * bom销量排名列表导出
+     * @return
+     */
+    @PostMapping("/bomSalesRankingExportExcel")
+    public void bomSalesRankingExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<BomSalesRankingVo> page = salesBoardService.getBomSalesRankingPage(dto);
+        List<BomSalesRankingVo> list = page.getRecords();
+        ExcelUtil.export(response,"bom销量排行", "bom销量排行数据", list, BomSalesRankingVo.class);
+    }
+
+    /**
+     * 获取bom销售额排名列表分页
+     * @return
+     */
+    @PostMapping("/getBomSalesAmountRankingPage")
+    public Page<BomSalesAmountRankingVo> getBomSalesAmountRankingPage(@RequestBody SalesBoardSelectDto dto) {
+        return salesBoardService.getBomSalesAmountRankingPage(dto);
+    }
+
+    /**
+     * bom销售额排名列表导出
+     * @return
+     */
+    @PostMapping("/bomSalesAmountRankingExportExcel")
+    public void bomSalesAmountRankingExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<BomSalesAmountRankingVo> page = salesBoardService.getBomSalesAmountRankingPage(dto);
+        List<BomSalesAmountRankingVo> list = page.getRecords();
+        ExcelUtil.export(response,"bom销售额排行", "bom销售额排行数据", list, BomSalesAmountRankingVo.class);
+    }
+
+
+    /**
+     * 获取sku销售地区排名列表分页
+     * @return
+     */
+    @PostMapping("/getSkuSalesRegionRankingPage")
+    public Page<SkuSalesRegionRankingVo> getSkuSalesRegionRankingPage(@RequestBody SalesBoardSelectDto dto) {
+        return salesBoardService.getSkuSalesRegionRankingPage(dto);
+    }
+
+    /**
+     * sku销售地区排名列表导出
+     * @return
+     */
+    @PostMapping("/skuSalesRegionRankingExportExcel")
+    public void skuSalesRegionRankingExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<SkuSalesRegionRankingVo> page = salesBoardService.getSkuSalesRegionRankingPage(dto);
+        List<SkuSalesRegionRankingVo> list = page.getRecords();
+        ExcelUtil.export(response,"sku销售地区排行", "sku销售地区排行数据", list, SkuSalesRegionRankingVo.class);
+    }
+
+    /**
+     * 获取sku销量增长率排名列表分页
+     * @return
+     */
+    @PostMapping("/getSkuSalesGrowthRateRankingPage")
+    public Page<SkuSalesGrowthRateRankingVo> getSkuSalesGrowthRateRankingPage(@RequestBody SalesBoardSelectDto dto) {
+        return salesBoardService.getSkuSalesGrowthRateRankingPage(dto);
+    }
+
+    /**
+     * sku销量增长率排名列表导出
+     * @return
+     */
+    @PostMapping("/skuSalesGrowthRateRankingExportExcel")
+    public void skuSalesGrowthRateRankingExportExcel(HttpServletResponse response, @RequestBody SalesBoardSelectDto dto) {
+        dto.setPageNum(1);
+        dto.setPageSize(9999999);
+        Page<SkuSalesGrowthRateRankingVo> page = salesBoardService.getSkuSalesGrowthRateRankingPage(dto);
+        List<SkuSalesGrowthRateRankingVo> list = page.getRecords();
+        ExcelUtil.export(response,"sku销量增长率排行", "sku销量增长率排行数据", list, SkuSalesGrowthRateRankingVo.class);
+    }
+}

+ 53 - 0
sd-business/src/main/java/com/sd/business/entity/board/dto/InOutStorageBoardSelectDto.java

@@ -0,0 +1,53 @@
+package com.sd.business.entity.board.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 出入库看板查询入参实体
+ *
+ * @author
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class InOutStorageBoardSelectDto extends BaseSelectDto {
+
+    /**
+     * 出入库类型
+     */
+    private Integer type;
+
+    /**
+     * 项目小类 字典:bom_itemSubclass
+     */
+    private String itemSubclass;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal bomSpecWidth;
+
+    /**
+     * 高 cm
+     */
+    private BigDecimal bomSpecHeight;
+
+    /**
+     * 色层 字典:bom_chromatophore
+     */
+    private String chromatophore;
+
+    /**
+     * 颜色
+     */
+    private String colour;
+
+    /**
+     * 排序方式 1-升序,2-降序
+     */
+    private Integer sortBy;
+}

+ 48 - 0
sd-business/src/main/java/com/sd/business/entity/board/dto/SalesBoardSelectDto.java

@@ -0,0 +1,48 @@
+package com.sd.business.entity.board.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 销售看板查询入参实体
+ *
+ * @author
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class SalesBoardSelectDto extends BaseSelectDto {
+
+    /**
+     * 项目小类 字典:bom_itemSubclass
+     */
+    private String itemSubclass;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal bomSpecWidth;
+
+    /**
+     * 高 cm
+     */
+    private BigDecimal bomSpecHeight;
+
+    /**
+     * 色层 字典:bom_chromatophore
+     */
+    private String chromatophore;
+
+    /**
+     * 颜色
+     */
+    private String colour;
+
+    /**
+     * 排序方式 1-升序,2-降序
+     */
+    private Integer sortBy;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/BomSalesAmountRankingVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * bom销售额排行数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class BomSalesAmountRankingVo {
+
+    /**
+     * bom品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "bom品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * bom品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "bom品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 销售额
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "销售额(元)", index = 2)
+    private BigDecimal salesAmount;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/BomSalesRankingVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * bom销量排行数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class BomSalesRankingVo {
+
+    /**
+     * bom品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "bom品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * bom品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "bom品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 销量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "销量", index = 2)
+    private BigDecimal salesQuantity;
+}

+ 46 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/HazardousInventoryVo.java

@@ -0,0 +1,46 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 危险库存数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class HazardousInventoryVo {
+
+    /**
+     * 品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 库存数量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "当前库存", index = 2)
+    private BigDecimal inventoryQuantity;
+
+    /**
+     * 预计维持天数
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "预计维持天数", index = 3)
+    private Integer predictOutStorageDays;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/InOutStorageBoardVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 出入库数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class InOutStorageBoardVo {
+
+    /**
+     * 品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 出入库数量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "数量", index = 2)
+    private BigDecimal quantity;
+}

+ 46 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/InTransitBomVo.java

@@ -0,0 +1,46 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 在途物料数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class InTransitBomVo {
+
+    /**
+     * 品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 在途数量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "在途数量", index = 2)
+    private BigDecimal inTransitQuantity;
+
+    /**
+     * 预计到达时间
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "预计到达时间", index = 3)
+    private Integer nextDeliveryDays;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/InventoryTurnoverRateVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 库存周转率数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class InventoryTurnoverRateVo {
+
+    /**
+     * 品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 周转率
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "周转率", index = 2)
+    private BigDecimal turnoverRate;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/PurchaseInStorageVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 采购入库数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class PurchaseInStorageVo {
+
+    /**
+     * 品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "品号", index = 0)
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "品名", index = 1)
+    private String bomSpecName;
+
+    /**
+     * 入库数量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "入库数量", index = 2)
+    private BigDecimal inStorageQuantity;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesAmountRankingVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * sku销售额排行数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class SkuSalesAmountRankingVo {
+
+    /**
+     * sku品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "sku品号", index = 0)
+    private String skuSpecCode;
+
+    /**
+     * sku品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "sku品名", index = 1)
+    private String skuSpecName;
+
+    /**
+     * 销售额
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "销售额(元)", index = 2)
+    private BigDecimal salesAmount;
+}

+ 46 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesGrowthRateRankingVo.java

@@ -0,0 +1,46 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * sku销量增长率排行数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class SkuSalesGrowthRateRankingVo {
+
+    /**
+     * sku品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "sku品号", index = 0)
+    private String skuSpecCode;
+
+    /**
+     * sku品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "sku品名", index = 1)
+    private String skuSpecName;
+
+    /**
+     * 月同比
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "月同比", index = 2)
+    private String monthOverMonthRatio;
+
+    /**
+     * 月环比
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "月环比", index = 3)
+    private String monthOnMonthRatio;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesRankingVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * sku销量排行数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class SkuSalesRankingVo {
+
+    /**
+     * sku品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "sku品号", index = 0)
+    private String skuSpecCode;
+
+    /**
+     * sku品名
+     */
+    @ColumnWidth(25)
+    @ExcelProperty(value = "sku品名", index = 1)
+    private String skuSpecName;
+
+    /**
+     * 销量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "销量", index = 2)
+    private BigDecimal salesQuantity;
+}

+ 39 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSalesRegionRankingVo.java

@@ -0,0 +1,39 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * sku销售地区排行数据查询返回值实体
+ *
+ * @since 2023-11-16
+ */
+@Getter
+@Setter
+public class SkuSalesRegionRankingVo {
+
+    /**
+     * 省份
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "省份", index = 1)
+    private String province;
+
+    /**
+     * 城市
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "城市", index = 1)
+    private String city;
+
+    /**
+     * 销量
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "销量", index = 2)
+    private BigDecimal salesQuantity;
+}

+ 53 - 0
sd-business/src/main/java/com/sd/business/mapper/board/InventoryBoardMapper.java

@@ -0,0 +1,53 @@
+package com.sd.business.mapper.board;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.vo.HazardousInventoryVo;
+import com.sd.business.entity.board.vo.InOutStorageBoardVo;
+import com.sd.business.entity.board.vo.InTransitBomVo;
+import com.sd.business.entity.board.vo.InventoryTurnoverRateVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 库存看板 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-11-17
+ */
+public interface InventoryBoardMapper {
+
+    /**
+     * 危险库存分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<HazardousInventoryVo> getHazardousInventoryPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<HazardousInventoryVo> wrapper);
+
+    /**
+     * 获取bom在途列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<InTransitBomVo> getInTransitBomPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<InTransitBomVo> wrapper);
+
+    /**
+     * 获取库存周转率列表分页
+     * @param page
+     * @param wrapper
+     * @param days
+     * @return
+     */
+    Page<InventoryTurnoverRateVo> getTurnoverRatePage(@Param("page") Page<Object> page, @Param("ew") IWrapper<InventoryTurnoverRateVo> wrapper, @Param("days") long days);
+
+    /**
+     * 出入库列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<InOutStorageBoardVo> getInOutStoragePage(@Param("page") Page<Object> page, @Param("ew") IWrapper<InOutStorageBoardVo> wrapper);
+}

+ 67 - 0
sd-business/src/main/java/com/sd/business/mapper/board/SalesBoardMapper.java

@@ -0,0 +1,67 @@
+package com.sd.business.mapper.board;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.vo.*;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 销售看板 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-11-17
+ */
+public interface SalesBoardMapper {
+
+    /**
+     * 获取sku销量排名列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<SkuSalesRankingVo> getSkuSalesRankingPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SkuSalesRankingVo> wrapper);
+
+    /**
+     * 获取sku销售额排名列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<SkuSalesAmountRankingVo> getSkuSalesAmountRankingPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SkuSalesAmountRankingVo> wrapper);
+
+    /**
+     * 获取bom销量排名列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<BomSalesRankingVo> getBomSalesRankingPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<BomSalesRankingVo> wrapper);
+
+
+    /**
+     * 获取bom销售额排名列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<BomSalesAmountRankingVo> getBomSalesAmountRankingPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<BomSalesAmountRankingVo> wrapper);
+
+    /**
+     * 获取sku销售地区排名列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<SkuSalesRegionRankingVo> getSkuSalesRegionRankingPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SkuSalesRegionRankingVo> wrapper);
+
+    /**
+     * 获取sku销量增长率排名列表分页
+     * @param page
+     * @param wrapper
+     * @return
+     */
+    Page<SkuSalesGrowthRateRankingVo> getSkuSalesGrowthRateRankingPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SkuSalesGrowthRateRankingVo> wrapper);
+}

+ 49 - 0
sd-business/src/main/java/com/sd/business/service/board/InventoryBoardService.java

@@ -0,0 +1,49 @@
+package com.sd.business.service.board;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.board.dto.InOutStorageBoardSelectDto;
+import com.sd.business.entity.board.dto.SalesBoardSelectDto;
+import com.sd.business.entity.board.vo.HazardousInventoryVo;
+import com.sd.business.entity.board.vo.InOutStorageBoardVo;
+import com.sd.business.entity.board.vo.InTransitBomVo;
+import com.sd.business.entity.board.vo.InventoryTurnoverRateVo;
+
+/**
+ * <p>
+ * 库存看板 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-11-16
+ */
+public interface InventoryBoardService {
+
+    /**
+     * 获取bom危险库存列表分页
+     * @param dto
+     * @return
+     */
+    Page<HazardousInventoryVo> getHazardousInventoryPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取bom在途列表分页
+     *
+     * @param dto
+     * @return
+     */
+    Page<InTransitBomVo> getInTransitBomPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取库存周转率列表分页
+     * @param dto
+     * @return
+     */
+    Page<InventoryTurnoverRateVo> getTurnoverRatePage(SalesBoardSelectDto dto);
+
+    /**
+     * 出入库列表分页
+     * @param dto
+     * @return
+     */
+    Page<InOutStorageBoardVo> getInOutStoragePage(InOutStorageBoardSelectDto dto);
+}

+ 58 - 0
sd-business/src/main/java/com/sd/business/service/board/SalesBoardService.java

@@ -0,0 +1,58 @@
+package com.sd.business.service.board;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.board.dto.SalesBoardSelectDto;
+import com.sd.business.entity.board.vo.*;
+
+/**
+ * <p>
+ * 销售看板 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-11-16
+ */
+public interface SalesBoardService {
+
+    /**
+     * 获取sku销量排名列表分页
+     * @param dto
+     * @return
+     */
+    Page<SkuSalesRankingVo> getSkuSalesRankingPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取sku销售额排名列表分页
+     * @param dto
+     * @return
+     */
+    Page<SkuSalesAmountRankingVo> getSkuSalesAmountRankingPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取bom销量排名列表分页
+     * @param dto
+     * @return
+     */
+    Page<BomSalesRankingVo> getBomSalesRankingPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取bom销售额排名列表分页
+     * @param dto
+     * @return
+     */
+    Page<BomSalesAmountRankingVo> getBomSalesAmountRankingPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取sku销售地区排名列表分页
+     * @param dto
+     * @return
+     */
+    Page<SkuSalesRegionRankingVo> getSkuSalesRegionRankingPage(SalesBoardSelectDto dto);
+
+    /**
+     * 获取sku销量增长率排名列表分页
+     * @param dto
+     * @return
+     */
+    Page<SkuSalesGrowthRateRankingVo> getSkuSalesGrowthRateRankingPage(SalesBoardSelectDto dto);
+}

+ 116 - 0
sd-business/src/main/java/com/sd/business/service/board/impl/InventoryBoardServiceImpl.java

@@ -0,0 +1,116 @@
+package com.sd.business.service.board.impl;
+
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.dto.InOutStorageBoardSelectDto;
+import com.sd.business.entity.board.dto.SalesBoardSelectDto;
+import com.sd.business.entity.board.vo.HazardousInventoryVo;
+import com.sd.business.entity.board.vo.InOutStorageBoardVo;
+import com.sd.business.entity.board.vo.InTransitBomVo;
+import com.sd.business.entity.board.vo.InventoryTurnoverRateVo;
+import com.sd.business.entity.bom.po.Bom;
+import com.sd.business.entity.bom.po.BomClassify;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.department.constant.DepartmentConstant;
+import com.sd.business.entity.in.emums.InDetailTypeEnum;
+import com.sd.business.entity.in.po.InOutStorage;
+import com.sd.business.entity.warehouse.constant.WarehouseConstant;
+import com.sd.business.mapper.board.InventoryBoardMapper;
+import com.sd.business.service.board.InventoryBoardService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 库存看板 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-11-16
+ */
+@Service
+public class InventoryBoardServiceImpl implements InventoryBoardService {
+
+    @Resource
+    private InventoryBoardMapper inventoryBoardMapper;
+
+    @Override
+    public Page<HazardousInventoryVo> getHazardousInventoryPage(SalesBoardSelectDto dto) {
+        IWrapper<HazardousInventoryVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.orderByDesc("if(saleQuantity > 0, 1, 0)");
+        wrapper.orderByDesc("if(inventoryQuantity > 0, 1, 0)");
+        wrapper.orderByAsc("predictOutStorageDays");
+        return inventoryBoardMapper.getHazardousInventoryPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<InTransitBomVo> getInTransitBomPage(SalesBoardSelectDto dto) {
+        IWrapper<InTransitBomVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.orderByAsc("nextDeliveryDays");
+        wrapper.orderByDesc("inTransitQuantity");
+        wrapper.groupBy("bs.id");
+        return inventoryBoardMapper.getInTransitBomPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<InventoryTurnoverRateVo> getTurnoverRatePage(SalesBoardSelectDto dto) {
+        IWrapper<InventoryTurnoverRateVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        if (Objects.equals(dto.getSortBy(), 1)) {
+            wrapper.orderByAsc("turnoverRate");
+        } else {
+            wrapper.orderByDesc("turnoverRate");
+        }
+        long days = 30;
+        if (dto.getBeginTime() != null && dto.getEndTime() != null) {
+            days = DateUtil.betweenDay(dto.getBeginTime(), dto.getEndTime(), true) + 1;
+        }
+        return inventoryBoardMapper.getTurnoverRatePage(dto.getPage(), wrapper, days);
+    }
+
+    @Override
+    public Page<InOutStorageBoardVo> getInOutStoragePage(InOutStorageBoardSelectDto dto) {
+        IWrapper<InOutStorageBoardVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.eq("ios", InOutStorage::getType, dto.getType());
+        wrapper.eq("ios", InOutStorage::getDetailType, InDetailTypeEnum.PURCHASE.getKey());
+        wrapper.eq("ios", InOutStorage::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT);
+        wrapper.eq("ios", InOutStorage::getDepartmentId, DepartmentConstant.SD_SPORTS);
+        wrapper.ge("ios", InOutStorage::getInOutStorageTime, dto.getBeginTime());
+        wrapper.le("ios", InOutStorage::getInOutStorageTime, dto.getEndTime());
+        wrapper.groupBy("bs.id");
+        if (Objects.equals(dto.getSortBy(), 1)) {
+            wrapper.orderByAsc("quantity");
+        } else {
+            wrapper.orderByDesc("quantity");
+        }
+        return inventoryBoardMapper.getInOutStoragePage(dto.getPage(), wrapper);
+    }
+}

+ 138 - 0
sd-business/src/main/java/com/sd/business/service/board/impl/SalesBoardServiceImpl.java

@@ -0,0 +1,138 @@
+package com.sd.business.service.board.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.dto.SalesBoardSelectDto;
+import com.sd.business.entity.board.vo.*;
+import com.sd.business.entity.bom.po.Bom;
+import com.sd.business.entity.bom.po.BomClassify;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.order.enums.OrderStatusEnum;
+import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.mapper.board.SalesBoardMapper;
+import com.sd.business.service.board.SalesBoardService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 销售看板 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-11-16
+ */
+@Service
+public class SalesBoardServiceImpl implements SalesBoardService {
+
+    @Resource
+    private SalesBoardMapper salesBoardMapper;
+
+    @Override
+    public Page<SkuSalesRankingVo> getSkuSalesRankingPage(SalesBoardSelectDto dto) {
+        IWrapper<SkuSalesRankingVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.ge("oi", OrderInfo::getShippingTime, dto.getBeginTime());
+        wrapper.le("oi", OrderInfo::getShippingTime, dto.getEndTime());
+        wrapper.groupBy("ss.id");
+        wrapper.orderByDesc("salesQuantity");
+        return salesBoardMapper.getSkuSalesRankingPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<SkuSalesAmountRankingVo> getSkuSalesAmountRankingPage(SalesBoardSelectDto dto) {
+        IWrapper<SkuSalesAmountRankingVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.ge("oi", OrderInfo::getShippingTime, dto.getBeginTime());
+        wrapper.le("oi", OrderInfo::getShippingTime, dto.getEndTime());
+        wrapper.groupBy("ss.id");
+        wrapper.orderByDesc("salesAmount");
+        return salesBoardMapper.getSkuSalesAmountRankingPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<BomSalesRankingVo> getBomSalesRankingPage(SalesBoardSelectDto dto) {
+        IWrapper<BomSalesRankingVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.ge("oi", OrderInfo::getShippingTime, dto.getBeginTime());
+        wrapper.le("oi", OrderInfo::getShippingTime, dto.getEndTime());
+        wrapper.groupBy("bs.id");
+        wrapper.orderByDesc("salesQuantity");
+        return salesBoardMapper.getBomSalesRankingPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<BomSalesAmountRankingVo> getBomSalesAmountRankingPage(SalesBoardSelectDto dto) {
+        IWrapper<BomSalesAmountRankingVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.ge("oi", OrderInfo::getShippingTime, dto.getBeginTime());
+        wrapper.le("oi", OrderInfo::getShippingTime, dto.getEndTime());
+        wrapper.groupBy("bs.id");
+        wrapper.orderByDesc("salesAmount");
+        return salesBoardMapper.getBomSalesAmountRankingPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<SkuSalesRegionRankingVo> getSkuSalesRegionRankingPage(SalesBoardSelectDto dto) {
+        IWrapper<SkuSalesRegionRankingVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.ge("oi", OrderInfo::getShippingTime, dto.getBeginTime());
+        wrapper.le("oi", OrderInfo::getShippingTime, dto.getEndTime());
+        wrapper.groupBy("oi.city");
+        if (Objects.equals(dto.getSortBy(), 1)) {
+            wrapper.orderByAsc("salesQuantity");
+        } else {
+            wrapper.orderByDesc("salesQuantity");
+        }
+        return salesBoardMapper.getSkuSalesRegionRankingPage(dto.getPage(), wrapper);
+    }
+
+    @Override
+    public Page<SkuSalesGrowthRateRankingVo> getSkuSalesGrowthRateRankingPage(SalesBoardSelectDto dto) {
+        IWrapper<SkuSalesGrowthRateRankingVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("bc", BomClassify::getParentId, 1);
+        wrapper.eq("b", Bom::getItemSubclass, dto.getItemSubclass());
+        wrapper.eq("b", Bom::getChromatophore, dto.getChromatophore());
+        wrapper.eq("bs", BomSpec::getWidth, dto.getBomSpecWidth());
+        wrapper.eq("bs", BomSpec::getHeight, dto.getBomSpecHeight());
+        wrapper.eq("bs", BomSpec::getColour, dto.getColour());
+        if (Objects.equals(dto.getSortBy(), 1)) {
+            wrapper.orderByAsc("monthOnMonthRatio");
+        } else {
+            wrapper.orderByDesc("monthOnMonthRatio");
+        }
+        return salesBoardMapper.getSkuSalesGrowthRateRankingPage(dto.getPage(), wrapper);
+    }
+}

+ 93 - 0
sd-business/src/main/resources/mapper/board/InventoryBoardMapper.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.board.InventoryBoardMapper">
+
+    <select id="getHazardousInventoryPage" resultType="com.sd.business.entity.board.vo.HazardousInventoryVo">
+        select
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            osq.quantity saleQuantity,
+            ifnull(i.quantity + ifnull(i.lock_quantity, 0), 0) inventoryQuantity,
+            ifnull((i.quantity + ifnull(i.lock_quantity, 0)) / (ifnull(osq.quantity, 0)  / 7), 0) predictOutStorageDays
+        from
+            bom_spec bs
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                left join inventory i on bs.id = i.bom_spec_id and department_id = 0 and warehouse_id in (1684037244354052098, 1684037201379213314)
+                left join (
+                    select
+                        os.bom_spec_id,
+                        ifnull(sum(os.quantity), 0) quantity
+                    from
+                        order_info o
+                            inner join order_sku os on o.id = os.order_id
+                            inner join statement_of_account soa on o.statement_of_account_id = soa.id
+                    where soa.time_period >= DATE_SUB(now(), INTERVAL 7 day)
+                      and o.`status` = 40
+                    group by os.bom_spec_id
+                ) osq on bs.id = osq.bom_spec_id
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getInTransitBomPage" resultType="com.sd.business.entity.board.vo.InTransitBomVo">
+        select
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            ifnull(sum(pb.purchase_quantity - pb.arrival_quantity + pb.return_quantity), 0) inTransitQuantity,
+            ifnull(datediff(min(if(p.delivery_date > now(), p.delivery_date, null)), now()), 0) nextDeliveryDays
+        from
+            bom_spec bs
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join purchase_bom pb on bs.id = pb.bom_spec_id
+                inner join purchase p on pb.purchase_id = p.id
+            ${ew.customSqlSegment}
+    </select>
+    <select id="getTurnoverRatePage" resultType="com.sd.business.entity.board.vo.InventoryTurnoverRateVo">
+        select
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            ${days} / (${days} * 0.5 * (
+                    (ibb.quantity + IFNULL(ibb.lock_quantity, 0))
+                        +
+                    (ibe.quantity + IFNULL(ibe.lock_quantity, 0))
+                ) / oq.quantity) turnoverRate
+        from
+            bom_spec bs
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join (
+                    select
+                        osss.bom_spec_id,
+                        sum(osss.quantity) quantity
+                    FROM
+                        order_sales_shipment_statistics osss
+                    where total_date >= date(date_sub(now(), INTERVAL ${days} + 1 day))
+                    group by osss.bom_spec_id
+                ) oq on bs.id = oq.bom_spec_id
+                inner join inventory_backup ibb on bs.id = ibb.bom_spec_id
+                    and ibb.backup_date = date(date_sub(now(), INTERVAL ${days} + 1 day))
+                    and ibb.department_id = 0
+                    and ibb.warehouse_id in (1684037244354052098, 1684037201379213314)
+                inner join inventory_backup ibe on bs.id = ibe.bom_spec_id
+                    and ibe.backup_date = date(date_sub(now(), INTERVAL 1 day))
+                    and ibe.department_id = 0
+                    and ibe.warehouse_id in (1684037244354052098, 1684037201379213314)
+                    and (ibe.quantity + IFNULL(ibe.lock_quantity, 0)) > 0
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getInOutStoragePage" resultType="com.sd.business.entity.board.vo.InOutStorageBoardVo">
+        select
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            sum(iosb.quantity) quantity
+        from
+            bom_spec bs
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join in_out_storage_bom iosb on bs.id = iosb.bom_spec_id
+                inner join in_out_storage ios on iosb.in_out_storage_id = ios.id
+            ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 129 - 0
sd-business/src/main/resources/mapper/board/SalesBoardMapper.xml

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.board.SalesBoardMapper">
+
+    <select id="getSkuSalesRankingPage" resultType="com.sd.business.entity.board.vo.SkuSalesRankingVo">
+        select
+            ss.name skuSpecName,
+            ss.code skuSpecCode,
+            sum(os.quantity) salesQuantity
+        from
+            sku_spec ss
+                inner join bom_spec bs on ss.bom_spec_id = bs.id
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join order_sku os on ss.id = os.sku_spec_id
+                inner join order_info oi on os.order_id = oi.id
+            ${ew.customSqlSegment}
+    </select>
+    <select id="getSkuSalesAmountRankingPage" resultType="com.sd.business.entity.board.vo.SkuSalesAmountRankingVo">
+        select
+            ss.name skuSpecName,
+            ss.code skuSpecCode,
+            sum(
+                (os.unit_price + os.custom_processing_fee +
+                 os.lssue_fee + os.delivery_materials_fee +
+                 os.packing_labor + os.management_fee +
+                 os.packaging_material_cost) * os.quantity
+                ) salesAmount
+        from
+            sku_spec ss
+                inner join bom_spec bs on ss.bom_spec_id = bs.id
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join order_sku os on ss.id = os.sku_spec_id
+                inner join order_info oi on os.order_id = oi.id
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getBomSalesRankingPage" resultType="com.sd.business.entity.board.vo.BomSalesRankingVo">
+        select
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            sum(os.quantity) salesQuantity
+        from
+            bom_spec bs
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join order_sku os on bs.id = os.bom_spec_id
+                inner join order_info oi on os.order_id = oi.id
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getBomSalesAmountRankingPage" resultType="com.sd.business.entity.board.vo.BomSalesAmountRankingVo">
+        select
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            sum(os.unit_price * os.quantity) salesAmount
+        from
+            bom_spec bs
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join order_sku os on bs.id = os.bom_spec_id
+                inner join order_info oi on os.order_id = oi.id
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getSkuSalesRegionRankingPage" resultType="com.sd.business.entity.board.vo.SkuSalesRegionRankingVo">
+        select
+            oi.province,
+            oi.city,
+            sum(os.quantity) salesQuantity
+        from
+            sku_spec ss
+                inner join bom_spec bs on ss.bom_spec_id = bs.id
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                inner join order_sku os on ss.id = os.sku_spec_id
+                inner join order_info oi on os.order_id = oi.id
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getSkuSalesGrowthRateRankingPage" resultType="com.sd.business.entity.board.vo.SkuSalesGrowthRateRankingVo">
+        select
+            ss.name skuSpecName,
+            ss.code skuSpecCode,
+            concat(ifnull(round(ifnull((oqtm.quantity - oqlym.quantity) / oqlym.quantity, oqtm.quantity) * 100, 2), 0), '%') monthOverMonthRatio,
+            concat(ifnull(round(ifnull((oqtm.quantity - oqlm.quantity) / oqlm.quantity, oqtm.quantity) * 100, 2), 0), '%') monthOnMonthRatio
+        from
+            sku_spec ss
+                inner join bom_spec bs on ss.bom_spec_id = bs.id
+                inner join bom b on bs.bom_id = b.id
+                inner join bom_classify bc on b.bom_classify_id = bc.id
+                left join (
+                    select
+                        os.sku_spec_id,
+                        sum(os.quantity) quantity
+                    from
+                        order_info oi
+                            inner join order_sku os on oi.id = os.order_id
+                    where  date_format(shipping_time, '%Y%m') = date_format(now(), '%Y%m')
+                      and oi.`status` = 40
+                    group by os.sku_spec_id
+                ) oqtm on ss.id = oqtm.sku_spec_id
+                left join (
+                    select
+                        os.sku_spec_id,
+                        sum(os.quantity) quantity
+                    from
+                        order_info oi
+                            inner join order_sku os on oi.id = os.order_id
+                    where PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(shipping_time, '%Y%m' )) = 1
+                      and oi.`status` = 40
+                    group by os.sku_spec_id
+                ) oqlm on ss.id = oqlm.sku_spec_id
+                left join (
+                    select
+                        os.sku_spec_id,
+                        sum(os.quantity) quantity
+                    from
+                        order_info oi
+                            inner join order_sku os on oi.id = os.order_id
+                    where PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(shipping_time, '%Y%m' )) = 12
+                      and oi.`status` = 40
+                    group by os.sku_spec_id
+                ) oqlym on ss.id = oqlym.sku_spec_id
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>