package com.qmth.sop.business.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qmth.sop.business.bean.dto.SopCrmInfo;
import com.qmth.sop.business.bean.params.ServiceScopeParam;
import com.qmth.sop.business.bean.result.CrmProjectResult;
import com.qmth.sop.business.bean.result.CrmServiceResult;
import com.qmth.sop.business.bean.result.CrmSubTotalResult;
import com.qmth.sop.business.bean.result.TBCrmResult;
import com.qmth.sop.business.entity.TBCrm;
import com.qmth.sop.common.enums.CrmStatusEnum;
import com.qmth.sop.common.enums.ProductTypeEnum;

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

/**
 * <p>
 * 派单信息表 服务类
 * </p>
 *
 * @author wangliang
 * @since 2023-08-01
 */
public interface TBCrmService extends IService<TBCrm> {

    /**
     * 服务范围管理 - 派单分页查询
     *
     * @param serviceUnitId 服务单元id
     * @param city          城市
     * @param productType   客户类型
     * @param customName    客户名称
     * @param bindStatus    绑定状态
     * @param pageNumber    分页页数
     * @param pageSize      分页容量
     * @return 派单分页查询结果
     */
    IPage<CrmServiceResult> findServiceScopePage(Long serviceUnitId, String city, ProductTypeEnum productType, String customName, Boolean bindStatus, Integer pageNumber, Integer pageSize);

    /**
     * 服务范围管理 - 待分配派单分页查询
     *
     * @param crmUserId   派单人id
     * @param productType 业务类型
     * @param customName  客户名称
     * @param crmNo       项目单号
     * @param startTime   派单开始时间
     * @param endTime     派单截止时间
     * @param pageNumber  分页页数
     * @param pageSize    分页容量
     * @return 未分配派单分页查询结果
     */
    IPage<CrmServiceResult> findUnbindOrderPage(Long crmUserId, ProductTypeEnum productType, String customName, String crmNo, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);

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

    /**
     * 服务范围管理 - 批量划定派单和服务单元关系
     *
     * @param serviceScopeParam 服务范围划定参数
     */
    void bindCrmWithServiceBatch(ServiceScopeParam serviceScopeParam);

    /**
     * 服务范围管理 - 移除(解绑派单和服务单元)
     *
     * @param crmId 派单id
     */
    void unbindCrmWithService(Long crmId);


    /**
     * 服务范围管理 - 查询派单小计
     *
     * @param serviceUnitId 服务单元id
     * @param city          城市
     * @param productType   客户类型
     * @param customName    客户名称
     * @param bindStatus    绑定状态
     * @return 派单小计
     */
    CrmSubTotalResult findCrmSubTotalData(Long serviceUnitId, String city, ProductTypeEnum productType, String customName, Boolean bindStatus);

    /**
     * 根据编号查询crm
     *
     * @param crmNo crm单号
     * @return crm
     */
    TBCrm findByCrmNo(String crmNo);


    /**
     * 查询列表
     *
     * @param iPage
     * @return
     */
    IPage<TBCrmResult> query(IPage<Map> iPage, Long serviceId,Boolean isBind, Long leadId, Long crmUserId, ProductTypeEnum type, String custom, String crmNo, Long startTime, Long endTime);

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

    /**
     * 新增修改派单信息表
     *
     * @param tBCrm
     */
    Boolean saveTBCrm(TBCrm tBCrm);


    /**
     * 删除派单信息表
     *
     * @param id
     */
    Boolean delete(Long id);

    boolean batchDisable(long[] crmIds);

    /**
     * 根据sopNo或crmNo查询项目派单信息
     *
     * @param sopNo sopNo
     * @param crmNo crmNo
     * @return 项目派单信息
     */
    CrmProjectResult findCrmProjectBySopNoOrCrmNo(String sopNo, String crmNo);

    /**
     * 根据sop单号查询签到中派单信息
     *
     * @param sopNo sop单号
     * @return 签到中派单信息
     */
    SopCrmInfo findSopCrmInfoBySop(String sopNo);

    /**
     * 根据工程师 用户id或档案id
     *
     * @param userId         用户id
     * @param userArchivesId 档案id
     * @return 正在进行的派单（被占用的）
     */
    List<TBCrm> findOccupiedCrm(Long userId, Long userArchivesId);

    /**
     * 根据工程师 用户id或档案id
     *
     * @param userId         用户id
     * @param userArchivesId 档案id
     * @return 所有派单
     */
    List<TBCrm> findAllCrm(Long userId, Long userArchivesId);

    /**
     * 更新派单发布状态
     *
     * @param crmNo  派单号
     * @param status 要更新的派单状态
     */
    void updateCrmStatus(String crmNo, CrmStatusEnum status);

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


    /**
     * 派单重新划定服务单元
     *
     * @param crmNo            派单号
     * @param oldServiceUnitId 划定前派单的服务单元id
     * @param newServiceUnitId 划定后派单的服务单元id
     */
    void crmReBindServiceUnit(String crmNo, Long oldServiceUnitId, Long newServiceUnitId);

    /**
     * 从纷享销客同步派单信息
     */
    Map<String, Object> syncCrmFromFxxk(Map<String, Object> map);
}