Jelajahi Sumber

周转率调整

fgd 1 tahun lalu
induk
melakukan
27484ff368

+ 2 - 2
sd-business/src/main/java/com/sd/business/controller/board/TurnoverRateBoardController.java

@@ -33,7 +33,7 @@ public class TurnoverRateBoardController {
      * @return
      */
     @PostMapping("/getTurnoverRateStatisticsList")
-    public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(@Validated @RequestBody TurnoverRateBoardSelectDto dto) {
+    public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(@RequestBody TurnoverRateBoardSelectDto dto) {
         return orderSalesShipmentStatisticsService.getTurnoverRateStatisticsList(dto);
     }
 
@@ -42,7 +42,7 @@ public class TurnoverRateBoardController {
      * @return
      */
     @PostMapping("/exportExcel")
-    public void exportExcel(HttpServletResponse response, @Validated @RequestBody TurnoverRateBoardSelectDto dto) {
+    public void exportExcel(HttpServletResponse response, @RequestBody TurnoverRateBoardSelectDto dto) {
         List<TurnoverRateStatisticsVo> list = orderSalesShipmentStatisticsService.getTurnoverRateStatisticsList(dto);
         ExcelUtil.export(response,"库存周转率", "库存周转率数据", list, TurnoverRateStatisticsVo.class);
     }

+ 41 - 0
sd-business/src/main/java/com/sd/business/entity/board/bo/TurnoverRateSalesShipmentStatisticsBo.java

@@ -0,0 +1,41 @@
+package com.sd.business.entity.board.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class TurnoverRateSalesShipmentStatisticsBo {
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 90天销售数量
+     */
+    private BigDecimal ninetyDaysSalesQuantity;
+
+    /**
+     * 60天销售数量
+     */
+    private BigDecimal sixtyDaysSalesQuantity;
+
+    /**
+     * 30天销售数量
+     */
+    private BigDecimal thirtyDaysSalesQuantity;
+}

+ 0 - 6
sd-business/src/main/java/com/sd/business/entity/board/dto/TurnoverRateBoardSelectDto.java

@@ -19,10 +19,4 @@ public class TurnoverRateBoardSelectDto {
      * bom分类 1-裸垫,2-裸砖
      */
     private Integer bomClassify;
-
-    /**
-     * 查询天数
-     */
-    @NotNull(message = "查询天数不能为空")
-    private Integer days;
 }

+ 15 - 2
sd-business/src/main/java/com/sd/business/entity/board/vo/TurnoverRateStatisticsVo.java

@@ -33,11 +33,24 @@ public class TurnoverRateStatisticsVo {
     /**
      * 周转率
      */
-    @ExcelProperty(value = "周转率", index = 2)
-    private BigDecimal turnoverRate;
+    @ExcelProperty(value = "30天周转率", index = 2)
+    private BigDecimal turnoverRateThirtyDays;
+
+    /**
+     * 周转率
+     */
+    @ExcelProperty(value = "60天周转率", index = 3)
+    private BigDecimal turnoverRateSixtyDays;
+
+    /**
+     * 周转率
+     */
+    @ExcelProperty(value = "90天周转率", index = 4)
+    private BigDecimal turnoverRateNinetyDays;
 
     /**
      * 库存数量
      */
+    @ExcelProperty(value = "库存数量", index = 5)
     private BigDecimal quantity;
 }

+ 14 - 0
sd-business/src/main/java/com/sd/business/mapper/order/OrderSalesShipmentStatisticsMapper.java

@@ -2,6 +2,7 @@ package com.sd.business.mapper.order;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo;
 import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
 import com.sd.business.entity.order.vo.OrderSalesShipmentStatisticsVo;
 import org.apache.ibatis.annotations.Param;
@@ -17,5 +18,18 @@ import java.util.List;
  * @since 2023-10-20
  */
 public interface OrderSalesShipmentStatisticsMapper extends BaseMapper<OrderSalesShipmentStatistics> {
+
+    /**
+     * 查询订单销售出库bom总数
+     * @param wrapper
+     * @return
+     */
     List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSalesShipmentStatistics> wrapper);
+
+    /**
+     * 查询近90、60、30天的订单销售出库bom总数
+     * @param wrapper
+     * @return
+     */
+    List<TurnoverRateSalesShipmentStatisticsBo> getTurnoverRateSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSalesShipmentStatistics> wrapper);
 }

+ 95 - 29
sd-business/src/main/java/com/sd/business/service/order/impl/OrderSalesShipmentStatisticsServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo;
 import com.sd.business.entity.board.dto.TurnoverRateBoardSelectDto;
 import com.sd.business.entity.board.vo.TurnoverRateStatisticsVo;
 import com.sd.business.entity.bom.po.BomClassify;
@@ -30,6 +31,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static java.util.Comparator.comparing;
@@ -72,25 +74,41 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
     @Override
     public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(TurnoverRateBoardSelectDto dto) {
         Date date = new Date();
-        Date beginDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -dto.getDays() - 1));
-        Date endDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -1));
-        OrderSalesShipmentStatisticsDto statisticsDto = new OrderSalesShipmentStatisticsDto();
-        statisticsDto.setBomClassify(dto.getBomClassify());
-        statisticsDto.setBeginDate(beginDate);
-        statisticsDto.setEndDate(endDate);
-        List<OrderSalesShipmentStatisticsVo> statisticsVoList = this.getSalesShipmentStatisticsByDate(statisticsDto);
+        String ninetyDaysDate = DateUtil.format(DateUtil.offsetDay(date, -91), "yyyy-MM-dd");
+        String sixtyDaysDate = DateUtil.format(DateUtil.offsetDay(date, -61), "yyyy-MM-dd");
+        String thirtyDaysDate = DateUtil.format(DateUtil.offsetDay(date, -31), "yyyy-MM-dd");
+        String endDate = DateUtil.format(DateUtil.offsetDay(date, -1), "yyyy-MM-dd");
+
+        IWrapper<OrderSalesShipmentStatistics> wrapper = getWrapper();
+        wrapper.orderByDesc("osss", OrderSalesShipmentStatistics::getId);
+        wrapper.between("osss", OrderSalesShipmentStatistics::getTotalDate, ninetyDaysDate, endDate);
+        if (Objects.equals(dto.getBomClassify(), 1)) {
+            wrapper.in("bc", BomClassify::getCode, Arrays.asList("201.G","203.G"));
+        } else if (Objects.equals(dto.getBomClassify(), 2)){
+            wrapper.eq("bc", BomClassify::getCode,"202.G");
+        }
+        wrapper.ne("bs", BomSpec::getCode, "1010000007");
+        wrapper.groupBy("osss.bom_spec_id");
+        List<TurnoverRateSalesShipmentStatisticsBo> statisticsVoList = this.baseMapper.getTurnoverRateSalesShipmentStatisticsList(wrapper);
         if (ObjectUtil.isEmpty(statisticsVoList)) {
             return Collections.emptyList();
         }
