|
@@ -1,28 +1,38 @@
|
|
|
package com.sd.business.service.purchase.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
+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.utils.wrapper.IWrapper;
|
|
|
+import com.sd.business.entity.bom.dto.BomSpecSelectDto;
|
|
|
import com.sd.business.entity.bom.po.Bom;
|
|
|
import com.sd.business.entity.bom.po.BomSpec;
|
|
|
+import com.sd.business.entity.bom.vo.BomSpecVo;
|
|
|
+import com.sd.business.entity.inventory.po.Inventory;
|
|
|
+import com.sd.business.entity.purchase.dto.PurchaseBoardSelectDto;
|
|
|
import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
|
|
|
import com.sd.business.entity.purchase.dto.PurchaseInTransitBomSelectDto;
|
|
|
import com.sd.business.entity.purchase.po.Purchase;
|
|
|
import com.sd.business.entity.purchase.po.PurchaseBom;
|
|
|
-import com.sd.business.entity.purchase.vo.PurchaseBomInfoVo;
|
|
|
-import com.sd.business.entity.purchase.vo.PurchaseBomSelectVo;
|
|
|
-import com.sd.business.entity.purchase.vo.PurchaseBomVo;
|
|
|
-import com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo;
|
|
|
+import com.sd.business.entity.purchase.vo.*;
|
|
|
import com.sd.business.mapper.purchase.PurchaseBomMapper;
|
|
|
import com.sd.business.service.bom.BomClassifyService;
|
|
|
import com.sd.business.service.bom.BomSpecService;
|
|
|
+import com.sd.business.service.in.InOutStorageService;
|
|
|
+import com.sd.business.service.inventory.InventoryService;
|
|
|
import com.sd.business.service.purchase.PurchaseBomService;
|
|
|
import com.sd.framework.util.Assert;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -45,6 +55,11 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
|
|
|
@Autowired
|
|
|
private BomClassifyService bomClassifyService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private InOutStorageService inOutStorageService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InventoryService inventoryService;
|
|
|
|
|
|
@Override
|
|
|
public Page<PurchaseBomSelectVo> getPage(PurchaseBomSelectDto dto) {
|
|
@@ -113,7 +128,97 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
|
|
|
wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
|
|
|
wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
|
|
|
wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
|
|
|
- wrapper.orderByAsc("p", PurchaseInTransitBomVo::getDeliveryDate);
|
|
|
+ wrapper.orderByAsc("bs", BomSpec::getCode)
|
|
|
+ .orderByDesc("bs", BomSpec::getLength)
|
|
|
+ .orderByAsc("bs", BomSpec::getWidth)
|
|
|
+ .orderByDesc("bs", BomSpec::getHeight);
|
|
|
return this.baseMapper.getPurchaseInTransitBomPage(dto.getPage(), wrapper);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<PurchaseBomBoardVo> getPurchaseBoardPage(PurchaseBoardSelectDto dto) {
|
|
|
+ BomSpecSelectDto bomSpecSelectDto = new BomSpecSelectDto();
|
|
|
+ bomSpecSelectDto.setName(dto.getBomSpecName());
|
|
|
+ bomSpecSelectDto.setCode(dto.getBomSpecCode());
|
|
|
+ Page<BomSpecVo> bomSpecVoPage = bomSpecService.getPage(bomSpecSelectDto);
|
|
|
+ List<BomSpecVo> records = bomSpecVoPage.getRecords();
|
|
|
+ Page<PurchaseBomBoardVo> page = new Page<>();
|
|
|
+ page.setSize(bomSpecVoPage.getSize());
|
|
|
+ page.setTotal(bomSpecVoPage.getTotal());
|
|
|
+ List<PurchaseBomBoardVo> list = new ArrayList<>();
|
|
|
+ for (BomSpecVo record : records) {
|
|
|
+ PurchaseBomBoardVo purchaseBomBoard = new PurchaseBomBoardVo();
|
|
|
+ Long bomSpecId = record.getId();
|
|
|
+ Inventory inventory = inventoryService.getOne(q -> q.eq(Inventory::getBomSpecId, bomSpecId));
|
|
|
+
|
|
|
+ // 当前库存数
|
|
|
+ BigDecimal inventoryQuantity = ObjectUtil.isEmpty(inventory) ? new BigDecimal("0") : inventory.getQuantity();
|
|
|
+ // 近7天消耗量
|
|
|
+ BigDecimal quantitySevenDays = inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 7);
|
|
|
+ // 近30天消耗量
|
|
|
+ BigDecimal quantityThirtyDays = inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 30);
|
|
|
+
|
|
|
+ // 40天安全库存
|
|
|
+ BigDecimal safetyInventoryQuantity = quantityThirtyDays.divide(new BigDecimal("30"), 2, RoundingMode.HALF_UP)
|
|
|
+ .multiply(new BigDecimal("40")).setScale(0, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+
|
|
|
+ // 近14天消耗量
|
|
|
+ BigDecimal quantityTwoWeek = inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 14);
|
|
|
+ // 近两周减去近一周的消耗量为上周数量
|
|
|
+ BigDecimal quantityLastWeek = quantityTwoWeek.subtract(quantitySevenDays);
|
|
|
+ // 周环比率
|
|
|
+ BigDecimal weekOnWeekRatio;
|
|
|
+ if (quantityLastWeek.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ weekOnWeekRatio = quantitySevenDays;
|
|
|
+ } else {
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取在途总数
|
|
|
+ IWrapper<PurchaseBom> wrapper = getWrapper();
|
|
|
+ wrapper.eq("pb", PurchaseBom::getBomSpecId, bomSpecId);
|
|
|
+ wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
|
|
|
+ purchaseBomBoard.setInTransitSum(this.baseMapper.getPurchaseBomInTransitSum(wrapper));
|
|
|
+
|
|
|
+ // 获取下一批到货天数
|
|
|
+ wrapper = IWrapper.getWrapper();
|
|
|
+ Date date = new Date();
|
|
|
+ wrapper.eq("pb", PurchaseBom::getBomSpecId, bomSpecId);
|
|
|
+ wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
|
|
|
+ wrapper.eq("p", Purchase::getStorageStatus, StatusConstant.NO);
|
|
|
+ wrapper.gt("p", Purchase::getDeliveryDate, date);
|
|
|
+ wrapper.orderByAsc("p", Purchase::getDeliveryDate);
|
|
|
+ wrapper.last("limit 1");
|
|
|
+ Date deliveryDate = this.baseMapper.getPurchaseBomDeliveryDate(wrapper);
|
|
|
+ long nextDeliveryDays = 0L;
|
|
|
+ if (ObjectUtil.isNotEmpty(deliveryDate)) {
|
|
|
+ nextDeliveryDays = DateUtil.between(date, deliveryDate, DateUnit.DAY);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 赋值
|
|
|
+ purchaseBomBoard.setBomSpecName(record.getName());
|
|
|
+ purchaseBomBoard.setBomSpecCode(record.getCode());
|
|
|
+ purchaseBomBoard.setBomSpecId(bomSpecId);
|
|
|
+ purchaseBomBoard.setInventoryQuantity(inventoryQuantity);
|
|
|
+ purchaseBomBoard.setPredictOutStorageDays(predictOutStorageDays);
|
|
|
+ purchaseBomBoard.setSafetyInventoryQuantity(safetyInventoryQuantity);
|
|
|
+ purchaseBomBoard.setOutStorageQuantitySevenDays(quantitySevenDays);
|
|
|
+ purchaseBomBoard.setOutStorageQuantityThirtyDays(quantityThirtyDays);
|
|
|
+ purchaseBomBoard.setOutStorageQuantityFifteenDays(inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 15));
|
|
|
+ purchaseBomBoard.setOutStorageQuantitySixtyDays(inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 60));
|
|
|
+ purchaseBomBoard.setOutStorageWeekOnWeekRatio(weekOnWeekRatio);
|
|
|
+ purchaseBomBoard.setNextDeliveryDays((int) nextDeliveryDays);
|
|
|
+ list.add(purchaseBomBoard);
|
|
|
+ }
|
|
|
+ page.setRecords(list);
|
|
|
+ return page;
|
|
|
+ }
|
|
|
}
|