package com.foreverwin.mesnac.anomaly.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.foreverwin.mesnac.anomaly.dto.AbnormalBillDisposeDto;
import com.foreverwin.mesnac.anomaly.dto.AbnormalBillDto;
import com.foreverwin.mesnac.anomaly.model.AbnormalBill;
import com.foreverwin.mesnac.anomaly.model.AbnormalBillDispose;
import com.foreverwin.mesnac.anomaly.model.UploadPictures;
import com.foreverwin.mesnac.common.model.Message;
import com.foreverwin.mesnac.meapi.dto.SfcDto;
import com.foreverwin.mesnac.meapi.model.MessageType;
import com.foreverwin.modular.core.util.FrontPage;

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

/**
 * <p>
 * 异常单 服务类
 * </p>
 *
 * @author zjw
 * @since 2021-08-16
 */
public interface AbnormalBillService extends IService<AbnormalBill> {

    /**
     *  分页查询
     * @param frontPage
     * @return
     */
    IPage<AbnormalBill> selectPage(FrontPage<AbnormalBill> frontPage, AbnormalBill abnormalBill);

    List<AbnormalBill> selectList(AbnormalBill abnormalBill);


    String anomalyReportOther(AbnormalBill abnormalBill,
                              AbnormalBillDispose abnormalBillDispose,
                              List<String> dutyCauseType,
                              List<String> dutyType);

    String anomalyReport(AbnormalBill abnormalBill,
                         AbnormalBillDispose abnormalBillDispose,
                         List<String> ncGroupAndNcCodes,
                         List<String> dutyCauseType,
                         List<String> dutyType);

    /**
     * 生成异常单号、创建时间和更新时间
     * 异常提报的时候调用的公共方法
     * @param abnormalBill
     * @param abnormalBillDispose
     */
    String generateAbnormalBill(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose,List<String> dutyCauseType,List<String> dutyType);

    boolean cancelBrowse(String handle,String cancelBrowse,String code,String cancelSendUserGroup);

    String anomalyReportDevice(AbnormalBill abnormalBill,AbnormalBillDispose abnormalBillDispose);

    /**
     * 初始化
     */
    HashMap<String,Object> init(String type);
    /**
     * 待办事项
     * @param abnormalBillDto
     * @return
     */
    List<AbnormalBillDto> backLog(AbnormalBillDto abnormalBillDto);

    /**
     * 跳转到异常响应**界面所带出的数据
     */
    AbnormalBillDisposeDto findAllByAbnormalNo(AbnormalBill abnormalBill);

    /**
     *
     */
    AbnormalBillDto findAllByAbnormalNoDevice(AbnormalBill abnormalBill);

    /**
     * 响应处理
     * @param abnormalBill
     */
    void resProcessing(AbnormalBill abnormalBill);

    /**
     * 方案确认
     * @param abnormalBill
     */
    void programConfirm(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose);

    /**
     * 判责提交
     * @param abnormalBill
     */
    void dutyConfirm(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose,
                     List<String> dutyCauseType,
                     List<String> dutyType);

    /**
     * 闭环关闭
     * @param abnormalBill
     * @param abnormalBillDispose
     */
    void anomalyShutDown(AbnormalBill abnormalBill,AbnormalBillDispose abnormalBillDispose);

    /**
     * 放置图片
     * @param abnormalBill
     */
    public void fileUpload(AbnormalBill abnormalBill);

    /**
     * 查看照片
     * @param abnormalBill
     * @return
     */
    public UploadPictures findUploadPictureByAbnormalBo(AbnormalBill abnormalBill);

    /**
     * 生成异常单
     * @param type
     * @return
     */
    String getNextNumber(String type);

    HashMap<String,Object> anomalyReveseRepair(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose);

//    void deleteFileInDatabase(String ftpPath,String fileName);

    /**
     * 异常发送消息
     */
    boolean anomalyCreatedAndSendMessage(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose);

    /**
     * 格式化消息
     */
    String formatMessage(AbnormalBill abnormalBill,String messageType, String site);

    List<AbnormalBill> getQCAbnormal();

    IPage getAbnormalByConditionalPage(IPage page,Map paramMap,String keyword);

    IPage getAbnormalSFCPage(IPage page,Map paramMap,String keyword);
    /**
     * @param sfcDto 以下是传递的参数
     * sfc
     * abnormalNo
     * qty
     * stepId
     * */
    void batchRepair(SfcDto sfcDto);

    /**
     * 根据异常单的状态和对应的用户组(status对应不同的用户组)找到对应的消息类型
     * @param message
     * @param abnormalBill
     * @param abnormalBillDispose
     */
    MessageType findMessageTypeByStatusAndUserGroup(Message message, AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose);

    /**
     *响应超时时要创建两个消息类型，分别时责任划分和判责提交，但是不发消息
     * @param paramMessage
     * @param userGroup
     */
    void saveDutyMessageAndResolveMessageByNodeIsResponse(Message paramMessage,String userGroup);

}