|
@@ -59,7 +59,7 @@ public class OrderSalesShipmentStatisticsServiceImpl implements OrderSalesShipme
|
|
|
@Override
|
|
|
public Map<Long, OrderSalesShipmentStatisticsBo> getSalesShipmentStatisticsByDate(List<Long> bomSpecIds) {
|
|
|
Date date = new Date();
|
|
|
- Date startDate = DateUtil.offsetDay(date, -90);
|
|
|
+ Date startDate = DateUtil.beginOfDay(DateUtil.offsetDay(date, -90));
|
|
|
IWrapper<OrderSku> wrapper = IWrapper.getWrapper();
|
|
|
wrapper.orderByDesc("os", OrderSku::getId);
|
|
|
wrapper.between("oi", OrderInfo::getShippingTime, startDate, date);
|
|
@@ -71,9 +71,9 @@ public class OrderSalesShipmentStatisticsServiceImpl implements OrderSalesShipme
|
|
|
@Override
|
|
|
public List<TurnoverRateStatisticsVo> getTurnoverRateStatisticsList(TurnoverRateBoardSelectDto dto) {
|
|
|
Date date = new Date();
|
|
|
- String ninetyDaysDate = DateUtil.formatDateTime(DateUtil.offsetDay(date, -90));
|
|
|
- String sixtyDaysDate = DateUtil.formatDateTime(DateUtil.offsetDay(date, -60));
|
|
|
- String thirtyDaysDate = DateUtil.formatDateTime(DateUtil.offsetDay(date, -30));
|
|
|
+ String ninetyDaysDate = DateUtil.formatDate(DateUtil.offsetDay(date, -90));
|
|
|
+ String sixtyDaysDate = DateUtil.formatDate(DateUtil.offsetDay(date, -60));
|
|
|
+ String thirtyDaysDate = DateUtil.formatDate(DateUtil.offsetDay(date, -30));
|
|
|
|
|
|
IWrapper<OrderSku> wrapper = IWrapper.getWrapper();
|
|
|
wrapper.orderByDesc("os", OrderSku::getId);
|
|
@@ -121,91 +121,97 @@ public class OrderSalesShipmentStatisticsServiceImpl implements OrderSalesShipme
|
|
|
.eq(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
|
|
|
.in(Inventory::getBomSpecId, bomSpecIds));
|
|
|
|
|
|
- List<TurnoverRateStatisticsVo> list = statisticsVoList.stream().map(item -> {
|
|
|
- Long bomSpecId = item.getBomSpecId();
|
|
|
- // 计算周转率
|
|
|
- // 时间段库存周转天数 = 时间段天数 * (1 / 2) * (期初库存数量+期末库存数量) / 时间段销售量;
|
|
|
- // 库存周转率 = 时间段天数 / 库存周转天数。
|
|
|
- // 获取期初和期末数据
|
|
|
- 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);
|
|
|
- Inventory endBackup = endBackupMap.get(bomSpecId);
|
|
|
- // 计算bom近90、60、30天的期初库存数量
|
|
|
- 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 = beginBackupSixtyDays.getQuantity()
|
|
|
- .add(beginBackupSixtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupSixtyDays.getLockQuantity());
|
|
|
- }
|
|
|
- if (beginBackupThirtyDays != null) {
|
|
|
- beginQuantityThirtyDays = beginBackupThirtyDays.getQuantity()
|
|
|
- .add(beginBackupThirtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupThirtyDays.getLockQuantity());
|
|
|
- }
|
|
|
- if (endBackup != null) {
|
|
|
- endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
|
|
|
- }
|
|
|
- // 时间段天数
|
|
|
- BigDecimal days;
|
|
|
- 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"))
|
|
|
- .multiply(beginQuantityNinetyDays.add(endQuantity))
|
|
|
- .divide(item.getNinetyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
|
|
|
- 4, RoundingMode.HALF_UP);
|
|
|
- }
|
|
|
- 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"))
|
|
|
- .multiply(beginQuantitySixtyDays.add(endQuantity))
|
|
|
- .divide(item.getSixtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
|
|
|
- 4, RoundingMode.HALF_UP);
|
|
|
- }
|
|
|
- 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"))
|
|
|
- .multiply(beginQuantityThirtyDays.add(endQuantity))
|
|
|
- .divide(item.getThirtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
|
|
|
- 4, RoundingMode.HALF_UP);
|
|
|
- }
|
|
|
- if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- TurnoverRateStatisticsVo vo = new TurnoverRateStatisticsVo();
|
|
|
- vo.setBomSpecCode(item.getBomSpecCode());
|
|
|
- vo.setBomSpecName(item.getBomSpecName());
|
|
|
- vo.setWidth(item.getWidth());
|
|
|
- vo.setHeight(item.getHeight());
|
|
|
- vo.setChromatophore(bomChromatophoreMap.get(item.getChromatophore()));
|
|
|
- vo.setSalesQuantityThirtyDays(item.getThirtyDaysSalesQuantity());
|
|
|
- vo.setSalesQuantitySixtyDays(item.getSixtyDaysSalesQuantity());
|
|
|
- vo.setSalesQuantityNinetyDays(item.getNinetyDaysSalesQuantity());
|
|
|
- vo.setTurnoverRateNinetyDays(turnoverRateNinetyDays);
|
|
|
- vo.setTurnoverRateSixtyDays(turnoverRateSixtyDays);
|
|
|
- vo.setTurnoverRateThirtyDays(turnoverRateThirtyDays);
|
|
|
- vo.setQuantity(endQuantity);
|
|
|
- return vo;
|
|
|
- }).filter(Objects::nonNull).sorted(comparing(TurnoverRateStatisticsVo::getTurnoverRateNinetyDays)).collect(Collectors.toList());
|
|
|
+ List<TurnoverRateStatisticsVo> list = statisticsVoList.stream()
|
|
|
+ .map(item -> {
|
|
|
+ Long bomSpecId = item.getBomSpecId();
|
|
|
+ // 计算周转率
|
|
|
+ // 时间段库存周转天数 = 时间段天数 * (1 / 2) * (期初库存数量+期末库存数量) / 时间段销售量;
|
|
|
+ // 库存周转率 = 时间段天数 / 库存周转天数。
|
|
|
+ // 获取期初和期末数据
|
|
|
+ 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);
|
|
|
+ Inventory endBackup = endBackupMap.get(bomSpecId);
|
|
|
+ // 计算bom近90、60、30天的期初库存数量
|
|
|
+ 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 = beginBackupSixtyDays.getQuantity()
|
|
|
+ .add(beginBackupSixtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupSixtyDays.getLockQuantity());
|
|
|
+ }
|
|
|
+ if (beginBackupThirtyDays != null) {
|
|
|
+ beginQuantityThirtyDays = beginBackupThirtyDays.getQuantity()
|
|
|
+ .add(beginBackupThirtyDays.getLockQuantity() == null ? BigDecimal.ZERO : beginBackupThirtyDays.getLockQuantity());
|
|
|
+ }
|
|
|
+ if (endBackup != null) {
|
|
|
+ endQuantity = endBackup.getQuantity().add(endBackup.getLockQuantity() == null ? BigDecimal.ZERO : endBackup.getLockQuantity());
|
|
|
+ }
|
|
|
+ // 时间段天数
|
|
|
+ BigDecimal days;
|
|
|
+ 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"))
|
|
|
+ .multiply(beginQuantityNinetyDays.add(endQuantity))
|
|
|
+ .divide(item.getNinetyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
|
|
|
+ 4, RoundingMode.HALF_UP)
|
|
|
+ .multiply(new BigDecimal(100));
|
|
|
+ }
|
|
|
+ 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"))
|
|
|
+ .multiply(beginQuantitySixtyDays.add(endQuantity))
|
|
|
+ .divide(item.getSixtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
|
|
|
+ 4, RoundingMode.HALF_UP)
|
|
|
+ .multiply(new BigDecimal(100));
|
|
|
+ }
|
|
|
+ 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"))
|
|
|
+ .multiply(beginQuantityThirtyDays.add(endQuantity))
|
|
|
+ .divide(item.getThirtyDaysSalesQuantity(), 4, RoundingMode.HALF_UP),
|
|
|
+ 4, RoundingMode.HALF_UP)
|
|
|
+ .multiply(new BigDecimal(100));
|
|
|
+ }
|
|
|
+ if (ObjectUtil.equals(endQuantity, BigDecimal.ZERO)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ TurnoverRateStatisticsVo vo = new TurnoverRateStatisticsVo();
|
|
|
+ vo.setBomSpecCode(item.getBomSpecCode());
|
|
|
+ vo.setBomSpecName(item.getBomSpecName());
|
|
|
+ vo.setWidth(item.getWidth());
|
|
|
+ vo.setHeight(item.getHeight());
|
|
|
+ vo.setChromatophore(bomChromatophoreMap.get(item.getChromatophore()));
|
|
|
+ vo.setSalesQuantityThirtyDays(item.getThirtyDaysSalesQuantity());
|
|
|
+ vo.setSalesQuantitySixtyDays(item.getSixtyDaysSalesQuantity());
|
|
|
+ vo.setSalesQuantityNinetyDays(item.getNinetyDaysSalesQuantity());
|
|
|
+ vo.setTurnoverRateNinetyDays(turnoverRateNinetyDays.stripTrailingZeros().toPlainString() + "%");
|
|
|
+ vo.setTurnoverRateSixtyDays(turnoverRateSixtyDays.stripTrailingZeros().toPlainString() + "%");
|
|
|
+ vo.setTurnoverRateThirtyDays(turnoverRateThirtyDays.stripTrailingZeros().toPlainString() + "%");
|
|
|
+ vo.setQuantity(endQuantity);
|
|
|
+ return vo;
|
|
|
+ }).filter(Objects::nonNull)
|
|
|
+ .sorted(comparing(item -> new BigDecimal(item.getTurnoverRateNinetyDays().replace("%", ""))))
|
|
|
+ .collect(Collectors.toList());
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Map<Long, BigDecimal> getTurnoverRateMapByBomSpecIds(List<Long> bomSpecIds) {
|
|
|
+ public Map<Long, String> getTurnoverRateMapByBomSpecIds(List<Long> bomSpecIds) {
|
|
|
IWrapper<OrderSku> wrapper = IWrapper.getWrapper();
|
|
|
wrapper.in("oq.bom_spec_id", bomSpecIds);
|
|
|
wrapper.groupBy("oq.bom_spec_id");
|