package com.ruoyi.web.controller.backstage.daily;


import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.dto.DailyScenicDto;
import com.ruoyi.system.domain.dto.DailySourceDto;
import com.ruoyi.system.domain.dto.DailyUserDto;
import com.ruoyi.system.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.List;

//@Component

//仅测试用
@RestController
@RequestMapping("/backstage/test")
public class dailySysServer {

    private static final Logger LOGGER = LoggerFactory.getLogger(dailySysServer.class);

    @Autowired
    private IDailySysService dailySysService;

    @Autowired
    private ISysUserService sysUserService;

    @Autowired
    private IUserWorkService userWorkService;

    @Autowired
    private ISysOrderService sysOrderService;

    @Autowired
    private ISysScenicService sysScenicService;

    @Autowired
    private IDailySourceService dailySourceService;

    @Autowired
    private IDailyScenicService dailyScenicService;

    @Autowired
    private IUserInfoService userInfoService;

    @Autowired
    private ISysSourceService sysSourceService;

    @Autowired
    private ISysScenicDefaultService sysScenicDefaultService;


    // 用户每天统计表
    @Autowired
    private IDailyUserService dailyUserService;

    @Autowired
    private ISysUserStService sysUserCountService;

    @Autowired
    private ISysUserWorkCountService sysUserWorkCountService;

    @Autowired
    private ISysUserNotificationService userNotificationService;



    //计数当前系统用户数量并且插入daily_sys表(日期是昨天)
    // 每天凌晨2点计算一次
    // 应该是定时任务, 测试完毕后修改接口类型
//    @GetMapping("/UserCount")
    public void updateUserCount(){

        Long UserCount = sysUserCountService.getUserCount();

        System.out.println("当前用户数量为:"+UserCount);

        LocalDate now = LocalDate.now();

        LocalDate oneDayAgo = now.minusDays(1);

        DailySys dailySys = dailySysService.selectDailySysByDate(oneDayAgo);

        // 今天未统计过, 统计时一定要先判断这个, 别的定时任务可能会先插入数据.
        if (dailySys == null){
            LOGGER.info("计数昨天的用户总数, 并插入数据");

            DailySys dailySys1 = new DailySys();
            dailySys1.settUser(UserCount);
            dailySys1.settIncome(0L);
            dailySys1.setDate(oneDayAgo);

            int back = dailySysService.insertDailySys(dailySys1);
            if(back == 0){
                LOGGER.info("插入昨天的统计用户总数数据失败");
            }
            else{
                LOGGER.info("插入昨天的统计用户总数数据成功");
            }

        }
        // 有其他的定时任务先插入了今天的数据, 要不把每天系统要统计的数据都一起算.
        else{
            dailySys.settUser(UserCount);
            int back = dailySysService.updateDailySys(dailySys);
            if(back == 0){
                LOGGER.info("更新昨天的统计用户总数数据失败");
            }
            else{
                LOGGER.info("更新昨天的统计用户总数数据成功");
            }
        }
    }

    //测试统计用户作品总数日期是昨天
    @GetMapping("/UserWorkCount")
    public void updateUserWorkCount(){

        Long UserWorkCount = sysUserWorkCountService.getUserWorkCount();

        System.out.println("当前用户作品数量为:"+UserWorkCount);

        LocalDate now = LocalDate.now();

        LocalDate oneDayAgo = now.minusDays(1);

        DailySys dailySys = dailySysService.selectDailySysByDate(oneDayAgo);

        // 今天未统计过, 统计时一定要先判断这个, 别的定时任务可能会先插入数据.
        if (dailySys == null){
            LOGGER.info("计数昨天的用户作品总数, 并插入数据");

            DailySys dailySys1 = new DailySys();
            dailySys1.settWork(UserWorkCount);
            dailySys1.setDate(oneDayAgo);

            int back = dailySysService.insertDailySys(dailySys1);
            if(back == 0){
                LOGGER.info("插入昨天的统计用户作品总数数据失败");
            }  else{
                LOGGER.info("插入昨天的统计用户作品总数数据成功");
            }
        }
        // 已有其他任务插入过数据, 后期直接写在一起,
        else{
            dailySys.settWork(UserWorkCount);
            int back = dailySysService.updateDailySys(dailySys);
            if(back == 0){
                LOGGER.info("更新昨天的统计用户作品总数数据失败");
            }  else{
                LOGGER.info("更新昨天的统计用户作品总数数据成功");
            }
        }
    }

