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

import com.xisc.pm.api.dto.ObtainWitnessPointDTO;
import com.xisc.pm.api.dto.PmCompositeBlockDTO;
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.PmSmallPlateDTO;
import com.xisc.pm.api.dto.RuleParamDTO;
import com.xisc.pm.api.dto.ctevent.ProContBoardEndDTO;
import com.xisc.pm.app.service.strategy.PdMatTypeStrategyFactory;
import com.xisc.pm.domain.entity.PmContMscTech;
import com.xisc.pm.domain.entity.PmPdBlockPos;
import com.xisc.pm.domain.entity.PmPdCcSlab;
import com.xisc.pm.domain.entity.PmPdConstBt;
import com.xisc.pm.domain.entity.PmPdContSum;
import com.xisc.pm.domain.entity.PmPdSlab;
import com.xisc.pm.domain.entity.PmProContProdTtr;
import com.xisc.pm.domain.entity.PmSlabSpecBt;
import com.xisc.pm.domain.entity.PmSmallPltPos;
import com.xisc.pm.domain.repository.PmPdCcSlabRepository;
import com.xisc.pm.domain.repository.PmPdConstBtRepository;
import com.xisc.pm.domain.repository.PmPdSlabRepository;
import com.xisc.pm.domain.vo.CtMainVO;
import com.xisc.pm.infra.client.QdOrderClient;
import com.xisc.pm.infra.constant.Constants;
import com.xisc.pm.infra.constant.Constants.PdStatusHp;
import com.xisc.pm.infra.constant.PmPlateConstants;
import com.xisc.pm.infra.enums.PdEventType;
import com.xisc.pm.infra.enums.PdMatType;
import com.xisc.pm.infra.enums.PdProdFlag;
import com.xisc.pm.infra.enums.PdRuleSetType;
import com.xisc.pm.infra.util.BeanUtils;
import com.xisc.pm.infra.util.Utils;
import io.choerodon.core.exception.CommonException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.hzero.core.base.BaseConstants;
import org.hzero.core.message.Message;
import org.hzero.core.message.MessageAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * 二次开坯
 * 
 * @author jun.zeng
 *
 */
@Component
public class MidSlabPdMatTypeStratrgy extends DefaultPdMatTypeStrategy<PmPdSlab> {

    @Autowired
    private PmPdSlabRepository pmPdSlabRepository;

    @Autowired
    private PmPdCcSlabRepository pmPdCcSlabRepository;

    @Autowired
    private PmPdConstBtRepository pmPdConstBtRepository;

    @Autowired
    private QdOrderClient qdOrderClient;

    @Override
    public String pdProgram() {
        return Constants.PdProgram.MID_SLAB_PROGRAM;

    }
    
