Ver Fonte

物料采购看板查询调整

fgd há 1 ano atrás
pai
commit
7ea37a4df7

+ 30 - 0
sd-business/src/main/java/com/sd/business/entity/bom/bo/BomSpecOrderConsumptionBo.java

@@ -0,0 +1,30 @@
+package com.sd.business.entity.bom.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * bom订单消耗量
+ */
+@Getter
+@Setter
+public class BomSpecOrderConsumptionBo {
+
+    /**
+     * 订单消耗日期
+     */
+    private Date consumptionDate;
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+}

+ 9 - 9
sd-business/src/main/java/com/sd/business/entity/check/dto/CheckImportDataDto.java

@@ -22,28 +22,28 @@ public class CheckImportDataDto {
      * 仓库名称
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "仓库", index = 0)
+    @ExcelProperty(value = "仓库")
     private String warehouseName;
 
     /**
      * 品名
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "品名", index = 1)
+    @ExcelProperty(value = "品名")
     private String bomSpecName;
 
     /**
      * 品号
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "品号", index = 2)
+    @ExcelProperty(value = "品号")
     private String bomSpecCode;
 
     /**
      * 结存单价
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "结存单价", index = 3)
+    @ExcelProperty(value = "结存单价")
     private BigDecimal balanceUnitPrice;
 
 
@@ -51,34 +51,34 @@ public class CheckImportDataDto {
      * 数量
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "可用库存", index = 4)
+    @ExcelProperty(value = "可用库存")
     private BigDecimal quantity;
 
     /**
      * 锁定库存
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "锁定库存", index = 5)
+    @ExcelProperty(value = "锁定库存")
     private BigDecimal lockQuantity;
 
     /**
      * 结存总价
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "结存总价", index = 6)
+    @ExcelProperty(value = "结存总价")
     private BigDecimal totalPrice;
 
     /**
      * 总库存
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "总库存", index = 7)
+    @ExcelProperty(value = "总库存")
     private BigDecimal totalQuantity;
 
     /**
      * 实际库存
      */
     @ColumnWidth(15)
-    @ExcelProperty(value = "实际库存", index = 8)
+    @ExcelProperty(value = "实际库存")
     private BigDecimal realityQuantity;
 }

+ 10 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBoardSelectDto.java

@@ -20,4 +20,14 @@ public class PurchaseBoardSelectDto extends BaseSelectDto {
      * 规格品号
      */
     private String bomSpecCode;
+
+    /**
+     * 排序字段 turnoverRate、predictOutStorageDays、nextDeliveryDays
+     */
+    private String sortField = "turnoverRate";
+
+    /**
+     * 排序方式 1-升序,2-降序
+     */
+    private Integer sortBy;
 }

+ 10 - 0
sd-business/src/main/java/com/sd/business/entity/sku/po/SkuSpec.java

@@ -66,6 +66,16 @@ public class SkuSpec extends BasePo {
     private String featureCode;
 
     /**
+     * e10 品号
+     */
+    private String erpCodeC2;
+
+    /**
+     * e10 特征码
+     */
+    private String featureCodeC2;
+
+    /**
      * 加工面板 字典:charge_item
      */
     private String machinedPanel;

+ 4 - 2
sd-business/src/main/java/com/sd/business/mapper/order/OrderMapper.java

@@ -3,12 +3,14 @@ package com.sd.business.mapper.order;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.order.po.OrderInfo;
 import com.sd.business.entity.order.vo.OrderInfoVo;
 import com.sd.business.entity.statement.vo.StatementOrderClassifyTotalCountVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * <p>
@@ -30,13 +32,13 @@ public interface OrderMapper extends BaseMapper<OrderInfo> {
      * 获取订单sku 出库数量
      * @return
      */
-    BigDecimal getOrderSkuOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
+    List<BomSpecOrderConsumptionBo> getOrderSkuOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
 
     /**
      * 获取订单sku bom出库数量
      * @return
      */
-    BigDecimal getOrderSkuBomOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
+    List<BomSpecOrderConsumptionBo> getOrderSkuBomOutStorageQuantity(@Param("ew") IWrapper<OrderInfo> wrapper);
 
     /**
      * 获取订单分类数量总计

+ 6 - 5
sd-business/src/main/java/com/sd/business/mapper/purchase/PurchaseBomMapper.java

@@ -50,20 +50,21 @@ public interface PurchaseBomMapper extends BaseMapper<PurchaseBom> {
      * @param wrapper
      * @return
      */
-    BigDecimal getPurchaseBomInTransitSum(@Param("ew") IWrapper<PurchaseBom> wrapper);
+    List<PurchaseInTransitBomVo> getPurchaseBomInTransitSum(@Param("ew") IWrapper<PurchaseBom> wrapper);
 
     /**
-     * 获取采购bom的到货时间
+     * 采购合同 bom分页
+     * @param page
      * @param wrapper
      * @return
      */
-    List<PurchaseInTransitBomVo> getPurchaseBomDeliveryDate(@Param("ew") IWrapper<PurchaseBom> wrapper);
+    Page<PurchaseBomDetailsVo> getDetailsPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchaseBomDetailsVo> wrapper);
 
     /**
-     * 采购合同 bom分页
+     * 采购看板分页
      * @param page
      * @param wrapper
      * @return
      */
-    Page<PurchaseBomDetailsVo> getDetailsPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchaseBomDetailsVo> wrapper);
+    Page<PurchaseBomBoardVo> getPurchaseBomBoardPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchaseBom> wrapper);
 }