    //测试统计每天用户在线时间总数,MR在线时间总数
    @GetMapping("/UserOnlineTime")
    public void updateUserOnlineTime(){

        LocalDate now = LocalDate.now();

        LocalDate oneDayAgo = now.minusDays(1);


        Long tOnlineTime = dailyUserService.getTotalOnlineTime(oneDayAgo);
        Long tMRTime = dailyUserService.getTotalMRTime(oneDayAgo);

        System.out.println("昨天用户总在线时间为:"+tOnlineTime+" 昨天用户总的MR在线时间: "+tMRTime);

        //写入系统每天统计数据
        DailySys dailySys = dailySysService.selectDailySysByDate(oneDayAgo);
        if (dailySys == null){
            LOGGER.info("计数昨天的用户作品总数, 并插入数据");

            DailySys dailySys1 = new DailySys();
            dailySys1.settOnlineTime(tOnlineTime);
            dailySys1.settMrTime(tMRTime);
            dailySys1.setDate(oneDayAgo);

            int back = dailySysService.insertDailySys(dailySys1);
            if(back == 0){
                LOGGER.info("插入昨天的统计用户在线/MR时长数据失败");
            }  else{
                LOGGER.info("插入昨天的统计用户在线/MR时长总数数据成功");
            }
        }
        // 已有其他任务插入过数据, 后期直接写在一起,
        else{
            dailySys.settOnlineTime(tOnlineTime);
            dailySys.settMrTime(tMRTime);
            int back = dailySysService.updateDailySys(dailySys);
            if(back == 0){
                LOGGER.info("更新昨天的统计用户在线/MR时长数据失败");
            }  else{
                LOGGER.info("更新昨天的统计用户在线/MR时长数据成功");
            }
        }

    }