    @Override
    public void ctEventRec(PmPdSlab t, List<PmSmallPltPos> pmSmallPltPoss,
            Map<String, PmProContFilterResposeDTO> filterOrderMap, PmProContYieldRequestDTO pmProContYield,
            PmCompositeSlabCalcDTO pmCompositeSlabCalc, PmProContYieldResposeDTO pmProContYieldRespose) {
        List<ProContBoardEndDTO> boardEndEventList = new ArrayList<>();
        String midVirtualSlabNo = getSlabNo(pmProContYield);
        PmProContFilterResposeDTO axisPmProCont = filterOrderMap.get(pmProContYield.getAxisOrderNo());
        // 虚拟板坯维度
        boardEndEventList.add(new ProContBoardEndDTO(axisPmProCont.getOrderNo()).setMatNo(midVirtualSlabNo)
                            .setLen(pmProContYieldRespose.getPreCleanSlabLen()).setMoMatNo(getSlabMoMatNo(pmProContYield))
                            .setMscLineNo(pmProContYield.getPmContFilterRequest().getMscLineNo())
                            .setPdMatStatus(PdStatusHp.PD_STATUS_HP_12).setPpFlag(PdProdFlag.VIRTUAL_SLAB.getCode())
                            .setThk(pmProContYield.getPmContFilterRequest().getMoldThick())
                            .setWid(pmProContYield.getPmContFilterRequest().getMoldWidth())
                            .setWgt(pmProContYieldRespose.getPreCleanSlabWt())
                            .setWholeBacklogCode(getWholeBacklogCode(axisPmProCont, pmProContYield))
                            .setStNo(axisPmProCont.getStNo())
                            .setSgSign(axisPmProCont.getSgSign())
                            .setProcCd(getProcCd()));
        // 大板维度
        boardEndEventList.add(new ProContBoardEndDTO(axisPmProCont.getOrderNo()).setMatNo(midVirtualSlabNo)
                .setLen(pmProContYieldRespose.getLaim()).setMoMatNo(getSlabMoMatNo(pmProContYield))
                .setMscLineNo(pmProContYield.getPmContFilterRequest().getMscLineNo())
                .setPdMatStatus(PdStatusHp.PD_STATUS_HP_12).setPpFlag(PdProdFlag.VIRTUAL_COMPOSITE_SLAB.getCode())
                .setThk(pmProContYieldRespose.getTaim())
                .setWid(pmProContYieldRespose.getWaim())
                .setWgt(pmProContYieldRespose.getRollWtHp())
                .setWholeBacklogCode(getWholeBacklogCode(axisPmProCont, pmProContYield))
                .setStNo(axisPmProCont.getStNo())
                .setSgSign(axisPmProCont.getSgSign())
                .setProcCd(getProcCd()));
        
        for (PmSmallPltPos pmSmallPltPos : pmSmallPltPoss) {
            PmProContFilterResposeDTO pmProContFilterResposeDTO = filterOrderMap.get(pmSmallPltPos.getOrderNo());
            // 小板维度
            boardEndEventList
                    .add(new ProContBoardEndDTO(pmSmallPltPos.getOrderNo()).setMatNo(midVirtualSlabNo + pmSmallPltPos.getSmallPlateDivNo())
                            .setLen(pmSmallPltPos.getOrderLen()).setMoMatNo(midVirtualSlabNo)
                            .setMscLineNo(pmProContYield.getPmContFilterRequest().getMscLineNo())
                            .setPdMatStatus(PdStatusHp.PD_STATUS_HP_12).setPpFlag(getSmallPosPpFlag())
                            .setThk(pmSmallPltPos.getOrderThick()).setWid(pmSmallPltPos.getOrderWidth())
                            .setWgt(pmProContFilterResposeDTO.getOrderUnitAimWt())
                            .setWholeBacklogCode(getWholeBacklogCode(axisPmProCont, pmProContYield))
                            .setStNo(pmProContFilterResposeDTO.getStNo())
                            .setSgSign(pmProContFilterResposeDTO.getSgSign())
                            .setProcCd(getProcCd()));
        }
        eventClient.addEvent(getCtEventCode(), boardEndEventList);
    }
    
