/**
 * @filename:CustomerAssignService 2024-06-03
 * @project trade-admin V1.0 Copyright(c) 2024 wanglang Co. Ltd. All right reserved.
 */
package com.trade.admin.enterprise.customer.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.trade.admin.enterprise.customer.domain.CustomerAssign;
import com.trade.admin.enterprise.customer.domain.CustomerAssignRecord;
import com.trade.admin.enterprise.customer.domain.SearchCustomerAssign;
import com.trade.admin.enterprise.customer.dto.ClaimDto;
import com.trade.admin.enterprise.customer.dto.CustomerTransferVo;
import com.trade.common.core.page.GridPage;

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

/**
 * @Description:客户分配移交业务接口
 * @version: V1.0
 * @author: wanglang
 */
public interface CustomerAssignService extends IService<CustomerAssign> {

    /**
     * 官网客户分配列表
     *
     * @param search
     * @return GridPage<CustomerAssign>
     */
    GridPage<CustomerAssign> findBySearch(SearchCustomerAssign search);

    /**
     * 查询客户分配信息
     * 
     * @param customerUserId
     * @return
     */
    CustomerAssign findByCustomerUserId(Long customerUserId);

    /**
     * 查看操作记录
     *
     * @param customerAssignId 官网客户分配ID
     * @return List<CustomerAssignRecord> 操作记录集合
     */
    List<CustomerAssignRecord> findRecordByCustomerAssignId(Long customerAssignId);

    /**
     * 新增官网客户信息
     *
     * @param customerUserId C端用户ID
     * @param referralCode 推荐码
     * @param identifierNo C端用户唯一标识
     */
    Boolean addCustomerAssign(Long customerUserId, String referralCode, String identifierNo);

    /**
     * 认领:只有BD/RC角色才可以认领
     *
     * @param claimDto 官网客户分配的主键ID 以及备注
     * @return boolean true 认领成功、否则失败
     */
    Boolean claim(ClaimDto claimDto);

    /**
     * 查询详情信息
     *
     * @param ids 主键ID
     * @return Map<String,Object>
     */
    Map<String, Object> getDetailById(List<Long> ids);

    /**
     * 分配调整
     *
     * @param assigns 客户分配实体对象
     * @return Boolean 修改成功、否则修改失败
     */
    Boolean assignAdjustment(List<CustomerAssign> assigns);

    /**
     * 获取移交页面信息
     * 
     * @return 移交页面信息
     */
    List<CustomerTransferVo> getCustomerTransferInfo(List<Long> customerAssignIds);

    /**
     * 移交
     *
     * @param assigns 客户移交实体对象
     * @return Boolean 修改成功、否则修改失败
     */
    Boolean transfer(List<CustomerTransferVo> assigns);

    /**
     * 修改
     *
     * @param assign 客户分配实体对象
     * @return boolean true 修改成功、否则修改失败
     */
    boolean update(CustomerAssign assign);

    /**
     * 指定B端用户是否被占用
     *
     * @param userId B端用户ID
     * @return true:被占用；false：未被占用
     */
    boolean isOccupiedByUserId(Long userId);
}
