Эх сурвалжийг харах

新增事业部销售统计,修改周转率统计方式

fgd 1 жил өмнө
parent
commit
d8d4d66bf6
22 өөрчлөгдсөн 367 нэмэгдсэн , 452 устгасан
  1. 11 0
      sd-business/src/main/java/com/sd/business/controller/board/SalesBoardController.java
  2. 6 1
      sd-business/src/main/java/com/sd/business/entity/board/bo/OrderSalesShipmentStatisticsBo.java
  3. 5 0
      sd-business/src/main/java/com/sd/business/entity/board/dto/TurnoverRateBoardSelectDto.java
  4. 1 1
      sd-business/src/main/java/com/sd/business/entity/board/vo/DailyBoardOutStorageBomVo.java
  5. 37 0
      sd-business/src/main/java/com/sd/business/entity/board/vo/DepartmentBomSalesBoardVo.java
  6. 0 39
      sd-business/src/main/java/com/sd/business/entity/order/dto/OrderSalesShipmentStatisticsDto.java
  7. 0 38
      sd-business/src/main/java/com/sd/business/entity/order/po/OrderSalesShipmentStatistics.java
  8. 0 26
      sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSalesShipmentStatisticsVo.java
  9. 2 17
      sd-business/src/main/java/com/sd/business/flow/OrderFlow.java
  10. 7 9
      sd-business/src/main/java/com/sd/business/mapper/order/OrderSalesShipmentStatisticsMapper.java
  11. 0 23
      sd-business/src/main/java/com/sd/business/scheduled/OrderSalesShipmentStatisticsTask.java
  12. 9 0
      sd-business/src/main/java/com/sd/business/service/board/SalesBoardService.java
  13. 123 1
      sd-business/src/main/java/com/sd/business/service/board/impl/SalesBoardServiceImpl.java
  14. 5 9
      sd-business/src/main/java/com/sd/business/service/bom/impl/BomSpecServiceImpl.java
  15. 5 12
      sd-business/src/main/java/com/sd/business/service/order/OrderSalesShipmentStatisticsService.java
  16. 0 8
      sd-business/src/main/java/com/sd/business/service/order/OrderService.java
  17. 56 181
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderSalesShipmentStatisticsServiceImpl.java
  18. 0 17
      sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java
  19. 10 25
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java
  20. 13 4
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java
  21. 39 23
      sd-business/src/main/resources/mapper/order/OrderSalesShipmentStatisticsMapper.xml
  22. 38 18
      sd-business/src/main/resources/mapper/purchase/PurchaseBomMapper.xml

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

@@ -1,11 +1,13 @@
 package com.sd.business.controller.board;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.board.dto.DailyBoardSelectDto;
 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.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -161,4 +163,13 @@ public class SalesBoardController {
         List<SkuSalesGrowthRateRankingVo> list = page.getRecords();
         ExcelUtil.export(response,"sku销量增长率排行", "sku销量增长率排行数据", list, SkuSalesGrowthRateRankingVo.class);
     }
+
+    /**
+     * 各事业部bom销量统计列表
+     * @return
+     */
+    @PostMapping("/getDepartmentBomSalesStatisticsList")
+    public List<DepartmentBomSalesBoardVo> getDepartmentBomSalesStatisticsList(@Validated @RequestBody DailyBoardSelectDto dto) {
+        return salesBoardService.getDepartmentBomSalesStatisticsList(dto);
+    }
 }

+ 6 - 1
sd-business/src/main/java/com/sd/business/entity/board/bo/TurnoverRateSalesShipmentStatisticsBo.java → sd-business/src/main/java/com/sd/business/entity/board/bo/OrderSalesShipmentStatisticsBo.java

@@ -7,7 +7,7 @@ import java.math.BigDecimal;
 
 @Getter
 @Setter
