package com.kxs.stat.biz.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kxs.stat.api.dto.statUser.StatUserGetMyTradeDTO;
import com.kxs.stat.api.model.KxsUserTrade;
import com.kxs.stat.api.vo.ShdTradeAmtVO;
import com.kxs.stat.api.vo.TotalTradeAmtVO;
import com.kxs.stat.api.vo.statUser.PercentVO;
import com.kxs.stat.api.vo.statUser.StatUserBrandTradeVO;
import com.kxs.stat.api.vo.statUser.StatUserGetHomeAmoutVO;
import com.kxs.stat.api.vo.statUser.TrendTimesVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.cursor.Cursor;

import java.math.BigDecimal;
import java.util.List;

/**
 * 个人交易统计总表(KxsUserTrade)表数据库访问层
 *
 * @author 系统
 * @since 2024-05-07 17:25:06
 */
@Mapper
public interface KxsUserTradeMapper extends BaseMapper<KxsUserTrade> {

    /**
     * 流式查询pos交易的月交易额
     *
     * @param tableName  表名
     * @return {@link Cursor}<{@link ShdTradeAmtVO}>
     */
    Cursor<ShdTradeAmtVO> getUserTradeList(@Param("tableName") String tableName);

    /**
     * 自动表创建任务
     *
     * @param tableName 表名
     */
    void automaticTableCreationTasks(String tableName);

    /**
     * 创建临时表 下面增删改查
     */
    void createTemporaryShdTable(String tableName);

    ShdTradeAmtVO getTempShdTableData(@Param("tableName") String tableName, @Param("userId") Integer userId);

    void updateTempShdTableData(@Param("tableName") String tableName, @Param("data") ShdTradeAmtVO shdTradeAmtVO);

    Cursor<ShdTradeAmtVO> getTempShdTableList(@Param("tableName") String tableName);

    void insertTempShdTableData(@Param("tableName") String tableName, @Param("data") ShdTradeAmtVO shdTradeAmtVO);

    BigDecimal getStatAmount(String tableName);

    void removeTempTable(String tempTableName);

    /**
     * 查询用户全部交易额根据日期分组以及或根据品牌分组
     * @param tableName 表名
     * @param times 查询日期  日  type = 2时可不传
     * @param userId 用户id
     * @param brandId 是否根据品牌分组  否:null  是:随意传值
     * @Param type 根据类型查询日期  1 日  2月
     * @Param totalType 0 个人 1团队
     * @return
     */
    List<TrendTimesVO> getUserTradeListByDayOrMonth(@Param("tableName") String tableName, @Param("times") List<String> times, @Param("userId") Long userId, @Param("brandId") Integer brandId, @Param("type") Integer type,@Param("totalType") Integer totalType);

    /**
     * 获取传入日期的交易额根据品牌分组
     * @param userId
     * @param times 查询时间列表
     * @param totalType  0个人 1团体
     * @param type 1日查询 2月查询
     * @return
     */
    List<PercentVO> getUserTradeTotal(@Param("tableName")String tableName,@Param("userId") Long userId,@Param("times") List<String> times,@Param("type") Integer type,@Param("totalType") Integer totalType);

    /**
     * 获取首页交易额
     * @param userId
     * @param tableName 表名
     * @param date 交易日
     * @param month 交易月
     * @return
     */
    StatUserGetHomeAmoutVO getHomeAmout(@Param("userId")Long userId, @Param("tableName")String tableName,@Param("date")String date,@Param("month")String month);

    /**
     * 获取月或日pos交易额
     * @param userId
     * @param tableName
     * @param date 时间
     * @param type 1日  2月
     * @return
     */
    TotalTradeAmtVO getPosTrade(@Param("userId")Long userId, @Param("tableName")String tableName, @Param("date")String date,@Param("type")Integer type);

    /**
     * 获取我的业绩
     * @param param type 1:个人 2:计奖   month  无用  不传
     * @param tradeType  0pos  1云闪付
     * @param date 该参数为是否根据日查询   不根据传""
     * @return
     */
    KxsUserTrade getMyPosOrCloudTrade(@Param("param")StatUserGetMyTradeDTO param, @Param("tableName")String tableName, @Param("tradeType")Integer tradeType,@Param("userId")Long userId,@Param("date") String date);

    /**
     * 查询用户所有交易额汇总
     * @param userId 用户id
     * @param date 时间参数
     * @param getType  1获取日详情 2获取月详情
     * @param tradeType 0pos  1云闪付
     * @param brandId 品牌id
     * @param totalType 0:个人 1:计奖
     * @return
     */
    KxsUserTrade getAllUserTrderSum(@Param("userId")Long userId,
                                    @Param("date") Integer date,
                                    @Param("getType") Integer getType,
                                    @Param("tradeType")Integer tradeType,
                                    @Param("brandId") Integer brandId,
                                    @Param("totalType") Integer totalType,
                                    @Param("tableName") String tableName);

    List<StatUserBrandTradeVO> getStatUserBrandTradeVOS(@Param("userId") Long userId, @Param("getType")Integer getType,@Param("tableName") String tableName, @Param("totalType")Integer totalType, @Param("date")String date);

}

