浏览代码

fix 统计月度数据导出

zoujiajian 3 年之前
父节点
当前提交
abdf236f73

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

@@ -25,4 +25,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	Integer updateHasPaymentInterestRealGoods();
 
 	void updateHasPaymentInterestRealGoodsPayTime();
+
+	Integer getTowPayUser(@Param("start") String start, @Param("end") String end);
 }

+ 22 - 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.OrderDataExcel;
+import com.cyksj.model.excel.RealGoodsDataExcel;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 import java.util.Date;
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -31,4 +35,22 @@ public interface StatisticsUserDataMapper extends BaseMapper<StatisticsUserData>
 
 	@Select("select count(*) from user where update_time between #{yesZeroDate} and #{thisZeroDate} and login_phone != ''")
 	Integer getPcNumOfActiveUser(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	OrderDataExcel getExportData(@Param("goodsId") Long goodsId, @Param("isDis") Boolean isDis, @Param("isCode") Boolean isCode, @Param("start") String start, @Param("end") String end);
+
+	@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);
+
+	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);
+
+	RealGoodsDataExcel getExportRealData(@Param("skuId") Long skuId, @Param("start") String start, @Param("end") String end);
+
+	@Select("select id from `goods_don_sku` where goods_id = #{goodsId}")
+	List<Long> getAllRealSku(Long goodsId);
+
+	List<RegisterOrderDon> getPlatformHasPaymentOrders(@Param("platform") String platform, @Param("start") String start, @Param("end") String end);
+
 }

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/ExportData.java

@@ -0,0 +1,36 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: ExportData
+ *创建者: JavaZou
+ *创建时间:2022/12/1 15:16
+ */
+@Getter
+@Setter
+public class ExportData {
+	private String name;
+
+	private Integer numOfUser;
+
+	private Integer numOfOrder;
+
+	private Integer numOfExCodeOrder;
+
+	private BigDecimal money;
+
+	private Integer month;
+
+	private Integer season;
+
+	private Integer year;
+
+	private Integer disOrder;
+
+	private BigDecimal disMoney;
+}

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

@@ -0,0 +1,77 @@
+package com.cyksj.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: AppleDataExcel
+ *创建者: JavaZou
+ *创建时间:2022/12/9 14:15
+ */
+@Getter
+@Setter
+public class AppleDataExcel {
+	/**
+	 * 平台
+	 */
+	@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;
+}

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

@@ -0,0 +1,77 @@
+package com.cyksj.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: OrderDataExcel
+ *创建者: JavaZou
+ *创建时间:2022/12/1 17:10
+ */
+@Getter
+@Setter
+public class OrderDataExcel {
+	/**
+	 * 平台
+	 */
+	@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;
+}

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

