Prechádzať zdrojové kódy

Merge branch 'is_sku_sts'

zoujiajian 7 mesiacov pred
rodič
commit
d887d3e43f

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonSkuStatisticsDataMapper.java

@@ -0,0 +1,18 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsDonSkuStatisticsData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: GoodsDonSkuStatisticsDataMapper
+ * 创建者: JavaZou
+ * 创建时间:2026/1/21 17:46
+ */
+public interface GoodsDonSkuStatisticsDataMapper extends BaseMapper<GoodsDonSkuStatisticsData> {
+	List<GoodsDonSkuStatisticsData> statisticsStreamingSkuData(@Param("goodsId") Long goodsId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
+}

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -97,7 +97,7 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 
 	Map<String, Object> selectUserMIrrorShopDistributeOrderDetail(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 
-	List<DistributeOrderStatisticsDataView> getDistributeOrderView(@Param("goodsId") Long goodsId, @Param("start") String start, @Param("end") String end, @Param("isGeneral") Boolean isGeneral, @Param("chain") Integer chain);
+	List<DistributeOrderStatisticsDataView> getDistributeOrderView(@Param("goodsId") Long goodsId, @Param("skuIds") List<Long> skuIds, @Param("start") String start, @Param("end") String end, @Param("isGeneral") Boolean isGeneral, @Param("chain") Integer chain);
 
 	Integer hasPaymentAiGoods(Long userId);
 

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/AbstractBackData.java

@@ -67,7 +67,7 @@ public abstract class AbstractBackData {
 	/**
 	 * 退款金额
 	 */
-	private BigDecimal refundMoney;
+	private BigDecimal refundMoney = BigDecimal.ZERO;
 
 	/**
 	 * 创建时间

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java

@@ -264,6 +264,11 @@ public class GoodsDon extends BaseEntity {
      */
     private Boolean isSubscribeAlert;
 
+    /**
+     * 是否开启规格详情数据统计
+     */
+    private Boolean isSkuStatistics;
+
     @AllArgsConstructor
     @Getter
     public enum SpecialType {

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSkuStatisticsData.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: GoodsDonSkuStatisticsData
+ * 创建者: JavaZou
+ * 创建时间:2026/1/21 17:41
+ */
+@Getter
+@Setter
+public class GoodsDonSkuStatisticsData extends AbstractBackData{
+	private Long goodsId;
+
+	/**
+	 * 0.共享,1.独立 2.镜像
+	 */
+	private Integer type;
+
+	/**
+	 * 兑换码订单
+	 */
+	private Integer numOfCodeOrder;
+}

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/StreamingAccountData.java

@@ -1,8 +1,12 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /*
  *项目名: netflix
  *文件名: StreamingAccount
@@ -26,4 +30,9 @@ public class StreamingAccountData extends AbstractBackData {
 	 * 兑换码订单
 	 */
 	private Integer numOfCodeOrder;
+
+
+	@TableField(exist = false)
+	@DbIgnore
+	private List<GoodsDonSkuStatisticsData> subDataList;
 }

+ 30 - 0
netflix-dao/src/main/resources/mapper/GoodsDonSkuStatisticsDataMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.GoodsDonSkuStatisticsDataMapper">
+
+    <select id="statisticsStreamingSkuData" resultType="com.cyksj.model.entity.GoodsDonSkuStatisticsData">
+        select goods_id,
+        `type`,
+        sum(num_of_user) as num_of_user,
+        sum(num_of_order) as num_of_order,
+        cast(sum(money)/100 as decimal(20,2)) as money,
+        sum(num_of_month_order) as num_of_month_order,
+        sum(num_of_season_order) as num_of_season_order,
+        sum(num_of_year_order) as num_of_year_order,
+        sum(num_of_code_order) as num_of_code_order,
+        sum(num_of_distribute_order) as numOfDistributeOrder,
+        sum(distribute_order_money) as distributeOrderMoney
+        from `goods_don_sku_statistics_data`
+        <where>
+            goods_id = #{goodsId}
+            <if test="startDate != null">
+                and statistics_date >= #{startDate}
+            </if>
+            <if test="endDate != null">
+                and statistics_date &lt; #{endDate}
+            </if>
+        </where>
+        group by goods_id,`type`
+    </select>
+</mapper>

+ 6 - 0
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -572,6 +572,12 @@
         where o.`status` not in ('close','noPayment','refund')
         and o.created_time BETWEEN #{start} and #{end}
         and o.goods_id = #{goodsId}
+        <if test="skuIds != null">
+            and o.sku_id in
+            <foreach collection="skuIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
         <if test="isGeneral != null">
             <if test="isGeneral">
                 and ud.id is null

+ 106 - 4
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataDayServiceImpl.java

@@ -231,7 +231,7 @@ public class StatisticsDataDayServiceImpl implements StatisticsDataDayService {
 			Long goodsId = goods.getId();
 			streamingAccount.setAccountName(goods.getTitle());
 			streamingAccount.setGoodsId(goodsId);
-			streamingAccountDataStatistics(goodsId, streamingAccount, streamingAccountDataSave, yesZeroDate, thisZeroDate);
+			streamingAccountDataStatistics(goodsId, goods.getIsSkuStatistics(), streamingAccount, streamingAccountDataSave, yesZeroDate, thisZeroDate);
 		});
 		if (today) {
 			return streamingAccountDataSave;
@@ -295,10 +295,10 @@ public class StatisticsDataDayServiceImpl implements StatisticsDataDayService {
 	 * @param yesZeroDate          昨日零时
 	 * @param thisZeroDate         今日零时
 	 */
-	private void streamingAccountDataStatistics(Long goodsId, StreamingAccountData streamingAccountData, List<StreamingAccountData> dataSave, Date yesZeroDate, Date thisZeroDate) {
+	private void streamingAccountDataStatistics(Long goodsId, Boolean isSkuStatistics, StreamingAccountData streamingAccountData, List<StreamingAccountData> dataSave, Date yesZeroDate, Date thisZeroDate) {
 		//规格
-		List<GoodsDonSku> list = Optional.ofNullable(goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goodsId).select(GoodsDonSku::getId))).orElse(new ArrayList<>());
-		List<Long> skuIds = list.stream().map(GoodsDonSku::getId).collect(Collectors.toList());
+		List<GoodsDonSku> skuList = Optional.ofNullable(goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goodsId).select(GoodsDonSku::getId, GoodsDonSku::getIsMirror, GoodsDonSku::getNum))).orElse(new ArrayList<>());
+		List<Long> skuIds = skuList.stream().map(GoodsDonSku::getId).collect(Collectors.toList());
 		if (CollUtil.isNotEmpty(skuIds)) {
 			List<OrderDon> orderDons = Optional.ofNullable(accountService.getNoAppleOneOrderDon(skuIds, yesZeroDate, thisZeroDate, Constant.noOrderStatus)).orElse(new ArrayList<>());
 			//用户数
@@ -320,10 +320,112 @@ public class StatisticsDataDayServiceImpl implements StatisticsDataDayService {
 			streamingAccountData.setNumOfDistributeOrder(distributeOrders.size());
 			Optional<BigDecimal> distributeMoney = distributeOrders.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
 			streamingAccountData.setDistributeOrderMoney(distributeMoney.isPresent() ? distributeMoney.get() : BigDecimal.ZERO);
+
+			//开启规格详情数据统计
+			if (isSkuStatistics) {
+				//镜像规格
+				List<Long> mirrorSkuIds = new ArrayList<>();
+				//独立规格
+				List<Long> singleSkuIds = new ArrayList<>();
+				//共享规格
+				List<Long> moreSkuIds = new ArrayList<>();
+				for (GoodsDonSku sku : skuList) {
+					if (sku.getIsMirror()) {
+						mirrorSkuIds.add(sku.getId());
+						continue;
+					}
+					if (sku.getNum() != null && sku.getNum() == 1) {
+						singleSkuIds.add(sku.getId());
+						continue;
+					}
+					if (sku.getNum() != null && sku.getNum() > 1) {
+						moreSkuIds.add(sku.getId());
+						continue;
+					}
+				}
+
+				//镜像订单
+				List<OrderDon> mirrorOrders = null;
+				if (CollUtil.isNotEmpty(mirrorSkuIds)) {
+					mirrorOrders = new ArrayList<>();
+				}
+				//独立订单
+				List<OrderDon> singleOrders = null;
+				if (CollUtil.isNotEmpty(singleSkuIds)) {
+					singleOrders = new ArrayList<>();
+				}
+				//共享订单
+				List<OrderDon> moreOrders = null;
+				if (CollUtil.isNotEmpty(moreSkuIds)) {
+					moreOrders = new ArrayList<>();
+				}
+				for (OrderDon orderDon : orderDons) {
+					if (CollUtil.isNotEmpty(mirrorSkuIds) && mirrorSkuIds.contains(orderDon.getSkuId())) {
+						mirrorOrders.add(orderDon);
+						continue;
+					}
+					if (CollUtil.isNotEmpty(singleSkuIds) && singleSkuIds.contains(orderDon.getSkuId())) {
+						singleOrders.add(orderDon);
+						continue;
+					}
+					if (CollUtil.isNotEmpty(moreSkuIds) && moreSkuIds.contains(orderDon.getSkuId())) {
+						moreOrders.add(orderDon);
+						continue;
+					}
+				}
+				List<GoodsDonSkuStatisticsData> subDataList = new ArrayList<>();
+				//共享订单
+				if (CollUtil.isNotEmpty(moreOrders)) {
+					subDataList.add(handleSubTypeOrdersData(goodsId, 0, moreOrders));
+				}
+				//独立订单
+				if (CollUtil.isNotEmpty(singleOrders)) {
+					subDataList.add(handleSubTypeOrdersData(goodsId, 1, singleOrders));
+				}
+				//镜像订单
+				if (CollUtil.isNotEmpty(mirrorOrders)) {
+					subDataList.add(handleSubTypeOrdersData(goodsId, 2, mirrorOrders));
+				}
+				//规格详情
+				streamingAccountData.setSubDataList(subDataList);
+			}
 		}
 		dataSave.add(streamingAccountData);
 	}
 
+	private GoodsDonSkuStatisticsData handleSubTypeOrdersData(Long goodsId, Integer type, List<OrderDon> orderDons) {
+		GoodsDonSkuStatisticsData skuStatisticsData = new GoodsDonSkuStatisticsData();
+		skuStatisticsData.setGoodsId(goodsId);
+		skuStatisticsData.setType(type);
+		//用户数
+		skuStatisticsData.setNumOfUser(orderDons.stream().map(OrderDon::getUserId).collect(Collectors.toSet()).size());
+		getNumOfOrderByPayType(orderDons, skuStatisticsData);
+
+		//兑换码订单数
+		List<OrderDon> subExCodeOrders = Optional.ofNullable(orderDons.stream().filter(order -> order.getType() == OrderDon.Type.EX_CODE).collect(Collectors.toList())).orElse(new ArrayList<>());
+		skuStatisticsData.setNumOfCodeOrder(subExCodeOrders.size());
+		skuStatisticsData.setNumOfOrder(orderDons.size());
+
+		Optional<BigDecimal> reduce = orderDons.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+		BigDecimal totalMoney = BigDecimal.valueOf(0);
+		if (reduce.isPresent()) {
+			totalMoney = reduce.get();
+		}
+		//金额
+		skuStatisticsData.setMoney(totalMoney);
+		//退款金额
+		Optional<BigDecimal> refundMoney = orderDons.stream().filter(od -> od.getStatus() == OrderDon.Status.refund).map(re -> Optional.ofNullable(re.getRefundMoney()).orElse(BigDecimal.ZERO)).reduce(BigDecimal::add);
+		if (refundMoney.isPresent()) {
+			skuStatisticsData.setRefundMoney(refundMoney.get());
+		}
+		//分销订单
+		List<OrderDon> distributeOrders = Optional.ofNullable(orderDons.stream().filter(ord -> ord.getIsDistribute()).collect(Collectors.toList())).orElse(new ArrayList<>());
+		skuStatisticsData.setNumOfDistributeOrder(distributeOrders.size());
+		Optional<BigDecimal> distributeMoney = distributeOrders.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+		skuStatisticsData.setDistributeOrderMoney(distributeMoney.isPresent() ? distributeMoney.get() : BigDecimal.ZERO);
+		return skuStatisticsData;
+	}
+
 	/**
 	 * 根据不同支付条件统计对应月、季、年订单
 	 */

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.mange.statistics.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -92,6 +93,8 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private final UserMirrorShopMapper userMirrorShopMapper;
 
+	private final GoodsDonSkuStatisticsDataMapper goodsDonSkuStatisticsDataMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -1011,6 +1014,13 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 				if (data.getNumOfUser() != null && data.getNumOfUser() > 0) {
 					data.setRefundMoney(getRefundMoney(data.getGoodsId(), null, startDate, endDate));
 					data.setMoney(data.getMoney().divide(BigDecimal.valueOf(100)));
+					List<GoodsDonSkuStatisticsData> subDataList = data.getSubDataList();
+					if (CollUtil.isNotEmpty(subDataList)) {
+						subDataList.forEach(sub->{
+							sub.setRefundMoney(sub.getRefundMoney().divide(BigDecimal.valueOf(100)));
+							sub.setMoney(sub.getMoney().divide(BigDecimal.valueOf(100)));
+						});
+					}
 					return true;
 				}
 				return false;
@@ -1023,6 +1033,10 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 				if (goodsDon != null) {
 					data.setAccountName(goodsDon.getTitle());
 				}
+				//开启规格详情数据统计
+				if (goodsDon.getIsSkuStatistics()) {
+					data.setSubDataList(goodsDonSkuStatisticsDataMapper.statisticsStreamingSkuData(goodsDon.getId(), startDate, endDate));
+				}
 				data.setRefundMoney(getRefundMoney(data.getGoodsId(), null, startDate, endDate));
 			}));
 			backgroundDataView.setStreamAccountDataViews(streamingAccountData);

+ 3 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -702,11 +702,11 @@ public class StatisticsDataController {
 	 * 商品渠道分销趋势
 	 *
 	 * @param isGeneral true 普通推广 false 渠道推广
-	 * @param chain 1.日环比 2.月环比 3.年环比
+	 * @param chain     1.日环比 2.月环比 3.年环比
 	 */
 	@GetMapping("/get/distributeOrder/brokenLine")
-	public Result<List<DistributeOrderStatisticsDataView>> getDistributeOrderView(Long goodsId, String first, String end, Boolean isGeneral, @RequestParam(defaultValue = "1") Integer chain) {
-		List<DistributeOrderStatisticsDataView> dataList = orderDonMapper.getDistributeOrderView(goodsId, first, end, isGeneral, chain);
+	public Result<List<DistributeOrderStatisticsDataView>> getDistributeOrderView(Long goodsId, @RequestParam(value = "skuIds", required = false) List<Long> skuIds, String first, String end, Boolean isGeneral, @RequestParam(defaultValue = "1") Integer chain) {
+		List<DistributeOrderStatisticsDataView> dataList = orderDonMapper.getDistributeOrderView(goodsId, skuIds, first, end, isGeneral, chain);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(dataList);
 	}