Browse Source

申购需求报表新增周转率字段

fgd 1 năm trước cách đây
mục cha
commit
58bc248823

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

@@ -5,6 +5,7 @@ import com.sd.business.entity.board.vo.TurnoverRateStatisticsVo;
 import com.sd.business.service.order.OrderSalesShipmentStatisticsService;
 import com.sd.framework.util.excel.util.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -32,7 +33,7 @@ public class TurnoverRateBoardController {
      * @return
      */
     @PostMapping("/getTurnoverRateStatisticsList")
-    public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(@RequestBody TurnoverRateBoardSelectDto dto) {
+    public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(@Validated @RequestBody TurnoverRateBoardSelectDto dto) {
         return orderSalesShipmentStatisticsService.getTurnoverRateStatisticsList(dto);
     }
 
@@ -41,7 +42,7 @@ public class TurnoverRateBoardController {
      * @return
      */
     @PostMapping("/exportExcel")
-    public void exportExcel(HttpServletResponse response, @RequestBody TurnoverRateBoardSelectDto dto) {
+    public void exportExcel(HttpServletResponse response, @Validated @RequestBody TurnoverRateBoardSelectDto dto) {
         List<TurnoverRateStatisticsVo> list = orderSalesShipmentStatisticsService.getTurnoverRateStatisticsList(dto);
         ExcelUtil.export(response,"库存周转率", "库存周转率数据", list, TurnoverRateStatisticsVo.class);
     }

+ 9 - 2
sd-business/src/main/java/com/sd/business/entity/apply/vo/ApplyBuyBomAccessoryVo.java

@@ -108,16 +108,23 @@ public class ApplyBuyBomAccessoryVo {
     private BigDecimal applyBuyQuantity;
 
     /**
+     * 周转率
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "周转率", index = 13)
+    private BigDecimal turnoverRate;
+
+    /**
      * 备注
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "备注", index = 13)
+    @ExcelProperty(value = "备注", index = 14)
     private String remark;
 
     /**
      * 附注
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "附注", index = 14)
+    @ExcelProperty(value = "附注", index = 15)
     private String annotation;
 }

+ 5 - 9
sd-business/src/main/java/com/sd/business/entity/board/dto/TurnoverRateBoardSelectDto.java

@@ -3,7 +3,7 @@ package com.sd.business.entity.board.dto;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Date;
+import javax.validation.constraints.NotNull;
 
 /**
  * 周转率查询入参实体
@@ -18,15 +18,11 @@ public class TurnoverRateBoardSelectDto {
     /**
      * bom分类 1-裸垫,2-裸砖
      */
-    private String bomClassify;
+    private Integer bomClassify;
 
     /**
-     * 开始时间
+     * 查询天数
      */
-    private Date beginDate;
-
-    /**
-     * 结束时间
-     */
-    private Date endDate;
+    @NotNull(message = "查询天数不能为空")
+    private Integer days;
 }

+ 23 - 0
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSalesShipmentStatisticsDto.java

@@ -4,6 +4,9 @@ import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * 订单销售出库统计 新增编辑入参实体
  *
@@ -13,4 +16,24 @@ import lombok.Setter;
 @Getter
 @Setter
 public class OrderSalesShipmentStatisticsDto extends OrderSalesShipmentStatistics {
+
+    /**
+     * bom分类 1-裸垫,2-裸砖
+     */
+    private Integer bomClassify;
+
+    /**
+     * 开始时间
+     */
+    private Date beginDate;
+
+    /**
+     * 结束时间
+     */
+    private Date endDate;
+
+    /**
+     * bom规格 id列表
+     */
+    private List<Long> bomSpecIds;
 }

+ 9 - 3
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java

@@ -29,6 +29,7 @@ import com.sd.business.service.apply.ApplyBuyBomService;
 import com.sd.business.service.apply.ApplyBuyService;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.inventory.InventoryService;
+import com.sd.business.service.order.OrderSalesShipmentStatisticsService;
 import com.sd.business.service.order.OrderService;
 import com.sd.business.service.purchase.PurchaseBomService;
 import com.sd.business.upload.ObsUploadService;
@@ -69,6 +70,9 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
     private PurchaseBomService purchaseBomService;
 
     @Autowired
+    private OrderSalesShipmentStatisticsService orderSalesShipmentStatisticsService;
+
+    @Autowired
     private InventoryService inventoryService;
 
     @Autowired
@@ -202,7 +206,9 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
     private List<ApplyBuyBomAccessoryVo> getApplyData(Long applyBuyId) {
         List<ApplyBuyBomAccessoryVo> accessoryList = new ArrayList<>();
         List<ApplyBuyBom> list = applyBuyBomService.list(q -> q.eq(ApplyBuyBom::getApplyBuyId, applyBuyId));
-        Map<Long, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, list.stream().map(ApplyBuyBom::getBomSpecId).collect(Collectors.toList())));
+        List<Long> bomSpecIds = list.stream().map(ApplyBuyBom::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, bomSpecIds));
+        Map<Long, BigDecimal> turnoverRateMap = orderSalesShipmentStatisticsService.getTurnoverRateMapByBomSpecIds(bomSpecIds);
         for (ApplyBuyBom applyBuyBom : list) {
             Long bomSpecId = applyBuyBom.getBomSpecId();
             BomSpec bomSpec = bomSpecMap.get(bomSpecId);
@@ -260,7 +266,7 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
             vo.setBomSpecCode(bomSpec.getCode());
             vo.setBomSpecName(bomSpec.getName());
             vo.setSpecification(length + " * " + width + " * " + height);
-            vo.setColour(bomSpec.getColour());
+            vo.setColour(bomSpec.getName());
             vo.setStockQuantity(inventoryQuantity);
             vo.setInTransitQuantity(inTransitSum);
             vo.setCurrentMonthSales(currentMonthSalesQuantity);
@@ -270,7 +276,7 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
             vo.setActualSalesDays(actualSalesDays);
             vo.setShortageQuantity(shortageQuantity);
             vo.setApplyBuyQuantity(applyBuyBom.getQuantity());
-            vo.setApplyBuyQuantity(applyBuyBom.getQuantity());
+            vo.setTurnoverRate(turnoverRateMap.get(applyBuyBom.getBomSpecId()));
             accessoryList.add(vo);
         }
 

+ 11 - 1
sd-business/src/main/java/com/sd/business/service/order/OrderSalesShipmentStatisticsService.java

@@ -3,10 +3,13 @@ package com.sd.business.service.order;
 import com.ruoyi.common.core.service.BaseService;
 import com.sd.business.entity.board.dto.TurnoverRateBoardSelectDto;
 import com.sd.business.entity.board.vo.TurnoverRateStatisticsVo;
+import com.sd.business.entity.order.dto.OrderSalesShipmentStatisticsDto;
 import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
 import com.sd.business.entity.order.vo.OrderSalesShipmentStatisticsVo;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -23,7 +26,7 @@ public interface OrderSalesShipmentStatisticsService extends BaseService<OrderSa
      * @param dto
      * @return
      */
-    List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsByDate(TurnoverRateBoardSelectDto dto);
+    List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsByDate(OrderSalesShipmentStatisticsDto dto);
 
     /**
      * 获取周转率数据列表
@@ -36,4 +39,11 @@ public interface OrderSalesShipmentStatisticsService extends BaseService<OrderSa
      * 销售出库统计任务
      */
     void salesShipmentStatistics();
+
+    /**
+     * 获取周转率数据列表
+     *
+     * @return
+     */
+    Map<Long, BigDecimal> getTurnoverRateMapByBomSpecIds(List<Long> bomSpecIds);
 }

+ 82 - 12
sd-business/src/main/java/com/sd/business/service/order/impl/OrderSalesShipmentStatisticsServiceImpl.java

@@ -11,6 +11,7 @@ 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.inventory.po.InventoryBackup;
+import com.sd.business.entity.order.dto.OrderSalesShipmentStatisticsDto;
 import com.sd.business.entity.order.enums.OrderClassifyEnum;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
@@ -54,13 +55,13 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
     private InventoryBackupService inventoryBackupService;
 
     @Override
-    public List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsByDate(TurnoverRateBoardSelectDto dto) {
+    public List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsByDate(OrderSalesShipmentStatisticsDto dto) {
         IWrapper<OrderSalesShipmentStatistics> wrapper = getWrapper();
         wrapper.orderByDesc("osss", OrderSalesShipmentStatistics::getId);
         wrapper.between("osss", OrderSalesShipmentStatistics::getTotalDate, dto.getBeginDate(), dto.getEndDate());
-        if ("1".equals(dto.getBomClassify())) {
+        if (Objects.equals(dto.getBomClassify(), 1)) {
             wrapper.in("bc", BomClassify::getCode, Arrays.asList("201.G","203.G"));
-        } else {
+        } else if (Objects.equals(dto.getBomClassify(), 2)){
             wrapper.eq("bc", BomClassify::getCode,"202.G");
         }
         wrapper.ne("bs", BomSpec::getCode, "1010000007");
@@ -70,13 +71,14 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
 
     @Override
     public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(TurnoverRateBoardSelectDto dto) {
-        // 查询90天的周转率
         Date date = new Date();
-        Date beginDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -90));
+        Date beginDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -dto.getDays() - 1));
         Date endDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -1));
