
package com.tmerclub.cloud.flow.service;


import com.tmerclub.cloud.api.user.vo.MemberContributeValueVO;
import com.tmerclub.cloud.api.user.vo.MemberTrendRespVO;
import com.tmerclub.cloud.flow.bo.FlowRegionalBO;
import com.tmerclub.cloud.flow.bo.FlowUserBO;
import com.tmerclub.cloud.flow.bo.FlowUserFootprintBO;
import com.tmerclub.cloud.flow.bo.FlowUserRetainBO;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;

import java.util.Date;
import java.util.List;

/**
 * 流量分析—页面数据统计表
 *
 * @author YXF
 * @date 2021-05-21 15:25:19
 */
public interface UserAnalyseMongoService {

    /**
     * 统计当天用户操作记录
     *
     * 统计数据存储表：flow_user_operation
     * 数据统计来源表：flow_user_log
     * @param beginDate
     * @param endDate
     */
    void statisticsAndSaveUserOfDay(Date beginDate, Date endDate);

    /**
     * 插入访问深度统计
     *
     * 统计数据存储表：flow_user_footprint
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginDate
     * @param endDate
     */
    void statisticsAndSaveUserFootprintOfDay(int dateType, Date beginDate, Date endDate);

    /**
     * 插入访问深度统计
     *
     * 统计数据存储表：flow_user_footprint
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginDate
     * @param endDate
     */
    void statisticsAndSaveUserFootprintOfTime(int dateType, Date beginDate, Date endDate);

    /**
     * 获取访问深度统计列表
     *
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginDate
     * @param endDate
     * @return
     */
    List<FlowUserFootprintBO> listUserFootprintOfTime(int dateType, Date beginDate, Date endDate);

    /**
     * 插入访问深度统计
     *
     * 统计数据存储表：flow_user_footprint
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginDate
     * @param endDate
     * @param aggregationOperationList
     * @return
     */
    List<FlowUserFootprintBO> statisticsUserFootprintOfTime(int dateType, Date beginDate, Date endDate, List<AggregationOperation> aggregationOperationList);

    /**
     * 插入访问地域统计
     *
     * 统计数据存储表：flow_regional
     * 数据统计来源表：flow_user_operation、flow_spu_user
     * @param dateType
     * @param beginDate
     * @param endDate
     */
    void statisticsAndSaveRegionalOfTime(int dateType, Date beginDate, Date endDate);

    /**
     * 获取访问地域统计列表
     *
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginDate
     * @param endDate
     * @return
     */
    List<FlowRegionalBO> listFlowRegional(Date beginDate, Date endDate, int dateType);

    /**
     * 插入访问地域统计
     *
     * 统计数据存储表：flow_regional
     * 数据统计来源表：flow_user_operation、flow_spu_user
     * @param beginDate
     * @param endDate
     * @return
     */
    List<FlowRegionalBO> statisticsRegionalOfTime(Date beginDate, Date endDate);

    /**
     * 统计会员概括
     *
     * 统计数据存储表：flow_user
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginTime
     * @param endTime
     * @return
     */
    List<FlowUserBO> statisticsUserOfTime(int dateType, Date beginTime, Date endTime);

    /**
     * 插入会员概括统计
     *
     * 统计数据存储表：flow_user
     * 数据统计来源表：flow_user_operation
     * @param dateType
     * @param beginTime
     * @param endTime
     */
    void statisticsAndSaveUserOfTime(int dateType, Date beginTime, Date endTime);

    /**
     * 获取用户访问深度列表
     * @param startTime
     * @param endTime
     * @param timeType
     * @return
     */
    List<FlowUserFootprintBO> listUserFootprint(Date startTime, Date endTime, Integer timeType);

    /**
     * 实时统计会员数量列表
     * @param startTime
     * @param endTime
     * @param dateType
     * @return
     */
    List<MemberTrendRespVO> statisticsRealMemberTrend(Date startTime, Date endTime, Integer dateType);

    /**
     * 获取会员数量列表
     * @param startTime
     * @param endTime
     * @return
     */
    List<MemberTrendRespVO> listUserNumAndTypeByTime(Date startTime, Date endTime);

    /**
     * 获取指定时间的会员概况
     * @param startTime
     * @param endTime
     * @param dateType
     * @param memberType
     * @return
     */
    FlowUserBO getFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType);

    /**
     * 获取会员概况列表
     * @param startTime
     * @param endTime
     * @param dateType
     * @param memberType
     * @return
     */
    List<FlowUserBO> listFlowUserByTimeAndUserType(Date startTime, Date endTime, Integer dateType, Integer memberType);

    /**
     * 实时会员贡献价值分析
     *
     * 接口用途： 平台端 -> 会员分析 -> 会员贡献价值分析
     * @param startTime
     * @param endTime
     * @return
     */
    List<MemberContributeValueVO> statisticsRealMemberContributeValue(Date startTime, Date endTime);

    /**
     * 获取用户统计数据的最新时间
     * @return
     */
    Date getLatestTime();

    /**
     * 统计并保存客户留存信息
     */
    void statisticsAndSaveUserRetained();

    /**
     * 统计客户留存信息
     * @param startTime
     * @param endTime
     * @return
     */
    List<FlowUserRetainBO> statisticsUserRetained(Date startTime, Date endTime);

    /**
     * 统计当月客户留存信息
     */
    void statisticsAndSaveUserRetainedOfCurrent();

    /**
     * 获取客户留存信息
     * @param startTime
     * @param endTime
     * @param retainType
     * @return
     */
    List<FlowUserRetainBO> listFlowUserRetain(Date startTime, Date endTime, Integer retainType);
}
