|
@@ -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);
|
|
|
}
|
|
|
}
|