package com.chinaweal.aiccs.aiccs.abnormal.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.chinaweal.aiccs.aiccs.abnormal.entity.TSAbnList;
import com.chinaweal.aiccs.aiccs.abnormal.entity.TSAttachment;
import com.chinaweal.aiccs.aiccs.abnormal.entity.TSBizSpeList;
import com.chinaweal.aiccs.aiccs.abnormal.entity.dto.AbnProcessDto;
import com.chinaweal.aiccs.aiccs.abnormal.entity.vo.TSBizSpeListVO;
import com.chinaweal.aiccs.aiccs.auditing.entity.TSOpinion;
import com.chinaweal.aiccs.aiccs.business.entity.TSTaskList;
import com.chinaweal.aiccs.aiccs.query.entity.TSEntBaseQuery;
import com.chinaweal.aiccs.aiccs.revoke.entity.Tsbizrevlist;
import com.chinaweal.aiccs.aiccs.revoke.entity.Tsrevtasklist;
import com.chinaweal.aiccs.aiccs.revoke.entity.dto.RevokeProcessDto;
import com.chinaweal.aicorg.model.AICUser;
import com.chinaweal.youfool.framework.springboot.mybatis.plus.BaseService;
import com.chinaweal.youfool.framework.springboot.mybatis.plus.page.PageRequestDto;
import com.chinaweal.youfool.framework.springboot.rest.RestResult;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 列入经营异常名录业务表 服务类
 * </p>2
 *
 * @author <a href="https://blog.lroyia.top">lroyia</a>
 * @since 2021-01-19
 */
public interface TSBizSpeListService extends IService<TSBizSpeList> {

    /**
     * 异常名录待办启动
     *
     * @param user          当前登录用户
     * @param taskListModel 待办信息
     * @param bizSpeList    异常名录信息
     * @return 创建结果
     * @author lroyia
     * @since 2021年1月22日 13:36:00
     */
    TSTaskList saveAbnListAccept(AICUser user, TSTaskList taskListModel, List<TSBizSpeList> bizSpeList);

    /**
     * 查询业务列表
     *
     * @param tsBizSpeListModel 业务列表信息对象
     * @return 查询结果
     * @author lroyia
     * @since 2021年1月22日 15:01:18
     */
    List<TSBizSpeList> selectBSPexptlist(TSBizSpeList tsBizSpeListModel);

    IPage<TSBizSpeList> selectBSPExptByPageList(TSBizSpeList tsBizSpeListModel, IPage<TSBizSpeList> pagingCriteria);

    /**
     * 异常名录列入 审核流程
     *
     * @param user             当前登录用户
     * @param taskListModel    待办列表
     * @param tsBizSpeList     异常名录
     * @param opinionModel     处办意见
     * @param nextNodeID       下一个节点id
     * @param nextPerformerids 下一步处理人id
     * @param nextPerformerids 下一步处理人名称
     * @return 列入处理结果
     * @author lroyia
     * @since 2021年1月25日 09:37:12
     */
    TSTaskList saveAbnListAuditProcess(AICUser user, TSTaskList taskListModel, List<TSBizSpeList> tsBizSpeList, TSOpinion opinionModel, String nextNodeID, String[] nextPerformerids, String[] nextPerformerNames);

    /**
     * 异常名录分页
     *
     * @param tsEntBaseQueryModel 查询参数
     * @return 分页结果
     * @author lroyia
     * @since 2021年1月25日 10:36:33
     */
    IPage<TSEntBaseQuery> abnormalListByPage(IPage<TSEntBaseQuery> page, TSEntBaseQuery tsEntBaseQueryModel);

    IPage<TSBizSpeList> selectAbnListBussByPage(IPage<TSBizSpeList> page, TSAbnList tsAbnListModel, String acceptno);

    /**
     * 异常名录修改 审核流程
     *
     * @param user             当前登录用户
     * @param taskListModel    待办信息
     * @param tsBizSpeList     异常名录
     * @param opinionModel     处办意见
     * @param nextNodeID       下一个节点id
     * @param nextPerformerids 下一步处理人id
     * @param nextPerformerids 下一步处理人名称
     * @return 处理结果
     * @author lroyia
     * @since 2021年1月25日 16:57:48
     */
    TSTaskList saveAbnModifyAuditProcess(AICUser user, TSTaskList taskListModel, List<TSBizSpeList> tsBizSpeList, TSOpinion opinionModel, String nextNodeID, String[] nextPerformerids, String[] nextPerformerNames);