    @Override
    public void buildOtherInfo(PmProContYieldRequestDTO pmProContYield, List<PmPdBlockPos> pmPdBlockPoss,
            List<PmPdContSum> pmPdContSums, List<PmSmallPltPos> pmSmallPltPoss, PmProContProdTtr axisPmProContProdTtr,
            Map<String, PmProContFilterResposeDTO> filterOrderMap) {
        String maxDivNo = pmSmallPltPosRepository.selectMaxSmallDivNoBySlabNo(pmProContYield.getTenantId() , getSlabNo(pmProContYield));
        String pdMatNo = pmProContYield.getVirtualSlabNo();
        Long tenantId = pmProContYield.getTenantId();
        Map<String , PmPdContSum> contMap = new HashMap<>();
        int i = maxDivNo == null ? 1 : (Integer.parseInt(maxDivNo) + 1);
        if (!"0".equals(axisPmProContProdTtr.getTrimCode())
                && pmProContYield.getCompositeBoard().getSpCount() >= PmPlateConstants.SMALL_PLATE_SPLIT_NO.length) {
            throw new CommonException("pm.pm_pro_cont_044");
        }
        String slabNo = getSlabNo(pmProContYield);
        String plateNo = getPlateNo(pmProContYield);
        for (PmCompositeBlockDTO block : pmProContYield.getCompositeBoard().getPmCompositeBlockDTOs()) {
            Set<String> contAddFlag = new HashSet<>(pmProContYield.getCompositeBoard().getOrderCount());
            for (PmSmallPlateDTO smallPlate : block.getSmallPlateDTOList()) {
                Long proContId = filterOrderMap.get(smallPlate.getOrderNo()).getProContId();
                if(!contMap.containsKey(smallPlate.getOrderNo())) {
                    PmPdContSum pmPdContSum = BeanUtils.copy(smallPlate, PmPdContSum.class);
                    pmPdContSum.setTenantId(tenantId);
                    pmPdContSum.setOrderNo(smallPlate.getOrderNo());
                    pmPdContSum.setPdMatNo(pdMatNo);
                    PdMatType pdMatType = PdMatType.getByCode(pmProContYield.getPmContFilterRequest().getMatDesignKind());
                    pmPdContSum.setPdMatType(pdMatType.getActualPdMatType());
                    pmPdContSum.setProContId(proContId);
                    pmPdContSum.setSlabNo(slabNo);
                    pmPdContSum.setPlateNo(plateNo);
                    if (axisPmProContProdTtr.getOrderNo().equals(smallPlate.getOrderNo())) {
                        pmPdContSum.setAxisFlag(BaseConstants.Flag.YES.longValue());
                    } else {
                        pmPdContSum.setAxisFlag(BaseConstants.Flag.NO.longValue());
                    }
    
                    pmPdContSum.setPdStatus(getOrderSumStatus());
                    pmPdContSums.add(pmPdContSum);
                    contMap.put(smallPlate.getOrderNo(), pmPdContSum);
                } else {
                    if(!contAddFlag.contains(smallPlate.getOrderNo())) {
                        // 同一个板块类一个小板合同只计算一次
                        PmPdContSum pmPdContSum = contMap.get(smallPlate.getOrderNo());
                    }
                }
                if (!contAddFlag.contains(smallPlate.getOrderNo())) {
                    // 如果不在标记中，则需要添加到组板子板位置表 和合同总量表中
                    contAddFlag.add(smallPlate.getOrderNo());
                    PmPdBlockPos pmPdBlockPos = new PmPdBlockPos();
                    pmPdBlockPos.setPdMatNo(pdMatNo);
                    pmPdBlockPos.setOrderBlockNo(block.getBlockNo().longValue());
                    pmPdBlockPos.setOrderNo(smallPlate.getOrderNo());
                    pmPdBlockPos.setOrderSeqNo(smallPlate.getOrderSeqNo());
                    pmPdBlockPos.setBlockPlateNum(BigDecimal.valueOf(smallPlate.getOrderBlockNum()));
                    pmPdBlockPos.setSlabNo(slabNo);
                    pmPdBlockPos.setPlateNo(plateNo);
                    pmPdBlockPos.setProContId(proContId);
                    pmPdBlockPos.setTenantId(tenantId);
                    pmPdBlockPoss.add(pmPdBlockPos);
                }
    
                PmSmallPltPos pmSmallPltPos = BeanUtils.copy(smallPlate, PmSmallPltPos.class);
                pmSmallPltPos.setTenantId(tenantId);
                pmSmallPltPos.setPdMatNo(pdMatNo);
                pmSmallPltPos.setSlabNo(slabNo);
                pmSmallPltPos.setPlateNo(plateNo);
                pmSmallPltPos.setProContId(proContId);
                pmSmallPltPos.setPickModeLenDir(smallPlate.getPickModeLenDirPos().longValue());
                pmSmallPltPos.setPickModeWidDir(smallPlate.getPickModeWidDirPos().longValue());
                pmSmallPltPos.setSmallPlateDivNo(getSmallPlateDivNo(plateNo, axisPmProContProdTtr.getTrimCode() , i++));
                pmSmallPltPoss.add(pmSmallPltPos);
            }
        }
    }
    
    @Override
    public String getSmallPlateDivNo(String plateNo, String trimCode, int index) {
        return String.format("%03d", index);
    }

    @Override
    public void contFilterInitParam(PmProContFilterRequestDTO pmProContFilterRequest) {
        //pmProContFilterRequest.setSgSign(null);
        pmProContFilterRequest.setStReplFlag(BaseConstants.Flag.NO.longValue());
        pmProContFilterRequest.check();
    }

