package com.sw.mes.inspect.service;

import com.sw.mes.base.workinprocess.dto.ErrorClosePlanProcessingOrderDto;
import com.sw.mes.base.workinprocess.dto.PlanProcessingOrderDto;
import com.sw.mes.base.workinprocess.entity.PlanProcessingOrder;
import com.sw.mes.core.base.BaseService;
import com.sw.mes.core.dto.PushSapDto;
import com.sw.mes.core.dto.RankResultDto;
import com.sw.mes.core.dto.YbInspectDataToMcsDto;
import com.sw.mes.core.dto.store.WarehouseOutputBillBo;
import com.sw.mes.core.entity.CrystalLossRecord;
import com.sw.mes.core.response.Result;
import com.sw.mes.inspect.dto.YbInspectDataCUDto;
import com.sw.mes.inspect.dto.YbInspectDataPdaAutomaticDto;
import com.sw.mes.inspect.dto.YbInspectDataSideLengthUpdateDto;
import com.sw.mes.inspect.entity.YbInspectData;
import com.sw.mes.yb.mcs.dto.YbCheckResultDto;
import com.sw.mes.yb.pad.entity.SectionNoDetail;
import com.sw.mes.yb.pc.dto.GetFbInfoDto;
import com.sw.mes.yb.pc.entity.DataInspectLog;
import com.sw.mes.yb.production.entity.LongCrystal;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @Author
 * @Description：
 * @Date:
 * @Modified By:
 */
public interface YbInspectDataService extends BaseService<YbInspectData> {

    /**
     * 导出出入库记录Excel
     * @param request
     * @param response
     */
    void exportExcel(HttpServletRequest request, HttpServletResponse response);


    List<YbInspectData> findBySections(List<String> sectionNoList);

    Map<String, Object> findBySectionNoMap(String sectionNo);

    /**
     * 根据晶段编号查询检验信息
     *
     * @param sectionNo
     * @return
     */
    YbInspectData findBySectionNo(String sectionNo);
    /**
     * 根据晶段编号查询检验信息
     *
     * @param sectionNo
     * @return
     */
    YbInspectData findByLikeSectionNo(String sectionNo);

    /**
     * 根据长晶棒编号获取所有晶段检验信息
     * @param crystalNo
     * @return
     */
    List<YbInspectData> getInspectDatasByCrystalNo(String crystalNo);


    /**
     * 根据方棒晶段编号查询圆棒检验信息
     *
     * @param sectionNo
     * @return
     */
    YbInspectData getSectionNo(String sectionNo);


    /**
     * 根据晶段编号获取 圆棒检验数据库详细信息
     * @param sectionNo
     * @return
     */
    YbInspectDataCUDto getYbInspectDataDto(String sectionNo);


    /**
     * 根据炉次号查询检验信息
     *
     * @param lotNo
     * @return
     */
    List<YbInspectData> findByLotNo(String lotNo);


    void saveAndLog(YbInspectData inspectDataBase, DataInspectLog dataInspectLog);

    void updateOrderTypeBySectionNoList(List<String> sectionNoList, String orderType, String checkoutName);

    void updateOrderTypeBySectionNoListNoType(List<String> sectionNoList, String orderType, String checkoutName);


    Integer updateSticksCountFbSectionNoList(List<String> sectionNoList, Integer sticksCount, BigDecimal totalLength, String sectionType, String sectionNoGroup);

    Result saveYbInspectData(YbInspectDataCUDto ybInspectDataCdto);

    Result saveYbInspectDataNew(YbInspectDataCUDto ybInspectDataCdto);

    /**
     * 修改圆棒检验数据库的方棒边长字段
     *
     * @param dto
     * @return
     */
    Result updateYbInspectDataSideLengthRange(YbInspectDataSideLengthUpdateDto dto);

    Result updateYbInspectResistivity(YbInspectDataCUDto ybInspectDataCdto);


    void initInspectData(YbInspectData ybInspectDataOld, SectionNoDetail sectionNoDetail, LongCrystal longCrystal);

    YbInspectDataCUDto coefficient(YbInspectDataCUDto ybInspectDataCuDto);

