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.result.ProjectMonitorResult;
import com.qmth.sop.business.bean.result.ServiceUnitProgressResult;
import com.qmth.sop.business.bean.result.ServiceUnitProvinceResult;
import com.qmth.sop.business.entity.TBService;
import com.qmth.sop.common.enums.CrmProcessEnum;
import com.qmth.sop.common.enums.DeviceDeliveryStatusEnum;
import com.qmth.sop.common.enums.InOutTypeEnum;
import com.qmth.sop.common.enums.SopRoleTypeEnum;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ServiceUnitAnalyseMapper extends BaseMapper<TBService> {

    /**
     * 统计服务单元下大区经理的人数
     *
     * @param serviceUnitId 服务单元ID
     * @return 大区经理的人数
     */
    int countLead(@Param(value = "serviceUnitId") Long serviceUnitId);

    /**
     * 统计服务单元下所有的参与人数
     *
     * @param serviceUnitId 服务单元ID
     * @return 参与人数
     */
    int countTotalPerson(@Param(value = "serviceUnitId") Long serviceUnitId);

    /**
     * 统计服务单元所有已签收的设备
     *
     * @param serviceUnitId      服务单元ID
     * @param deliveryStatusList 设备使用状态List
     * @param out                设备出入库
     * @return 服务单元下所有使用的设备
     */
    int countScanner(@Param(value = "serviceUnitId") Long serviceUnitId, @Param(value = "deliveryStatusList") List<DeviceDeliveryStatusEnum> deliveryStatusList,
            @Param(value = "out") InOutTypeEnum out);

    /**
     * 统计服务单元所有阶段的sop
     *
     * @param serviceUnitId 服务单元ID
     * @return sop列表
     */
    List<ServiceUnitProgressResult> listSopProgress(@Param(value = "serviceUnitId") Long serviceUnitId);

    /**
     * 统计服务单元所有省份的派单数量
     *
     * @param serviceUnitId 服务单元ID
     * @return 各省份派单数量Map
     */
    List<ServiceUnitProvinceResult> listProvinceCrmNum(@Param(value = "serviceUnitId") Long serviceUnitId);

    /**
     * 通过服务单元等条件分页查询sop
     *
     * @param page          分页参数
     * @param serviceUnitId 服务单元ID
     * @param crmUserId     客户经理
     * @param customName    客户名称
     * @param process       当前进度
     * @param leadId        大区经理
     * @param province      客户所在省份
     * @param processList   进度List
     * @return 分页结果
     */
    IPage<ProjectMonitorResult> pageSop(Page<ProjectMonitorResult> page, @Param(value = "serviceUnitId") Long serviceUnitId,
            @Param(value = "crmUserId") Long crmUserId, @Param(value = "customName") String customName, @Param(value = "process") CrmProcessEnum process,
            @Param(value = "leadId") Long leadId, @Param(value = "province") String province, @Param(value = "prList") List<String> processList,
            @Param(value = "type") String type, @Param(value = "fieldObj") String fieldObj);

    /**
     * 过服务单元等条件查询sop列表
     *
     * @param serviceUnitId 服务单元ID
     * @param crmUserId     客户经理
     * @param customName    客户名称
     * @param process       当前进度
     * @param leadId        大区经理
     * @param province      客户所在省份
     * @param processList   进度List
     * @return 列表
     */
    List<ProjectMonitorResult> listSop(@Param(value = "serviceUnitId") Long serviceUnitId,
            @Param(value = "crmUserId") Long crmUserId, @Param(value = "customName") String customName, @Param(value = "process") CrmProcessEnum process,
            @Param(value = "leadId") Long leadId, @Param(value = "province") String province, @Param(value = "prList") List<String> processList,
            @Param(value = "type") String type, @Param(value = "fieldObj") String fieldObj);

    /**
     * 通过服务单元等条件分页查询sop
     *
     * @param page          分页参数
     * @param serviceUnitId 服务单元ID
     * @param crmUserId     客户经理
     * @param customName    客户名称
     * @param process       当前进度
     * @param leadId        大区经理
     * @param province      客户所在省份
     * @param processList   进度List
     * @param supplierId    人力商ID
     * @param coordinatorId 区域协调人ID
     * @param roleType      sop角色
     * @return 分页结果
     */
    IPage<ProjectMonitorResult> pageSopByUserAllocation(Page<ProjectMonitorResult> page, @Param(value = "serviceUnitId") Long serviceUnitId,
            @Param(value = "crmUserId") Long crmUserId, @Param(value = "customName") String customName, @Param(value = "process") CrmProcessEnum process,
            @Param(value = "leadId") Long leadId, @Param(value = "province") String province, @Param(value = "prList") List<String> processList,
            @Param(value = "supplierId") Long supplierId, @Param(value = "coordinatorId") Long coordinatorId,
            @Param(value = "roleType") SopRoleTypeEnum roleType, @Param(value = "type") String type, @Param(value = "fieldObj") String fieldObj);

    /**
     * 过服务单元等条件查询sop列表
     *
     * @param serviceUnitId 服务单元ID
     * @param crmUserId     客户经理
     * @param customName    客户名称
     * @param process       当前进度
     * @param leadId        大区经理
     * @param province      客户所在省份
     * @param processList   进度List
     * @return 列表
     */
    List<ProjectMonitorResult> listSopByUserAllocation(@Param(value = "serviceUnitId") Long serviceUnitId,
            @Param(value = "crmUserId") Long crmUserId, @Param(value = "customName") String customName, @Param(value = "process") CrmProcessEnum process,
            @Param(value = "leadId") Long leadId, @Param(value = "province") String province, @Param(value = "prList") List<String> processList,
            @Param(value = "supplierId") Long supplierId, @Param(value = "coordinatorId") Long coordinatorId,
            @Param(value = "roleType") SopRoleTypeEnum roleType, @Param(value = "type") String type, @Param(value = "fieldObj") String fieldObj);
}