@@ -0,0 +1,35 @@
+package com.cyksj.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: RealGoodsDataExcel
+ *创建者: JavaZou
+ *创建时间:2022/12/1 17:27
+ */
+@Getter
+@Setter
+public class RealGoodsDataExcel {
+	/**
+	 * 设备名
+	 */
+	@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/RegisterDataExcel.java

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

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

@@ -79,4 +79,14 @@
         where not EXISTS(
                 select id from `order_don` where user_id = s.user_id and goods_id = s.goods_id and status !='close')
     </select>
+
+    <select id="getTowPayUser" resultType="java.lang.Integer">
+        select count(*)
+        from (select user_id
+              from `order_don`
+              where status not in ('close', 'noPayment', 'refund')
+                and created_time between #{start} and #{end}
+              group by user_id
+              having count(*) > 1)s
+    </select>
 </mapper>

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

@@ -0,0 +1,50 @@
+<?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="getExportData" resultType="com.cyksj.model.excel.OrderDataExcel">
+        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>
+        <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.RealGoodsDataExcel">
+        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>

+ 300 - 300
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -1,300 +1,300 @@
-package com.cyksj.task;
-
-import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.cyksj.common.exception.BusinessRuntimeException;
-import com.cyksj.common.util.Jsons;
-import com.cyksj.dto.RedisKey;
-import com.cyksj.mapper.*;
-import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
-import com.cyksj.model.dto.WxMpTemplateData;
-import com.cyksj.model.dto.WxMpTemplateMessage;
-import com.cyksj.model.entity.*;
-import com.cyksj.redis.RedisService;
-import com.cyksj.service.order.OrderDonService;
-import com.cyksj.service.register.RegisterOrderDonService;
-import com.cyksj.service.register.SpotifyService;
-import com.cyksj.service.wechat.WeChatService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.dao.DuplicateKeyException;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static com.cyksj.common.constant.WeChatTemplateConst.EXPIRY_TEMPLATE;
-
-@Component
-@Slf4j
-@RequiredArgsConstructor
-public class Scheduler {
-
-        private final GoodsDonMapper donMapper;
-
-        private final GroupsMapper groupsMapper;
-
-        private final OrderDonService orderDonService;
-
-        private final GroupsRelationMapper groupsRelationMapper;
-
-        private final UserMapper userMapper;
-
-        private final GoodsDonSkuMapper skuMapper;
-        
-        private final WeChatService weChatService;
-        
-        private final AccountMapper accountMapper;
-
-        private final CustomerServiceMapper customerServiceMapper;
-
-        private final SpotifyService spotifyService;
-
-        private final RegisterOrderDonMapper registerOrderDonMapper;
-
-        private final RedisService redisService;
-
-        private final SysConfigMapper sysConfigMapper;
-
-        private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper;
-
-        private final RegisterOrderDonService registerOrderDonService;
-
-        private final AppleAutoRegisterDataMapper appleAutoRegisterDataMapper;
-
-        private final RealGoodsInterestUserMapper realGoodsInterestUserMapper;
-
-
-    /**
-     * 每5分钟清理过期账号
-     */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    @Transactional(rollbackFor = Throwable.class)
-    public void clearExpiry() {
-        DateTime now = new DateTime();
-        List<GroupsRelation> expiryList = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, now));
-        log.info("定时清理过期账号start ===> 数量:{}", expiryList.size());
-        //过期账号清楚有效期
-        expiryList.forEach(relation -> delRelation(relation));
-    }
-
-    @Scheduled(cron = "0 0 9 * * ?")
-    public void expiryWxMsg() throws Exception {
-        DateTime now = new DateTime();
-        DateTime zero = DateUtil.offset(now, DateField.HOUR, -9);
-        DateTime time = DateUtil.offset(zero, DateField.DAY_OF_MONTH, 5);
-        List<GroupsRelation> groupsRelations = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, time));
-        for (GroupsRelation relation : groupsRelations) {
-            User user = userMapper.selectById(relation.getUserId());
-            WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                    .setToUser(user.getOpenId())
-                    .setTemplateId(EXPIRY_TEMPLATE)
-                    .setUrl(" ");
-
-            /**
-             * 您的账号即将到期
-             * 账号名称:Netflix账号
-             * 平台:Netflix
-             * 失效日期:5天后
-             * 异常原因:账号即将到期
-             * 请尽快续费,以免影响使用
-             */
-            GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
-            GoodsDonSku donSku = skuMapper.selectById(groupsTrips.getSkuId());
-            GoodsDon goodsDon = donMapper.selectById(donSku.getGoodsId());
-            WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-            data.setFirst(new WxMpTemplateData("您的账号即将到期"));
-            data.setKeyword1(new WxMpTemplateData(goodsDon.getTitle()));
-            data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
-            data.setKeyword3(new WxMpTemplateData(DateUtil.format(relation.getExpiryTime(), "yyyy-MM-dd HH:mm:ss")));
-            data.setKeyword4(new WxMpTemplateData("账号即将到期"));
-            data.setRemark(new WxMpTemplateData("请尽快续费,以免影响使用"));
-            log.info("发送账号即将到期消息至用户:{}", user.getId());
-            weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
-
-            List<Account> accounts = accountMapper.selectList(Wrappers.lambdaQuery(Account.class).le(Account::getExpiryTime, time));
-            List<CustomerService> customerServices = customerServiceMapper.selectList(null);
-            if(!accounts.isEmpty()){
-                for (CustomerService customerService : customerServices) {
-                    WxMpTemplateMessage manageMessage = new WxMpTemplateMessage()
-                            .setToUser(customerService.getOpenId())
-                            .setTemplateId(EXPIRY_TEMPLATE)
-                            .setUrl(" ");
-                    WxMpTemplateMessage.TemplateData data2 = manageMessage.getData();
-                    data2.setFirst(new WxMpTemplateData("您有" + accounts.size() + "个主账号即将到期"));
-                    data2.setKeyword1(new WxMpTemplateData("车队主账号"));
-                    data2.setKeyword2(new WxMpTemplateData("车队主账号"));
-                    data2.setKeyword3(new WxMpTemplateData("5天后"));
-                    data2.setKeyword4(new WxMpTemplateData("账号即将到期"));
-                    data2.setRemark(new WxMpTemplateData("请尽快登录后台-在账号管理中查看"));
-                    log.info("发送账号即将到期消息至客服:{}", customerService.getNickName());
-                    weChatService.sendTemplateMessage(weChatService.getAccessToken(),Jsons.toJson(manageMessage));
-                }
-            }
-        }
-
-
-    }
-
-    private void delRelation(GroupsRelation relation) {
-        Date expireTime = relation.getExpiryTime();
-        relation.setStartTime(null);
-        relation.setExpiryTime(null);
-        relation.setUserId(0l);
-        relation.setStatus(GroupsRelation.Status.none);
-        relation.setIsHandle(false);
-        relation.setRenewStatus(false);
-        relation.setAccount(null);
-        Integer success = groupsRelationMapper.updateExpiryTime(relation, expireTime);
-        if (success == 1) {
-            log.info("开始清除过期子账号,座位号:{}", relation.getId());
-            int count = groupsMapper.incrAvailableNum(relation.getGroupsId());
-            if (count == 0) {
-                log.error("车位异常 groupId:{}", relation.getGroupsId());
-                throw new BusinessRuntimeException("车位异常");
-            }
-        }
-    }
-
-
-    /**
-     * 定时关闭订单
-     */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void closeOrder() {
-        //获取为支付订单
-        DateTime now = new DateTime();
-        Date newDate = DateUtil.offset(now, DateField.MINUTE, -5);
-        List<OrderDon> list = orderDonService.list(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getStatus, OrderDon.Status.noPayment).le(OrderDon::getCreatedTime,newDate));
-        log.info("定时任务 关闭 订单数:{}",list.size());
-        list.forEach((orderDon)->{
-            orderDonService.closeOrder(orderDon.getId());
-        });
-    }
-
-    /**
-     * spotify 注册
-     */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void spotify() {
-        synchronized (this){
-            List<RegisterOrderDon> spotify = registerOrderDonMapper.selectList(Wrappers.lambdaQuery(RegisterOrderDon.class)
-                    .select(RegisterOrderDon::getId)
-                    .eq(RegisterOrderDon::getPlatform, "spotify")
-                    .eq(RegisterOrderDon::getStatus, RegisterOrderDon.Status.hasPayment));
-            spotify.forEach((orderDon)->{
-                spotifyService.register(orderDon.getId());
-            });
-        }
-    }
-
-    /**
-     * 每日免单重置
-     */
-    @Scheduled(cron = "0 0 0 * * ?")
-    public void freeReset() {
-        log.info("每日重置 spotify 免单账户数 [start]");
-        SysConfig register_free_num = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "register_free_num"));
-        redisService.set(RedisKey.SPOTIFY_FREE_NUM, Long.parseLong(register_free_num.getSysValue()));
-        log.info("每日重置 spotify 免单账户数 [end] 数量:{}",register_free_num.getSysValue());
-    }
-
-    /**
-     * 分销订单积分奖励分发
-     */
-    @Scheduled(cron = "0 0 0/2 * * ?")
-    @Transactional(rollbackFor = Throwable.class)
-    public void distributeOrdersSendPoints() {
-        List<DistributeWaitingSendPoints> waitingSendPoints = Optional.ofNullable(distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
-                .eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting)
-                .lt(DistributeWaitingSendPoints::getSendTime, DateTime.now())
-                .select(DistributeWaitingSendPoints::getId,
-                        DistributeWaitingSendPoints::getOrderId,
-                        DistributeWaitingSendPoints::getPoints,
-                        DistributeWaitingSendPoints::getUserId,
-                        DistributeWaitingSendPoints::getSendTime))).orElse(new ArrayList<>());
-        log.info("查询分销订单积分分发记录开始,条数:{}=======》", waitingSendPoints.size());
-        waitingSendPoints.forEach(wait -> {
-            //积分待发人
-            Long sharedId = wait.getSharedId();
-            User user = userMapper.selectById(sharedId);
-            if (user == null) {
-                wait.setSendStatus(DistributeWaitingSendPoints.Status.not_exist);
-                log.info("分销订单,发送积分用户不存在");
-                distributeWaitingSendPointsMapper.updateById(wait);
-            } else {
-                wait.setSendStatus(DistributeWaitingSendPoints.Status.success);
-                log.info("更新用户积分开始=====>");
-                while (true) {
-                    user = userMapper.selectById(sharedId);
-                    if (user == null) {
-                        break;
-                    }
-                    Integer update = userMapper.updatePoints(user.getId(), wait.getPoints(), user.getPoints());
-                    if (update == 1) {
-                        distributeWaitingSendPointsMapper.updateById(wait);
-                        log.info("分销积分表订单id:{}发放积分success", wait.getOrderId());
-                        break;
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * 定时更新未支付AppleID自动注册订单
-     */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void updateAppleAutoStatus() {
-        //获取为支付订单
-        DateTime now = new DateTime();
-        Date newDate = DateUtil.offset(now, DateField.MINUTE, -5);
-        List<Long> orderDons = appleAutoRegisterDataMapper.getAllNoPayOrders(newDate);
-        log.info("定时更新未支付AppleID自动注册订单 订单数:{}",orderDons.size());
-        orderDons.forEach((orderId)->{
-            registerOrderDonService.updateAppleAutoStatus(orderId);
-        });
-    }
-
-    /**
-     * 实物订单意愿数据
-     */
-    @Scheduled(cron = "0 0/5 * * * ?")
-    public void realGoodsInterestUser() {
-        Optional.ofNullable(orderDonService.selectNoPaymentRealGoods()).ifPresent(list -> {
-                    if (list.size() > 0) {
-                        Map<String, List<RealGoodsInterestUser>> collect = list.stream().collect(Collectors.groupingBy(RealGoodsInterestUser::getGroupBy));
-                        log.info("实物订单意愿数据同步开始");
-                        collect.forEach((k, data) -> {
-                            RealGoodsInterestUser realGoodsInterestUser = null;
-                            if (data.size() == 0) {
-                                realGoodsInterestUser = data.get(0);
-                            } else {
-                                List<RealGoodsInterestUser> high = data.stream().sorted(Comparator.comparing(RealGoodsInterestUser::getMoney).thenComparing(RealGoodsInterestUser::getOrderCreatedTime).reversed()).collect(Collectors.toList());
-                                realGoodsInterestUser = high.get(0);
-                            }
-                            try {
-                                realGoodsInterestUserMapper.insert(realGoodsInterestUser);
-                            } catch (DuplicateKeyException e) {
-                                log.info("重复插入用户相同实物商品记录");
-                            }
-                        });
-                        log.info("实物订单意愿数据同步结束");
-                    }
-                }
-        );
-        Integer update = orderDonService.updateHasPaymentInterestRealGoods();
-        orderDonService.updateHasPaymentInterestRealGoodsPayTime();
-        if (update > 0) {
-            log.info("更新用户记录:{}已购买实物意愿商品状态成功", update);
-        }
-    }
-}
+//package com.cyksj.task;
+//
+//import cn.hutool.core.date.DateField;
+//import cn.hutool.core.date.DateTime;
+//import cn.hutool.core.date.DateUtil;
+//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+//import com.cyksj.common.exception.BusinessRuntimeException;
+//import com.cyksj.common.util.Jsons;
+//import com.cyksj.dto.RedisKey;
+//import com.cyksj.mapper.*;
+//import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
+//import com.cyksj.model.dto.WxMpTemplateData;
+//import com.cyksj.model.dto.WxMpTemplateMessage;
+//import com.cyksj.model.entity.*;
+//import com.cyksj.redis.RedisService;
+//import com.cyksj.service.order.OrderDonService;
+//import com.cyksj.service.register.RegisterOrderDonService;
+//import com.cyksj.service.register.SpotifyService;
+//import com.cyksj.service.wechat.WeChatService;
+//import lombok.RequiredArgsConstructor;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.dao.DuplicateKeyException;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import java.util.ArrayList;
+//import java.util.Date;
+//import java.util.List;
+//import java.util.Optional;
+//import java.util.*;
+//import java.util.stream.Collectors;
+//
+//import static com.cyksj.common.constant.WeChatTemplateConst.EXPIRY_TEMPLATE;
+//
+//@Component
+//@Slf4j
+//@RequiredArgsConstructor
+//public class Scheduler {
+//
+//        private final GoodsDonMapper donMapper;
+//
+//        private final GroupsMapper groupsMapper;
+//
+//        private final OrderDonService orderDonService;
+//
+//        private final GroupsRelationMapper groupsRelationMapper;
+//
+//        private final UserMapper userMapper;
+//
+//        private final GoodsDonSkuMapper skuMapper;
+//
+//        private final WeChatService weChatService;
+//
+//        private final AccountMapper accountMapper;
+//
+//        private final CustomerServiceMapper customerServiceMapper;
+//
+//        private final SpotifyService spotifyService;
+//
+//        private final RegisterOrderDonMapper registerOrderDonMapper;
+//
+//        private final RedisService redisService;
+//
+//        private final SysConfigMapper sysConfigMapper;
+//
+//        private final DistributeWaitingSendPointsMapper distributeWaitingSendPointsMapper;
+//
+//        private final RegisterOrderDonService registerOrderDonService;
+//
+//        private final AppleAutoRegisterDataMapper appleAutoRegisterDataMapper;
+//
+//        private final RealGoodsInterestUserMapper realGoodsInterestUserMapper;
+//
+//
+//    /**
+//     * 每5分钟清理过期账号
+//     */
+//    @Scheduled(cron = "0 0/5 * * * ?")
+//    @Transactional(rollbackFor = Throwable.class)
+//    public void clearExpiry() {
+//        DateTime now = new DateTime();
+//        List<GroupsRelation> expiryList = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, now));
+//        log.info("定时清理过期账号start ===> 数量:{}", expiryList.size());
+//        //过期账号清楚有效期
+//        expiryList.forEach(relation -> delRelation(relation));
+//    }
+//
+//    @Scheduled(cron = "0 0 9 * * ?")
+//    public void expiryWxMsg() throws Exception {
+//        DateTime now = new DateTime();
+//        DateTime zero = DateUtil.offset(now, DateField.HOUR, -9);
+//        DateTime time = DateUtil.offset(zero, DateField.DAY_OF_MONTH, 5);
+//        List<GroupsRelation> groupsRelations = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, time));
+//        for (GroupsRelation relation : groupsRelations) {
+//            User user = userMapper.selectById(relation.getUserId());
+//            WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+//                    .setToUser(user.getOpenId())
+//                    .setTemplateId(EXPIRY_TEMPLATE)
+//                    .setUrl(" ");
+//
+//            /**
+//             * 您的账号即将到期
+//             * 账号名称:Netflix账号
+//             * 平台:Netflix
+//             * 失效日期:5天后
+//             * 异常原因:账号即将到期
+//             * 请尽快续费,以免影响使用
+//             */
+//            GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+//            GoodsDonSku donSku = skuMapper.selectById(groupsTrips.getSkuId());
+//            GoodsDon goodsDon = donMapper.selectById(donSku.getGoodsId());
+//            WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+//            data.setFirst(new WxMpTemplateData("您的账号即将到期"));
+//            data.setKeyword1(new WxMpTemplateData(goodsDon.getTitle()));
+//            data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
+//            data.setKeyword3(new WxMpTemplateData(DateUtil.format(relation.getExpiryTime(), "yyyy-MM-dd HH:mm:ss")));
+//            data.setKeyword4(new WxMpTemplateData("账号即将到期"));
+//            data.setRemark(new WxMpTemplateData("请尽快续费,以免影响使用"));
+//            log.info("发送账号即将到期消息至用户:{}", user.getId());
+//            weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+//
+//            List<Account> accounts = accountMapper.selectList(Wrappers.lambdaQuery(Account.class).le(Account::getExpiryTime, time));
+//            List<CustomerService> customerServices = customerServiceMapper.selectList(null);
+//            if(!accounts.isEmpty()){
+//                for (CustomerService customerService : customerServices) {
+//                    WxMpTemplateMessage manageMessage = new WxMpTemplateMessage()
+//                            .setToUser(customerService.getOpenId())
+//                            .setTemplateId(EXPIRY_TEMPLATE)
+//                            .setUrl(" ");
+//                    WxMpTemplateMessage.TemplateData data2 = manageMessage.getData();
+//                    data2.setFirst(new WxMpTemplateData("您有" + accounts.size() + "个主账号即将到期"));
+//                    data2.setKeyword1(new WxMpTemplateData("车队主账号"));
+//                    data2.setKeyword2(new WxMpTemplateData("车队主账号"));
+//                    data2.setKeyword3(new WxMpTemplateData("5天后"));
+//                    data2.setKeyword4(new WxMpTemplateData("账号即将到期"));
+//                    data2.setRemark(new WxMpTemplateData("请尽快登录后台-在账号管理中查看"));
+//                    log.info("发送账号即将到期消息至客服:{}", customerService.getNickName());
+//                    weChatService.sendTemplateMessage(weChatService.getAccessToken(),Jsons.toJson(manageMessage));
+//                }
+//            }
+//        }
+//
+//
+//    }
+//
+//    private void delRelation(GroupsRelation relation) {
+//        Date expireTime = relation.getExpiryTime();
+//        relation.setStartTime(null);
+//        relation.setExpiryTime(null);
+//        relation.setUserId(0l);
+//        relation.setStatus(GroupsRelation.Status.none);
+//        relation.setIsHandle(false);
+//        relation.setRenewStatus(false);
+//        relation.setAccount(null);
+//        Integer success = groupsRelationMapper.updateExpiryTime(relation, expireTime);
+//        if (success == 1) {
+//            log.info("开始清除过期子账号,座位号:{}", relation.getId());
+//            int count = groupsMapper.incrAvailableNum(relation.getGroupsId());
+//            if (count == 0) {
+//                log.error("车位异常 groupId:{}", relation.getGroupsId());
+//                throw new BusinessRuntimeException("车位异常");
+//            }
+//        }
+//    }
+//
+//
+//    /**
+//     * 定时关闭订单
+//     */
+//    @Scheduled(cron = "0 0/5 * * * ?")
+//    public void closeOrder() {
+//        //获取为支付订单
+//        DateTime now = new DateTime();
+//        Date newDate = DateUtil.offset(now, DateField.MINUTE, -5);
+//        List<OrderDon> list = orderDonService.list(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getStatus, OrderDon.Status.noPayment).le(OrderDon::getCreatedTime,newDate));
+//        log.info("定时任务 关闭 订单数:{}",list.size());
+//        list.forEach((orderDon)->{
+//            orderDonService.closeOrder(orderDon.getId());
+//        });
+//    }
+//
+//    /**
+//     * spotify 注册
+//     */
+//    @Scheduled(cron = "0 0/5 * * * ?")
+//    public void spotify() {
+//        synchronized (this){
+//            List<RegisterOrderDon> spotify = registerOrderDonMapper.selectList(Wrappers.lambdaQuery(RegisterOrderDon.class)
+//                    .select(RegisterOrderDon::getId)
+//                    .eq(RegisterOrderDon::getPlatform, "spotify")
+//                    .eq(RegisterOrderDon::getStatus, RegisterOrderDon.Status.hasPayment));
+//            spotify.forEach((orderDon)->{
+//                spotifyService.register(orderDon.getId());
+//            });
+//        }
+//    }
+//
+//    /**
+//     * 每日免单重置
+//     */
+//    @Scheduled(cron = "0 0 0 * * ?")
+//    public void freeReset() {
+//        log.info("每日重置 spotify 免单账户数 [start]");
+//        SysConfig register_free_num = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "register_free_num"));
+//        redisService.set(RedisKey.SPOTIFY_FREE_NUM, Long.parseLong(register_free_num.getSysValue()));
+//        log.info("每日重置 spotify 免单账户数 [end] 数量:{}",register_free_num.getSysValue());
+//    }
+//
+//    /**
+//     * 分销订单积分奖励分发
+//     */
+//    @Scheduled(cron = "0 0 0/2 * * ?")
+//    @Transactional(rollbackFor = Throwable.class)
+//    public void distributeOrdersSendPoints() {
+//        List<DistributeWaitingSendPoints> waitingSendPoints = Optional.ofNullable(distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
+//                .eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting)
+//                .lt(DistributeWaitingSendPoints::getSendTime, DateTime.now())
+//                .select(DistributeWaitingSendPoints::getId,
+//                        DistributeWaitingSendPoints::getOrderId,
+//                        DistributeWaitingSendPoints::getPoints,
+//                        DistributeWaitingSendPoints::getUserId,
+//                        DistributeWaitingSendPoints::getSendTime))).orElse(new ArrayList<>());
+//        log.info("查询分销订单积分分发记录开始,条数:{}=======》", waitingSendPoints.size());
+//        waitingSendPoints.forEach(wait -> {
+//            //积分待发人
+//            Long sharedId = wait.getSharedId();
+//            User user = userMapper.selectById(sharedId);
+//            if (user == null) {
+//                wait.setSendStatus(DistributeWaitingSendPoints.Status.not_exist);
+//                log.info("分销订单,发送积分用户不存在");
+//                distributeWaitingSendPointsMapper.updateById(wait);
+//            } else {
+//                wait.setSendStatus(DistributeWaitingSendPoints.Status.success);
+//                log.info("更新用户积分开始=====>");
+//                while (true) {
+//                    user = userMapper.selectById(sharedId);
+//                    if (user == null) {
+//                        break;
+//                    }
+//                    Integer update = userMapper.updatePoints(user.getId(), wait.getPoints(), user.getPoints());
+//                    if (update == 1) {
+//                        distributeWaitingSendPointsMapper.updateById(wait);
+//                        log.info("分销积分表订单id:{}发放积分success", wait.getOrderId());
+//                        break;
+//                    }
+//                }
+//            }
+//        });
+//    }
+//
+//    /**
+//     * 定时更新未支付AppleID自动注册订单
+//     */
+//    @Scheduled(cron = "0 0/5 * * * ?")
+//    public void updateAppleAutoStatus() {
+//        //获取为支付订单
+//        DateTime now = new DateTime();
+//        Date newDate = DateUtil.offset(now, DateField.MINUTE, -5);
+//        List<Long> orderDons = appleAutoRegisterDataMapper.getAllNoPayOrders(newDate);
+//        log.info("定时更新未支付AppleID自动注册订单 订单数:{}",orderDons.size());
+//        orderDons.forEach((orderId)->{
+//            registerOrderDonService.updateAppleAutoStatus(orderId);
+//        });
+//    }
+//
+//    /**
+//     * 实物订单意愿数据
+//     */
+//    @Scheduled(cron = "0 0/5 * * * ?")
+//    public void realGoodsInterestUser() {
+//        Optional.ofNullable(orderDonService.selectNoPaymentRealGoods()).ifPresent(list -> {
+//                    if (list.size() > 0) {
+//                        Map<String, List<RealGoodsInterestUser>> collect = list.stream().collect(Collectors.groupingBy(RealGoodsInterestUser::getGroupBy));
+//                        log.info("实物订单意愿数据同步开始");
+//                        collect.forEach((k, data) -> {
+//                            RealGoodsInterestUser realGoodsInterestUser = null;
+//                            if (data.size() == 0) {
+//                                realGoodsInterestUser = data.get(0);
+//                            } else {
+//                                List<RealGoodsInterestUser> high = data.stream().sorted(Comparator.comparing(RealGoodsInterestUser::getMoney).thenComparing(RealGoodsInterestUser::getOrderCreatedTime).reversed()).collect(Collectors.toList());
+//                                realGoodsInterestUser = high.get(0);
+//                            }
+//                            try {
+//                                realGoodsInterestUserMapper.insert(realGoodsInterestUser);
+//                            } catch (DuplicateKeyException e) {
+//                                log.info("重复插入用户相同实物商品记录");
+//                            }
+//                        });
+//                        log.info("实物订单意愿数据同步结束");
+//                    }
+//                }
+//        );
+//        Integer update = orderDonService.updateHasPaymentInterestRealGoods();
+//        orderDonService.updateHasPaymentInterestRealGoodsPayTime();
+//        if (update > 0) {
+//            log.info("更新用户记录:{}已购买实物意愿商品状态成功", update);
+//        }
+//    }
+//}

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

@@ -2,34 +2,41 @@ package com.cyksj.web.controller.manage.statistics;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.mapper.UserMapper;
-import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
-import com.cyksj.model.entity.StatisticsUserData;
-import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.statistics.IncrExpiryTimeRecordMapper;
-import com.cyksj.model.entity.GroupsRelation;
-import com.cyksj.model.entity.IncrExpiryTimeRecord;
+import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.excel.AppleDataExcel;
+import com.cyksj.model.excel.OrderDataExcel;
+import com.cyksj.model.excel.RealGoodsDataExcel;
+import com.cyksj.model.excel.RegisterDataExcel;
 import com.cyksj.model.request.RenewTimeUpReq;
 import com.cyksj.model.views.BackgroundDataView;
 import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.model.views.StatisticsUserDataView;
+import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
+import com.cyksj.web.util.EasyExcelUtils;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
-import com.ejlchina.searcher.BeanSearcher;
-import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /*
  *项目名: netflix
@@ -153,4 +160,172 @@ public class StatisticsDataController {
 		statisticsUserDataView.setUserData(beanSearcher.search(StatisticsUserData.class, MapUtils.flatBuilder(request.getParameterMap()).build()));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(statisticsUserDataView);
 	}
+
+	private final GoodsDonMapper getGoodsDonMapper;
+
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
+	private final CmsGoodsDonSkuService goodsDonSkuService;
+
+	private final OrderDonMapper orderDonMapper;
+
+	public static List<String> noOrderStatus = List.of("close", "noPayment", "refund");
+
+	public static List<String> payType = List.of("月", "季", "年");
+
+	private final static List<String> registerAccount = List.of("apple", "spotify", "google");
+
+
+	/***
+	 * apple One
+	 * @param start
+	 * @param end
+	 * @param response
+	 */
+	@GetMapping("/get/apple/data")
+	public void appleData(String start, String end, HttpServletResponse response) {
+		List<GoodsDonSku> list = goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, 2).select(GoodsDonSku::getId, GoodsDonSku::getSpecVal));
+		List<AppleDataExcel> appleDatas = new ArrayList<>();
+		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))).orElse(new ArrayList<>());
+			areaDataMap.put(name, sku);
+		}
+		areaDataMap.forEach((k, v) -> {
+			AppleDataExcel appleDataExcel = new AppleDataExcel();
+			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, noOrderStatus).between(OrderDon::getCreatedTime, start, end));
+			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, noOrderStatus).between(OrderDon::getCreatedTime, start, end));
+			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, noOrderStatus).between(OrderDon::getCreatedTime, start, end));
+			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(payType.get(0)) && !sku.getSpecVal().contains(payType.get(2))) {
+					appleDataExcel.setMonth(dons.size());
+				} else if (sku.getSpecVal().contains(payType.get(1))) {
+					appleDataExcel.setSeason(dons.size());
+				} else if (!sku.getSpecVal().contains(payType.get(0)) && sku.getSpecVal().contains(payType.get(2))) {
+					appleDataExcel.setYear(dons.size());
+				}
+			});
+			appleDatas.add(appleDataExcel);
+		});
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, AppleDataExcel.class, appleDatas, "AppleOne", "AppleOne", ExcelTypeEnum.XLSX, null);
+	}
+
+	/**
+	 * 流媒体
+	 *
+	 * @param start
+	 * @param end
+	 * @param response
+	 */
+	@GetMapping("/get/streaming/data")
+	public void streamingData(String start, String end, HttpServletResponse response) {
+		List<Long> goodsIds = statisticsUserDataMapper.getAllStreaming(start, end);
+		List<OrderDataExcel> list = new ArrayList<>();
+		goodsIds.forEach(goodsId -> {
+			//订单数据
+			OrderDataExcel exportData = statisticsUserDataMapper.getExportData(goodsId, null, null, start, end);
+			exportData.setName(getGoodsDonMapper.selectById(goodsId).getTitle());
+			//兑换单数
+			exportData.setNumOfExCodeOrder(statisticsUserDataMapper.getExportData(goodsId, null, true, start, end).getNumOfOrder());
+			//分销记录
+			OrderDataExcel exportData1 = statisticsUserDataMapper.getExportData(goodsId, true, null, start, end);
+			exportData.setDisOrder(exportData1.getNumOfOrder());
+			exportData.setDisMoney(exportData1.getMoney() != null ? exportData1.getMoney() : BigDecimal.ZERO);
+			//月、季、年
+			exportData.setMonth(statisticsUserDataMapper.getTypeData(goodsId, "月", start, end));
+			exportData.setSeason(statisticsUserDataMapper.getTypeData(goodsId, "季", start, end));
+			exportData.setYear(statisticsUserDataMapper.getTypeData(goodsId, "年", start, end));
+			list.add(exportData);
+		});
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, OrderDataExcel.class, list, "流媒体账号订单数", "流媒体账号订单数据", ExcelTypeEnum.XLSX, null);
+	}
+
+	/**
+	 * 实物
+	 *
+	 * @param start
+	 * @param end
+	 * @param response
+	 */
+	@GetMapping("/get/real/data")
+	public void realData(String start, String end, HttpServletResponse response) {
+		List<Long> goodsIds = statisticsUserDataMapper.getAllRealGoods(start, end);
+		List<RealGoodsDataExcel> list = new ArrayList<>();
+		goodsIds.forEach(goodsId -> {
+			//查找所有规格
+			List<Long> skuIds = statisticsUserDataMapper.getAllRealSku(goodsId);
+			skuIds.forEach(skuId -> {
+				//订单数据
+				RealGoodsDataExcel exportData = statisticsUserDataMapper.getExportRealData(skuId, start, end);
+				exportData.setName(getGoodsDonMapper.selectById(goodsId).getTitle());
+				exportData.setSpecVal(goodsDonSkuMapper.selectById(skuId).getSpecVal());
+				if (exportData.getNumOfOrder() != 0) {
+					list.add(exportData);
+				}
+			});
+		});
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, RealGoodsDataExcel.class, list, "硬件订单数", "硬件订单数据", ExcelTypeEnum.XLSX, null);
+	}
+
+	/**
+	 * 注册账号数据
+	 *
+	 * @param start
+	 * @param end
+	 * @param response
+	 */
+	@GetMapping("/get/register/data")
+	public void registerData(String start, String end, HttpServletResponse response) {
+		List<RegisterDataExcel> list = new ArrayList<>();
+		registerAccount.forEach(platform -> {
+			List<RegisterOrderDon> registerOrderDons = statisticsUserDataMapper.getPlatformHasPaymentOrders(platform, start, end);
+			RegisterDataExcel registerDataExcel = new RegisterDataExcel();
+			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);
+			list.add(registerDataExcel);
+		});
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, RegisterDataExcel.class, list, "注册账号数据", "注册账号数据", ExcelTypeEnum.XLSX, null);
+	}
+
+	@GetMapping("/get/original")
+	public Result<String> getOriginal(String start, String end) throws Exception {
+		List<OrderDon> orderDons = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getOrderType, 2).notIn(OrderDon::getStatus, noOrderStatus).between(OrderDon::getCreatedTime, start, end));
+		Integer twoPay = orderDonMapper.getTowPayUser(start, end);
+		Map<String, Integer> map = new HashMap<>();
+		map.put("账号续费的订单数", orderDons.size());
+		map.put("消费满2次的用户数", twoPay);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(Jsons.toJson(map));
+	}
+
 }

+ 0 - 2
netflix-web/src/main/java/com/cyksj/web/controller/user/AddressController.java

@@ -70,6 +70,4 @@ public class AddressController {
         addressService.removeById(id);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
-
-
 }

文件差异内容过多而无法显示
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 1 - 1
netflix-web/src/main/resources/application.yml

@@ -1 +1 @@
-spring:
  profiles:
    active:
      - ${activeProfile}
    
+spring:
  profiles:
    active: prd
    

部分文件因为文件数量过多而无法显示