
package com.tmerclub.cloud.user.service;

import cn.hutool.core.date.DateTime;
import com.tmerclub.cloud.api.user.vo.UserManagerVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.user.bo.mongo.MongoUserScoreLogBO;
import com.tmerclub.cloud.user.model.UserScoreLog;
import com.tmerclub.cloud.user.vo.UserScoreLogVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户积分记录
 *
 * @author YXF
 * @date 2020-12-08 10:16:53
 */
public interface UserScoreLogService {

    /**
     * 保存到mongodb
     * @param mongoUserScoreLogBO
     */
    void saveToMongdb(MongoUserScoreLogBO mongoUserScoreLogBO);

    /**
     * 批量保存到mongodb
     * @param list
     */
    void saveBatchToMongodb(List<MongoUserScoreLogBO> list);

    /**
     * 根据出入类型和积分状态分页获取用户积分记录列表
     *
     * @param pageDTO 分页参数
     * @param ioType  出入类型
     * @param source  积分状态
     * @return 用户积分记录列表分页数据
     */
    PageVO<UserScoreLogVO> pageByIoTypeAndSource(PageDTO pageDTO, Integer ioType, Integer source);

    /**
     * 通过用户id，分页获取用户积分日志
     *
     * @param pageDTO
     * @param userId
     * @return
     */
    PageVO<UserScoreLogVO> pageByUserId(PageDTO pageDTO, Long userId);

    /**
     * 根据用户id删除用户积分记录
     *
     * @param userId 用户id
     */
    void deleteByUserId(@Param("userId") Long userId);

    /**
     * 根据日志类型，用户id，开始时间和结束时间获取日志数量
     *
     * @param type       日志类型
     * @param userId     用户id
     * @param beginOfDay 开始时间
     * @param endOfDay   结束时间
     * @return 数量
     */
    Long countByUserIdAndDateTimeAndType(Integer type, Long userId, DateTime beginOfDay, DateTime endOfDay);

    /**
     * 获取业务有关积分记录
     *
     * @param userId 用户id
     * @param bizId  业务id
     * @param source 业务类型
     * @param ioType 收入/支出
     * @return
     */
    UserScoreLog getOrderScoreLog(Long userId, Long bizId, Integer source, Integer ioType);

    /**
     * 获取用户积分商品兑换记录列表
     *
     * @param pageDTO
     * @return
     */
    PageVO<UserScoreLogVO> scoreProdPage(PageDTO pageDTO);

    /**
     * 根据退款id列表获取退款积分总数
     *
     * @param refundIds
     * @return
     */
    Long getScoreCountByRefundIds(List<Long> refundIds);

    /**
     * 根据用户id查询最近一条积分过期日志
     *
     * @param userId
     * @return
     */
    UserScoreLog getExpireScoreLogByUserId(Long userId);

    /**
     * 初始化积分记录到mongodb
     */
    void initUserScoreLogToMongodb();

    /**
     * 补充用户列表积分数据
     * @param userList
     * @return
     */
    List<UserManagerVO> setUserInfo(List<UserManagerVO> userList);
}
