package com.xisc.pm.app.service.strategy.pdmattype;

import com.xisc.pm.api.dto.PmBoardMatInfoDTO;
import com.xisc.pm.api.dto.PmCompositeSlabCalcDTO;
import com.xisc.pm.api.dto.PmProContFilterRequestDTO;
import com.xisc.pm.api.dto.PmProContFilterResposeDTO;
import com.xisc.pm.api.dto.PmProContYieldRequestDTO;
import com.xisc.pm.api.dto.PmProContYieldResposeDTO;
import com.xisc.pm.api.dto.RuleParamDTO;
import com.xisc.pm.domain.entity.PmContMscTech;
import com.xisc.pm.domain.entity.PmPdContSum;
import com.xisc.pm.domain.entity.PmProContProdTtr;
import com.xisc.pm.domain.entity.PmSlabSpecBt;
import com.xisc.pm.domain.vo.CtMainVO;
import org.springframework.beans.factory.InitializingBean;

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

/**
 * 组板材料类型
 * 
 * @author jun.zeng
 *
 */
public interface PdMatTypeStrategy extends InitializingBean {
    
    /**
     * 获取组板程序
     * @return
     */
    String pdProgram();
    
    /**
     * 合同抽取-参数初始化处理
     * @param pmProContFilterRequest
     */
    void contFilterInitParam(PmProContFilterRequestDTO pmProContFilterRequest);

    /**
     * 合同抽取-合同公用条件检查函数
     *
     * @param pmProContFilterResposeDTO
     * @param tenantId
     * @return
     */
    boolean contPublicConditionsCheck(PmProContFilterResposeDTO pmProContFilterResposeDTO, Long tenantId);
    
    /**
     * 合同抽取-规则集校验
     * @param pmProContFilterRequest
     * @param pmProContFilterResposeDTO
     * @param pmSlabSpecBts
     * @return
     */
    boolean contFilterRuleSetCheck(PmProContFilterRequestDTO pmProContFilterRequest , PmProContFilterResposeDTO pmProContFilterResposeDTO , List<PmSlabSpecBt> pmSlabSpecBts , Map<String , CtMainVO> cmCtMainMap);
    
    /**
     * 轴合同非轴合同筛选-规则集
     * @return
     */
    RuleParamDTO contSelectionRuleSet();
    
    /**
     * 轴合同非轴合同匹配校验规则
     * @return
     */
    RuleParamDTO contSelectionCheckRuleSet();
    
    /**
     * 组板结果检查规则集
     * @return
     */
    RuleParamDTO pdResultCheckRuleSet();
    
    /**
     * 收得率计算前检查
     * @param pmProContYield
     */
    void yiledCalcBeforeCheck(PmProContYieldRequestDTO pmProContYield, boolean isExec);
    
    /**
     * 初始化检验与参数初始化 返回母板长度数组 异宽个数 异宽位置数组 取板方式_长度方向 取板方式_宽度方向 热处理类型
     * 
     * @param filterOrderMap       合同信息
     * @param pmProContYield       组板参数
     * @param axisPmProContProdTtr 轴合同生产属性
     */
    PmCompositeSlabCalcDTO checkAndInitParams(Map<String, PmProContFilterResposeDTO> filterOrderMap,
            PmProContYieldRequestDTO pmProContYield, PmProContProdTtr axisPmProContProdTtr);

    /**
     * 大板粗切位置计算 记录： 异宽粗切位置 命令粗切位置 母板分段累计和 粗切长度上下限
     * 
     * @param filterOrderMap 合同信息
     * @param pmProContYield 组板参数
     * @param axisPmProContProdTtr 轴合同生产属性
     */
    void plateCut(Map<String, PmProContFilterResposeDTO> filterOrderMap, PmProContYieldRequestDTO pmProContYield,
            PmProContProdTtr axisPmProContProdTtr, PmCompositeSlabCalcDTO compositeSlabCalcDTO);

    /**
     * 
     * 计算试材长度
     * 头部试材长度sample_len_head、尾部试材长度sample_len_tail、中部试材长度sample_len_mid、试样长sample_length
     * 
     * @param pmProContYield 组板参数
     * @param axisPmProContProdTtr 轴合同生产属性
     * @param pmCompositeSlabCalc 
     */
    void calcSampleLen(PmProContYieldRequestDTO pmProContYield, PmProContProdTtr axisPmProContProdTtr, PmCompositeSlabCalcDTO pmCompositeSlabCalc);

    /**
     * 计算RsCode
     * @param pmProContYield
     * @param axisPmProContProdTtr
     * @param pmCompositeSlabCalc
     */
    void calcRsCodeAndBroadFlag(PmProContYieldRequestDTO pmProContYield, PmProContProdTtr axisPmProContProdTtr,
            PmCompositeSlabCalcDTO pmCompositeSlabCalc);

    /**
     * 计算临时板坯长
     * @param pmProContYield
     * @param axisPmProContProdTtr
     * @param pmCompositeSlabCalc
     */
    void calcLpre(PmProContYieldRequestDTO pmProContYield, PmProContProdTtr axisPmProContProdTtr,
            PmCompositeSlabCalcDTO pmCompositeSlabCalc);
    
    /**
     * 计算收得率
     * @param filterOrderMap 合同信息
     * @param pmProContYield 收得率请求参数
     * @param axisPmProContProdTtr 轴合同生产属性
     * @param axisPmContMscTech  轴合同工艺参数
     * @param pmCompositeSlabCalc 组板计算中间数据
     * @return PmProContYieldResposeDTO 收得率计算结构
     */
    PmProContYieldResposeDTO calcYield(Map<String, PmProContFilterResposeDTO> filterOrderMap, PmProContYieldRequestDTO pmProContYield,
            PmProContProdTtr axisPmProContProdTtr, PmContMscTech axisPmContMscTech, PmCompositeSlabCalcDTO pmCompositeSlabCalc);
    
    /**
     * 执行组板
     * @param pmProContYield 请求参数
     * @param filterOrderMap 合同信息
     * @param pmCompositeSlabCalc 组板计算结果
     * @param pmProContYieldRespose 收得率计算结果
     */
    void executePd(PmProContYieldRequestDTO pmProContYield, Map<String, PmProContFilterResposeDTO> filterOrderMap,
            PmCompositeSlabCalcDTO pmCompositeSlabCalc, PmProContYieldResposeDTO pmProContYieldRespose);
    
    /**
     * 是否需要粗切
     * @return
     */
    boolean needPlateCut() ;
    
    /**
     * 组板解散事件
     * @param pmPdContSums 合同信息
     * @param virtualSlabNo 虚拟板坯号
     * @param mscLineNo 产线号
     * @param tenantId
     * @return
     */
    void pdDeleteEvent(List<PmPdContSum> pmPdContSums , String virtualSlabNo , String mscLineNo , String apiCode, Long tenantId);

    /**
     * 组板解散事件
     * @param pmPdContSums
     * @param virtualSlabNo
     * @param mscLineNo
     * @param apiCode
     * @param tenantId
     * @param moduleCode
     * @param eventMaker
     */
    void pdDeleteEvent(List<PmPdContSum> pmPdContSums , String virtualSlabNo , String mscLineNo , String apiCode, Long tenantId, String moduleCode, String eventMaker);

    /**
     * 按合同号查询组板材料信息
     * @param orderNo
     * @param organizationId
     * @return
     */
    List<PmBoardMatInfoDTO> selectBoardMatByOrderNo(String orderNo, Long organizationId);
    
}