-        dto.setBeginDate(beginDate);
-        dto.setEndDate(endDate);
-        List<OrderSalesShipmentStatisticsVo> statisticsVoList = this.getSalesShipmentStatisticsByDate(dto);
+        OrderSalesShipmentStatisticsDto statisticsDto = new OrderSalesShipmentStatisticsDto();
+        statisticsDto.setBomClassify(dto.getBomClassify());
+        statisticsDto.setBeginDate(beginDate);
+        statisticsDto.setEndDate(endDate);
+        List<OrderSalesShipmentStatisticsVo> statisticsVoList = this.getSalesShipmentStatisticsByDate(statisticsDto);
         if (ObjectUtil.isEmpty(statisticsVoList)) {
             return Collections.emptyList();
         }
@@ -115,7 +117,8 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
             } else {
                 endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
             }
-            BigDecimal days = new BigDecimal(90);
+            // 时间段天数
+            BigDecimal days = new BigDecimal(dto.getDays());
             BigDecimal turnoverRate;
             if (ObjectUtil.equals(item.getQuantity(), BigDecimal.ZERO)
                     || ObjectUtil.equals(beginQuantity.add(endQuantity), BigDecimal.ZERO)) {
@@ -136,9 +139,7 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
             vo.setTurnoverRate(turnoverRate);
             vo.setQuantity(endQuantity);
             return vo;
-        }).filter(Objects::nonNull).collect(Collectors.toList());
-        // 按照周转率升序
-        list.sort(comparing(TurnoverRateStatisticsVo::getTurnoverRate));
+        }).filter(Objects::nonNull).sorted(comparing(TurnoverRateStatisticsVo::getTurnoverRate)).collect(Collectors.toList());
         return list;
     }
 
