Bläddra i källkod

规格订单数据统计

zoujiajian 7 månader sedan
förälder
incheckning
cfa324817b

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsDonSkuStatisticsData;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: GoodsDonSkuStatisticsDataMapper
+ * 创建者: JavaZou
+ * 创建时间:2026/1/21 17:46
+ */
+public interface GoodsDonSkuStatisticsDataMapper extends BaseMapper<GoodsDonSkuStatisticsData> {
+}

+ 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);
 

+ 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;
 }

+ 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

+ 101 - 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))).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,107 @@ 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() == 1) {
+						singleSkuIds.add(sku.getId());
+						continue;
+					}
+					if (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> singleOrders) {
+		GoodsDonSkuStatisticsData skuStatisticsData = new GoodsDonSkuStatisticsData();
+		skuStatisticsData.setGoodsId(goodsId);
+		skuStatisticsData.setType(type);
+		//用户数
+		skuStatisticsData.setNumOfUser(singleOrders.stream().map(OrderDon::getUserId).collect(Collectors.toSet()).size());
+		getNumOfOrderByPayType(singleOrders, skuStatisticsData);
+
+		//兑换码订单数
+		List<OrderDon> subExCodeOrders = Optional.ofNullable(singleOrders.stream().filter(order -> order.getType() == OrderDon.Type.EX_CODE).collect(Collectors.toList())).orElse(new ArrayList<>());
+		skuStatisticsData.setNumOfCodeOrder(subExCodeOrders.size());
+		skuStatisticsData.setNumOfOrder(singleOrders.size());
+
+		Optional<BigDecimal> reduce = singleOrders.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+		BigDecimal totalMoney = BigDecimal.valueOf(0);
+		if (reduce.isPresent()) {
+			totalMoney = reduce.get();
+		}
+		//金额
+		skuStatisticsData.setMoney(totalMoney);
+		//分销订单
+		List<OrderDon> distributeOrders = Optional.ofNullable(singleOrders.stream().filter(ord -> ord.getIsDistribute()).collect(Collectors.toList())).orElse(new ArrayList<>());
+		skuStatisticsData.setNumOfDistributeOrder(distributeOrders.size());
+		Optional<BigDecimal> distributeMoney = singleOrders.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+		skuStatisticsData.setDistributeOrderMoney(distributeMoney.isPresent() ? distributeMoney.get() : BigDecimal.ZERO);
+		return skuStatisticsData;
+	}
+
 	/**
 	 * 根据不同支付条件统计对应月、季、年订单
 	 */

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

@@ -92,6 +92,8 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private final UserMirrorShopMapper userMirrorShopMapper;
 
+	private final GoodsDonSkuStatisticsDataMapper goodsDonSkuStatisticsDataMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -1023,6 +1025,10 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 				if (goodsDon != null) {
 					data.setAccountName(goodsDon.getTitle());
 				}
+				//开启规格详情数据统计
+				if (goodsDon.getIsSkuStatistics()) {
+					data.setSubDataList(goodsDonSkuStatisticsDataMapper.selectList(Wrappers.lambdaQuery(GoodsDonSkuStatisticsData.class).eq(GoodsDonSkuStatisticsData::getGoodsId, goodsDon.getId()).eq(GoodsDonSkuStatisticsData::getStatisticsDate, data.getStatisticsDate())));
+				}
 				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);
 	}