    @Override
    public boolean contFilterRuleSetCheck(PmProContFilterRequestDTO pmProContFilterRequest,
            PmProContFilterResposeDTO pmProContFilterResposeDTO, List<PmSlabSpecBt> pmSlabSpecBts,
            Map<String, CtMainVO> cmCtMainMap) {
        RuleParamDTO ruleParam = initContFilterRuleParam(PdRuleSetType.C01, pmProContFilterResposeDTO,
                pmProContFilterRequest, pmSlabSpecBts);
        ruleParam.buildExcludeRuleNo(pmProContFilterRequest);
        try {
            pmPdRuleSetService.runRuleSet(ruleParam);
            return true;
        } catch (CommonException e) {
            Message message = MessageAccessor.getMessage(e.getCode(), e.getParameters());
            pmProContFilterResposeDTO.setUnSelectedReason(message.getDesc());
            return false;
        }
    }

    @Override
    public RuleParamDTO contSelectionRuleSet() {
        return new RuleParamDTO(PdRuleSetType.C03);
    }

    @Override
    public RuleParamDTO contSelectionCheckRuleSet() {
        return new RuleParamDTO(PdRuleSetType.C04);
    }

    @Override
    public RuleParamDTO pdResultCheckRuleSet() {
        return new RuleParamDTO(PdRuleSetType.C05);
    }

    @Override
    public void yiledCalcBeforeCheck(PmProContYieldRequestDTO pmProContYield, boolean isExec) {
        if (StringUtils.isBlank(pmProContYield.getVirtualSlabNo())) {
            throw new CommonException("pm.pm_pro_cont_039");
        }
        pmProContYield.getPmContFilterRequest().setFixSlabLenFlag(BaseConstants.Flag.NO.longValue());
        // 二次开坯不抛合同跟踪事件
        if (isExec) {
            PmPdSlab pmPdSlab = pmPdSlabRepository.selectByVirtualSlabNo(pmProContYield.getVirtualSlabNo(),
                    pmProContYield.getTenantId());
            if (pmPdSlab == null || !Constants.PdStatusHp.PD_STATUS_HP_31.equals(pmPdSlab.getPdStatusHp())) {
                // 分割信息【virtual_slab_no】未在中间坯材料处于组板中状态，不能组板；
                throw new CommonException("pm.pm_pd_slab_34", pmProContYield.getVirtualSlabNo());
            }
            pmProContYield.setPmPdSlab(pmPdSlab);
        }
    }

    @Override
    public boolean needPlateCut() {
        return false;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        PdMatTypeStrategyFactory.register(PdMatType.MID_SPLIT, this);
    }

    @Override
    protected Long ctEventBoardPpFlag(PmPdSlab pmPdSlab, PmProContYieldRequestDTO pmProContYield) {
        return null;
    }

    @Override
    public void generateCmd(PmPdSlab pmPdSlab, List<PmPdContSum> pmPdContSums, List<PmSmallPltPos> pmSmallPltPoss,
            String mscLineNo) {
        // 二次开坯确认时组板执行时不生成命令数据
    }

