package com.qmth.sop.business.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qmth.sop.business.bean.dto.DataPermissionDto;
import com.qmth.sop.business.bean.dto.SopCrmInfo;
import com.qmth.sop.business.bean.result.CrmProjectResult;
import com.qmth.sop.business.bean.result.CrmServiceResult;
import com.qmth.sop.business.bean.result.SysLogResult;
import com.qmth.sop.business.bean.result.TBCrmResult;
import com.qmth.sop.business.entity.TBCrm;
import com.qmth.sop.common.enums.ProductTypeEnum;
import org.apache.ibatis.annotations.Param;

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

/**
 * <p>
 * 派单信息表 Mapper 接口
 * </p>
 *
 * @author wangliang
 * @since 2023-08-01
 */
public interface TBCrmMapper extends BaseMapper<TBCrm> {

    /**
     * 服务范围管理派单分页查询
     *
     * @param iPage         分页参数
     * @param serviceUnitId 服务单元id
     * @param city          城市
     * @param productType   业务类型
     * @param customName    客户名称
     * @param bindStatus    派单是否绑定服务单元
     * @param dpr           数据权限
     * @return 分页查询结果
     */
    IPage<CrmServiceResult> findServiceScopePage(@Param("iPage") Page<SysLogResult> iPage, @Param("serviceUnitId") Long serviceUnitId,
            @Param("city") String city, @Param("productType") ProductTypeEnum productType, @Param("customName") String customName,
            @Param("bindStatus") Boolean bindStatus, @Param("dpr") DataPermissionDto dpr);

    /**
     * 服务范围管理派单分页查询
     *
     * @param serviceUnitId 服务单元id
     * @param city          城市
     * @param productType   业务类型
     * @param customName    客户名称
     * @param bindStatus    派单是否绑定服务单元
     * @param dpr           数据权限
     * @return 分页查询结果
     */
    List<CrmServiceResult> findServiceScopeList(@Param("serviceUnitId") Long serviceUnitId, @Param("city") String city,
            @Param("productType") ProductTypeEnum productType, @Param("customName") String customName, @Param("bindStatus") Boolean bindStatus,
            @Param("dpr") DataPermissionDto dpr);

    /**
     * 服务范围管理-未绑定派单分页查询
     *
     * @param iPage       分页参数
     * @param crmUserId   派单人id
     * @param productType 业务类型
     * @param customName  客户名称
     * @param crmNo       项目单号
     * @param startTime   派单时间 - 起始
     * @param endTime     派单时间 - 截止
     * @return 分页查询结果
     */
    IPage<CrmServiceResult> findUnbindOrderPage(@Param("iPage") Page<SysLogResult> iPage, @Param("crmUserId") Long crmUserId,
            @Param("productType") ProductTypeEnum productType, @Param("customName") String customName, @Param("crmNo") String crmNo,
            @Param("startTime") Long startTime, @Param("endTime") Long endTime);

    /**
     * 根据服务单元id集合查询派单部分信息
     *
     * @param serviceIdList 服务单元id集合
     * @return 派单信息
     */
    List<CrmServiceResult> findOrderListByServiceIds(@Param("serviceIdList") List<Long> serviceIdList);

    /**
     * 查询列表
     *
     * @param iPage
     * @return
     */

    IPage<TBCrmResult> query(IPage<Map> iPage, @Param("serviceId") Long serviceId, @Param("isBind") Boolean isBind, @Param("leadId") Long leadId, @Param("crmUserId") Long crmUserId, @Param("type") String type,
            @Param("custom") String custom, @Param("crmNo") String crmNo, @Param("startTime") Long startTime, @Param("endTime") Long endTime);

    int count(@Param("serviceId") Long serviceId, @Param("isBind") Boolean isBind, @Param("leadId") Long leadId, @Param("crmUserId") Long crmUserId, @Param("type") String type, @Param("custom") String custom,
            @Param("crmNo") String crmNo, @Param("startTime") Long startTime, @Param("endTime") Long endTime);

    /**
     * 根据sopNo查询派单项目信息
     *
     * @param sopNo sop号
     * @return 派单项目结果
     */
    List<CrmProjectResult> findCrmProjectBySopNo(@Param("sopNo") String sopNo);

    /**
     * 根据crmNo查询派单项目信息
     *
     * @param crmNo crmNo
     * @return 派单项目结果
     */
    List<CrmProjectResult> findCrmProjectByCrmNo(@Param("crmNo") String crmNo);

    /**
     * 根据sopNo查询派单信息
     *
     * @param sopNo sop号
     * @return sop派单信息
     */
    List<SopCrmInfo> findSopCrmInfoBySopNo(@Param("sopNo") String sopNo);

    /**
     * 查询工程师正在哪个派单上
     *
     * @param userId         工程师用户id
     * @param userArchivesId 工程师档案id
     * @return 被占用的派单
     */
    List<TBCrm> findOccupiedCrm(@Param("userId") Long userId, @Param("userArchivesId") Long userArchivesId);

    /**
     * 查询工程师正在哪个派单上
     *
     * @param userId         工程师用户id
     * @param userArchivesId 工程师档案id
     * @return 被占用的派单
     */
    List<TBCrm> findAllCrm(@Param("userId") Long userId, @Param("userArchivesId") Long userArchivesId);

    /**
     * 根据绑定的服务单元id和客户地址查询符合条件的派单
     *
     * @param serviceUnitId 服务单元id
     * @param province      省份
     * @param city          城市
     * @return 派单集合
     */
    List<TBCrm> findByTBCrmListByServiceUnitIdAndAddress(@Param("serviceUnitId") Long serviceUnitId, @Param("province") String province,
            @Param("city") String city);
}