    IPage<TSBizSpeList> selectBizSpeByPageList(IPage<TSBizSpeList> pagingCriteria);

    TSBizSpeList selectBSPexptlistById(String abnlistid);

    IPage<TSBizSpeListVO> selectBizSpeListPage(IPage<TSBizSpeListVO> page, Map<String, Object> customParamMap);

    String updateTaskBusName(String bizseq);

    void clueResubmit(String dataFromId);

    boolean deleteClue(String toIncludeId, String deleteReason, AICUser user);

    /**
     * 动态监管列异线索新增接口
     * @param pripid 企业主键
     * @param includeType 列异类型 2.未按规定公示应当公示的信息 3.公示信息隐瞒真实情况弄虚作假 4.通过登记的住所（经营场所〉无法联系 6.不配合检查情节严重
     * @param regEntryUserId 检查人id
     * @param regEntryUserName 检查人
     * @param dataFrom 3、日常检查 4、应诉检查
     * @param dataFromId 数据来源主键
     * @return
     */
    Map<String, Object> clueAdd(String pripid, String includeType, String regEntryUserId, String regEntryUserName, String dataFrom, String dataFromId);

    /**
     * 动态监管列异线索新增接口 (批量)
     * @param pripids 用";" 隔开
     * @param includeType 列异类型 2.未按规定公示应当公示的信息 3.公示信息隐瞒真实情况弄虚作假 4.通过登记的住所（经营场所〉无法联系 6.不配合检查情节严重
     * @param regEntryUserId 检查人id
     * @param regEntryUserName 检查人
     * @param dataFrom 3、日常检查 4、应诉检查
     * @param dataFromId 数据来源主键
     * @return
     */
    boolean clueAddBatch(String pripids, String includeType, String regEntryUserId, String regEntryUserName, String dataFrom, String dataFromId);

    /**
     * 列异线索废弃/重新提交
     * @param type       “delete” 废弃 “update” 重新提交
     * @param dataFromId 线索主键id
     * @return
     */
    boolean updateClue(String type, String dataFromId);

    /**
     * 列异线索废弃/重新提交（批量）
     * @param type “delete” 废弃 “update” 重新提交
     * @param dataFromId 原dataFromId 用于找到动态监管的附件
     * @param pripids 企业主键用 ";" 分开
     */
    boolean updateClueBatch(String type, String dataFromId, String pripids);

    /**
     * 双随机列异线索废弃/重新提交
     * @param type       “delete” 废弃 “update” 重新提交
     * @param dataFromId 线索主键id
     * @return
     */
    boolean updateAicodsClue(String type, String dataFromId, String files);

    /**
     * 双随机线索回退 通过线索主键id查业务表
     * @param includeId
     * @return
     */
    TSBizSpeList getByToIncludeId(String includeId);

    /**
     * 列异决定书预生成
     * @param specause   列异原因
     * @param entertype  主体类型
     * @param decorg     机关代码
     * @return
     */
    String getDecTempContent(String specause,String entertype,String decorg);

    void processControl(AbnProcessDto abnProcessDto, TSTaskList taskList, List<TSBizSpeList> tsBizSpeList, AICUser loginUser)throws Exception;

    void toHandleCase(AbnProcessDto abnProcessDto, TSTaskList taskList, List<TSBizSpeList> tsBizSpeList, AICUser loginUser);

    void toEndExptlist(AbnProcessDto abnProcessDto, TSTaskList taskList, List<TSBizSpeList> tsBizSpeList, AICUser loginUser);

    void toOverExptlist(AbnProcessDto abnProcessDto, TSTaskList taskList, List<TSBizSpeList> tsBizSpeList, AICUser loginUser);

    void backLastStep(AbnProcessDto abnProcessDto, TSTaskList taskList,String currentNode,String nextNode);

    Boolean saveTsbizspelistBatch(List<TSBizSpeList> list);

    void updateByBizseq(TSBizSpeList tsBizSpeList);

    void updateStatus(TSBizSpeList tsBizSpeList);

    String checkEBaseinfo(String pripid, String entertype, String includeType);

    RestResult<?> saveAcceptBatch(String id, String entertype, HttpServletRequest request);

    RestResult<?> queryOldabnInfo(String SAPPROVECODE);

    RestResult<?> getOldBizSpeListPage(PageRequestDto pageRequestDto);

    void exportExcelOldBizSpeList(OutputStream outputStream, String SAPPROVECODE);
}
