|
|
@@ -53,6 +53,7 @@ import org.springblade.salesPart.dto.SaleDetail;
|
|
|
import org.springblade.salesPart.dto.SaleDetailDto;
|
|
|
import org.springblade.salesPart.dto.SalespersonCustomer;
|
|
|
import org.springblade.salesPart.entity.*;
|
|
|
+import org.springblade.salesPart.enums.FinalMap;
|
|
|
import org.springblade.salesPart.enums.OrderStatusEnum;
|
|
|
import org.springblade.salesPart.enums.OrderTypeEnum;
|
|
|
import org.springblade.salesPart.excel.*;
|
|
|
@@ -4794,24 +4795,28 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
|
|
|
public R<AppStatisticsVo> turnoverAnalysis(String startDate, String endDate) {
|
|
|
AppStatisticsVo appStatisticsVo = new AppStatisticsVo();
|
|
|
BladeUser user = AuthUtil.getUser();
|
|
|
- SaleDetail saleDetail = new SaleDetail();
|
|
|
- saleDetail.setTenantId(user.getTenantId());
|
|
|
- saleDetail.setSalesCompanyId(user.getDeptId());
|
|
|
- saleDetail.setDateStart(startDate);
|
|
|
- saleDetail.setDateEnd(endDate);
|
|
|
String userRoles = AuthUtil.getUserRole();
|
|
|
+ appStatisticsVo.valueIsZero();
|
|
|
+ SaleDetail saleDetailDto = new SaleDetail();
|
|
|
+ saleDetailDto.setTenantId(user.getTenantId());
|
|
|
+ saleDetailDto.setSalesCompanyId(user.getDeptId());
|
|
|
+ saleDetailDto.setBusinesDateStart(startDate);
|
|
|
+ saleDetailDto.setBusinesDateEnd(endDate);
|
|
|
+ saleDetailDto.setIsContain("1");
|
|
|
+ saleDetailDto.setBsType("XS,TKXS");
|
|
|
if (!userRoles.contains("admin") && !userRoles.contains("老板") && userRoles.contains("业务员")) {
|
|
|
- saleDetail.setSalerName(String.valueOf(user.getUserId()));
|
|
|
+ saleDetailDto.setSalerName(String.valueOf(user.getUserId()));
|
|
|
}
|
|
|
- appStatisticsVo.valueIsZero();
|
|
|
- List<Long> orderIds = orderItemsService.getAppSaleDetailList(saleDetail);
|
|
|
- if (org.springframework.util.CollectionUtils.isEmpty(orderIds)) {
|
|
|
+ StatisticsVo statisticsVo = new StatisticsVo();
|
|
|
+ statisticsVo.valueIsZero();
|
|
|
+ List<SaleDetailDto> saleDetailDtoList = orderItemsService.saleDetailList(saleDetailDto);
|
|
|
+ if (org.springframework.util.CollectionUtils.isEmpty(saleDetailDtoList)) {
|
|
|
return R.data(appStatisticsVo);
|
|
|
}
|
|
|
List<PjOrder> pjOrderList = orderMapper.selectList(new LambdaQueryWrapper<PjOrder>()
|
|
|
.eq(PjOrder::getTenantId, user.getTenantId())
|
|
|
.eq(PjOrder::getIsDeleted, 0)
|
|
|
- .in(PjOrder::getId, orderIds)
|
|
|
+ .in(PjOrder::getOrdNo, saleDetailDtoList.stream().map(SaleDetailDto::getOrdNo).distinct().collect(Collectors.toList()))
|
|
|
);
|
|
|
if (org.springframework.util.CollectionUtils.isEmpty(pjOrderList)) {
|
|
|
return R.data(appStatisticsVo);
|
|
|
@@ -4819,41 +4824,99 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
|
|
|
List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
|
|
|
.eq(PjOrderItems::getIsDeleted, 0)
|
|
|
.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
|
|
|
- .in(PjOrderItems::getPid, orderIds));
|
|
|
+ .in(PjOrderItems::getPid, pjOrderList.stream().map(PjOrder::getId).collect(Collectors.toList())));
|
|
|
if (org.springframework.util.CollectionUtils.isEmpty(pjOrderItemsList)) {
|
|
|
return R.data(appStatisticsVo);
|
|
|
}
|
|
|
- List<String> purchaseList = Arrays.asList(BsTypeEnum.PROCUREMENT.info, BsTypeEnum.FINANCING_PROCUREMENT.info, BsTypeEnum.REFUND_PROCUREMENT.info);
|
|
|
- List<Long> saleOrderIds = pjOrderList.stream().filter(e -> e.getBsType().equals(BsTypeEnum.SALE.info)).map(PjOrder::getId).collect(Collectors.toList());
|
|
|
- List<Long> purchaseOrderIds = pjOrderList.stream().filter(e -> purchaseList.contains(e.getBsType()) && !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
|
|
|
- // 销售金额
|
|
|
- BigDecimal income = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid())).map(p -> p.getGoodsNum().multiply(p.getPrice())).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- BigDecimal freightAmount = pjOrderList.stream().filter(e -> e.getBsType().equals(BsTypeEnum.SALE.info)).map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- // 支出-采购金额 primary_goods_total_amount
|
|
|
- BigDecimal expenditure = pjOrderItemsList.stream().filter(e -> purchaseOrderIds.contains(e.getPid())).map(PjOrderItems::getPrimaryGoodsTotalAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
-
|
|
|
- //成本
|
|
|
- BigDecimal cost = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid())).map(p -> p.getGoodsNum().multiply(p.getCostpriePrice())).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- // 退货成本
|
|
|
- BigDecimal returnsCost = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid()) && Objects.nonNull(e.getReturnsNumber())
|
|
|
- && BigDecimal.ZERO.compareTo(e.getReturnsNumber()) != 0).map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- cost = cost.subtract(returnsCost);
|
|
|
- // 退货金额
|
|
|
- BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid())).map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- income = income.add(freightAmount).subtract(returnsAmount);
|
|
|
- //利润
|
|
|
- BigDecimal profit = income.subtract(cost);
|
|
|
-
|
|
|
- //平均客单价
|
|
|
- BigDecimal averageAmount = income.divide(new BigDecimal(saleOrderIds.size()), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP);
|
|
|
-
|
|
|
- appStatisticsVo.setIncome(income);
|
|
|
- appStatisticsVo.setProfit(profit);
|
|
|
- appStatisticsVo.setCost(cost);
|
|
|
- appStatisticsVo.setReturnsCost(returnsCost);
|
|
|
- appStatisticsVo.setAverageAmount(averageAmount);
|
|
|
+ for (PjOrder item : pjOrderList) {
|
|
|
+ List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoList.stream().filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
|
|
|
+ if (org.springframework.util.CollectionUtils.isEmpty(saleDetailDtoList1)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())
|
|
|
+ && !"线下退款".equals(e.getRefundType())).map(PjOrderItems::getReturnsAmount)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal amount = item.getPaymentAmountTl().subtract(returnsAmount);
|
|
|
+ amount = amount.abs();
|
|
|
+ for (SaleDetailDto items : saleDetailDtoList1) {
|
|
|
+ PjOrderItems orderItems = pjOrderItemsList.stream().filter(e -> e.getId().equals(items.getItemId())).findFirst().orElse(null);
|
|
|
+ if (orderItems != null) {
|
|
|
+ items.setItemRemarks(orderItems.getRemarks());
|
|
|
+ items.setGoodsNum(orderItems.getGoodsNum());
|
|
|
+ items.setPrice(orderItems.getPrice());
|
|
|
+ items.setSubTotalMoney(orderItems.getGoodsNum().multiply(orderItems.getPrice()));
|
|
|
+ items.setSubTotalMoney(items.getSubTotalMoney().add(item.getFreight()));
|
|
|
+ items.setProfit(items.getSubTotalMoney().subtract(items.getCostprie()));
|
|
|
+ items.setReturnsNumber(orderItems.getReturnsNumber());
|
|
|
+ items.setReturnsAmount(orderItems.getReturnsAmount());
|
|
|
+ items.setOutGoodsTotalShipNum(orderItems.getOutGoodsTotalShipNum());
|
|
|
+ items.setOutGoodsTotalShipAmount(orderItems.getOutGoodsTotalShipAmount());
|
|
|
+ items.setPrimaryGoodsTotalNum(orderItems.getPrimaryGoodsTotalNum());
|
|
|
+ items.setPrimaryGoodsTotalMoney(orderItems.getPrimaryGoodsTotalAmount());
|
|
|
+ items.setCostpriePrice(orderItems.getCostpriePrice());
|
|
|
+ }
|
|
|
+ if (OrderStatusEnum.CANCELLED.value.equals(items.getStatus())) {
|
|
|
+ // 已取消的
|
|
|
+ items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
|
|
|
+ items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
|
|
|
+ items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (BsTypeEnum.REFUND_SALE.info.equals(item.getBsType()) || BsTypeEnum.REFUND_PROCUREMENT.info.equals(item.getBsType())) {
|
|
|
+ if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
|
|
|
+ items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
|
|
|
+ amount = amount.subtract(items.getSubTotalMoney().abs());
|
|
|
+ } else {
|
|
|
+ items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO.subtract(items.getSubTotalMoney().abs().subtract(amount)));
|
|
|
+ amount = FinalMap.ZERO_POINT_ZERO;
|
|
|
+ }
|
|
|
+ items.setGoodsNum(FinalMap.ZERO_POINT_ZERO.subtract(items.getReturnsNumber()));
|
|
|
+ items.setSubTotalMoney(FinalMap.ZERO_POINT_ZERO.subtract(items.getReturnsAmount()).subtract(item.getFreight()));
|
|
|
+ items.setFreight(FinalMap.ZERO_POINT_ZERO.subtract(items.getFreight()));
|
|
|
+ BigDecimal costPrice = items.getReturnsNumber().multiply(items.getCostpriePrice());
|
|
|
+ BigDecimal profit = items.getSubTotalMoney().abs().subtract(costPrice);
|
|
|
+ items.setProfit(FinalMap.ZERO_POINT_ZERO.subtract(profit));
|
|
|
+ items.setCostprie(FinalMap.ZERO_POINT_ZERO.subtract(costPrice));
|
|
|
+ items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
|
|
|
+ items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
|
|
|
+ items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
|
|
|
+ amount = amount.subtract(items.getSubTotalMoney());
|
|
|
+ } else {
|
|
|
+ items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
|
|
|
+ amount = FinalMap.ZERO_POINT_ZERO;
|
|
|
+ }
|
|
|
+ items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
|
|
|
+ items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 已取消的金额 --subTotalMoneyCancel
|
|
|
+ BigDecimal subTotalMoneyCancel = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
|
|
|
+ .map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .setScale(0, RoundingMode.HALF_UP).abs();
|
|
|
+ // 实际金额
|
|
|
+ BigDecimal subTotalMoneyActual = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
|
|
|
+ .map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .setScale(0, RoundingMode.HALF_UP);
|
|
|
+ // 实际成本金额
|
|
|
+ BigDecimal costprieActual = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
|
|
|
+ .map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .setScale(0, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal expenditure = orderMapper.expenditureSum(saleDetailDto);
|
|
|
+ // 已取消的成本金额
|
|
|
+ BigDecimal costprieCancel = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
|
|
|
+ .map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
+ .setScale(0, RoundingMode.HALF_UP).abs();
|
|
|
+
|
|
|
+ long xsCount = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()) && e.getBsType().equals("销售")).count();
|
|
|
+ appStatisticsVo.setIncome(subTotalMoneyActual.abs().add(subTotalMoneyCancel));
|
|
|
+ appStatisticsVo.setCost(costprieActual.abs().add(costprieCancel));
|
|
|
+ appStatisticsVo.setProfit(appStatisticsVo.getIncome().subtract(appStatisticsVo.getCost()));
|
|
|
+ appStatisticsVo.setAverageAmount(appStatisticsVo.getIncome().divide(new BigDecimal(xsCount), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
|
|
|
appStatisticsVo.setExpenditure(expenditure);
|
|
|
- appStatisticsVo.setFreightAmount(freightAmount);
|
|
|
return R.data(appStatisticsVo);
|
|
|
}
|
|
|
|