Ver Fonte

add 数据统计导出接口

zoujiajian há 3 anos atrás
pai
commit
d47de352a9

+ 4 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -63,4 +63,8 @@ public interface Constant {
 	List<String> serviceKeys = List.of("service_img_set", "service_name_set");
 
 	List<Long> dsGoodsIds = List.of(1l, 2l);
+
+	List<String> payType = List.of("月", "季", "年");
+
+	List<String> registerAccount = List.of("apple", "spotify", "google");
 }

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsUserDataMapper.java

@@ -1,11 +1,15 @@
 package com.cyksj.mapper.manage.statistics;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.RegisterOrderDon;
 import com.cyksj.model.entity.StatisticsUserData;
+import com.cyksj.model.excel.statistics.ExcelRealGoodsData;
+import com.cyksj.model.excel.statistics.ExcelStreamingAccountData;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 import java.util.Date;
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -31,4 +35,21 @@ public interface StatisticsUserDataMapper extends BaseMapper<StatisticsUserData>
 
 	@Select("select count(*) from user_distribute_shared where created_time between #{yesZeroDate} and #{thisZeroDate}")
 	Integer getNumOfDistributeUserToday(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	@Select("select goods_id from `streaming_account_data` sd where statistics_date between #{start} and #{end} group by goods_id")
+	List<Long> getAllStreaming(@Param("start") String start, @Param("end") String end);
+
+	ExcelStreamingAccountData getExportStreamingAccountData(@Param("goodsId") Long goodsId, @Param("isDis") Boolean isDis, @Param("isCode") Boolean isCode, @Param("start") String start, @Param("end") String end);
+
+	Integer getTypeData(@Param("goodsId") Long goodsId, @Param("type") String type, @Param("start") String start, @Param("end") String end);
+
+	@Select("select goods_id from `real_goods_data` sd where statistics_date between #{start} and #{end} group by goods_id")
+	List<Long> getAllRealGoods(@Param("start") String start, @Param("end") String end);
+
+	ExcelRealGoodsData getExportGoodsDonDataBySkuId(@Param("skuId") Long skuId, @Param("start") String start, @Param("end") String end);
+
+	List<RegisterOrderDon> getPlatformHasPaymentOrders(@Param("platform") String platform, @Param("start") String start, @Param("end") String end);
+
+	@Select("select goods_id from `statistics_fashion_goods_data` sd where statistics_date between #{start} and #{end} group by goods_id")
+	List<Long> getAllFashionGoods(@Param("start") String start, @Param("end") String end);
 }

+ 77 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/statistics/ExcelAppleOneData.java

@@ -0,0 +1,77 @@
+package com.cyksj.model.excel.statistics;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelAppleOneData
+ *创建者: JavaZou
+ *创建时间:2023/3/14 9:48
+ */
+@Getter
+@Setter
+public class ExcelAppleOneData {
+	/**
+	 * 平台
+	 */
+	@ExcelProperty("区域")
+	private String area;
+
+	/**
+	 * 用户数
+	 */
+	@ExcelProperty("用户数")
+	private Integer numOfUser;
+
+	/**
+	 * 订单
+	 */
+	@ExcelProperty("订单数")
+	private Integer numOfOrder;
+
+	/**
+	 * 兑换订单
+	 */
+	@ExcelProperty("兑换订单数")
+	private Integer numOfExCodeOrder;
+
+	/**
+	 * 金额
+	 */
+	@ExcelProperty("金额")
+	private BigDecimal money;
+
+	/**
+	 * 月付单数
+	 */
+	@ExcelProperty("月付单数")
+	private Integer month;
+
+	/**
+	 * 季付单数
+	 */
+	@ExcelProperty("季付单数")
+	private Integer season;
+
+	/**
+	 * 年付单数
+	 */
+	@ExcelProperty("年付单数")
+	private Integer year;
+
+	/**
+	 * 分销单数
+	 */
+	@ExcelProperty("分销单数")
+	private Integer disOrder;
+
+	/**
+	 * 分销金额
+	 */
+	@ExcelProperty("分销金额")
+	private BigDecimal disMoney;
+}

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/statistics/ExcelFashionData.java