-        List<Long> bomSpecIds = statisticsVoList.stream().map(OrderSalesShipmentStatistics::getBomSpecId).collect(Collectors.toList());
+        List<Long> bomSpecIds = statisticsVoList.stream().map(TurnoverRateSalesShipmentStatisticsBo::getBomSpecId).collect(Collectors.toList());
 
-        // 期初库存数据
-        Map<Long, InventoryBackup> beginBackupMap = inventoryBackupService.mapKEntity(InventoryBackup::getBomSpecId, q -> q
-                .eq(InventoryBackup::getBackupDate, beginDate)
+        // 查询前90、60、30天的所有库存数据
+        List<InventoryBackup> inventoryBackupList = inventoryBackupService.list(q -> q
+                .in(InventoryBackup::getBackupDate, ninetyDaysDate, sixtyDaysDate, thirtyDaysDate)
                 .eq(InventoryBackup::getDepartmentId, DepartmentConstant.SD_SPORTS)
                 .eq(InventoryBackup::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
                 .in(InventoryBackup::getBomSpecId, bomSpecIds));
 
+        // 期初库存数据
+        Map<String, Map<Long, InventoryBackup>> beginBackupMap = inventoryBackupList.stream()
+                .collect(
+                        Collectors.groupingBy(
+                                item -> DateUtil.format(item.getBackupDate(), "yyyy-MM-dd"),
+                                Collectors.toMap(InventoryBackup::getBomSpecId, Function.identity())));
+
         // 期末库存数据
         Map<Long, InventoryBackup> endBackupMap = inventoryBackupService.mapKEntity(InventoryBackup::getBomSpecId, q -> q
                 .eq(InventoryBackup::getBackupDate, endDate)
@@ -99,18 +117,37 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                 .in(InventoryBackup::getBomSpecId, bomSpecIds));
 
         List<TurnoverRateStatisticsVo> list = statisticsVoList.stream().map(item -> {
+            Long bomSpecId = item.getBomSpecId();
             // 计算周转率
             // 时间段库存周转天数 = 时间段天数 * (1 / 2) * (期初库存数量+期末库存数量) / 时间段销售量;
             // 库存周转率 = 时间段天数 / 库存周转天数。
             // 获取期初和期末数据
-            InventoryBackup beginBackup = beginBackupMap.get(item.getBomSpecId());
-            InventoryBackup endBackup = endBackupMap.get(item.getBomSpecId());
-            BigDecimal beginQuantity;
+            InventoryBackup beginBackupNinetyDays = beginBackupMap.getOrDefault(ninetyDaysDate, Collections.emptyMap()).get(bomSpecId);
+            InventoryBackup beginBackupSixtyDays = beginBackupMap.getOrDefault(sixtyDaysDate, Collections.emptyMap()).get(bomSpecId);
+            InventoryBackup beginBackupThirtyDays = beginBackupMap.getOrDefault(thirtyDaysDate, Collections.emptyMap()).get(bomSpecId);
+            InventoryBackup endBackup = endBackupMap.get(bomSpecId);
+            // 计算bom近90、60、30天的期初库存数量
+            BigDecimal beginQuantityNinetyDays;
+            BigDecimal beginQuantitySixtyDays;
+            BigDecimal beginQuantityThirtyDays;
             BigDecimal endQuantity;
-            if (beginBackup == null) {
-                beginQuantity = BigDecimal.ZERO;
+            if (beginBackupNinetyDays == null) {
+                beginQuantityNinetyDays = BigDecimal.ZERO;
             } else {
-                beginQuantity = beginBackup.getQuantity().add(beginBackup.getLockQuantity() == null ? BigDecimal.ZERO : beginBackup.getLockQuantity());
+                beginQuantityNinetyDays = beginBackupNinetyDays.getQuantity()
+                        .add(beginBackupNinetyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupNinetyDays.getLockQuantity());
+            }
+            if (beginBackupSixtyDays == null) {
+                beginQuantitySixtyDays = BigDecimal.ZERO;
+            } else {
+                beginQuantitySixtyDays = beginBackupSixtyDays.getQuantity()
+                        .add(beginBackupSixtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupSixtyDays.getLockQuantity());
+            }
+            if (beginBackupThirtyDays == null) {
+                beginQuantityThirtyDays = BigDecimal.ZERO;
+            } else {
+                beginQuantityThirtyDays = beginBackupThirtyDays.getQuantity()
+                        .add(beginBackupThirtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupThirtyDays.getLockQuantity());
             }
             if (endBackup == null) {
                 endQuantity = BigDecimal.ZERO;
@@ -118,28 +155,55 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                 endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
             }
             // 时间段天数
-            BigDecimal days = new BigDecimal(dto.getDays());
-            BigDecimal turnoverRate;
-            if (ObjectUtil.equals(item.getQuantity(), BigDecimal.ZERO)
-                    || ObjectUtil.equals(beginQuantity.add(endQuantity), BigDecimal.ZERO)) {
-                turnoverRate = BigDecimal.ZERO;
+            BigDecimal days;
+            BigDecimal turnoverRateNinetyDays;
+            BigDecimal turnoverRateSixtyDays;
+            BigDecimal turnoverRateThirtyDays;
+            if (ObjectUtil.equals(item.getNinetyDaysSalesQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantityNinetyDays.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRateNinetyDays = BigDecimal.ZERO;
             } else {
-                turnoverRate = days
+                days = new BigDecimal(90);
+                turnoverRateNinetyDays = days
                         .divide(days.multiply(new BigDecimal("0.5"))
-                                        .multiply(beginQuantity.add(endQuantity))
-                                        .divide(item.getQuantity(), 4, RoundingMode.HALF_UP),
+                                        .multiply(beginQuantityNinetyDays.add(endQuantity))
+                                        .divide(item.getNinetyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
                                 4, RoundingMode.HALF_UP);
             }
-            if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO) && ObjectUtil.equals(turnoverRate, BigDecimal.ZERO)) {
+            if (ObjectUtil.equals(item.getSixtyDaysSalesQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantitySixtyDays.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRateSixtyDays = BigDecimal.ZERO;
+            } else {
+                days = new BigDecimal(60);
+                turnoverRateSixtyDays = days
+                        .divide(days.multiply(new BigDecimal("0.5"))
+                                        .multiply(beginQuantitySixtyDays.add(endQuantity))
+                                        .divide(item.getSixtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
+                                4, RoundingMode.HALF_UP);
+            }
+            if (ObjectUtil.equals(item.getThirtyDaysSalesQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantityThirtyDays.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRateThirtyDays = BigDecimal.ZERO;
+            } else {
+                days = new BigDecimal(30);
+                turnoverRateThirtyDays = days
+                        .divide(days.multiply(new BigDecimal("0.5"))
+                                        .multiply(beginQuantityThirtyDays.add(endQuantity))
+                                        .divide(item.getThirtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
+                                4, RoundingMode.HALF_UP);
+            }
+            if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO) && ObjectUtil.equals(turnoverRateNinetyDays, BigDecimal.ZERO)) {
                 return null;
             }
             TurnoverRateStatisticsVo vo = new TurnoverRateStatisticsVo();
             vo.setBomSpecCode(item.getBomSpecCode());
             vo.setBomSpecName(item.getBomSpecName());
-            vo.setTurnoverRate(turnoverRate);
+            vo.setTurnoverRateNinetyDays(turnoverRateNinetyDays);
+            vo.setTurnoverRateSixtyDays(turnoverRateSixtyDays);
+            vo.setTurnoverRateThirtyDays(turnoverRateThirtyDays);
             vo.setQuantity(endQuantity);
             return vo;
-        }).filter(Objects::nonNull).sorted(comparing(TurnoverRateStatisticsVo::getTurnoverRate)).collect(Collectors.toList());
+        }).filter(Objects::nonNull).sorted(comparing(TurnoverRateStatisticsVo::getTurnoverRateNinetyDays)).collect(Collectors.toList());
         return list;
     }
 
@@ -159,7 +223,9 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
             if (list.isEmpty()) {
                 return;
             }
-            Map<Long, OrderSalesShipmentStatistics> statisticsMap = this.mapKEntity(OrderSalesShipmentStatistics::getBomSpecId, q -> q.eq(OrderSalesShipmentStatistics::getTotalDate, formatDate));
+            Map<Long, OrderSalesShipmentStatistics> statisticsMap = this.mapKEntity(
+                    OrderSalesShipmentStatistics::getBomSpecId,
+                    q -> q.eq(OrderSalesShipmentStatistics::getTotalDate, formatDate));
 
             List<Long> orderIds = list.stream().map(BaseIdPo::getId).collect(Collectors.toList());
             List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIds));

+ 16 - 0
sd-business/src/main/resources/mapper/order/OrderSalesShipmentStatisticsMapper.xml

@@ -15,4 +15,20 @@
             left join bom_classify bc on b.bom_classify_id = bc.id
         ${ew.customSqlSegment}
     </select>
+    <select id="getTurnoverRateSalesShipmentStatisticsList"
+            resultType="com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo">
+        select
+            osss.bom_spec_id,
+            bs.code bomSpecCode,
+            bs.name bomSpecName,
+            sum(case when osss.total_date >= date(date_sub(now(), interval 91 day)) then quantity else 0 end) ninetyDaysSalesQuantity,
+            sum(case when osss.total_date >= date(date_sub(now(), interval 61 day)) then quantity else 0 end) sixtyDaysSalesQuantity,
+            sum(case when osss.total_date >= date(date_sub(now(), interval 31 day)) then quantity else 0 end) thirtyDaysSalesQuantity
+        from
+            order_sales_shipment_statistics osss
+                left join bom_spec bs on osss.bom_spec_id = bs.id
+                left join bom b on bs.bom_id = b.id
+                left join bom_classify bc on b.bom_classify_id = bc.id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>