Explorar el Código

app 经营分析数据与pc统计销售一致

liyuan hace 2 meses
padre
commit
bb49485335

+ 2 - 2
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.xml

@@ -507,10 +507,10 @@
             and po.actual_payment_status =#{actualPaymentStatus}
         </if>
         <if test="businesDateStart !=null and businesDateStart !=''">
-            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;= #{businesDateStart}
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;=  DATE_FORMAT(#{businesDateStart},'%Y-%m-%d')
         </if>
         <if test="businesDateEnd !=null and businesDateEnd !=''">
-            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{businesDateEnd}
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;=  DATE_FORMAT(#{businesDateEnd},'%Y-%m-%d')
         </if>
         <if test="dateStart !=null and dateStart !=''">
             and DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') &gt;= #{dateStart}

+ 8 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.java

@@ -145,4 +145,12 @@ public interface OrderMapper extends BaseMapper<PjOrder> {
 	 * @return 结果
 	 */
 	BigDecimal getPendingPaymentSum(@Param("tenantId") String tenantId);
+
+	/**
+	 * 获取支出金额和
+	 *
+	 * @param saleDetailDto 参数
+	 * @return 结果
+	 */
+	BigDecimal expenditureSum(SaleDetail saleDetailDto);
 }

+ 23 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml

@@ -1027,7 +1027,7 @@
              pcd.is_deleted = '0'
           AND pcd.tenant_id = #{tenantId}
         <if test="salesCompanyId != null and salesCompanyId != ''">
-            and po.sales_company_id = #{salesCompanyId}
+            and pcd.sales_company_id = #{salesCompanyId}
         </if>
         group by pcd.id
         order by unpaidAmount desc
@@ -1074,4 +1074,26 @@
           AND pcd.tenant_id = #{tenantId}
 
     </select>
+    <select id="expenditureSum" resultType="java.math.BigDecimal"
+            parameterType="org.springblade.salesPart.dto.SaleDetail">
+        select SUM(poi.price * poi.send_num) from pjpf_order po inner join  pjpf_order_items poi on po.id = poi.pid
+        where po.is_deleted = 0 and poi.is_deleted = 0
+        AND po.bs_type = 'CG'
+        AND poi.tenant_id = #{tenantId}
+        AND po.tenant_id = #{tenantId}
+        and poi.refund_type = '未退款'
+        and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货,待收货')
+        <if test="salesCompanyId !=null and salesCompanyId != ''">
+            and find_in_set(po.sales_company_id,#{salesCompanyId})
+        </if>
+        <if test="salerName !=null and salerName != ''">
+            and po.saler_name like concat('%', #{salerName}, '%')
+        </if>
+        <if test="businesDateStart !=null and businesDateStart !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;=  DATE_FORMAT(#{businesDateStart},'%Y-%m-%d')
+        </if>
+        <if test="businesDateEnd !=null and businesDateEnd !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;=  DATE_FORMAT(#{businesDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
 </mapper>

+ 104 - 41
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

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