    // 更新资源位信息
    // 这里应该每天12点后更新一次,
    @Scheduled(cron = "0 5 12 * * ?")
    @Transactional
    @GetMapping("/dailySource")
    public void updateDailySource(){

        LocalDate now = LocalDate.now();
        //----------------------------------sys_source 替换作品,修改状态, 设置默认封面------------------------------
        //获取所有资源位信息
        List<SysSource> sysSourceList = sysSourceService.selectSysSourceList(new SysSource());

        System.out.println("查询所有资源位: "+ sysSourceList.size());

        // 由于默认从明天购买, 资源位状态在被购买时就已经改变,起止时间在下订单时被写入,这里就不需要从订单里查询资源位的起止时间了.
        // 若后期可以预定资源位时间,则需要从订单里查询资源位的起止时间了.
        for(SysSource sysSource : sysSourceList){
            // 根据sysSource中的startTime和endTime
            if(!sysSource.getSourceStatus().equals("0")){

                // 比较时间时不需要关注时分秒信息, 默认是哪天12点以后执行.
                LocalDate startTime = sysSource.getStartTime().toLocalDate();
                LocalDate endTime = sysSource.getEndTime().toLocalDate();


                System.out.println("开始时间: "+ startTime + "今天日期" + now + "是否相等: " + startTime.equals(now));
                if(startTime.equals(now)){
                    System.out.println("订单开始 "+"资源位id: "+sysSource.getSourceId()+" 资源位状态: "+sysSource.getSourceStatus()+" 资源位起止时间: "+sysSource.getStartTime()+"--"+sysSource.getEndTime()
                            +" 作品id: "+ sysSource.getWorkId());

                    UserWork userwork = userWorkService.selectUserWorkByWorkId(sysSource.getWorkId());


                    // 判断作品是否通过审核, 审核通过的作品才能展示
                    if(userwork != null && userwork.getWorkStatus().equals("3")){

                        // 根据work_id 修改资源位默认背景. 资源位状态修改为2(已购展示中)
                        sysSource.setSourceStatus("2");

                        // 这个wordAddress有意义吗? 好像没什么用, 传作品的时候还是要去查user_work这张表
                        sysSource.setWorkAddress(userwork.getWorkAddress());

                        // 修改订单状态为3 展示中
                        Long orderId = sysSource.getOrderId();
                        if(orderId != null){
                            SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
                            if(sysOrder!=null){
                                sysOrder.setStatus("3");
                                sysOrderService.updateSysOrder(sysOrder);
                            }
                        }

                    }


                    // 或者作品没有通过审核,应退款
                    else if (userwork != null && !userwork.getWorkStatus().equals("3")){
                        System.out.println("到了展示, 作品审核没有通过");
                        System.out.println("退款");

                        // 修改订单状态为1 已退款
                        Long orderId = sysSource.getOrderId();
                        if(orderId != null){
                            SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
                            if(sysOrder!=null){
                                sysOrder.setStatus("1");
                                sysOrderService.updateSysOrder(sysOrder);
                            }
                        }

                        //发送退款消息通知
                        SysUserNotification sysUserNotification = new SysUserNotification();
                        sysUserNotification.setUserId(userwork.getUserId());
                        sysUserNotification.setSenderId(1L);
                        sysUserNotification.setDetail("您购买的"+sysSource.getScenic()+sysSource.getPart()+String.format("%02d", sysSource.getcX())+String.format("%02d", sysSource.getcY())+"资源位已退款");
                        sysUserNotification.setType("4");
                        sysUserNotification.setStatus("0");
                        userNotificationService.insertSysUserNotification(sysUserNotification);

                        // 修改资源位状态为0,可购买
                        SysScenicDefault sysScenicDefault = sysScenicDefaultService.getScenicDefaultByScenicAndPart(sysSource.getScenic(), sysSource.getPart());
                        sysSource.setPrice(sysScenicDefault.getPrice());
                        sysSource.setSourceStatus("0");

                        sysSource.setWorkAddress(sysScenicDefault.getWorkAddress());


                    }
                    // 作品为null说明已经注销账号了, 这里先什么也不做
                    else if (userwork == null){
                        System.out.println("作品为null");
                    }

                }
                // 结束展示--修改默认背景和默认价格, 这个区域的默认价格可能发生变化.
                else if(sysSource.getSourceStatus().equals("2") &&
                endTime.equals(now)){
                    SysScenicDefault sysScenicDefault = sysScenicDefaultService.getScenicDefaultByScenicAndPart(sysSource.getScenic(), sysSource.getPart());
                    // System.out.println("订单结束, 默认资源位价格数据: "+ sysScenicDefault.getPrice());
                    sysSource.setPrice(sysScenicDefault.getPrice());
                    sysSource.setSourceStatus("0");
                    sysSource.setWorkAddress(sysScenicDefault.getWorkAddress());



                    // 修改订单状态为2 已结束
                    Long orderId = sysSource.getOrderId();
                    if(orderId != null){
                        SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
                        if(sysOrder!=null){
                            sysOrder.setStatus("2");
                            sysOrderService.updateSysOrder(sysOrder);
                        }
                    }



                }

                // 审核未通过--结束时间已经过去了---退款
                else if(sysSource.getSourceStatus().equals("1") && endTime.isEqual(now)){
                    //-----------------退款  还没写------------------------

                    //-----------------退款 end----------------------------

                    // 修改订单状态为1 已退款
                    Long orderId = sysSource.getOrderId();
                    if(orderId != null){
                        SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
                        if(sysOrder!=null){
                            sysOrder.setStatus("1");
                            sysOrderService.updateSysOrder(sysOrder);
                        }
                    }

                    // 退款时发送消息

                    //-----------------退款end--------------------------

                    SysScenicDefault sysScenicDefault = sysScenicDefaultService.getScenicDefaultByScenicAndPart(sysSource.getScenic(), sysSource.getPart());
                    // System.out.println("订单结束, 默认资源位价格数据: "+ sysScenicDefault.getPrice());
                    sysSource.setPrice(sysScenicDefault.getPrice());
                    sysSource.setSourceStatus("0");
                    sysSource.setWorkAddress(sysScenicDefault.getWorkAddress());


                }



                // 更新资源位信息
                sysSourceService.updateSysSource(sysSource);

                // 24小时临期,结束资源位展示消息, 资源位结束时间-1 = now, 展示中才发到期提醒
                if(endTime.minusDays(1).equals(now) && sysSource.getSourceStatus().equals("2")){
                    // 发送系统消息
                    //发送消息通知
                    Long workId = sysSource.getWorkId();
                    // 查询用户id
                    UserWork userWork = userWorkService.selectUserWorkByWorkId(workId);
                    if(userWork != null){
                        Long receiveUserId = userWork.getUserId();
                        if (receiveUserId != null){
                            SysUserNotification sysUserNotification = new SysUserNotification();
                            sysUserNotification.setUserId(receiveUserId);
                            sysUserNotification.setSenderId(0L);
                            sysUserNotification.setDetail("你的作品将在24小时后结束展示");
                            // 24小时临期消息
                            sysUserNotification.setType("7");
                            sysUserNotification.setStatus("0");

                            userNotificationService.insertSysUserNotification(sysUserNotification);


                        }
                    }


                }

            }

        }

    }
    // 系统每天任务--
    // 总的用户数,用户总的在线时长, 用户总的MR在线时长, 总的购买次数,
    // 总的交互次数, 总的分享次数, 总的作品数, 总的过审作品总数,总的未过审作品总数,
    // 总的收入, 总的退款, 资源位被购买总数.
    // 每天凌晨一点更新系统每天统计数据.
    @Scheduled(cron = "0 0 1 * * ?")
    @Transactional
//    @GetMapping("/dailySys")
    public void updateDailySys(){
        LocalDate now = LocalDate.now();
        // 一天前
        LocalDate oneDayAgo = now.minusDays(1);
        //--------------------------------------------每天 判断用户长期未登录状态------------------------------------------------------
        // 获取所有系统用户
        List<SysUser> sysUsers = sysUserService.getAPPUser();

//        System.out.println("系统人数"+sysUsers.size());
        // 查看上一次登录时间是否超过30天, 超过30设置status为3
        for (SysUser sysUser : sysUsers) {
//            System.out.println("用户id:"+sysUser.getUserId()+" 用户登录时间:"+sysUser.getLoginDate());
            if(sysUser.getLoginDate() != null){


                // 将Date转换为Instant
                Instant instant = sysUser.getLoginDate().toInstant();

                // 转换时区（根据你的需要选择合适的时区）
                ZoneId zone = ZoneId.systemDefault(); // 或者指定特定的时区，例如 ZoneId.of("UTC")

                // 将Instant转换为LocalDateTime
                LocalDateTime localDateTime = instant.atZone(zone).toLocalDateTime();

                // 获取LocalDate
                LocalDate dateConverted = localDateTime.toLocalDate();

                // 计算两个LocalDate之间的天数差
                long daysBetween = ChronoUnit.DAYS.between(dateConverted, now);

                System.out.println("天数差：" + daysBetween);
                // 检查天数差是否为30
                if (daysBetween >= 30) {
                    sysUser.setStatus("3");
                    sysUserService.updateUser(sysUser);
                }

            }
            else{
                // 没登录过的直接长期未登录
                sysUser.setStatus("3");
                sysUserService.updateUser(sysUser);
            }
        }

        //--------------------------------------------每天 判断用户长期未登录状态end------------------------------------------------------


        //--------------------------------------------每天  daily_sys-------------------------------------------------------------------

        // 前天的统计daily_sys数据
        DailySys dailySys = dailySysService.selectDailySysByDate(oneDayAgo.minusDays(1));

        // 如果他为空-----正式运行时一般不会出现这种情况, 但为了防止意外, 先判断下
        // 找前面一个不为空的daily_sys数据
        if(dailySys == null){
            int t = 2;
            while(dailySys == null){
                dailySys = dailySysService.selectDailySysByDate(oneDayAgo.minusDays(t));
                t += 1;
            }
        }

        System.out.println("前一天统计数据日期为:"+dailySys.getDate());


        // 每天用户总数
        Long tUser = sysUserService.getUserCount();
        System.out.println("当前用户总数为:"+tUser);

        // 每天所有用户总的在线时长--可能会出现总时间为null的情况
        Long tOnlineTime = dailyUserService.getTotalOnlineTime(oneDayAgo);
        if(tOnlineTime == null){
            tOnlineTime = 0L;
        }

        System.out.println("昨天用户总在线时间为:"+tOnlineTime);

        // 上传内容总数
        Long tWork = userWorkService.getUserWorkCount("");
        System.out.println("当前用户作品数量为:"+tWork);

        // 过审总数
        Long tPassWork = userWorkService.getUserWorkCount("3");
        System.out.println("当前用户作品过审数量为:"+tPassWork);


        // 退回总数
        Long tBackWork = userWorkService.getUserWorkCount("4");
        System.out.println("当前用户作品退货数量为:"+tBackWork);

        //每天资源位统计相关
        DailySourceDto dailySourceDto = dailySourceService.getStDailySource(oneDayAgo);

        if(dailySourceDto == null){
            dailySourceDto = new DailySourceDto();
            dailySourceDto.setInteractions(0L);
            dailySourceDto.setShares(0L);
        }

        // 互动次数
        Long interactions = dailySourceDto.getInteractions();
        if(interactions == null){
            interactions = 0L;
        }

        // 分享次数
        Long shares = dailySourceDto.getShares();
        if(shares == null){
            shares = 0L;
        }

        // 总的互动次数
        Long tInteractions = dailySys.gettInteractions() + interactions;

        // 总的分享次数
        Long tShares = dailySys.gettShares() + shares;

        System.out.println("昨天资源位互动次数为:"+interactions+" 昨天资源位分享次数为:"+shares);

        // 每天 收入总额, 从订单sys_order中获取
        Long tIncome = sysOrderService.getMoneybyDateAndStatus(oneDayAgo);
        if(tIncome == null){
            tIncome = 0L;
        }

        // 每天 退款总额, 从订单中获取
        Long tRefund = sysOrderService.getRefund(oneDayAgo);
        if(tRefund == null){
            tRefund = 0L;
        }

        System.out.println("昨天收入总额为:"+tIncome+" 昨天退款总额为:"+tRefund);

        // 昨天的统计数据
        DailySys dailySys1 = new DailySys();
        dailySys1.setDate(oneDayAgo);
        dailySys1.settUser(tUser);
        dailySys1.settOnlineTime(tOnlineTime);
        dailySys1.settWork(tWork);
        dailySys1.settPassWork(tPassWork);
        dailySys1.settBackWork(tBackWork);
        dailySys1.settIncome(tIncome);
        dailySys1.settRefund(tRefund);
        dailySys1.settInteractions(tInteractions);
        dailySys1.settShares(tShares);
        //----------------------------------------------测试注释-------------------------------------------------------
        // 插入数据, 这里默认不会重复插入？？
        int back = dailySysService.insertDailySys(dailySys1);
        if(back == 0){
            LOGGER.info("插入昨天的统计数据失败");
        }  else{
            LOGGER.info("插入昨天的统计数据成功");
        }
        //---------------------------------------------测试注释end-----------------------------------------------------

        //-------------------------------------每天--daily_sys end--------------------------------------------------------

        //---------------------------------每天-daily_scenic------------------------------------------------
        // 查询所有景区
        List<SysScenic> sysScenicList = sysScenicService.selectSysScenicList(new SysScenic());

        // 统计每个景区的MR在线时长-------这样也太麻烦了吧, 先这样吧
        for(SysScenic sysScenic : sysScenicList){

            DailyScenicDto dailyScenicDto = dailySourceService.getDailyScenicDto(oneDayAgo, sysScenic.getScenicId());
            if(dailyScenicDto == null){
                dailyScenicDto = new DailyScenicDto();
                dailyScenicDto.setBought(0L);
                dailyScenicDto.setIncome(0L);
                dailyScenicDto.setInteractions(0L);
                dailyScenicDto.setShares(0L);
                dailyScenicDto.setUMrTime(0L);

            }

            System.out.println("景区:"+sysScenic.getScenic()+" 景区id:"+sysScenic.getScenicId()+" 景区购买数:"+dailyScenicDto.getBought()+" 景区收入:"+dailyScenicDto.getIncome()+" 景区互动数:"+dailyScenicDto.getInteractions()+"景区分享数"+dailyScenicDto.getShares()+" 景区MR在线时长:"+dailyScenicDto.getUMrTime());

            // 插入 daily_scenic 数据
            DailyScenic dailyScenic = new DailyScenic();
            dailyScenic.setDate(oneDayAgo);
            dailyScenic.setScenicId(sysScenic.getScenicId());
            dailyScenic.setBought(dailyScenicDto.getBought());
            // 收入这里默认是0, 后续要通过别的方法计算.
            dailyScenic.setIncome(dailyScenicDto.getIncome());
            dailyScenic.setInteractions(dailyScenicDto.getInteractions());
            dailyScenic.setShares(dailyScenicDto.getShares());
            dailyScenic.setuMrTime(dailyScenicDto.getUMrTime());

            //------------------------------------------------测试时注释---------------------------------------------
            // 插入数据
            int back_dss = dailyScenicService.insertDailyScenic(dailyScenic);
            if(back_dss == 0){
                LOGGER.info("插入昨天的景区统计数据失败, 景区id: "+sysScenic.getScenicId());
            }  else{
                LOGGER.info("插入昨天的景区统计数据成功, 景区id: "+sysScenic.getScenicId());
            }
            //------------------------------------------------测试时注释end--------------------------------------------------

        }
        System.out.println("查询所有景区: "+ sysScenicList.size());
        //--------------------------------每天--daily_scenic------------------------------------------------


        //--------------------------------每天--user_info----------------------------------------------------

        // 查看所有用户
        List<UserInfo> userInfoList = userInfoService.selectUserInfoList(new UserInfo());

        for(UserInfo userInfo : userInfoList){

            // 根据日期 和 user_id 获取 daily_user中的用户信息

            // 昨天的用户信息
            DailyUser dailyUserYesterday = dailyUserService.selectDailyUserByUserIdAndDate(userInfo.getUserId(), oneDayAgo);

            // 默认的初始化值
            if(dailyUserYesterday == null){
                dailyUserYesterday = new DailyUser();
                dailyUserYesterday.setUserId(userInfo.getUserId());
                dailyUserYesterday.setDate(oneDayAgo);
                dailyUserYesterday.setConsumption(0L);
                dailyUserYesterday.setOnlineTime(0L);
                dailyUserYesterday.setMrTime(0L);

            }

            // 8天前的用户信息
            DailyUser dailyUserEight = dailyUserService.selectDailyUserByUserIdAndDate(userInfo.getUserId(), oneDayAgo.minusDays(7));
            // 默认的初始化值
            if(dailyUserEight == null){
                dailyUserEight = new DailyUser();
                dailyUserEight.setUserId(userInfo.getUserId());
                dailyUserEight.setDate(oneDayAgo.minusDays(7));
                dailyUserEight.setConsumption(0L);
                dailyUserEight.setOnlineTime(0L);
                dailyUserEight.setMrTime(0L);
            }

            // 31天前的用户信息
            DailyUser dailyUserThirty = dailyUserService.selectDailyUserByUserIdAndDate(userInfo.getUserId(), oneDayAgo.minusDays(30));
            // 默认的初始化值
            if(dailyUserThirty == null){
                dailyUserThirty = new DailyUser();
                dailyUserThirty.setUserId(userInfo.getUserId());
                dailyUserThirty.setDate(oneDayAgo.minusDays(30));
                dailyUserThirty.setConsumption(0L);
                dailyUserThirty.setOnlineTime(0L);
                dailyUserThirty.setMrTime(0L);
            }

            // 近7天用户在线时间
            Long sOnlineTime = userInfo.getsOnlineTime() + dailyUserYesterday.getOnlineTime() - dailyUserEight.getOnlineTime();

            // 近7天用户MR在线时间
            Long sMrTime = userInfo.getsMrTime() + dailyUserYesterday.getMrTime() - dailyUserEight.getMrTime();

            // 近7天用户消费额
            Long sConsumption = userInfo.getsConsumption() + dailyUserYesterday.getConsumption() - dailyUserEight.getConsumption();

            // 近30天用户消费额
            Long thConsumption = userInfo.getThConsumption() + dailyUserYesterday.getConsumption() - dailyUserThirty.getConsumption();

            // 总的在线时间
            Long tUserOnlineTime = userInfo.gettOnlineTime() + dailyUserYesterday.getOnlineTime();
            // 总的MR在线时间
            Long tUserMrTime = userInfo.gettMrTime() + dailyUserYesterday.getMrTime();

            System.out.println("用户:"+userInfo.getUserId()+ " 近7天在线时长:"+sOnlineTime+" 近7天MR在线时长:"+sMrTime+" 近7天消费额:"+sConsumption+" 近30天消费额:"+thConsumption);

            //----新的数据
            userInfo.setsOnlineTime(sOnlineTime);
            userInfo.setsMrTime(sMrTime);
            userInfo.setsConsumption(sConsumption);
            userInfo.setThConsumption(thConsumption);
            userInfo.settOnlineTime(tUserOnlineTime);
            userInfo.settMrTime(tUserMrTime);

            System.out.println("用户认证状态:"+userInfo.getAuthenticationStatus());

            //---------------------------------------测试时注释---------------------------------------------------
            int back_uis = userInfoService.updateUserInfo(userInfo);
            if(back_uis == 0){
                LOGGER.info("插入昨天的用户统计数据失败, 用户id: "+userInfo.getUserId());
            }  else{
                LOGGER.info("插入昨天的用户统计数据成功, 用户id: "+userInfo.getUserId());
            }
            //--------------------------------------测试时注释end-------------------------------------------------



        }
        System.out.println("查询所有用户: "+ userInfoList.size());

        //--------------------------------每天--user_info end------------------------------------------------

//
//        //----------------------------------sys_source 替换作品,修改状态, 设置默认封面------------------------------
//        //获取所有资源位信息
//        List<SysSource> sysSourceList = sysSourceService.selectSysSourceList(new SysSource());
//
//        System.out.println("查询所有资源位: "+ sysSourceList.size());
//
//        // 由于默认从明天购买, 资源位状态在被购买时就已经改变,起止时间在下订单时被写入,这里就不需要从订单里查询资源位的起止时间了.
//        // 若后期可以预定资源位时间,则需要从订单里查询资源位的起止时间了.
//        for(SysSource sysSource : sysSourceList){
//            // 根据sysSource中的startTime和endTime
//            if(sysSource.getStartTime() != null && sysSource.getEndTime() != null){
////                 System.out.println("资源位id: "+sysSource.getSourceId()+" 资源位状态: "+sysSource.getSourceStatus()+" 资源位起止时间: "+sysSource.getStartTime()+"--"+sysSource.getEndTime());
////                 System.out.println("开始时间: "+ sysSource.getStartTime() + "今天日期" + now + "是否相等: " + sysSource.getStartTime().equals(now));
//                if(sysSource.getStartTime().equals(now)){
//                    System.out.println("订单开始 "+"资源位id: "+sysSource.getSourceId()+" 资源位状态: "+sysSource.getSourceStatus()+" 资源位起止时间: "+sysSource.getStartTime()+"--"+sysSource.getEndTime()
//                            +" 作品id: "+ sysSource.getWorkId());
//                    // 根据work_id 修改资源位默认背景. 资源位状态修改为2(已购展示中)
//                    sysSource.setSourceStatus("2");
//                    UserWork userwork = userWorkService.selectUserWorkByWorkId(sysSource.getWorkId());
//
//                    // 处理userwork为null的情况
//                    // 判断作品是否通过审核, 审核通过的作品才能展示
//                    if(userwork!=null && userwork.getWorkStatus().equals("3")){
//                        // 这个wordAddress有意义吗? 好像没什么用, 传作品的时候还是要去查user_work这张表
//                        sysSource.setWorkAddress(userwork.getWorkAddress());
//                    }
//                    // 修改订单状态为3 展示中
//                    Long orderId = sysSource.getOrderId();
//                    if(orderId != null){
//                        SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
//                        if(sysOrder!=null){
//                            sysOrder.setStatus("3");
//                            sysOrderService.updateSysOrder(sysOrder);
//                        }
//                    }
//
//
//                    // 作品为null说明已经注销账号了, 这里直接把
//                    else{
//
//                    }
//
//                }
//                // 结束展示--修改默认背景和默认价格, 这个区域的默认价格可能发生变化.
//                else if(sysSource.getSourceStatus().equals("2") && sysSource.getEndTime().equals(now)){
//                    SysScenicDefault sysScenicDefault = sysScenicDefaultService.getScenicDefaultByScenicAndPart(sysSource.getScenic(), sysSource.getPart());
//                    // System.out.println("订单结束, 默认资源位价格数据: "+ sysScenicDefault.getPrice());
//                    sysSource.setPrice(sysScenicDefault.getPrice());
//                    sysSource.setSourceStatus("0");
//                    sysSource.setWorkAddress(sysScenicDefault.getWorkAddress());
//
//                    // 修改订单状态为2 已结束
//                    Long orderId = sysSource.getOrderId();
//                    if(orderId != null){
//                        SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
//                        if(sysOrder!=null){
//                            sysOrder.setStatus("2");
//                            sysOrderService.updateSysOrder(sysOrder);
//                        }
//                    }
//
//                }
//
//                // 审核未通过--结束时间已经过去了---退款
//                else if(sysSource.getSourceStatus().equals("1") && sysSource.getEndTime().isEqual(now.atStartOfDay())){
//                    //-----------------退款  还没写------------------------
//
//                    // 修改订单状态为1 已退款
//                    Long orderId = sysSource.getOrderId();
//                    if(orderId != null){
//                        SysOrder sysOrder = sysOrderService.selectSysOrderByOrderId(orderId);
//                        if(sysOrder!=null){
//                            sysOrder.setStatus("1");
//                            sysOrderService.updateSysOrder(sysOrder);
//                        }
//                    }
//
//                    // 退款时发送消息
//                    //-----------------退款end--------------------------
//
//                    SysScenicDefault sysScenicDefault = sysScenicDefaultService.getScenicDefaultByScenicAndPart(sysSource.getScenic(), sysSource.getPart());
//                    // System.out.println("订单结束, 默认资源位价格数据: "+ sysScenicDefault.getPrice());
//                    sysSource.setPrice(sysScenicDefault.getPrice());
//                    sysSource.setSourceStatus("0");
//                    sysSource.setWorkAddress(sysScenicDefault.getWorkAddress());
//
//                }
//
//                // 更新资源位信息
//                sysSourceService.updateSysSource(sysSource);
//
//                // 24小时临期,结束资源位展示消息, 资源位结束时间-1 = now
//                if(sysSource.getEndTime().minusDays(1).equals(now)){
//                    // 发送系统消息
//                    //发送消息通知
//                    Long workId = sysSource.getWorkId();
//                    // 查询用户id
//                    UserWork userWork = userWorkService.selectUserWorkByWorkId(workId);
//                    if(userWork != null){
//                        Long receiveUserId = userWork.getUserId();
//                        if (receiveUserId != null){
//                            SysUserNotification sysUserNotification = new SysUserNotification();
//                            sysUserNotification.setUserId(receiveUserId);
//                            sysUserNotification.setSenderId(0L);
//                            // 24小时临期消息
//                            sysUserNotification.setType("7");
//                            sysUserNotification.setStatus("0");
//
//                            userNotificationService.insertSysUserNotification(sysUserNotification);
//
//
//                        }
//                    }
//
//
//                }
//
//            }
//
//        }
//
//        //----------------------------------sys_source 替换作品,修改状态, 设置默认封面 end---------------------------










//        // 总的用户总数
//        Long tUser = sysUserCountService.getUserCount();
//
//        // 用户总的在线时长
//        Long tOnlineTime = dailyUserService.getTotalOnlineTime(oneDayAgo);
//
//        // 用户总的MR在线时长
//        Long tMRTime = dailyUserService.getTotalMRTime(oneDayAgo);

//        //----------------------------------------资源位--------------------------------------------------------------------
//        // 资源位相关的查询----------成功.
//        DailySourceDto dailySourceDto = dailySourceService.getStDailySource(oneDayAgo);
//
//        System.out.println("bought:"+dailySourceDto.getBought()+" shares: "+dailySourceDto.getShares()+" inter: "+dailySourceDto.getInteractions()+" mr: "+dailySourceDto.getuMrTime());
//
//        //---------------------------------------资源位相关end-----------------------------------------------------------------------
//        //---------------------------------------------- 用户相关的查询----------------------------------------------------------------------------------
//        DailyUserDto dailyUserDto = dailyUserService.getStDailyUser(oneDayAgo);
//
//        System.out.println("tUser:"+dailyUserDto.getOnlineTime()+" tOnlineTime: "+dailyUserDto.getMrTime()+" tMRTime: "+dailyUserDto.getConsumption()+" tWork: "+dailyUserDto.gettWork());
//
//        //-------------------------------------------用户相关查询 end-----------------------------------------------------------------------------------------

    }




    // 统计用户每天消费-- daily_user 的 consumption 属性

    // 统计各个地区的MR在线时长

    // 统计每天资源位的互动次数, 分享次数, 被购买总数
}