+ 32 - 10
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java

@@ -21,9 +21,11 @@ import com.sd.business.entity.apply.po.ApplyBuyBom;
 import com.sd.business.entity.apply.vo.ApplyBuyBomAccessoryVo;
 import com.sd.business.entity.apply.vo.ApplyBuyBomVo;
 import com.sd.business.entity.apply.vo.ApplyBuyVo;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 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.purchase.vo.PurchaseInTransitBomVo;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.apply.ApplyBuyMapper;
 import com.sd.business.service.apply.ApplyBuyBomService;
@@ -210,24 +212,44 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
         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);
+        // 在途数据
+        List<PurchaseInTransitBomVo> purchaseBomInTransitList = purchaseBomService.getPurchaseBomInTransitSum(bomSpecIds);
+        Map<Long, BigDecimal> inTransitMap = purchaseBomInTransitList.stream().collect(Collectors.toMap(PurchaseInTransitBomVo::getBomSpecId, PurchaseInTransitBomVo::getInTransitQuantity));
+
+        // 当月时间
+        Date date = DateUtil.date();
+        // 上上个月时间
+        Date beforeLastMonthDate = DateUtil.offsetMonth(date, -2);
+        Date beforeLastMonthBeginDate = DateUtil.beginOfMonth(beforeLastMonthDate);
+        // 查询近3个月的bom消耗数据
+        List<BomSpecOrderConsumptionBo> orderBomSpecOutStorageList = orderService.getOrderBomSpecOutStorageQuantity(bomSpecIds, beforeLastMonthBeginDate, date);
+        Map<Long, List<BomSpecOrderConsumptionBo>> bomSpecOutStorageMap = orderBomSpecOutStorageList.stream().collect(Collectors.groupingBy(BomSpecOrderConsumptionBo::getBomSpecId));
+
         for (ApplyBuyBom applyBuyBom : list) {
             Long bomSpecId = applyBuyBom.getBomSpecId();
             BomSpec bomSpec = bomSpecMap.get(bomSpecId);
             ApplyBuyBomAccessoryVo vo = new ApplyBuyBomAccessoryVo();
-            // 当月时间
-            Date date = DateUtil.date();
+            List<BomSpecOrderConsumptionBo> bomSpecConsumptionList = bomSpecOutStorageMap.getOrDefault(bomSpecId, Collections.emptyList());
+            // 当月消耗量
             Date currentMonthBeginDate = DateUtil.beginOfMonth(date);
-            BigDecimal currentMonthSalesQuantity = orderService.getOrderBomSpecOutStorageQuantity(bomSpecId, currentMonthBeginDate, date);
-            // 上个月时间
+            BigDecimal currentMonthSalesQuantity = bomSpecConsumptionList.stream()
+                    .filter(item -> currentMonthBeginDate.compareTo(item.getConsumptionDate()) <= 0 && date.compareTo(item.getConsumptionDate()) >= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 上个月消耗量
             Date lastMonthDate = DateUtil.offsetMonth(date, -1);
             Date lastMonthBeginDate = DateUtil.beginOfMonth(lastMonthDate);
             Date lastMonthEndDate = DateUtil.endOfMonth(lastMonthDate);
-            BigDecimal lastMonthSalesQuantity = orderService.getOrderBomSpecOutStorageQuantity(bomSpecId, lastMonthBeginDate, lastMonthEndDate);
-            // 上上个月时间
-            Date beforeLastMonthDate = DateUtil.offsetMonth(date, -2);
-            Date beforeLastMonthBeginDate = DateUtil.beginOfMonth(beforeLastMonthDate);
+            BigDecimal lastMonthSalesQuantity = bomSpecConsumptionList.stream()
+                    .filter(item -> lastMonthBeginDate.compareTo(item.getConsumptionDate()) <= 0 && lastMonthEndDate.compareTo(item.getConsumptionDate()) >= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 上上个月消耗量
             Date beforeLastMonthEndDate = DateUtil.endOfMonth(beforeLastMonthDate);
-            BigDecimal beforeLastMonth00Quantity = orderService.getOrderBomSpecOutStorageQuantity(bomSpecId, beforeLastMonthBeginDate, beforeLastMonthEndDate);
+            BigDecimal beforeLastMonth00Quantity = bomSpecConsumptionList.stream()
+                    .filter(item -> beforeLastMonthBeginDate.compareTo(item.getConsumptionDate()) <= 0 && beforeLastMonthEndDate.compareTo(item.getConsumptionDate()) >= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
             List<Inventory> inventoryList = inventoryService.list(q -> q
                     .eq(Inventory::getBomSpecId, bomSpecId)
                     .eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS)
@@ -235,7 +257,7 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
             // 当前库存数
             BigDecimal inventoryQuantity = ObjectUtil.isEmpty(inventoryList) ? BigDecimal.ZERO : StreamUtil.bigDecimalAdd(inventoryList, Inventory::getQuantity);
             // 在途数量
-            BigDecimal inTransitSum = purchaseBomService.getPurchaseBomInTransitSum(bomSpecId);
+            BigDecimal inTransitSum = inTransitMap.getOrDefault(bomSpecId, BigDecimal.ZERO);
             // 月平均消耗
             BigDecimal averageMonthSales = currentMonthSalesQuantity
                     .add(lastMonthSalesQuantity)

+ 0 - 1
sd-business/src/main/java/com/sd/business/service/check/impl/CheckServiceImpl.java

@@ -110,7 +110,6 @@ public class CheckServiceImpl extends ServiceImpl<CheckMapper, Check> implements
         long checkId = IdWorker.getId();
         checkDto.setId(checkId);
         checkDto.setCode(CodeEnum.CHECK_CODE.getCode());
-        checkDto.setStatus(0);
 
         List<CheckBom> checkBomList = checkDto.getCheckBomList();
         for (CheckBom checkBom : checkBomList) {

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

@@ -3,6 +3,7 @@ package com.sd.business.service.order;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.order.dto.OrderInfoDto;
 import com.sd.business.entity.order.dto.OrderSelectDto;
 import com.sd.business.entity.order.dto.SkuSpecPriceDto;
@@ -13,7 +14,6 @@ import com.sd.business.entity.order.vo.SkuSpecPriceVo;
 import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.entity.statement.vo.StatementOrderClassifyTotalCountVo;
 
-import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -98,14 +98,14 @@ public interface OrderService extends BaseService<OrderInfo> {
     CompareVo compare(OrderSelectDto dto);
 
     /**
-     * 获取订单bom的出库数
+     * 获取订单bom的出库数
      *
-     * @param bomSpecId bom规格id
+     * @param bomSpecIds bom规格id
      * @param startDate 开始时间
-     * @param endDate 结束时间
+     * @param endDate   结束时间
      * @return
      */
-    BigDecimal getOrderBomSpecOutStorageQuantity(Long bomSpecId, Date startDate, Date endDate);
+    List<BomSpecOrderConsumptionBo> getOrderBomSpecOutStorageQuantity(List<Long> bomSpecIds, Date startDate, Date endDate);
 
     /**
      * 获取万里牛单号

+ 24 - 10
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -22,6 +22,7 @@ import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
 import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo;
 import com.sd.business.entity.bom.po.Bom;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.po.Department;
@@ -933,24 +934,37 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
     }
 
     @Override
-    public BigDecimal getOrderBomSpecOutStorageQuantity(Long bomSpecId, Date startDate, Date endDate) {
+    public List<BomSpecOrderConsumptionBo> getOrderBomSpecOutStorageQuantity(List<Long> bomSpecIds, Date startDate, Date endDate) {
         // 根据对账时间获取有对账单的订单
         List<StatementOfAccount> list = statementOfAccountService.list(q -> q.between(StatementOfAccount::getTimePeriod, startDate, endDate));
         List<Long> accountIds = list.stream().map(StatementOfAccount::getId).collect(Collectors.toList());
 
-        Map<Long, BomSpecBo> bomSpecBo = skuSpecService.getBomSpecBoByIdList(Collections.singleton(bomSpecId));
+
         IWrapper<OrderInfo> wrapper = getWrapper();
         wrapper.in("o", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
         wrapper.in("o", OrderInfo::getStatementOfAccountId, accountIds);
-        if (ObjectUtil.equal(bomSpecBo.get(bomSpecId).getClassifyParentId(), 1L)) {
-            // 查询主材消耗数量
-            wrapper.eq("os", OrderSku::getBomSpecId, bomSpecId);
-            return this.baseMapper.getOrderSkuOutStorageQuantity(wrapper);
-        } else {
-            // 查询包材消耗数量
-            wrapper.eq("osb", OrderSkuBom::getBomSpecId, bomSpecId);
-            return this.baseMapper.getOrderSkuBomOutStorageQuantity(wrapper);
+
+        // 查询主材消耗数量
+        wrapper.groupBy("os.bom_spec_id", "soa.time_period");
+        wrapper.in("os", OrderSku::getBomSpecId, bomSpecIds);
+        List<BomSpecOrderConsumptionBo> orderSkuOutStorageList = this.baseMapper.getOrderSkuOutStorageQuantity(wrapper);
+
+        wrapper = IWrapper.getWrapper();
+        wrapper.in("o", OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey(), OrderStatusEnum.COMPLETION_PRODUCTION.getKey());
+        wrapper.in("o", OrderInfo::getStatementOfAccountId, accountIds);
+        wrapper.groupBy("osb.bom_spec_id", "soa.time_period");
+        // 查询包材消耗数量
+        wrapper.in("osb", OrderSkuBom::getBomSpecId, bomSpecIds);
+        List<BomSpecOrderConsumptionBo> orderSkuBomOutStorageList = this.baseMapper.getOrderSkuBomOutStorageQuantity(wrapper);
+        List<BomSpecOrderConsumptionBo> bomOutStorageList = new ArrayList<>();
+        if (ObjectUtil.isNotEmpty(orderSkuOutStorageList)) {
+            bomOutStorageList.addAll(orderSkuOutStorageList);
         }
+        if (ObjectUtil.isNotEmpty(orderSkuBomOutStorageList)) {
+            bomOutStorageList.addAll(orderSkuBomOutStorageList);
+        }
+
+        return bomOutStorageList;
     }
 
     @Override

+ 3 - 2
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseBomService.java

@@ -10,6 +10,7 @@ import com.sd.business.entity.purchase.po.PurchaseBom;
 import com.sd.business.entity.purchase.vo.*;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
@@ -60,8 +61,8 @@ public interface PurchaseBomService extends BaseService<PurchaseBom> {
 
     /**
      * 获取采购bom的在途数量
-     * @param bomSpecId
+     * @param bomSpecIds
      * @return
      */
-    BigDecimal getPurchaseBomInTransitSum(Long bomSpecId);
+    List<PurchaseInTransitBomVo> getPurchaseBomInTransitSum(List<Long> bomSpecIds);
 }

+ 61 - 67
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java

@@ -1,6 +1,7 @@
 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;
@@ -9,6 +10,7 @@ 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.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.BomSpec;
@@ -149,23 +151,22 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
 
     @Override
     public Page<PurchaseBomBoardVo> getPurchaseBoardPage(PurchaseBoardSelectDto dto) {
-        BomSpecSelectDto bomSpecSelectDto = new BomSpecSelectDto();
-        bomSpecSelectDto.setName(dto.getBomSpecName());
-        bomSpecSelectDto.setCode(dto.getBomSpecCode());
-        bomSpecSelectDto.setPageNum(dto.getPageNum());
-        bomSpecSelectDto.setPageSize(dto.getPageSize());
-        Page<BomSpecVo> bomSpecVoPage = bomSpecService.getPage(bomSpecSelectDto);
-        List<BomSpecVo> records = bomSpecVoPage.getRecords();
-        Page<PurchaseBomBoardVo> page = new Page<>();
-        page.setSize(bomSpecVoPage.getSize());
-        page.setTotal(bomSpecVoPage.getTotal());
+        IWrapper<PurchaseBom> wrapper = getWrapper();
+        wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
+        wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
+        if (Objects.equals(dto.getSortBy(), 1)) {
+            wrapper.orderByAsc(dto.getSortField());
+        } else {
+            wrapper.orderByDesc(dto.getSortField());
+        }
+        Page<PurchaseBomBoardVo> bomSpecVoPage = this.baseMapper.getPurchaseBomBoardPage(dto.getPage(), wrapper);
+        List<PurchaseBomBoardVo> records = bomSpecVoPage.getRecords();
         if (ObjectUtil.isEmpty(records)) {
-            return page;
+            return bomSpecVoPage;
         }
         Date date = new Date();
-        List<PurchaseBomBoardVo> list = new ArrayList<>();
 
-        List<Long> bomSpecIds = records.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<Long> bomSpecIds = records.stream().map(PurchaseBomBoardVo::getBomSpecId).collect(Collectors.toList());
         // 查询库存数据
         Map<Long, List<Inventory>> inventorMap = inventoryService.mapKGroup(
                 Inventory::getBomSpecId,
@@ -174,37 +175,43 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
                         .in(Inventory::getWarehouseId,
                                 Arrays.asList(WarehouseConstant.SEMI_FINISHED_PRODUCT, WarehouseConstant.PACKAGING_MATERIAL)));
 
-        // 查询周转率数据
-        Map<Long, BigDecimal> turnoverRateMap = orderSalesShipmentStatisticsService.getTurnoverRateMapByBomSpecIds(bomSpecIds);
+        // 在途数据
+        List<PurchaseInTransitBomVo> purchaseBomInTransitList = this.getPurchaseBomInTransitSum(bomSpecIds);
+        Map<Long, BigDecimal> inTransitMap = purchaseBomInTransitList.stream().collect(Collectors.toMap(PurchaseInTransitBomVo::getBomSpecId, PurchaseInTransitBomVo::getInTransitQuantity));
+        // 查询近60天的bom消耗数据
+        List<BomSpecOrderConsumptionBo> orderBomSpecOutStorageList = orderService.getOrderBomSpecOutStorageQuantity(bomSpecIds, DateUtil.offsetDay(date, -60), date);
+        Map<Long, List<BomSpecOrderConsumptionBo>> bomSpecOutStorageMap = orderBomSpecOutStorageList.stream().collect(Collectors.groupingBy(BomSpecOrderConsumptionBo::getBomSpecId));
 
-        // 获取bom的下一批到货天数
-        IWrapper<PurchaseBom> wrapper = IWrapper.getWrapper();
-        wrapper.in("pb", PurchaseBom::getBomSpecId, bomSpecIds);
-        wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
-        wrapper.eq("p", Purchase::getStorageStatus, StatusConstant.NO);
-        wrapper.gt("p", Purchase::getDeliveryDate, date);
-        wrapper.groupBy("pb.bom_spec_id");
-        List<PurchaseInTransitBomVo> deliveryDateList = this.baseMapper.getPurchaseBomDeliveryDate(wrapper);
-        Map<Long, Date> deliveryDateMap = deliveryDateList.stream().collect(Collectors.toMap(PurchaseInTransitBomVo::getBomSpecId, PurchaseInTransitBomVo::getDeliveryDate));
-
-        for (BomSpecVo record : records) {
-            PurchaseBomBoardVo purchaseBomBoard = new PurchaseBomBoardVo();
-            Long bomSpecId = record.getId();
+        for (PurchaseBomBoardVo record : records) {
+            Long bomSpecId = record.getBomSpecId();
             List<Inventory> inventoryList = inventorMap.get(bomSpecId);
+            List<BomSpecOrderConsumptionBo> bomSpecConsumptionList = bomSpecOutStorageMap.getOrDefault(bomSpecId, Collections.emptyList());
 
             // 当前库存数
             BigDecimal inventoryQuantity = ObjectUtil.isEmpty(inventoryList) ? BigDecimal.ZERO : StreamUtil.bigDecimalAdd(inventoryList, Inventory::getQuantity);
             // 近7天消耗量
-            BigDecimal quantitySevenDays = orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -7), date);
+            Date sevenDate = DateUtil.offsetDay(date, -7);
+            BigDecimal quantitySevenDays = bomSpecConsumptionList.stream()
+                    .filter(item -> sevenDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
             // 近30天消耗量
-            BigDecimal quantityThirtyDays = orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -30), date);
+            Date thirtyDate = DateUtil.offsetDay(date, -30);
+            BigDecimal quantityThirtyDays = bomSpecConsumptionList.stream()
+                    .filter(item -> thirtyDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
             // 40天安全库存
             BigDecimal safetyInventoryQuantity = quantityThirtyDays.divide(new BigDecimal("30"), 2, RoundingMode.HALF_UP)
                     .multiply(new BigDecimal("40")).setScale(0, RoundingMode.HALF_UP);
 
             // 近14天消耗量
-            BigDecimal quantityTwoWeek = orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -14), date);
+            Date twoWeekDate = DateUtil.offsetDay(date, -14);
+            BigDecimal quantityTwoWeek = bomSpecConsumptionList.stream()
+                    .filter(item -> twoWeekDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
             // 近两周减去近一周的消耗量为上周数量
             BigDecimal quantityLastWeek = quantityTwoWeek.subtract(quantitySevenDays);
             // 周环比率
@@ -215,45 +222,31 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
                 weekOnWeekRatio = quantitySevenDays.subtract(quantityLastWeek).divide(quantityLastWeek, 2, RoundingMode.HALF_UP);
             }
 
-            // 预计消耗天数
-            int predictOutStorageDays = 0;
-            if (quantitySevenDays.compareTo(BigDecimal.ZERO) != 0) {
-                predictOutStorageDays = inventoryQuantity.divide(quantitySevenDays
-                        .divide(new BigDecimal("7"), 2, RoundingMode.HALF_UP), 2, RoundingMode.HALF_UP).intValue();
-            }
-
             // 获取在途总数
-            purchaseBomBoard.setInTransitSum(this.getPurchaseBomInTransitSum(bomSpecId));
+            BigDecimal inTransitSum = inTransitMap.getOrDefault(bomSpecId, BigDecimal.ZERO);
+            record.setInTransitSum(inTransitSum);
 
-            // 获取下一批到货天数
-            Date deliveryDate = deliveryDateMap.get(bomSpecId);
-            long nextDeliveryDays = 0L;
-            if (ObjectUtil.isNotEmpty(deliveryDate)) {
-                nextDeliveryDays = DateUtil.between(date, deliveryDate, DateUnit.DAY);
-            }
+            // 近15天消耗量
+            Date fifteenDate = DateUtil.offsetDay(date, -15);
+            BigDecimal quantityFifteenDays = bomSpecConsumptionList.stream()
+                    .filter(item -> fifteenDate.compareTo(item.getConsumptionDate()) <= 0)
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 近60天消耗量
+            BigDecimal quantitySixtyDays = bomSpecConsumptionList.stream()
+                    .map(BomSpecOrderConsumptionBo::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
 
             // 赋值
-            purchaseBomBoard.setBomSpecName(record.getName());
-            purchaseBomBoard.setBomSpecCode(record.getCode());
-            purchaseBomBoard.setColour(record.getColour());
-            purchaseBomBoard.setLength(record.getLength());
-            purchaseBomBoard.setHeight(record.getHeight());
-            purchaseBomBoard.setWidth(record.getWidth());
-            purchaseBomBoard.setBomSpecId(bomSpecId);
-            purchaseBomBoard.setInventoryQuantity(inventoryQuantity);
-            purchaseBomBoard.setPredictOutStorageDays(predictOutStorageDays);
-            purchaseBomBoard.setSafetyInventoryQuantity(safetyInventoryQuantity);
-            purchaseBomBoard.setOutStorageQuantitySevenDays(quantitySevenDays);
-            purchaseBomBoard.setOutStorageQuantityThirtyDays(quantityThirtyDays);
-            purchaseBomBoard.setOutStorageQuantityFifteenDays(orderService.getOrderBomSpecOutStorageQuantity(record.getId(),DateUtil.offsetDay(date, -15), date));
-            purchaseBomBoard.setOutStorageQuantitySixtyDays(orderService.getOrderBomSpecOutStorageQuantity(record.getId(), DateUtil.offsetDay(date, -60), date));
-            purchaseBomBoard.setOutStorageWeekOnWeekRatio(weekOnWeekRatio);
-            purchaseBomBoard.setNextDeliveryDays((int) nextDeliveryDays);
-            purchaseBomBoard.setTurnoverRate(turnoverRateMap.get(bomSpecId));
-            list.add(purchaseBomBoard);
+            record.setInventoryQuantity(inventoryQuantity);
+            record.setSafetyInventoryQuantity(safetyInventoryQuantity);
+            record.setOutStorageQuantitySevenDays(quantitySevenDays);
+            record.setOutStorageQuantityThirtyDays(quantityThirtyDays);
+            record.setOutStorageQuantityFifteenDays(quantityFifteenDays);
+            record.setOutStorageQuantitySixtyDays(quantitySixtyDays);
+            record.setOutStorageWeekOnWeekRatio(weekOnWeekRatio);
         }
-        page.setRecords(list);
-        return page;
+        return bomSpecVoPage;
     }
 
     @Override
@@ -267,11 +260,12 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
     }
 
     @Override
-    public BigDecimal getPurchaseBomInTransitSum(Long bomSpecId) {
+    public List<PurchaseInTransitBomVo> getPurchaseBomInTransitSum(List<Long> bomSpecIds) {
         IWrapper<PurchaseBom> wrapper = getWrapper();
-        wrapper.eq("pb", PurchaseBom::getBomSpecId, bomSpecId);
+        wrapper.in("pb", PurchaseBom::getBomSpecId, bomSpecIds);
         wrapper.eq("p", Purchase::getStatus, PurchaseStatusEnum.UNDER_PURCHASE.getKey());
         wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
+        wrapper.groupBy("pb.bom_spec_id");
         return this.baseMapper.getPurchaseBomInTransitSum(wrapper);
     }
 }

+ 10 - 4
sd-business/src/main/resources/mapper/order/OrderMapper.xml

@@ -58,22 +58,28 @@
             ${ew.customSqlSegment}
     </select>
 
-       <select id="getOrderSkuOutStorageQuantity" resultType="java.math.BigDecimal">
+       <select id="getOrderSkuOutStorageQuantity" resultType="com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo">
             select
-                ifnull(sum(os.quantity), 0)
+                soa.time_period consumptionDate,
+                os.bom_spec_id,
+                ifnull(sum(os.quantity), 0) quantity
             from
                 order_info o
                 LEFT JOIN order_sku os on o.id = os.order_id
+                LEFT JOIN statement_of_account soa on o.statement_of_account_id = soa.id
                 ${ew.customSqlSegment}
        </select>
 
-       <select id="getOrderSkuBomOutStorageQuantity" resultType="java.math.BigDecimal">
+       <select id="getOrderSkuBomOutStorageQuantity" resultType="com.sd.business.entity.bom.bo.BomSpecOrderConsumptionBo">
             select
-                ifnull(sum(os.quantity * osb.quantity), 0)
+                soa.time_period consumptionDate,
+                os.bom_spec_id,
+                ifnull(sum(os.quantity * osb.quantity), 0) quantity
             from
                 order_info o
                 LEFT JOIN order_sku os on o.id = os.order_id
                 LEFT JOIN order_sku_bom osb on os.id = osb.order_sku_id
+                LEFT JOIN statement_of_account soa on o.statement_of_account_id = soa.id
                 ${ew.customSqlSegment}
        </select>
 

+ 76 - 13
sd-business/src/main/resources/mapper/purchase/PurchaseBomMapper.xml

@@ -94,26 +94,16 @@
             ${ew.customSqlSegment}
     </select>
 
-    <select id="getPurchaseBomInTransitSum" resultType="java.math.BigDecimal">
-        select
-            ifnull(sum(pb.purchase_quantity - pb.arrival_quantity + pb.return_quantity), 0)
-        from
-            purchase_bom pb
-            left join purchase p on pb.purchase_id = p.id
-            ${ew.customSqlSegment}
-    </select>
-
-    <select id="getPurchaseBomDeliveryDate" resultType="com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo">
+    <select id="getPurchaseBomInTransitSum" resultType="com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo">
         select
             pb.bom_spec_id,
-            min(p.delivery_date) delivery_date
+            ifnull(sum(pb.purchase_quantity - pb.arrival_quantity + pb.return_quantity), 0) inTransitQuantity
         from
             purchase_bom pb
-            LEFT JOIN purchase p on pb.purchase_id = p.id
+            left join purchase p on pb.purchase_id = p.id
             ${ew.customSqlSegment}
     </select>
 
-
     <select id="getDetailsPage" resultType="com.sd.business.entity.purchase.vo.PurchaseBomDetailsVo">
         select
             p.code purchaseCode,
@@ -133,4 +123,77 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="getPurchaseBomBoardPage" resultType="com.sd.business.entity.purchase.vo.PurchaseBomBoardVo">
+        SELECT
+            bs.id bomSpecId,
+            bs.name bomSpecName,
+            bs.code bomSpecCode,
+            bs.colour,
+            bs.length,
+            bs.width,
+            bs.height,
+            ifnull((i.quantity + ifnull(i.lock_quantity, 0)) / ((ifnull(osq.quantity, 0) + ifnull(osbq.quantity, 0)) / 7), 0) predictOutStorageDays,
+            ifnull(pd.next_delivery_days, 0) nextDeliveryDays,
+            ifnull(btr.turnover_rate, 0) turnoverRate
+        FROM
+            bom_spec bs
+            left join inventory i on bs.id = i.bom_spec_id and department_id = 0 and warehouse_id in (1684037244354052098, 1684037201379213314)
+            left join (
+                select
+                    os.bom_spec_id,
+                    ifnull(sum(os.quantity), 0) quantity
+                from
+                    order_info o
+                    left join order_sku os on o.id = os.order_id
+                    left join statement_of_account soa on o.statement_of_account_id = soa.id
+                where soa.time_period >= DATE_SUB(now(), INTERVAL 7 day)
+                    and o.`status` = 40
+                group by os.bom_spec_id
+            ) osq on bs.id = osq.bom_spec_id
+            left join (
+                select
+                    osb.bom_spec_id,
+                    ifnull(sum(os.quantity * osb.quantity), 0) quantity
+                from
+                    order_info o
+                    left join order_sku os on o.id = os.order_id
+                    left join order_sku_bom osb on os.id = osb.order_sku_id
+                    left join statement_of_account soa on o.statement_of_account_id = soa.id
+                where soa.time_period >= DATE_SUB(now(), INTERVAL 7 day)
+                    and o.`status` = 40
+                group by osb.bom_spec_id
+            ) osbq on bs.id = osbq.bom_spec_id
+            left join (
+                select
+                    pb.bom_spec_id,
+                    datediff(min(p.delivery_date), now()) next_delivery_days
+                from
+                    purchase_bom pb
+                    left join purchase p on pb.purchase_id = p.id
+                where pb.purchase_quantity > pb.arrival_quantity
+                    and p.storage_status = 0
+                    and p.delivery_date > now()
+                group by pb.bom_spec_id
+            ) pd on bs.id = pd.bom_spec_id
+            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
+                from (
+                    select
+                        osss.bom_spec_id,
+                        sum(osss.quantity) quantity
+                    FROM
+                        order_sales_shipment_statistics osss
+                    where total_date >= date(date_sub(now(), INTERVAL 91 day))
+                    group by osss.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)
+                group by oq.bom_spec_id
+            ) btr on bs.id = btr.bom_spec_id
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>