@@ -0,0 +1,32 @@
+package com.cyksj.model.excel.statistics;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelFashionData
+ *创建者: JavaZou
+ *创建时间:2023/3/14 16:42
+ */
+@Getter
+@Setter
+public class ExcelFashionData {
+	@ExcelProperty("名称")
+	private String name;
+
+	@ExcelProperty("规格")
+	private String specVal;
+
+	@ExcelProperty("用户数")
+	private Integer numOfUser;
+
+	@ExcelProperty("订单数")
+	private Integer numOfOrder;
+
+	@ExcelProperty("金额")
+	private BigDecimal money;
+}

+ 35 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/statistics/ExcelRealGoodsData.java

@@ -0,0 +1,35 @@
+package com.cyksj.model.excel.statistics;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelRealGoodsData
+ *创建者: JavaZou
+ *创建时间:2023/3/14 9:49
+ */
+@Getter
+@Setter
+public class ExcelRealGoodsData {
+	/**
+	 * 设备名
+	 */
+	@ExcelProperty("设备名")
+	private String name;
+
+	@ExcelProperty("规格")
+	private String specVal;
+
+	@ExcelProperty("用户数")
+	private Integer numOfUser;
+
+	@ExcelProperty("订单数")
+	private Integer numOfOrder;
+
+	@ExcelProperty("金额")
+	private BigDecimal money;
+}

+ 29 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/statistics/ExcelRegisterAccountData.java

@@ -0,0 +1,29 @@
+package com.cyksj.model.excel.statistics;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelRegisterAccountData
+ *创建者: JavaZou
+ *创建时间:2023/3/14 9:50
+ */
+@Getter
+@Setter
+public class ExcelRegisterAccountData {
+	@ExcelProperty("平台")
+	private String platform;
+
+	@ExcelProperty("用户数")
+	private Integer numOfUser;
+
+	@ExcelProperty("订单数")
+	private Integer numOfOrder;
+
+	@ExcelProperty("金额")
+	private BigDecimal money;
+}

+ 77 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/statistics/ExcelStreamingAccountData.java

@@ -0,0 +1,77 @@
+package com.cyksj.model.excel.statistics;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelStreamingAccountData
+ *创建者: JavaZou
+ *创建时间:2023/3/14 9:49
+ */
+@Getter
+@Setter
+public class ExcelStreamingAccountData {
+	/**
+	 * 平台
+	 */
+	@ExcelProperty("name")
+	private String name;
+
+	/**
+	 * 用户数
+	 */
+	@ExcelProperty("用户数")
+	private Integer numOfUser;
+
+	/**
+	 * 订单
+	 */
+	@ExcelProperty("订单数")
+	private Integer numOfOrder;
+
+	/**
+	 * 兑换订单
+	 */
+	@ExcelProperty("兑换订单数")
+	private Integer numOfExCodeOrder;
+
+	/**
+	 * 金额
+	 */
+	@ExcelProperty("金额")
+	private BigDecimal money;
+
+	/**
+	 * 月付单数
+	 */
+	@ExcelProperty("月付单数")
+	private Integer month;
+
+	/**
+	 * 季付单数
+	 */
+	@ExcelProperty("季付单数")
+	private Integer season;
+
+	/**
+	 * 年付单数
+	 */
+	@ExcelProperty("年付单数")
+	private Integer year;
+
+	/**
+	 * 分销单数
+	 */
+	@ExcelProperty("分销单数")
+	private Integer disOrder;
+
+	/**
+	 * 分销金额
+	 */
+	@ExcelProperty("分销金额")
+	private BigDecimal disMoney;
+}

+ 48 - 0
netflix-dao/src/main/resources/mapper/StatisticsUserDataMapper.xml

