package com.chinaweal.aiccs.aiccs.market.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.chinaweal.aiccs.aiccs.abnormal.entity.EBaseinfo;
import com.chinaweal.aiccs.aiccs.market.entity.AreaSlice;
import com.chinaweal.aiccs.aiccs.market.entity.BizOwnerAssign;
import com.chinaweal.aiccs.aiccs.market.entity.dto.AssignLogDto;
import com.chinaweal.aiccs.aiccs.market.entity.dto.EBaseInfoAssignDto;
import com.chinaweal.aiccs.aiccs.market.entity.dto.SliceAssignLogDto;
import com.chinaweal.aicorg.model.AICUser;
import com.chinaweal.youfool.framework.springboot.exception.custom.ParameterException;
import com.chinaweal.youfool.framework.springboot.mybatis.plus.BaseService;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;

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

/**
 * <p>
 * 业户管理业务记录表 服务类
 * </p>
 *
 * @author <a href="https://blog.lroyia.top">lroyia</a>
 * @since 2021-05-05
 */
public interface BizOwnerAssignService extends BaseService<BizOwnerAssign> {

    /**
     * 业户认领记录分页
     * @param page   分页参数
     * @param params    查询参数
     * @return  分页结果
     * @author lroyia
     * @since  2021年5月5日 11:38:07
     */
    IPage<EBaseInfoAssignDto> ownerAssignPage(IPage<EBaseinfo> page, Map<String, Object> params);

    /**
     * 业户认领记录
     * @param params  查询参数
     * @return  结果
     * @author ymc
     * @since  2022年5月23日 16:11
     */
    List<EBaseInfoAssignDto> ownerAssign(Map<String, Object> params);

    /**
     * 待认领数据分页
     * @param beginId   待认领主体分页
     * @param limitSize 分页大小
     * @return  限制结果
     * @author lroyia
     * @since  2022年1月14日 09:42:21
     */
    List<EBaseInfoAssignDto> waitAssignPage(String beginId, int limitSize);

    /**
     * 片区认领（加悲观锁判断）
     * @param sliceId 片区id
     * @param pripid  主体pripid
     * @param operatorId 操作人id
     * @return  新建的认领结果，没有则表示之前已经认领掉
     * @author lroyia
     * @since  2021年5月21日 17:08:39
     */
    BizOwnerAssign areaClaim(String sliceId, String pripid, String operatorId);

    /**
     * 片区认领（加悲观锁判断）
     * @param sliceId 片区id
     * @param pripid  主体pripid
     * @param operatorId 操作人id
     * @param assignType 认领类型（指派或认领）
     * @return  新建的认领结果，没有则表示之前已经认领掉
     * @author lroyia
     * @since  2021年5月21日 17:08:39
     */
    BizOwnerAssign areaClaim(String sliceId, String pripid, String operatorId, String assignType);


    List<BizOwnerAssign> listBySliceId(String sliceId);

    /**
     * 列出带片区信息的列入记录
     * @param sliceId   片区id
     * @param pripid    主体pripid
     * @return  查询结果
     * @author lroyia
     * @since  2021年12月11日 15:12:16
     */
    List<SliceAssignLogDto> listBySliceInfo(String sliceId, String pripid);

    /**
     * 查询认领记录信息
     * @param pripid    主体pripid
     * @return  查询结果
     * @author lroyia
     * @throws ParameterException 参数错误，pripid不可为空
     * @since  2021年12月29日 10:37:24
     */
    List<AssignLogDto> listAssignLog(String pripid) throws ParameterException;

    /**
     * 获取当前用户对该主体的可认领片区
     * @param pripid    主体pripid
     * @param curUser    当前用户
     * @return  获取结果
     * @author lroyia
     * @since  2021年12月29日 14:31:01
     */
    List<AreaSlice> getAssignableSlice(String pripid, AICUser curUser);

    /**
     * 查询最新的认领记录
     * @param pripid    主体id
     * @return  查询结果
     * @author lroyia
     * @since  2022年1月5日 14:20:35
     */
    BizOwnerAssign getLatestAssignLog(String pripid);

    /**
     * 查询没有认领记录，但已经认领的主体信息
     * @param beginId   主体id
     * @param limitSize 分页大小
     * @param supOrg  认领机关
     * @return  查询结果
     * @author lroyia
     * @since  2022年1月14日 10:39:01
     */
    List<EBaseinfo> selectNoAssignRecordInfo(String beginId, int limitSize, String supOrg);

    /**
     * 业户认领操作接口
     * @author ymc
     * @date 2022年4月25日 10:44
     * @param sliceId 片区id
     * @param pripid 主体id
     * @return
     */
    RestResult<?> assignOwner(String sliceId, String pripid, String assignType);


    void BatchAssignOwner(String sliceId, List list, String assignType);

    List<Map<String, String>> countAssign(String org, String psid, Map<String, Object> param);

}