    void saveDataAndGrade(YbInspectData inspectDataBase);

    Result<String> saveDataAndGrade(YbInspectData inspectDataBase, boolean mandatoryTrigger);

    /**
     * 获取是否评级的状态
     *
     * @param sticksCount         拼数
     * @param planProcessingOrder 工单信息
     * @return 返回不能自动评级的信息，为空则自动触发评级
     */
    String getGradeStatus(Integer sticksCount, PlanProcessingOrder planProcessingOrder);

    List<String> findByAllSectionNo();

    String getSectionComposeBySectionNo(String sectionNo);

    /**
     * 修改检验数据库是否反切字段
     *
     * @param isCutBack 是否反切
     * @param sectionNo 晶段
     */
    void updateIsCutBack(int isCutBack, String sectionNo);

    /**
     * 修改检验数据中的订单编号
     *
     * @param sectionNo 晶段编号
     * @param orderNo   订单号
     */
    void updateOrderNoBySectionNo(String sectionNo, String orderNo);

    /**
     * 修改检验数据中的订单编号
     *
     * @param sectionNo    晶段编号
     * @param orderNo      订单号
     * @param materialCode 物料号
     */
    void updateOrderNoAndModelCodeBySectionNo(String sectionNo, String orderNo, String materialCode);

    void updateSticksCountFbSectionNoListFromYb(List<String> sectionNos, int i, Object o, String sectionType, Object o1);

    Result<GetFbInfoDto> findInfoByYbNo(String sectionNoYb);

    YbInspectDataToMcsDto getPinKuData(YbInspectData inspectDataBase, RankResultDto rankResultDto);

    List<YbInspectData> getDataByCrystalNo(String crystalNo);

    Result readResultsImportMk(MultipartFile file) throws Exception;

    void saveDataInspectLog(YbInspectData ybInspectDataOld);

    String getResistanceLevel(BigDecimal tRadialCentre);

    List<YbInspectData> findByLotNoAndAgainNum(String lotNo, Integer againNum);

    /**
     * Map  YbInspectData
     * @param bySectionNoMap
     */
    void verificationManagement(Map<String, Object> bySectionNoMap);

    /**
     * 方棒上报SAP数据,防止来回调用查询数据
     * @param fbSectionNo
     * @param ybSectionNo
     * @param weight
     * @return
     */
    void sendSquareRodInfo(String fbSectionNo,String ybSectionNo,BigDecimal weight,String userName);

    void sendSquareRodInfoList(List<PushSapDto> list);

    /**
     * 方棒返切上报SAP数据,进行冲销
     * @return
     */
    Result sendSquareWriteOffAccounts(List<PushSapDto> list, WarehouseOutputBillBo warehouseOutputBillBo);


    YbInspectData findByCrystalNoAndOxygenCarbonMark(String crystalNo,Integer oxygenCarbonMark);

    void handleDefaultOxygenAndCarbon(YbInspectData ybInspectData);

    Result findVerifyScrapLoss(String processName,BigDecimal lossLength,String sectionNo);

    BigDecimal findSumWeightByOrderNoAndIsCutBack(String orderNo, int cutBack);

    /**
     * 根据圆棒编号查询长晶棒信息
     * @param sectionNo 圆棒编号
     * @return 长晶棒信息
     */
    Integer findLongCrystalByCrystalNo(String sectionNo);

    List<ErrorClosePlanProcessingOrderDto> supplementaryData(List<PlanProcessingOrderDto> dtos);

    List<YbInspectData> findByCrystalNo(List<String> ybCrystalNoList);

    void handleCrystalLossRecord(CrystalLossRecord crystalLossRecord);

    /**
     * 处理圆棒上传数据，晶科单独分开
     * @param ybCheckResultDto
     * @return
     */
    Result ybCheckResult(YbCheckResultDto ybCheckResultDto);

    /**
     * 获取毛棒单晶所有检验数据
     * @param crystalNo
     * @return
     */
    Result<List<YbInspectDataPdaAutomaticDto>> getInspectDataByCrystalNo(String crystalNo);


    String assignmentResistance( List<YbInspectDataPdaAutomaticDto> ybInspectDataPdaAutomaticDtos);


}
