package com.ruoyi.excel.wecom.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.excel.wecom.domain.CustomerExportData;
import com.ruoyi.excel.wecom.vo.CustomerExportDataVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * 客户导出数据Mapper
 */
@Mapper
public interface CustomerExportDataMapper extends BaseMapper<CustomerExportData> {
    List<Date> getDistinctDate( @Param("corpId") String corpId);

    /**
     * 查询客户导出数据列表
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param customerName 客户名称(可选)
     * @return 客户导出数据列表
     */
    List<CustomerExportData> selectCustomerExportDataList(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("customerName") String customerName
    );

    /**
     * 查询客户导出数据VO列表(用于导出)
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param customerName 客户名称(可选)
     * @return 客户导出数据VO列表
     */
    List<CustomerExportDataVO> selectCustomerExportDataVOList(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("customerName") String customerName
    );

    /**
     * 根据客户唯一标识查询客户数据（客户名称+添加人账号+添加时间）
     * @param customerName 客户名称
     * @param addUserAccount 添加人账号
     * @param addTime 添加时间
     * @return 客户导出数据
     */
    CustomerExportData selectByUniqueKey(
            @Param("corpId") String corpId,
            @Param("customerUserId") String customerUserId,
            @Param("addUserAccount") String addUserAccount,
            @Param("addTime") Date addTime
    );

    Long selectByFinishDate(
            @Param("corpId") String corpId,@Param("date") Date date,
            @Param("attr") String attr,@Param("successFlags") List<String> successFlags);

    /**
     * 查询及时单数量（根据成交日期和订单状态）
     * @param corpId 企业ID
     * @param date 成交日期
     * @param attr 组字段名
     * @return 及时单数量
     */
    Long selectTimelyOrderCount(
            @Param("corpId") String corpId, @Param("date") Date date,
            @Param("attr") String attr,@Param("successFlags") List<String> successFlags);

    /**
     * 查询非及时单数量（根据成交日期和订单状态）
     * @param corpId 企业ID
     * @param date 成交日期
     * @param attr 组字段名
     * @return 非及时单数量
     */
    Long selectNonTimelyOrderCount(
            @Param("corpId") String corpId, @Param("date") Date date,
            @Param("attr") String attr,@Param("successFlags") List<String> successFlags);

    /**
     * 查询成单数（根据成交日期、组字段和标签值）
     * @param corpId 企业ID
     * @param date 成交日期
     * @param attr 组字段名
     * @param tagValue 标签值
     * @return 成单数
     */
    Long selectByFinishDateAndTag(
            @Param("corpId") String corpId, @Param("date") Date date, 
            @Param("attr") String attr, @Param("tagValue") String tagValue,
            @Param("successFlags") List<String> successFlags);

    /**
     * 查询及时单数量（根据成交日期、订单状态和标签值）
     * @param corpId 企业ID
     * @param date 成交日期
     * @param attr 组字段名
     * @param tagValue 标签值
     * @return 及时单数量
     */
    Long selectTimelyOrderCountByTag(
            @Param("corpId") String corpId, @Param("date") Date date, 
            @Param("attr") String attr, @Param("tagValue") String tagValue,
            @Param("successFlags") List<String> successFlags);

    /**
     * 查询非及时单数量（根据成交日期、订单状态和标签值）
     * @param corpId 企业ID
     * @param date 成交日期
     * @param attr 组字段名
     * @param tagValue 标签值
     * @return 非及时单数量
     */
    Long selectNonTimelyOrderCountByTag(
            @Param("corpId") String corpId, @Param("date") Date date, 
            @Param("attr") String attr, @Param("tagValue") String tagValue,
            @Param("successFlags") List<String> successFlags);

    /**
     * 统计客户导出数据VO数量(用于异步导出)
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param customerName 客户名称(可选)
     * @return 数据总数
     */
    int countCustomerExportDataVOList(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("customerName") String customerName
    );

    /**
     * 分页查询客户导出数据VO列表(用于异步导出)
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param customerName 客户名称(可选)
     * @param offset 偏移量
     * @param limit 每页数量
     * @return 客户导出数据VO列表
     */
    List<CustomerExportDataVO> selectCustomerExportDataVOListByPage(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("customerName") String customerName,
            @Param("offset") int offset,
            @Param("limit") int limit
    );

    /**
     * 按日期范围查询成单数（根据finish_date）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param attr 组字段名（如tag_group11）
     * @return 成单数
     */
    Long selectOrderCountByFinishDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("attr") String attr,
            @Param("successFlags") List<String> successFlags);

    /**
     * 按日期范围查询及时单数量（根据finish_date）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param attr 组字段名
     * @return 及时单数量
     */
    Long selectTimelyOrderCountByDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("attr") String attr,
            @Param("successFlags") List<String> successFlags);

    /**
     * 按日期范围查询非及时单数量（根据finish_date）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param attr 组字段名
     * @return 非及时单数量
     */
    Long selectNonTimelyOrderCountByDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("attr") String attr,
            @Param("successFlags") List<String> successFlags);

    /**
     * 批量查询所有组的成单数（根据finish_date）
     * 一次查询返回所有组的成单数，避免N+1查询问题
     * @param corpId 企业ID
     * @param startDate 开始日期（可为null，表示不限制）
     * @param endDate 结束日期（可为null，表示不限制）
     * @return Map格式：key=组字段名，value=成单数
     */
    Map<String, Object> selectOrderCountBatchByFinishDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("successFlags") List<String> successFlags);

    /**
     * 批量查询所有组的及时单数量（根据finish_date）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return Map格式：key=组字段名，value=及时单数量
     */
    Map<String, Object> selectTimelyOrderCountBatchByDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,@Param("successFlags") List<String> successFlags);

    /**
     * 批量查询所有组的非及时单数量（根据finish_date）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return Map格式：key=组字段名，value=非及时单数量
     */
    Map<String, Object> selectNonTimelyOrderCountBatchByDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,@Param("successFlags") List<String> successFlags);

    /**
     * 查询未分组记录的成单数（所有组字段都为空）
     * @param corpId 企业ID
     * @param date 成交日期
     * @param successFlags 成单状态标志
     * @return 成单数
     */
    Long selectUngroupedFinishCount(
            @Param("corpId") String corpId,
            @Param("date") Date date,
            @Param("successFlags") List<String> successFlags);

    /**
     * 查询未分组记录的及时单数量
     * @param corpId 企业ID
     * @param date 成交日期
     * @param successFlags 及时单状态标志
     * @return 及时单数量
     */
    Long selectUngroupedTimelyOrderCount(
            @Param("corpId") String corpId,
            @Param("date") Date date,
            @Param("successFlags") List<String> successFlags);

    /**
     * 查询未分组记录的非及时单数量
     * @param corpId 企业ID
     * @param date 成交日期
     * @param successFlags 非及时单状态标志
     * @return 非及时单数量
     */
    Long selectUngroupedNonTimelyOrderCount(
            @Param("corpId") String corpId,
            @Param("date") Date date,
            @Param("successFlags") List<String> successFlags);
}