@@ -0,0 +1,48 @@
+<?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.manage.statistics.StatisticsUserDataMapper">
+
+    <select id="getExportStreamingAccountData"
+            resultType="com.cyksj.model.excel.statistics.ExcelStreamingAccountData">
+        select count(distinct user_id) as numOfUser, count(*) as numOfOrder,ifnull(sum(money)/100,0) as money from
+        `order_don`
+        where sku_id in (select id from `goods_don_sku` where goods_id = #{goodsId})
+        and status not in ('close','noPayment','refund')
+        <if test="isDis!=null and isDis">
+            and is_distribute = 1
+        </if>
+        <if test="isCode!=null and isCode">
+            and `type` = 'EX_CODE'
+        </if>
+        and created_time between #{start} and #{end}
+    </select>
+
+    <select id="getTypeData" resultType="java.lang.Integer">
+        select count(*) as numOfOrder from `order_don` od where
+        sku_id in (select id from `goods_don_sku` where goods_id = #{goodsId} and spec_val like '%${type}%%'
+        <if test="type =='月'.toString()">
+            and spec_val not like '%年%'
+        </if>)
+        and status not in ('close','noPayment','refund')
+        and created_time between #{start} and #{end}
+    </select>
+
+    <select id="getExportRealData" resultType="com.cyksj.model.excel.statistics.ExcelRealGoodsData">
+        select count(distinct user_id) as numOfUser, count(*) as numOfOrder, ifnull(sum(money) / 100, 0) as money
+        from `order_don`
+        where sku_id = #{skuId}
+          and status not in ('close', 'noPayment', 'refund')
+          and created_time between #{start} and #{end}
+    </select>
+
+    <select id="getPlatformHasPaymentOrders" resultType="com.cyksj.model.entity.RegisterOrderDon">
+        select id,
+               platform,
+               money,
+               user_id
+        from `register_order_don`
+        where platform = #{platform}
+          and created_time between #{start} and #{end}
+          and status not in ('close', 'noPayment', 'refund')
+    </select>
+</mapper>

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

@@ -3,6 +3,7 @@ package com.cyksj.service.mange.statistics;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.cyksj.dto.Result;
 import com.cyksj.model.excel.ExcelAccountData;
+import com.cyksj.model.excel.ExcelSheetAndData;
 import com.cyksj.model.views.BackgroundDataView;
 import com.cyksj.model.views.ExpiredAccountDataView;
 
@@ -30,4 +31,9 @@ public interface StatisticsDataService {
 
 	//分销金额数据统计
 	void distribute(BackgroundDataView backgroundDataView, Date startDate, Date endDate);
+
+	/**
+	 * 数据导出
+	 */
+	List<ExcelSheetAndData> exportStatisticsDataByType(Integer type, Long startTime, Long endTime);
 }

+ 193 - 4
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -8,15 +8,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.mapper.GoodsDonMapper;
-import com.cyksj.mapper.GoodsDonSkuMapper;
-import com.cyksj.mapper.GroupsMapper;
-import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.statistics.AppleOneDataMapper;
 import com.cyksj.mapper.manage.statistics.RealGoodsDataMapper;
+import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
 import com.cyksj.mapper.manage.statistics.StreamingAccountDataMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
+import com.cyksj.model.excel.ExcelSheetAndData;
+import com.cyksj.model.excel.statistics.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.views.*;
@@ -68,6 +68,10 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private final GroupsMapper groupsMapper;
 
+	private final OrderDonMapper orderDonMapper;
+
+	private final StatisticsUserDataMapper statisticsUserDataMapper;
+
 	@Override
 	public Result<BackgroundDataView> getStatisticsByCondition(Long startTime, Long endTime) {
 		BackgroundDataView backgroundDataView = new BackgroundDataView();
@@ -228,6 +232,191 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		return GatewayResponse.SUCCESS.newBuilder().toResult("处理状态变更成功");
 	}
 
+	@Override
+	public List<ExcelSheetAndData> exportStatisticsDataByType(Integer type, Long startTime, Long endTime) {
+		String startDate = null;
+		String endDate = null;
+		if (type==null) type = 0;
+		if (startTime != null) {
+			startDate = DateTime.of(startTime).toString();
+		}
+		if (endTime != null) {
+			endDate = DateTime.of(endTime).toString();
+		}
+		List<ExcelSheetAndData> excelSheetDataList = new ArrayList<>();
+		switch (type) {
+			case 1:
+				exportAppleOneData(excelSheetDataList, startDate, endDate);
+				break;
+			case 2:
+				exportStreamingAccountData(excelSheetDataList, startDate, endDate);
+				break;
+			case 3:
+				exportRealGoodsData(excelSheetDataList, startDate, endDate);
+				break;
+			case 4:
+				exportFashionData(excelSheetDataList, startDate, endDate);
+				break;
+			case 5:
+				exportRegisterData(excelSheetDataList, startDate, endDate);
+				break;
+			default:
+				exportAppleOneData(excelSheetDataList, startDate, endDate);
+				exportStreamingAccountData(excelSheetDataList, startDate, endDate);
+				exportRealGoodsData(excelSheetDataList, startDate, endDate);
+				exportFashionData(excelSheetDataList, startDate, endDate);
+				exportRegisterData(excelSheetDataList, startDate, endDate);
+		}
+		return excelSheetDataList;
+	}
+
+	private void exportRegisterData(List<ExcelSheetAndData> excelSheetDataList, String startDate, String endDate) {
+		List<ExcelRegisterAccountData> registerAccountData = new ArrayList<>();
+		Constant.registerAccount.forEach(platform -> {
+			List<RegisterOrderDon> registerOrderDons = statisticsUserDataMapper.getPlatformHasPaymentOrders(platform, startDate, endDate);
+			if (registerOrderDons.isEmpty()) {
+				return;
+			}
+			ExcelRegisterAccountData registerDataExcel = new ExcelRegisterAccountData();
+			registerDataExcel.setPlatform(platform);
+			registerDataExcel.setNumOfOrder(registerOrderDons.size());
+			Set<Long> userSet = registerOrderDons.stream().map(RegisterOrderDon::getUserId).collect(Collectors.toSet());
+			registerDataExcel.setNumOfUser(userSet.size());
+			Optional<BigDecimal> reduce = registerOrderDons.stream().map(RegisterOrderDon::getMoney).reduce(BigDecimal::add);
+			registerDataExcel.setMoney(reduce.isPresent() ? reduce.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
+			registerAccountData.add(registerDataExcel);
+		});
+		if (registerAccountData.isEmpty()) {
+			return;
+		}
+		excelSheetDataList.add(new ExcelSheetAndData("注册账号数据", registerAccountData, ExcelRegisterAccountData.class));
+	}
+
+	private void exportFashionData(List<ExcelSheetAndData> excelSheetDataList, String startDate, String endDate) {
+		List<Long> goodsIds = statisticsUserDataMapper.getAllFashionGoods(startDate, endDate);
+		List<ExcelRealGoodsData> fashionData = new ArrayList<>();
+		goodsIds.forEach(goodsId->{
+			//查找所有规格
+			List<Long> skuIds = goodsDonSkuMapper.selectList(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goodsId)).stream().map(GoodsDonSku::getId).collect(Collectors.toList());
+			skuIds.forEach(skuId -> {
+				//订单数据
+				ExcelRealGoodsData exportData = statisticsUserDataMapper.getExportGoodsDonDataBySkuId(skuId, startDate, endDate);
+				if (exportData == null) {
+					return;
+				}
+				exportData.setName(goodsDonMapper.selectById(goodsId).getTitle());
+				exportData.setSpecVal(goodsDonSkuMapper.selectById(skuId).getSpecVal());
+				if (exportData.getNumOfOrder() != 0) {
+					fashionData.add(exportData);
+				}
+			});
+		});
+		if (fashionData.isEmpty()) {
+			return;
+		}
+		excelSheetDataList.add(new ExcelSheetAndData("潮玩好物", fashionData, ExcelRealGoodsData.class));
+	}
+
+	private void exportRealGoodsData(List<ExcelSheetAndData> excelSheetDataList, String startDate, String endDate) {
+		List<Long> goodsIds = statisticsUserDataMapper.getAllRealGoods(startDate, endDate);
+		List<ExcelRealGoodsData> realGoodsData = new ArrayList<>();
+		goodsIds.forEach(goodsId -> {
+			//查找所有规格
+			List<Long> skuIds = goodsDonSkuMapper.selectList(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goodsId)).stream().map(GoodsDonSku::getId).collect(Collectors.toList());
+			skuIds.forEach(skuId -> {
+				//订单数据
+				ExcelRealGoodsData exportData = statisticsUserDataMapper.getExportGoodsDonDataBySkuId(skuId, startDate, endDate);
+				if (exportData == null) {
+					return;
+				}
+				exportData.setName(goodsDonMapper.selectById(goodsId).getTitle());
+				exportData.setSpecVal(goodsDonSkuMapper.selectById(skuId).getSpecVal());
+				if (exportData.getNumOfOrder() != 0) {
+					realGoodsData.add(exportData);
+				}
+			});
+		});
+		if (realGoodsData.isEmpty()) {
+			return;
+		}
+		excelSheetDataList.add(new ExcelSheetAndData("硬件设备数据", realGoodsData, ExcelRealGoodsData.class));
+	}
+
+	private void exportStreamingAccountData(List<ExcelSheetAndData> excelSheetDataList, String startDate, String endDate) {
+		List<Long> goodsIds = statisticsUserDataMapper.getAllStreaming(startDate, endDate);
+		List<ExcelStreamingAccountData> streamingAccountData = new ArrayList<>();
+		goodsIds.forEach(goodsId -> {
+			//订单数据
+			ExcelStreamingAccountData exportData = statisticsUserDataMapper.getExportStreamingAccountData(goodsId, null, null, startDate, endDate);
+			exportData.setName(goodsDonMapper.selectById(goodsId).getTitle());
+			//兑换单数
+			exportData.setNumOfExCodeOrder(statisticsUserDataMapper.getExportStreamingAccountData(goodsId, null, true, startDate, endDate).getNumOfOrder());
+			//分销记录
+			ExcelStreamingAccountData distributeData = statisticsUserDataMapper.getExportStreamingAccountData(goodsId, true, null, startDate, endDate);
+			exportData.setDisOrder(distributeData.getNumOfOrder());
+			exportData.setDisMoney(distributeData.getMoney() != null ? distributeData.getMoney() : BigDecimal.ZERO);
+			//月、季、年
+			exportData.setMonth(statisticsUserDataMapper.getTypeData(goodsId, Constant.payType.get(0), startDate, endDate));
+			exportData.setSeason(statisticsUserDataMapper.getTypeData(goodsId, Constant.payType.get(1), startDate, endDate));
+			exportData.setYear(statisticsUserDataMapper.getTypeData(goodsId, Constant.payType.get(2), startDate, endDate));
+			streamingAccountData.add(exportData);
+		});
+		if (streamingAccountData.isEmpty()) {
+			return;
+		}
+		excelSheetDataList.add(new ExcelSheetAndData("流媒体账号数据", streamingAccountData, ExcelStreamingAccountData.class));
+	}
+
+	private void exportAppleOneData(List<ExcelSheetAndData> excelSheetDataList, String startDate, String endDate) {
+		Map<String, List<GoodsDonSku>> appleOneMap = statistics.getAppleOneMap();
+		List<ExcelAppleOneData> appleData = new ArrayList<>();
+		appleOneMap.forEach((k,v)->{
+			ExcelAppleOneData appleDataExcel = new ExcelAppleOneData();
+			appleDataExcel.setArea(k);
+			Set<Long> skuIds = v.stream().map(GoodsDonSku::getId).collect(Collectors.toSet());
+			List<OrderDon> orderDons = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class).in(OrderDon::getSkuId, skuIds).notIn(OrderDon::getStatus, Constant.noOrderStatus).between(OrderDon::getCreatedTime, startDate, endDate));
+			appleDataExcel.setNumOfOrder(orderDons.size());
+			Set<Long> userSet = Optional.ofNullable(orderDons.stream().map(OrderDon::getUserId).collect(Collectors.toSet())).orElse(new HashSet<>());
+			appleDataExcel.setNumOfUser(userSet.size());
+			List<OrderDon> exCodeOrders = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getType, OrderDon.Type.EX_CODE)
+					.in(OrderDon::getSkuId, skuIds)
+					.notIn(OrderDon::getStatus, Constant.noOrderStatus).between(OrderDon::getCreatedTime, startDate, endDate));
+			if (orderDons.isEmpty()) {
+				return;
+			}
+			appleDataExcel.setNumOfExCodeOrder(exCodeOrders.size());
+			Optional<BigDecimal> money = orderDons.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+			appleDataExcel.setMoney(money.isPresent() ? money.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
+			List<OrderDon> distributeOrders = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getIsDistribute, true)
+					.in(OrderDon::getSkuId, skuIds)
+					.notIn(OrderDon::getStatus, Constant.noOrderStatus).between(OrderDon::getCreatedTime, startDate, endDate));
+			appleDataExcel.setDisOrder(distributeOrders.size());
+			Optional<BigDecimal> distributeMoney = distributeOrders.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+			appleDataExcel.setDisMoney(distributeMoney.isPresent() ? distributeMoney.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
+			Map<Long, List<OrderDon>> skuMaps = orderDons.stream().collect(Collectors.groupingBy(OrderDon::getSkuId));
+			v.forEach(sku -> {
+				Long skuId = sku.getId();
+				List<OrderDon> dons = Optional.ofNullable(skuMaps.get(skuId)).orElse(new ArrayList<>());
+				if (sku.getSpecVal().contains(Constant.payType.get(0)) && !sku.getSpecVal().contains(Constant.payType.get(2))) {
+					appleDataExcel.setMonth(dons.size());
+				} else if (sku.getSpecVal().contains(Constant.payType.get(1))) {
+					appleDataExcel.setSeason(dons.size());
+				} else if (!sku.getSpecVal().contains(Constant.payType.get(0)) && sku.getSpecVal().contains(Constant.payType.get(2))) {
+					appleDataExcel.setYear(dons.size());
+				}
+			});
+			appleData.add(appleDataExcel);
+		});
+		if (appleData.isEmpty()) {
+			return;
+		}
+		excelSheetDataList.add(new ExcelSheetAndData("Apple One数据", appleData, ExcelAppleOneData.class));
+	}
+
+
+
 	private void getAppleOneDataView(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
 		List<AppleOneData> appleOneData = appleOneDataMapper.statisticsAppleOneData(startDate, endDate);
 		if (DateUtil.beginOfDay(DateTime.now()).equals(startDate) && DateUtil.beginOfDay(DateUtil.offsetDay(DateTime.now(), 1)).equals(endDate)) {

+ 26 - 22
netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java

@@ -55,10 +55,6 @@ public class StatisticsDataScheduler {
 
 	private final static String APPLE_ONE = "Apple One";
 
-	public static List<String> payType = List.of("月", "季", "年");
-
-	private final static List<String> registerAccount = List.of("apple", "spotify", "google");
-
 	private final GoodsDonMapper goodsDonMapper;
 
 	private final RealGoodsDataMapper realGoodsDataMapper;
@@ -163,7 +159,7 @@ public class StatisticsDataScheduler {
 	 */
 	public List<RegisterAccountData> statisticsRegisterAccountData(Date yesZeroDate, Date thisZeroDate, Boolean today) {
 		List<RegisterAccountData> list = new ArrayList<>();
-		registerAccount.forEach(platform -> {
+		Constant.registerAccount.forEach(platform -> {
 			RegisterAccountData entity = Optional.ofNullable(registerOrderDonMapper.registerAccountDataEveryDay(yesZeroDate, thisZeroDate, platform)).orElse(new RegisterAccountData());
 			entity.setPlatform(platform);
 			RegisterAccountData dto = Optional.ofNullable(registerOrderDonMapper.selectRefundOrderDetail(yesZeroDate, thisZeroDate, platform)).orElse(new RegisterAccountData());
@@ -188,20 +184,7 @@ public class StatisticsDataScheduler {
 	 * @return
 	 */
 	public List<AppleOneData> statisticsAppleOneData(Date yesZeroDate, Date thisZeroDate, Boolean today) {
-		GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getTitle, APPLE_ONE).last("limit 1"));
-		List<GoodsDonSku> list = goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goodsDon.getId()).select(GoodsDonSku::getId, GoodsDonSku::getSpecVal));
-		Set<String> area = new HashSet<>();
-		list.forEach(sku -> {
-			String areaName = sku.getSpecVal().substring(0, sku.getSpecVal().indexOf("区") + 1);
-			if (!area.contains(areaName)) {
-				area.add(areaName);
-			}
-		});
-		Map<String, List<GoodsDonSku>> areaDataMap = new HashMap<>();
-		for (String name : area) {
-			List<GoodsDonSku> sku = Optional.ofNullable(goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).like(GoodsDonSku::getSpecVal, name).select(GoodsDonSku::getId, GoodsDonSku::getGoodsId))).orElse(new ArrayList<>());
-			areaDataMap.put(name, sku);
-		}
+		Map<String, List<GoodsDonSku>> areaDataMap = getAppleOneMap();
 
 		List<AbstractBackData> appleOneSave = new ArrayList<>();
 		List<AppleOneData> appleOneData = new ArrayList<>();
@@ -369,11 +352,11 @@ public class StatisticsDataScheduler {
 			List<GoodsDonSku> goodsDonSkus = Optional.ofNullable(goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).in(GoodsDonSku::getId, skuIdMaps.keySet()))).orElse(new ArrayList<>());
 			for (GoodsDonSku donSkus : goodsDonSkus) {
 				int size = skuIdMaps.get(donSkus.getId()).size();
-				if (donSkus.getSpecVal().contains(payType.get(0)) && !donSkus.getSpecVal().contains(payType.get(2))) {
+				if (donSkus.getSpecVal().contains(Constant.payType.get(0)) && !donSkus.getSpecVal().contains(Constant.payType.get(2))) {
 					numOfMonthOrder += size;
-				} else if (donSkus.getSpecVal().contains(payType.get(1))) {
+				} else if (donSkus.getSpecVal().contains(Constant.payType.get(1))) {
 					numOfSeasonOrder += size;
-				} else if (donSkus.getSpecVal().contains(payType.get(2))) {
+				} else if (donSkus.getSpecVal().contains(Constant.payType.get(2))) {
 					numOfYearOrder += size;
 				}
 			}
@@ -385,4 +368,25 @@ public class StatisticsDataScheduler {
 		//年付
 		backData.setNumOfYearOrder(numOfYearOrder);
 	}
+
+	/**
+	 * 获取Apple区域map
+	 */
+	public Map<String, List<GoodsDonSku>> getAppleOneMap() {
+		GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getTitle, APPLE_ONE).last("limit 1"));
+		List<GoodsDonSku> list = goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goodsDon.getId()).select(GoodsDonSku::getId, GoodsDonSku::getSpecVal));
+		Set<String> area = new HashSet<>();
+		list.forEach(sku -> {
+			String areaName = sku.getSpecVal().substring(0, sku.getSpecVal().indexOf("区") + 1);
+			if (!area.contains(areaName)) {
+				area.add(areaName);
+			}
+		});
+		Map<String, List<GoodsDonSku>> areaDataMap = new HashMap<>();
+		for (String name : area) {
+			List<GoodsDonSku> sku = Optional.ofNullable(goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).like(GoodsDonSku::getSpecVal, name).select(GoodsDonSku::getId, GoodsDonSku::getGoodsId))).orElse(new ArrayList<>());
+			areaDataMap.put(name, sku);
+		}
+		return areaDataMap;
+	}
 }

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

@@ -25,6 +25,7 @@ import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
 import com.cyksj.mapper.stock.GoodsDonStockRecordMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
+import com.cyksj.model.excel.ExcelSheetAndData;
 import com.cyksj.model.request.BatchServiceReq;
 import com.cyksj.model.request.RenewTimeUpReq;
 import com.cyksj.model.views.*;
@@ -94,6 +95,16 @@ public class StatisticsDataController {
 		return statisticsDataService.getStatisticsByCondition(startTime, endTime);
 	}
 
+	/**
+	 * 导出统计数据
+	 */
+	@GetMapping("/export")
+	@SaCheckPermission("statics:export")
+	public void exportStatisticsData(Integer type, Long startTime, Long endTime, HttpServletResponse response) {
+		List<ExcelSheetAndData> excelSheetDataList = statisticsDataService.exportStatisticsDataByType(type, startTime, endTime);
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, excelSheetDataList, "统计数据", ExcelTypeEnum.XLSX, null);
+	}
+
 	/**
 	 * 有效子账号数列表
 	 */