@@ -166,4 +167,73 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
         }).collect(Collectors.toList());
         this.saveBatch(statisticsDtoList);
     }
+
+    @Override
+    public Map<Long, BigDecimal> getTurnoverRateMapByBomSpecIds(List<Long> bomSpecIds) {
+        Map<Long, BigDecimal> map = new HashMap<>();
+        // 查询90天的周转率
+        Date date = new Date();
+        Date beginDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -91));
+        Date endDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -1));
+        OrderSalesShipmentStatisticsDto statisticsDto = new OrderSalesShipmentStatisticsDto();
+        statisticsDto.setBeginDate(beginDate);
+        statisticsDto.setEndDate(endDate);
+        statisticsDto.setBomSpecIds(bomSpecIds);
+        List<OrderSalesShipmentStatisticsVo> statisticsVoList = this.getSalesShipmentStatisticsByDate(statisticsDto);
+        if (ObjectUtil.isEmpty(statisticsVoList)) {
+            return map;
+        }
+        // 期初库存数据
+        Map<Long, InventoryBackup> beginBackupMap = inventoryBackupService.mapKEntity(InventoryBackup::getBomSpecId, q -> q
+                .eq(InventoryBackup::getBackupDate, beginDate)
+                .eq(InventoryBackup::getDepartmentId, DepartmentConstant.SD_SPORTS)
+                .eq(InventoryBackup::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
+                .in(InventoryBackup::getBomSpecId, bomSpecIds));
+
+        // 期末库存数据
+        Map<Long, InventoryBackup> endBackupMap = inventoryBackupService.mapKEntity(InventoryBackup::getBomSpecId, q -> q
+                .eq(InventoryBackup::getBackupDate, endDate)
+                .eq(InventoryBackup::getDepartmentId, DepartmentConstant.SD_SPORTS)
+                .eq(InventoryBackup::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
+                .in(InventoryBackup::getBomSpecId, bomSpecIds));
+
+        for (OrderSalesShipmentStatisticsVo item : statisticsVoList) {
+            // 计算周转率
+            // 时间段库存周转天数 = 时间段天数 * (1 / 2) * (期初库存数量+期末库存数量) / 时间段销售量;
+            // 库存周转率 = 时间段天数 / 库存周转天数。
+            // 获取期初和期末数据
+            InventoryBackup beginBackup = beginBackupMap.get(item.getBomSpecId());
+            InventoryBackup endBackup = endBackupMap.get(item.getBomSpecId());
+            BigDecimal beginQuantity;
+            BigDecimal endQuantity;
+            if (beginBackup == null) {
+                beginQuantity = BigDecimal.ZERO;
+            } else {
+                beginQuantity = beginBackup.getQuantity().add(beginBackup.getLockQuantity() == null ? BigDecimal.ZERO : beginBackup.getLockQuantity());
+            }
+            if (endBackup == null) {
+                endQuantity = BigDecimal.ZERO;
+            } else {
+                endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
+            }
+            // 时间段天数
+            BigDecimal days = new BigDecimal(90);
+            BigDecimal turnoverRate;
+            if (ObjectUtil.equals(item.getQuantity(), BigDecimal.ZERO)
+                    || ObjectUtil.equals(beginQuantity.add(endQuantity), BigDecimal.ZERO)) {
+                turnoverRate = BigDecimal.ZERO;
+            } else {
+                turnoverRate = days
+                        .divide(days.multiply(new BigDecimal("0.5"))
+                                        .multiply(beginQuantity.add(endQuantity))
+                                        .divide(item.getQuantity(), 4, RoundingMode.HALF_UP),
+                                4, RoundingMode.HALF_UP);
+            }
+            if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO) && ObjectUtil.equals(turnoverRate, BigDecimal.ZERO)) {
+                continue;
+            }
+            map.put(item.getBomSpecId(), turnoverRate);
+        }
+        return map;
+    }
 }