-public class TurnoverRateSalesShipmentStatisticsBo {
+public class OrderSalesShipmentStatisticsBo {
 
     /**
      * bom规格id
@@ -53,4 +53,9 @@ public class TurnoverRateSalesShipmentStatisticsBo {
      * 30天销售数量
      */
     private BigDecimal thirtyDaysSalesQuantity;
+
+    /**
+     * 周转率
+     */
+    private BigDecimal turnoverRate;
 }

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

@@ -16,6 +16,11 @@ import java.math.BigDecimal;
 public class TurnoverRateBoardSelectDto {
 
     /**
+     * 事业部id
+     */
+    private Long departmentId;
+
+    /**
      * bom分类 1-瑜伽垫裸垫,2-瑜伽垫裸砖,3-跳绳垫裸垫
      */
     private Integer bomClassify;

+ 1 - 1
sd-business/src/main/java/com/sd/business/entity/board/vo/DailyBoardOutStorageBomVo.java

@@ -15,7 +15,7 @@ import java.math.BigDecimal;
 public class DailyBoardOutStorageBomVo {
 
     /**
-     * 产品规格品号
+     * 产品规格id
      */
     private Long bomSpecId;
 

+ 37 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/DepartmentBomSalesBoardVo.java

@@ -0,0 +1,37 @@
+package com.sd.business.entity.board.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 事业部bom销量统计数据查询返回值实体
+ *
+ * @since 2023-12-14
+ */
+@Getter
+@Setter
+public class DepartmentBomSalesBoardVo {
+
+    /**
+     * 事业部名称
+     */
+    private String departmentName;
+
+    /**
+     * 订单总数
+     */
+    private Integer orderSalesCount;
+
+    /**
+     * bom销售总数
+     */
+    private BigDecimal bomSpecSalesCount;
+
+    /**
+     * bom销售列表
+     */
+    private List<DailyBoardOutStorageBomVo> bomSpecSalesList;
+}

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

@@ -1,39 +0,0 @@
-package com.sd.business.entity.order.dto;
-
-import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * 订单销售出库统计 新增编辑入参实体
- *
- * @author
- * @since 2023-10-20
- */
-@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;
-}

+ 0 - 38
sd-business/src/main/java/com/sd/business/entity/order/po/OrderSalesShipmentStatistics.java

@@ -1,38 +0,0 @@
-package com.sd.business.entity.order.po;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.ruoyi.common.core.domain.BasePo;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
- * <p>
- * 订单销售出库统计
- * </p>
- *
- * @author
- * @since 2023-10-20
- */
-@Getter
-@Setter
-@TableName("order_sales_shipment_statistics")
-public class OrderSalesShipmentStatistics extends BasePo {
-
-    /**
-     * 统计时间
-     */
-    private Date totalDate;
-
-    /**
-     * bom规格id
-     */
-    private Long bomSpecId;
-
-    /**
-     * 数量
-     */
-    private BigDecimal quantity;
-}

+ 0 - 26
sd-business/src/main/java/com/sd/business/entity/order/vo/OrderSalesShipmentStatisticsVo.java

@@ -1,26 +0,0 @@
-package com.sd.business.entity.order.vo;
-
-import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * 订单销售出库统计列表查询返回值实体
- *
- * @author
- * @since 2023-10-20
- */
-@Getter
-@Setter
-public class OrderSalesShipmentStatisticsVo extends OrderSalesShipmentStatistics {
-
-    /**
-     * 品号
-     */
-    private String bomSpecCode;
-
-    /**
-     * 品名
-     */
-    private String bomSpecName;
-}

+ 2 - 17
sd-business/src/main/java/com/sd/business/flow/OrderFlow.java

@@ -68,25 +68,10 @@ public class OrderFlow extends FlowDelegate {
     @Override
     public void end(Long flowId, Long businessId, JSONObject submitData) {
         OrderInfoDto dto = submitData.toJavaObject(OrderInfoDto.class);
+        dto.setFlowStatus(FlowStatusEnum.PASS.getKey());
+        dto.setStatus(OrderStatusEnum.STOCK_PREPARATION.getKey());
         orderService.edit(dto);
 
-        // 查询委外订单是否存在包材
-        Boolean isExist = orderService.isExistOrderSkuBom(businessId);
-
-        orderService.update(q -> q
-                .eq(BaseIdPo::getId, businessId)
-                .set(OrderInfo::getFlowStatus, FlowStatusEnum.PASS.getKey())
-                // 委外订单不存在包材则直接修改为生产中
-                .set(OrderInfo::getStatus, !isExist ? OrderStatusEnum.IN_PRODUCTION.getKey() : OrderStatusEnum.STOCK_PREPARATION.getKey())
-                .set(BasePo::getUpdateTime, new Date())
-                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-        );
-
-        if (!isExist) {
-            // 生成生产任务和工单
-            productionWorkOrderService.add(businessId);
-        }
-
         orderFlowExampleService.update(q -> q.eq(OrderFlowExample::getOrderId, businessId)
                 .eq(OrderFlowExample::getFlowId, flowId)
                 .set(OrderFlowExample::getFlowStatus, FlowStatusEnum.PASS.getKey())

+ 7 - 9
sd-business/src/main/java/com/sd/business/mapper/order/OrderSalesShipmentStatisticsMapper.java

@@ -1,10 +1,8 @@
 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 com.sd.business.entity.board.bo.OrderSalesShipmentStatisticsBo;
+import com.sd.business.entity.order.po.OrderSku;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -17,19 +15,19 @@ import java.util.List;
  * @author
  * @since 2023-10-20
  */
-public interface OrderSalesShipmentStatisticsMapper extends BaseMapper<OrderSalesShipmentStatistics> {
+public interface OrderSalesShipmentStatisticsMapper {
 
     /**
-     * 查询订单销售出库bom总数
+     * 查询近90、60、30天的订单销售出库bom总数
      * @param wrapper
      * @return
      */
-    List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSalesShipmentStatistics> wrapper);
+    List<OrderSalesShipmentStatisticsBo> getOrderSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSku> wrapper);
 
     /**
-     * 查询近90、60、30天的订单销售出库bom总数
+     * 查询bom的周转率
      * @param wrapper
      * @return
      */
-    List<TurnoverRateSalesShipmentStatisticsBo> getTurnoverRateSalesShipmentStatisticsList(@Param("ew") IWrapper<OrderSalesShipmentStatistics> wrapper);
+    List<OrderSalesShipmentStatisticsBo> getTurnoverRateMapByBomSpecIds(@Param("ew") IWrapper<OrderSku> wrapper);
 }

+ 0 - 23
sd-business/src/main/java/com/sd/business/scheduled/OrderSalesShipmentStatisticsTask.java

@@ -1,23 +0,0 @@
-package com.sd.business.scheduled;
-
-import com.sd.business.service.order.OrderSalesShipmentStatisticsService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Profile;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-@Profile({"test", "prod"})
-@Component
-public class OrderSalesShipmentStatisticsTask {
-
-    @Autowired
-    private OrderSalesShipmentStatisticsService orderSalesShipmentStatisticsService;
-
-    /**
-     * 每天统计前一天的销售出库数量
-     */
-    @Scheduled(cron = "0 0 0 * * ?")
-    public void orderSalesShipmentStatistics() {
-        orderSalesShipmentStatisticsService.salesShipmentStatistics();
-    }
-}

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

@@ -1,9 +1,12 @@
 package com.sd.business.service.board;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.board.dto.DailyBoardSelectDto;
 import com.sd.business.entity.board.dto.SalesBoardSelectDto;
 import com.sd.business.entity.board.vo.*;
 
+import java.util.List;
+
 /**
  * <p>
  * 销售看板 服务类
@@ -55,4 +58,10 @@ public interface SalesBoardService {
      * @return
      */
     Page<SkuSalesGrowthRateRankingVo> getSkuSalesGrowthRateRankingPage(SalesBoardSelectDto dto);
+
+    /**
+     * 各事业部bom销量统计列表
+     * @return
+     */
+    List<DepartmentBomSalesBoardVo> getDepartmentBomSalesStatisticsList(DailyBoardSelectDto dto);
 }

+ 123 - 1
sd-business/src/main/java/com/sd/business/service/board/impl/SalesBoardServiceImpl.java

@@ -1,20 +1,38 @@
 package com.sd.business.service.board.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.dto.DailyBoardSelectDto;
 import com.sd.business.entity.board.dto.SalesBoardSelectDto;
 import com.sd.business.entity.board.vo.*;
+import com.sd.business.entity.bom.bo.BomSpecBo;
 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.po.Department;
+import com.sd.business.entity.order.enums.OrderClassifyEnum;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.mapper.board.SalesBoardMapper;
 import com.sd.business.service.board.SalesBoardService;
+import com.sd.business.service.department.DepartmentService;
+import com.sd.business.service.order.OrderService;
+import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.sku.SkuSpecService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Objects;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static java.util.Comparator.comparing;
 
 /**
  * <p>
@@ -30,6 +48,18 @@ public class SalesBoardServiceImpl implements SalesBoardService {
     @Resource
     private SalesBoardMapper salesBoardMapper;
 
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private DepartmentService departmentService;
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
     @Override
     public Page<SkuSalesRankingVo> getSkuSalesRankingPage(SalesBoardSelectDto dto) {
         IWrapper<SkuSalesRankingVo> wrapper = IWrapper.getWrapper();
@@ -140,4 +170,96 @@ public class SalesBoardServiceImpl implements SalesBoardService {
         });
         return page;
     }
+
+    @Override
+    public List<DepartmentBomSalesBoardVo> getDepartmentBomSalesStatisticsList(DailyBoardSelectDto dto) {
+        List<OrderInfo> orderList = orderService.list(q -> q
+                .ne(OrderInfo::getClassify, OrderClassifyEnum.OUTSOURCE_ORDER.getKey())
+                .between(OrderInfo::getShippingTime, DateUtil.beginOfDay(dto.getBeginDate()), DateUtil.endOfDay(dto.getEndDate()))
+                .select(BaseIdPo::getId, OrderInfo::getDepartmentId));
+
+        if (orderList.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<Long> orderIds = orderList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        Map<Long, List<OrderInfo>> orderMap = orderList.stream().collect(Collectors.groupingBy(OrderInfo::getDepartmentId));
+        // 获取事业部
+        Map<Long, String> departmentMap = departmentService.mapKV(BaseIdPo::getId, Department::getName, q -> q.in(BaseIdPo::getId, orderMap.keySet()));
+
+        // 获取订单sku列表
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q
+                .in(OrderSku::getOrderId, orderIds)
+                .select(OrderSku::getOrderId, OrderSku::getBomSpecId, OrderSku::getQuantity));
+        Map<Long, List<OrderSku>> orderSkuMap = orderSkuList.stream().collect(Collectors.groupingBy(OrderSku::getOrderId));
+
+        // 获取bom列表
+        Set<Long> bomSpecIds = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toSet());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+
+        List<DepartmentBomSalesBoardVo> list = new ArrayList<>();
+
+        orderMap.forEach((departmentId, orderInfoList) -> {
+            DepartmentBomSalesBoardVo bomSalesBoardVo = new DepartmentBomSalesBoardVo();
+            bomSalesBoardVo.setDepartmentName(departmentMap.get(departmentId));
+            bomSalesBoardVo.setOrderSalesCount(orderInfoList.size());
+
+            // 获取订单bom销售列表
+            Map<Long, DailyBoardOutStorageBomVo> bomSpecSalesMap = orderInfoList.stream()
+                    .map(item -> orderSkuMap.getOrDefault(item.getId(), Collections.emptyList()))
+                    .flatMap(Collection::stream)
+                    .filter(item -> {
+                        BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+                        if (bomSpecBo == null) {
+                            return false;
+                        }
+                        return Objects.equals(bomSpecBo.getClassifyParentId(), 1L);
+                    })
+                    .collect(Collectors.toMap(
+                            OrderSku::getBomSpecId,
+                            item -> {
+                                DailyBoardOutStorageBomVo bomVo = new DailyBoardOutStorageBomVo();
+                                bomVo.setQuantity(item.getQuantity());
+                                BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+                                bomVo.setBomSpecId(bomSpecBo.getBomSpecId());
+                                bomVo.setBomSpecName(bomSpecBo.getBomSpecName());
+                                bomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+                                return bomVo;
+                            },
+                            (v1, v2) -> {
+                                v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                return v1;
+                            })
+                    );
+
+            bomSalesBoardVo.setBomSpecSalesList(new ArrayList<>(bomSpecSalesMap.values()));
+            BigDecimal bomSpecSalesCount = bomSalesBoardVo.getBomSpecSalesList().stream().map(DailyBoardOutStorageBomVo::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+            bomSalesBoardVo.setBomSpecSalesCount(bomSpecSalesCount);
+            list.add(bomSalesBoardVo);
+        });
+
+        list.sort(comparing(DepartmentBomSalesBoardVo::getBomSpecSalesCount).reversed());
+
+        // 将所有事业部的bom合并,获取所有bom销售列表
+        Map<Long, DailyBoardOutStorageBomVo> sumBomMap = list.stream()
+                .map(DepartmentBomSalesBoardVo::getBomSpecSalesList)
+                .flatMap(Collection::stream)
+                .collect(Collectors.toMap(
+                        DailyBoardOutStorageBomVo::getBomSpecId,
+                        Function.identity(),
+                        (v1, v2) -> {
+                            DailyBoardOutStorageBomVo tempVo = BeanUtil.copyProperties(v1, DailyBoardOutStorageBomVo.class);
+                            tempVo.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                            return tempVo;
+                        }));
+
+        DepartmentBomSalesBoardVo sumBomVo = new DepartmentBomSalesBoardVo();
+        sumBomVo.setDepartmentName("");
+        sumBomVo.setOrderSalesCount(orderList.size());
+        sumBomVo.setBomSpecSalesList(new ArrayList<>(sumBomMap.values()));
+        BigDecimal sumBomSpecSalesCount = sumBomVo.getBomSpecSalesList().stream().map(DailyBoardOutStorageBomVo::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+        sumBomVo.setBomSpecSalesCount(sumBomSpecSalesCount);
+        list.add(0, sumBomVo);
+        return list;
+    }
 }

+ 5 - 9
sd-business/src/main/java/com/sd/business/service/bom/impl/BomSpecServiceImpl.java

@@ -25,10 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -94,14 +91,13 @@ public class BomSpecServiceImpl extends ServiceImpl<BomSpecMapper, BomSpec> impl
     @Override
     public List<BomSpecBoardSelectVo> getBoardList() {
         List<BomSpec> list = this.list(q -> q.eq(BomSpec::getIsShowBoard, StatusConstant.YES).orderByAsc(BomSpec::getSort));
+        if (list.isEmpty()) {
+            return Collections.emptyList();
+        }
         List<Long> bomSpecIds = list.stream().map(BaseIdPo::getId).collect(Collectors.toList());
         // 查询半成品和包材库存
-        List<Long> warehouseIds = new ArrayList<>();
-        warehouseIds.add(WarehouseConstant.SEMI_FINISHED_PRODUCT);
-        warehouseIds.add(WarehouseConstant.PACKAGING_MATERIAL);
-
         Map<Long, Inventory> inventoryMap = inventoryService.mapKEntity(Inventory::getBomSpecId, q -> q.eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS)
-                .in(Inventory::getWarehouseId, warehouseIds)
+                .in(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT, WarehouseConstant.PACKAGING_MATERIAL)
                 .in(Inventory::getBomSpecId, bomSpecIds));
         List<BomSpecBoardSelectVo> boardSelectList = BeanUtil.copyToList(list, BomSpecBoardSelectVo.class);
         List<BomSpecBoardSelectVo> collect = boardSelectList.stream().peek(item -> {

+ 5 - 12
sd-business/src/main/java/com/sd/business/service/order/OrderSalesShipmentStatisticsService.java

@@ -1,11 +1,8 @@
 package com.sd.business.service.order;
 
-import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.board.bo.OrderSalesShipmentStatisticsBo;
 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;
@@ -19,14 +16,15 @@ import java.util.Map;
  * @author
  * @since 2023-10-20
  */
-public interface OrderSalesShipmentStatisticsService extends BaseService<OrderSalesShipmentStatistics> {
+public interface OrderSalesShipmentStatisticsService {
 
     /**
      * 根据时间段获取销售出库数量统计
-     * @param dto
+     *
+     * @param bomSpecIds
      * @return
      */
-    List<OrderSalesShipmentStatisticsVo> getSalesShipmentStatisticsByDate(OrderSalesShipmentStatisticsDto dto);
+    Map<Long, OrderSalesShipmentStatisticsBo> getSalesShipmentStatisticsByDate(List<Long> bomSpecIds);
 
     /**
      * 获取周转率数据列表
@@ -36,11 +34,6 @@ public interface OrderSalesShipmentStatisticsService extends BaseService<OrderSa
     List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(TurnoverRateBoardSelectDto dto);
 
     /**
-     * 销售出库统计任务
-     */
-    void salesShipmentStatistics();
-
-    /**
      * 获取周转率数据列表
      *
      * @return

+ 0 - 8
sd-business/src/main/java/com/sd/business/service/order/OrderService.java

@@ -115,14 +115,6 @@ public interface OrderService extends BaseService<OrderInfo> {
     String getOrderWlnCodeStr(OrderSelectDto dto);
 
     /**
-     * 订单是否存在包材
-     *
-     * @param orderId
-     * @return
-     */
-    Boolean isExistOrderSkuBom(Long orderId);
-
-    /**
      * 获取订单送货单号
      * @return
      */

+ 56 - 181
sd-business/src/main/java/com/sd/business/service/order/impl/OrderSalesShipmentStatisticsServiceImpl.java

@@ -2,35 +2,29 @@ package com.sd.business.service.order.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.tenant.entity.dict.po.DictCommonData;
 import com.fjhx.tenant.service.dict.DictCommonDataService;
-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.bo.OrderSalesShipmentStatisticsBo;
 import com.sd.business.entity.board.dto.TurnoverRateBoardSelectDto;
 import com.sd.business.entity.board.vo.TurnoverRateStatisticsVo;
 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.inventory.po.Inventory;
 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;
-import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
 import com.sd.business.entity.order.po.OrderSku;
-import com.sd.business.entity.order.vo.OrderSalesShipmentStatisticsVo;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.order.OrderSalesShipmentStatisticsMapper;
 import com.sd.business.service.inventory.InventoryBackupService;
+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.order.OrderSkuService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -48,46 +42,43 @@ import static java.util.Comparator.comparing;
  * @since 2023-10-20
  */
 @Service
-public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSalesShipmentStatisticsMapper, OrderSalesShipmentStatistics> implements OrderSalesShipmentStatisticsService {
+public class OrderSalesShipmentStatisticsServiceImpl implements OrderSalesShipmentStatisticsService {
 
-    @Autowired
-    private OrderService orderService;
+    @Resource
+    private OrderSalesShipmentStatisticsMapper orderSalesShipmentStatisticsMapper;
 
     @Autowired
-    private OrderSkuService orderSkuService;
+    private InventoryBackupService inventoryBackupService;
 
     @Autowired
-    private InventoryBackupService inventoryBackupService;
+    private InventoryService inventoryService;
 
     @Autowired
     private DictCommonDataService dictCommonDataService;
 
     @Override
-    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 (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");
-        return this.baseMapper.getSalesShipmentStatisticsList(wrapper);
+    public Map<Long, OrderSalesShipmentStatisticsBo> getSalesShipmentStatisticsByDate(List<Long> bomSpecIds) {
+        Date date = new Date();
+        Date startDate = DateUtil.offsetDay(date, -90);
+        IWrapper<OrderSku> wrapper = IWrapper.getWrapper();
+        wrapper.orderByDesc("os", OrderSku::getId);
+        wrapper.between("oi", OrderInfo::getShippingTime, startDate, date);
+        wrapper.groupBy("bs.id");
+        List<OrderSalesShipmentStatisticsBo> list = orderSalesShipmentStatisticsMapper.getOrderSalesShipmentStatisticsList(wrapper);
+        return list.stream().collect(Collectors.toMap(OrderSalesShipmentStatisticsBo::getBomSpecId, Function.identity()));
     }
 
     @Override
     public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(TurnoverRateBoardSelectDto dto) {
         Date date = new Date();
-        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);
+        String ninetyDaysDate = DateUtil.formatDateTime(DateUtil.offsetDay(date, -90));
+        String sixtyDaysDate = DateUtil.formatDateTime(DateUtil.offsetDay(date, -60));
+        String thirtyDaysDate = DateUtil.formatDateTime(DateUtil.offsetDay(date, -30));
+
+        IWrapper<OrderSku> wrapper = IWrapper.getWrapper();
+        wrapper.orderByDesc("os", OrderSku::getId);
+        wrapper.eq("oi", OrderInfo::getDepartmentId, dto.getDepartmentId());
+        wrapper.between("oi", OrderInfo::getShippingTime, ninetyDaysDate, date);
         if (Objects.equals(dto.getBomClassify(), 1)) {
             wrapper.eq("bc", BomClassify::getCode, "201.G");
         } else if (Objects.equals(dto.getBomClassify(), 2)){
@@ -100,12 +91,12 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
         wrapper.like("bs", BomSpec::getWidth, dto.getWidth());
         wrapper.like("bs", BomSpec::getHeight, dto.getHeight());
         wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
-        wrapper.groupBy("osss.bom_spec_id");
-        List<TurnoverRateSalesShipmentStatisticsBo> statisticsVoList = this.baseMapper.getTurnoverRateSalesShipmentStatisticsList(wrapper);
+        wrapper.groupBy("bs.id");
+        List<OrderSalesShipmentStatisticsBo> statisticsVoList = orderSalesShipmentStatisticsMapper.getOrderSalesShipmentStatisticsList(wrapper);
         if (ObjectUtil.isEmpty(statisticsVoList)) {
             return Collections.emptyList();
         }
-        List<Long> bomSpecIds = statisticsVoList.stream().map(TurnoverRateSalesShipmentStatisticsBo::getBomSpecId).collect(Collectors.toList());
+        List<Long> bomSpecIds = statisticsVoList.stream().map(OrderSalesShipmentStatisticsBo::getBomSpecId).collect(Collectors.toList());
 
         Map<String, String> bomChromatophoreMap = dictCommonDataService.list(q -> q.eq(DictCommonData::getDictCode, "bom_chromatophore"))
                 .stream().collect(Collectors.toMap(DictCommonData::getDictKey, DictCommonData::getDictValue));
@@ -125,11 +116,10 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                                 Collectors.toMap(InventoryBackup::getBomSpecId, Function.identity())));
 
         // 期末库存数据
-        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));
+        Map<Long, Inventory> endBackupMap = inventoryService.mapKEntity(Inventory::getBomSpecId, q -> q
+                .eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS)
+                .eq(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
+                .in(Inventory::getBomSpecId, bomSpecIds));
 
         List<TurnoverRateStatisticsVo> list = statisticsVoList.stream().map(item -> {
             Long bomSpecId = item.getBomSpecId();
@@ -140,44 +130,34 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
             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);
+            Inventory endBackup = endBackupMap.get(bomSpecId);
             // 计算bom近90、60、30天的期初库存数量
-            BigDecimal beginQuantityNinetyDays;
-            BigDecimal beginQuantitySixtyDays;
-            BigDecimal beginQuantityThirtyDays;
-            BigDecimal endQuantity;
-            if (beginBackupNinetyDays == null) {
-                beginQuantityNinetyDays = BigDecimal.ZERO;
-            } else {
+            BigDecimal beginQuantityNinetyDays = BigDecimal.ZERO;
+            BigDecimal beginQuantitySixtyDays = BigDecimal.ZERO;
+            BigDecimal beginQuantityThirtyDays = BigDecimal.ZERO;
+            BigDecimal endQuantity = BigDecimal.ZERO;
+            if (beginBackupNinetyDays != null) {
                 beginQuantityNinetyDays = beginBackupNinetyDays.getQuantity()
                         .add(beginBackupNinetyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupNinetyDays.getLockQuantity());
             }
-            if (beginBackupSixtyDays == null) {
-                beginQuantitySixtyDays = BigDecimal.ZERO;
-            } else {
+            if (beginBackupSixtyDays != null) {
                 beginQuantitySixtyDays = beginBackupSixtyDays.getQuantity()
                         .add(beginBackupSixtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupSixtyDays.getLockQuantity());
             }
-            if (beginBackupThirtyDays == null) {
-                beginQuantityThirtyDays = BigDecimal.ZERO;
-            } else {
+            if (beginBackupThirtyDays != null) {
                 beginQuantityThirtyDays = beginBackupThirtyDays.getQuantity()
                         .add(beginBackupThirtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupThirtyDays.getLockQuantity());
             }
-            if (endBackup == null) {
-                endQuantity = BigDecimal.ZERO;
-            } else {
+            if (endBackup != null) {
                 endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
             }
             // 时间段天数
             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 {
+            BigDecimal turnoverRateNinetyDays = BigDecimal.ZERO;
+            BigDecimal turnoverRateSixtyDays = BigDecimal.ZERO;
+            BigDecimal turnoverRateThirtyDays = BigDecimal.ZERO;
+            if (ObjectUtil.notEqual(item.getNinetyDaysSalesQuantity(), BigDecimal.ZERO)
+                    && ObjectUtil.notEqual(beginQuantityNinetyDays.add(endQuantity), BigDecimal.ZERO)) {
                 days = new BigDecimal(90);
                 turnoverRateNinetyDays = days
                         .divide(days.multiply(new BigDecimal("0.5"))
@@ -185,10 +165,8 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                                         .divide(item.getNinetyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
                                 4, RoundingMode.HALF_UP);
             }
-            if (ObjectUtil.equals(item.getSixtyDaysSalesQuantity(), BigDecimal.ZERO)
-                    || ObjectUtil.equals(beginQuantitySixtyDays.add(endQuantity), BigDecimal.ZERO)) {
-                turnoverRateSixtyDays = BigDecimal.ZERO;
-            } else {
+            if (ObjectUtil.notEqual(item.getSixtyDaysSalesQuantity(), BigDecimal.ZERO)
+                    && ObjectUtil.notEqual(beginQuantitySixtyDays.add(endQuantity), BigDecimal.ZERO)) {
                 days = new BigDecimal(60);
                 turnoverRateSixtyDays = days
                         .divide(days.multiply(new BigDecimal("0.5"))
@@ -196,10 +174,8 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
                                         .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 {
+            if (ObjectUtil.notEqual(item.getThirtyDaysSalesQuantity(), BigDecimal.ZERO)
+                    && ObjectUtil.notEqual(beginQuantityThirtyDays.add(endQuantity), BigDecimal.ZERO)) {
                 days = new BigDecimal(30);
                 turnoverRateThirtyDays = days
                         .divide(days.multiply(new BigDecimal("0.5"))
@@ -229,112 +205,11 @@ public class OrderSalesShipmentStatisticsServiceImpl extends ServiceImpl<OrderSa
     }
 
     @Override
-    public void salesShipmentStatistics() {
-        Date date = new Date();
-        List<OrderSalesShipmentStatistics> salesShipmentStatisticsList = new ArrayList<>();
-        // 统计近7天数据
-        for (int i = 7; i >= 1; i--) {
-            Date offsetDay = DateUtil.offsetDay(date, -i);
-            String formatDate = DateUtil.formatDate(offsetDay);
-            List<OrderInfo> list = orderService.list(q -> q
-                    .eq(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey())
-                    .ne(OrderInfo::getClassify, OrderClassifyEnum.OUTSOURCE_ORDER.getKey())
-                    .likeRight(OrderInfo::getShippingTime, formatDate)
-                    .select(BaseIdPo::getId));
-            if (list.isEmpty()) {
-                return;
-            }
-            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));
-            Map<Long, BigDecimal> map = orderSkuList.stream().collect(Collectors.toMap(OrderSku::getBomSpecId, OrderSku::getQuantity, BigDecimal::add));
-            List<OrderSalesShipmentStatistics> statisticsDtoList = map.keySet().stream().map(item -> {
-                OrderSalesShipmentStatistics statistics = statisticsMap.get(item);
-                if (statistics == null) {
-                    statistics = new OrderSalesShipmentStatistics();
-                }
-                statistics.setTotalDate(offsetDay);
-                statistics.setBomSpecId(item);
-                statistics.setQuantity(map.get(item));
-                return statistics;
-            }).collect(Collectors.toList());
-            salesShipmentStatisticsList.addAll(statisticsDtoList);
-        }
-        if (salesShipmentStatisticsList.isEmpty()) {
-            return;
-        }
-        this.saveOrUpdateBatch(salesShipmentStatisticsList);
-    }
-
-    @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;
+        IWrapper<OrderSku> wrapper = IWrapper.getWrapper();
+        wrapper.in("oq.bom_spec_id", bomSpecIds);
+        wrapper.groupBy("oq.bom_spec_id");
+        List<OrderSalesShipmentStatisticsBo> list = orderSalesShipmentStatisticsMapper.getTurnoverRateMapByBomSpecIds(wrapper);
+        return list.stream().collect(Collectors.toMap(OrderSalesShipmentStatisticsBo::getBomSpecId, OrderSalesShipmentStatisticsBo::getTurnoverRate));
     }
 }

+ 0 - 17
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -1094,23 +1094,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
     }
 
     @Override
-    public Boolean isExistOrderSkuBom(Long orderId) {
-        OrderInfo orderInfo = this.getById(orderId);
-        if (!ObjectUtil.equals(orderInfo.getType(), 2)) {
-            return true;
-        }
-        boolean flag = false;
-        List<OrderSku> list = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, orderInfo.getId()));
-        for (OrderSku orderSku : list) {
-            long count = orderSkuBomService.count(q -> q.eq(OrderSkuBom::getOrderSkuId, orderSku.getId()));
-            if (count != 0) {
-                flag = true;
-            }
-        }
-        return flag;
-    }
-
-    @Override
     public String getOrderDeliveryCode() {
         return CodeEnum.SH_CODE.getCode();
     }

+ 10 - 25
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java

@@ -1,24 +1,18 @@
 package com.sd.business.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.constant.StatusConstant;
-import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.bo.OrderSalesShipmentStatisticsBo;
 import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
-import com.sd.business.entity.bom.dto.BomSpecSelectDto;
 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.bom.vo.BomSpecVo;
 import com.sd.business.entity.department.constant.DepartmentConstant;
 import com.sd.business.entity.inventory.po.Inventory;
-import com.sd.business.entity.order.po.OrderSalesShipmentStatistics;
 import com.sd.business.entity.purchase.dto.PurchaseBoardSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomDetailsSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
@@ -154,28 +148,19 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
                 .eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS));
 
         // 获取30天,60天销售数据
-        Date date = new Date();
-        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");
-
-        Map<Long, List<OrderSalesShipmentStatistics>> sixtyDaysMap = orderSalesShipmentStatisticsService.mapKGroup(OrderSalesShipmentStatistics::getBomSpecId,
-                q -> q.between(OrderSalesShipmentStatistics::getTotalDate, sixtyDaysDate, endDate)
-                        .in(OrderSalesShipmentStatistics::getBomSpecId, bomSpecIds));
-        Map<Long, List<OrderSalesShipmentStatistics>> thirtyDaysMap = orderSalesShipmentStatisticsService.mapKGroup(OrderSalesShipmentStatistics::getBomSpecId,
-                q -> q.between(OrderSalesShipmentStatistics::getTotalDate, thirtyDaysDate, endDate)
-                        .in(OrderSalesShipmentStatistics::getBomSpecId, bomSpecIds));
+        Map<Long, OrderSalesShipmentStatisticsBo> orderSalesShipmentStatisticsBoMap = orderSalesShipmentStatisticsService.getSalesShipmentStatisticsByDate(bomSpecIds);
 
         for (PurchaseInTransitBomVo record : records) {
+            record.setSalesQuantitySixtyDays(BigDecimal.ZERO);
+            record.setSalesQuantityThirtyDays(BigDecimal.ZERO);
             Long bomSpecId = record.getBomSpecId();
-            List<OrderSalesShipmentStatistics> sixtyDaysList = sixtyDaysMap.getOrDefault(bomSpecId, Collections.emptyList());
-            List<OrderSalesShipmentStatistics> thirtyDaysList = thirtyDaysMap.getOrDefault(bomSpecId, Collections.emptyList());
-            BigDecimal salesQuantitySixtyDays = sixtyDaysList.stream().map(OrderSalesShipmentStatistics::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
-            BigDecimal salesQuantityThirtyDays = thirtyDaysList.stream().map(OrderSalesShipmentStatistics::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
-            record.setSalesQuantitySixtyDays(salesQuantitySixtyDays);
-            record.setSalesQuantityThirtyDays(salesQuantityThirtyDays);
+            OrderSalesShipmentStatisticsBo statisticsBo = orderSalesShipmentStatisticsBoMap.get(bomSpecId);
+            if (statisticsBo != null) {
+                record.setSalesQuantitySixtyDays(statisticsBo.getSixtyDaysSalesQuantity());
+                record.setSalesQuantityThirtyDays(statisticsBo.getThirtyDaysSalesQuantity());
+            }
 
-            Inventory inventory = inventoryMap.get(record.getBomSpecId());
+            Inventory inventory = inventoryMap.get(bomSpecId);
             if (inventory == null) {
                 record.setInventoryQuantity(BigDecimal.ZERO);
                 continue;

+ 13 - 4
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java

@@ -15,6 +15,7 @@ import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.sd.business.entity.bom.bo.BomSpecBo;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.in.po.InOutStorageBom;
 import com.sd.business.entity.purchase.dto.*;
@@ -29,6 +30,7 @@ import com.sd.business.service.apply.ApplyBuyBomService;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.purchase.PurchaseBomService;
 import com.sd.business.service.purchase.PurchaseService;
+import com.sd.business.service.sku.SkuSpecService;
 import com.sd.business.service.supplier.SupplierService;
 import com.sd.business.util.CodeEnum;
 import com.sd.framework.util.Assert;
@@ -59,6 +61,9 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     private BomSpecService bomSpecService;
 
     @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
     private ApplyBuyBomService applyBuyBomService;
 
     @Autowired
@@ -337,6 +342,8 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
 
         List<String> bomSpecCodes = list.stream().map(PurchaseBomImportDataDto::getBomSpecCode).collect(Collectors.toList());
         Map<String, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BomSpec::getCode, q -> q.in(BomSpec::getCode, bomSpecCodes));
+        List<Long> bomSpecIds = bomSpecMap.values().stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
 
         List<Purchase> purchaseList = new ArrayList<>();
         List<PurchaseBom> purchaseBomList = new ArrayList<>();
@@ -401,10 +408,12 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
                         .multiply(purchaseBom.getPurchaseQuantity());
                 purchase.setTotalAmountExcludingTax(purchase.getTotalAmountExcludingTax().add(totalAmountIncludingTax));
 
-                // 保存最新的合同价格
-                bomSpec.setCostPrice(purchaseBom.getUnitPrice());
-                bomSpec.setInternalSellingPrice(purchaseBom.getUnitPrice());
-                bomSpecList.add(bomSpec);
+                // 主材保存最新的合同价格
+                if (Objects.equals(bomSpecBoMap.get(bomSpec.getId()).getClassifyParentId(), 1L)) {
+                    bomSpec.setCostPrice(purchaseBom.getUnitPrice());
+                    bomSpec.setInternalSellingPrice(purchaseBom.getUnitPrice());
+                    bomSpecList.add(bomSpec);
+                }
 
                 return purchaseBom;
             }).collect(Collectors.toList());

+ 39 - 23
sd-business/src/main/resources/mapper/order/OrderSalesShipmentStatisticsMapper.xml

@@ -2,36 +2,52 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sd.business.mapper.order.OrderSalesShipmentStatisticsMapper">
 
-    <select id="getSalesShipmentStatisticsList" resultType="com.sd.business.entity.order.vo.OrderSalesShipmentStatisticsVo">
+    <select id="getOrderSalesShipmentStatisticsList" resultType="com.sd.business.entity.board.bo.OrderSalesShipmentStatisticsBo">
         select
-            osss.bom_spec_id,
-            bs.code bomSpecCode,
-            bs.name bomSpecName,
-            sum(osss.quantity) quantity
-        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>
-    <select id="getTurnoverRateSalesShipmentStatisticsList"
-            resultType="com.sd.business.entity.board.bo.TurnoverRateSalesShipmentStatisticsBo">
-        select
-            osss.bom_spec_id,
+            os.bom_spec_id,
             bs.code bomSpecCode,
             bs.name bomSpecName,
             bs.width,
             bs.height,
             b.chromatophore,
-            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
+            sum(case when oi.shipping_time >= date_sub(now(), interval 90 day) then os.quantity else 0 end) ninetyDaysSalesQuantity,
+            sum(case when oi.shipping_time >= date_sub(now(), interval 60 day) then os.quantity else 0 end) sixtyDaysSalesQuantity,
+            sum(case when oi.shipping_time >= date_sub(now(), interval 30 day) then os.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
+            order_info oi
+                inner join order_sku os on oi.id = os.order_id
+                inner join bom_spec bs on os.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
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getTurnoverRateMapByBomSpecIds" resultType="com.sd.business.entity.board.bo.OrderSalesShipmentStatisticsBo">
+        select
+            oq.bom_spec_id,
+            ifnull(90 / (90 * 0.5 *
+                  (ifnull(ib.quantity, 0)
+                      +
+                  ifnull(ib.lock_quantity, 0)
+                      +
+                  ifnull(i.quantity, 0)
+                      +
+                  ifnull(i.lock_quantity, 0)) / oq.quantity), 0) turnover_rate
+        from (
+             select
+                 os.bom_spec_id,
+                 sum(os.quantity) quantity
+             FROM
+                 order_info oi
+                     inner join order_sku  os on oi.id = os.order_id
+             where oi.shipping_time >= date_sub(now(), INTERVAL 90 day)
+             group by os.bom_spec_id
+        ) oq
+            left join inventory_backup ib on oq.bom_spec_id = ib.bom_spec_id
+                and backup_date = date(date_sub(now(), INTERVAL 90 day))
+                and ib.department_id = 0 and ib.warehouse_id = 1684037244354052098
+            left join inventory i on oq.bom_spec_id = i.bom_spec_id
+                and i.department_id = 0 and i.warehouse_id = 1684037244354052098
             ${ew.customSqlSegment}
     </select>
 </mapper>

+ 38 - 18
sd-business/src/main/resources/mapper/purchase/PurchaseBomMapper.xml

@@ -85,7 +85,7 @@
             p.erp_code purchaseErpCode,
             s.name supplierName,
             pb.purchase_quantity,
-            (pb.purchase_quantity - pb.arrival_quantity) inTransitQuantity,
+            pb.purchase_quantity - pb.arrival_quantity + pb.return_quantity inTransitQuantity,
             p.delivery_date,
             ifnull(btr.turnover_rate, 0) turnoverRate,
             ifnull(btr.quantity, 0) salesQuantity
@@ -99,20 +99,30 @@
             left join (
                 select
                     oq.bom_spec_id,
-                    90 / (90 * 0.5 * (sum(ifnull(ib.quantity, 0) + ifnull(ib.lock_quantity, 0))) / oq.quantity) turnover_rate,
+                    90 / (90 * 0.5 *
+                          (ifnull(ib.quantity, 0)
+                               +
+                          ifnull(ib.lock_quantity, 0)
+                               +
+                          ifnull(i.quantity, 0)
+                               +
+                          ifnull(i.lock_quantity, 0)) / oq.quantity) turnover_rate,
                     oq.quantity
                 from (
                      select
-                         osss.bom_spec_id,
-                         sum(osss.quantity) quantity
+                         os.bom_spec_id,
+                         sum(os.quantity) quantity
                      FROM
-                         order_sales_shipment_statistics osss
-                     where total_date >= date(date_sub(now(), INTERVAL 91 day))
-                     group by osss.bom_spec_id
+                         order_info oi
+                         inner join order_sku  os on oi.id = os.order_id
+                         where oi.shipping_time >= date_sub(now(), INTERVAL 90 day)
+                    group by os.bom_spec_id
                 ) oq
                 left join inventory_backup ib on oq.bom_spec_id = ib.bom_spec_id
-                    and backup_date in (date(date_sub(now(), INTERVAL 91 day)), date(date_sub(now(), INTERVAL 1 day)))
-                    and department_id = 0 and warehouse_id = 1684037244354052098
+                    and backup_date = date(date_sub(now(), INTERVAL 90 day))
+                    and ib.department_id = 0 and ib.warehouse_id = 1684037244354052098
+                left join inventory i on oq.bom_spec_id = i.bom_spec_id
+                    and i.department_id = 0 and i.warehouse_id = 1684037244354052098
                 group by oq.bom_spec_id
             ) btr on bs.id = btr.bom_spec_id
             ${ew.customSqlSegment}
@@ -203,19 +213,29 @@
             left join (
                 select
                     oq.bom_spec_id,
-                    90 / (90 * 0.5 * (sum(IFNULL(ib.quantity, 0) + IFNULL(ib.lock_quantity, 0))) / oq.quantity) turnover_rate
+                    90 / (90 * 0.5 *
+                          (ifnull(ib.quantity, 0)
+                              +
+                          ifnull(ib.lock_quantity, 0)
+                              +
+                          ifnull(i.quantity, 0)
+                              +
+                          ifnull(i.lock_quantity, 0)) / oq.quantity) turnover_rate
                 from (
                     select
-                        osss.bom_spec_id,
-                        sum(osss.quantity) quantity
+                        os.bom_spec_id,
+                        sum(os.quantity) quantity
                     FROM
-                        order_sales_shipment_statistics osss
-                    where total_date >= date(date_sub(now(), INTERVAL 91 day))
-                    group by osss.bom_spec_id
+                        order_info oi
+                        inner join order_sku  os on oi.id = os.order_id
+                    where oi.shipping_time >= date_sub(now(), INTERVAL 90 day)
+                    group by os.bom_spec_id
                 ) oq
-                    left join inventory_backup ib on oq.bom_spec_id = ib.bom_spec_id
-                             and backup_date in (date(date_sub(now(), INTERVAL 91 day)), date(date_sub(now(), INTERVAL 1 day)))
-                             and department_id = 0 and warehouse_id in (1684037244354052098, 1684037201379213314)
+                left join inventory_backup ib on oq.bom_spec_id = ib.bom_spec_id
+                    and backup_date = date(date_sub(now(), INTERVAL 90 day))
+                    and ib.department_id = 0 and ib.warehouse_id = 1684037244354052098
+                left join inventory i on oq.bom_spec_id = i.bom_spec_id
+                    and i.department_id = 0 and i.warehouse_id = 1684037244354052098
                 group by oq.bom_spec_id
             ) btr on bs.id = btr.bom_spec_id
             ${ew.customSqlSegment}