    @Override
    public PmPdSlab generateResult(PmProContYieldRequestDTO pmProContYield,
            Map<String, PmProContFilterResposeDTO> filterOrderMap, PmCompositeSlabCalcDTO pmCompositeSlabCalc,
            PmProContYieldResposeDTO pmProContYieldRespose, PmContMscTech axisPmContMscTech,
            PmProContProdTtr axisPmProContProdTtr) {
        PmPdSlab pmPdSlab = pmProContYield.getPmPdSlab();
        PmPdSlab update = new PmPdSlab();
        update.setMatDesignKind(PdMatType.MID_SPLIT.getActualPdMatType());
        update.setObjectVersionNumber(pmPdSlab.getObjectVersionNumber());
        update.setPmPdSlabId(pmPdSlab.getPmPdSlabId());
        update.setPdStatusHp(PdStatusHp.PD_STATUS_HP_32);
        update.setFormPlateMode(pmProContYield.getPmContFilterRequest().getFormPlateMode());
        update.setOrderNoAxis(pmProContYield.getAxisOrderNo());
        update.setSgSign(axisPmProContProdTtr.getSgSign());
        update.setStNo(axisPmContMscTech.getStNo());
        update.setNeedSlabLen(pmProContYieldRespose.getNeedSlabLen());
        update.setNeedSlabWt(pmProContYieldRespose.getNeedSlabWt());
        update.setInfurSlabLen(pmProContYieldRespose.getNeedSlabLen());
        update.setInfurSlabWt(pmProContYieldRespose.getNeedSlabWt());
        update.setPreCleanSlabLen(pmProContYieldRespose.getNeedSlabLen());
        update.setPreCleanSlabWt(pmProContYieldRespose.getNeedSlabWt());
        update.setPreCleanSlabThick(pmProContYield.getPmContFilterRequest().getMoldThick());
        update.setPreCleanSlabWidth(pmProContYield.getPmContFilterRequest().getMoldWidth());
        update.setInfurSlabThick(pmProContYield.getPmContFilterRequest().getMoldThick());
        update.setInfurSlabWid(pmProContYield.getPmContFilterRequest().getMoldWidth());
        update.setRollAimLen(pmProContYieldRespose.getLaim());
        update.setRollAimThick(pmProContYieldRespose.getTaim());
        update.setRollAimWidth(pmProContYieldRespose.getWaim());
        update.setOrderThickAxis(axisPmProContProdTtr.getOrderThick());
        update.setCombinePlateLen(pmProContYieldRespose.getCombinePlateLen());
        update.setCombinePlateWidth(pmProContYieldRespose.getCombinePlateWidth());
        update.setNormYield(pmProContYieldRespose.getNormYield());
        update.setMscLineNo(pmProContYield.getPmContFilterRequest().getMscLineNo());
        update.setRsCode(String.valueOf(pmCompositeSlabCalc.getRsCode()));
        update.setBroadFlag(pmCompositeSlabCalc.getBroadFlag());
        update.setRollDirectCode(Constants.RollDirectCode.L);

        PmPdCcSlab pmPdCcSlab = new PmPdCcSlab();
        PmPdCcSlab pmPdCcSlabDb = pmPdCcSlabRepository.selectByPdMatNo(pmProContYield.getTenantId(),
                pmPdSlab.getSlabNo());
        pmPdCcSlab.setRollAimThick(pmProContYield.getPmContFilterRequest().getMoldThick());
        pmPdCcSlab.setRollAimWidth(pmProContYield.getPmContFilterRequest().getMoldWidth());
        pmPdCcSlab.setVirtualSlabId(pmPdCcSlabDb.getVirtualSlabId());
        pmPdCcSlab.setObjectVersionNumber(pmPdCcSlabDb.getObjectVersionNumber());
        if (StringUtils.isBlank(pmPdCcSlabDb.getUrgOrderFlag())) {
            // 取第一个分割坯的第一个合同
            pmPdCcSlab.setUrgOrderFlag(axisPmProContProdTtr.getUrgOrderFlag() != null ? null
                    : axisPmProContProdTtr.getUrgOrderFlag().toString());
        }

        if (pmPdCcSlabDb.getRollAimLen() == null) {
            pmPdCcSlab.setRollAimLen(pmProContYieldRespose.getNeedSlabLen());
        } else {
            PmPdConstBt pmPdConstBt = new PmPdConstBt();
            pmPdConstBt.setTenantId(pmProContYield.getTenantId());
            pmPdConstBt
                    .setRollLineNo(Utils.mscLineNoToRoolLineNo(pmProContYield.getPmContFilterRequest().getMscLineNo()));
            pmPdConstBt = pmPdConstBtRepository.selectOne(pmPdConstBt);
            if (pmPdConstBt == null || pmPdConstBt.getSlabCutGap() == null) {
                // 未查询到组板常数基准表，或者长板坯充当短板坯之间切缝宽度未配置，产线号【{0}】
                throw new CommonException("pm.pm_pd_const_bt_001",
                        pmProContYield.getPmContFilterRequest().getMscLineNo());
            }
            BigDecimal slabCutGap = pmPdConstBt.getSlabCutGap() == null ? BigDecimal.ZERO : pmPdConstBt.getSlabCutGap();
            pmPdCcSlab.setRollAimLen(pmPdCcSlabDb.getRollAimLen().add(slabCutGap).add(pmProContYieldRespose.getNeedSlabLen()));
        }
        BigDecimal rollWtHp = pmPdCcSlab.getRollAimLen().multiply(pmPdCcSlab.getRollAimWidth())
                .multiply(pmPdCcSlab.getRollAimThick().multiply(PmPlateConstants.DEFAULT_PROD_DENCITY));
        rollWtHp = rollWtHp.divide(BigDecimal.valueOf(1000L * 1000L * 1000L), PmPlateConstants.WT_SCALE,
                RoundingMode.HALF_UP);
        pmPdCcSlab.setRollWtHp(rollWtHp);
        Date steelPlanDate = pmPdCcSlabDb.getSteelPlanDate();
        Date steelLatestDate = pmPdCcSlabDb.getSteelLatestDate();
        for (Entry<String, PmProContFilterResposeDTO> entry : filterOrderMap.entrySet()) {
            if (entry.getValue().getSteelPlanDate() != null) {
                if (steelPlanDate == null || steelPlanDate.after(entry.getValue().getSteelPlanDate())) {
                    steelPlanDate = entry.getValue().getSteelPlanDate();
                }
            }
            if (entry.getValue().getSteelLatestDate() != null) {
                if (steelLatestDate == null || steelLatestDate.after(entry.getValue().getSteelLatestDate())) {
                    steelLatestDate = entry.getValue().getSteelLatestDate();
                }
            }
        }
        pmPdCcSlab.setSteelLatestDate(steelLatestDate);
        if (steelPlanDate == null) {
            // 获取当前时间往前推15天
            LocalDate now = LocalDate.now().plusDays(15);
            steelPlanDate = Date.from(now.atStartOfDay(ZoneId.systemDefault()).toInstant());
        }
        pmPdCcSlab.setHotSendFlag(axisPmContMscTech.getHotSendDiv());
        pmPdCcSlab.setHotChargeFlag(axisPmContMscTech.getHotChargeFlag());
        pmPdCcSlab.setSteelPlanDate(steelPlanDate);
        pmPdCcSlab.setOrderNumInPlate(pmPdCcSlabDb.getOrderNumInPlate() == null ? filterOrderMap.size()
                : pmPdCcSlabDb.getOrderNumInPlate() + filterOrderMap.size());

        // 调用质量见证点状态接口，获取见证点
        List<ObtainWitnessPointDTO> witnessPointList = pmQdToPoOrderRepository.selectWitnessOrderPass(Arrays.asList(pmPdCcSlab.getOrderNoAxis()),
                Arrays.asList(Constants.WITNESS_POINT), pmProContYield.getTenantId());
        pmPdCcSlab.setWitnessPointStatus(CollectionUtils.isNotEmpty(witnessPointList) ? witnessPointList.get(0).getWitnessPointStatus() : null);
        pmPdSlabRepository.updateByPrimaryKeySelective(update);
        pmPdCcSlabRepository.updateByPrimaryKeySelective(pmPdCcSlab);

        return update;
    }

    @Override
    protected PdEventType pdDeleteEventType() {
        return PdEventType.HP17;
    }

    @Override
    protected PdEventType pdFinshedEventType() {
        return PdEventType.HP16;
    }

    @Override
    protected String getSlabNo(PmProContYieldRequestDTO pmProContYield) {
        return pmProContYield.getPmPdSlab().getSlabNo();
    }
    
    @Override
    protected String getSlabMoMatNo(PmProContYieldRequestDTO pmProContYield) {
        return null;
    }
    
    @Override
    protected String getOrderSumStatus() {
        return PdStatusHp.PD_STATUS_HP_32;
    }

    @Override
    protected String getWholeBacklogCode(PmProContFilterResposeDTO axisPmProCont, PmProContYieldRequestDTO pmProContYield) {
        return Constants.WholeBacklogCode.CODE_14;
    }
}
