Edc2MyspcManagerImpl.java

package com.mycim.server.edcmyspc.manager.impl;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.exception.SystemIllegalException;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.logging.Logger;
import com.mycim.framework.logging.LoggerFactory;
import com.mycim.framework.utils.exception.ExceptionUtils;
import com.mycim.framework.utils.lang.BooleanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.msg.JsonUtils;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.TransactionLogManager;
import com.mycim.server.ctx.exec.manager.ReworkRouteContextValueManager;
import com.mycim.server.edc.manager.ParameterManager;
import com.mycim.server.edc.manager.ParameterSetManager;
import com.mycim.server.edcmyspc.manager.Edc2MyspcManager;
import com.mycim.server.ems.manager.EquipmentManager;
import com.mycim.server.prp.manager.OperationManager;
import com.mycim.server.security.manager.UserManager;
import com.mycim.server.spc.manager.SpcManager;
import com.mycim.server.wip.manager.*;
import com.mycim.utils.ChartNamingRule;
import com.mycim.valueobject.LotConstants;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.*;
import com.mycim.valueobject.edcspc.DataCollection;
import com.mycim.valueobject.edcspc.Parameter;
import com.mycim.valueobject.edcspc.Reading;
import com.mycim.valueobject.edcspc.Sample;
import com.mycim.valueobject.edcspc.dto.*;
import com.mycim.valueobject.ems.Equipment;
import com.mycim.valueobject.prp.ContextValue;
import com.mycim.valueobject.runcard.util.RunCardUtils;
import com.mycim.valueobject.security.User;
import com.mycim.valueobject.spc.SpcResult;
import com.mycim.valueobject.wip.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.print.DocFlavor;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Luopeng.Wang
 * @version 6.0.0
 * @date 2019/11/11
 **/
@Service
@Transactional
public class Edc2MyspcManagerImpl implements Edc2MyspcManager {
    public static final String HOLD_GROUP = "SPC";

    public static final String HOLD_USER = "SPC";

    public static final String HOLD_CODE = "SPCHOLD";

    private static final String CHAMBER_ID_FLAG = "-";

    private final Logger logger = LoggerFactory.getLogger(Edc2MyspcManagerImpl.class);

    @Autowired
    private NamedObjectManager namedObjectManager;

    @Autowired
    private LotQueryManager lotQueryManager;

    @Autowired
    private LotInqManager lotInqManager;

    @Autowired
    private UnitQueryManager unitQueryManager;

    @Autowired
    private ParameterSetManager parameterSetManager;

    @Autowired
    private ParameterManager parameterManager;

    @Autowired
    private TransactionLogManager transactionLogManager;

    @Autowired
    private SpcManager spcManager;

    @Autowired
    private UserManager userManager;

    @Autowired
    private OperationManager operationManager;

    @Autowired
    private ReworkRouteContextValueManager reworkRouteContextValueManager;

    @Autowired
    private DiffBatchQueryManager diffBatchQueryManager;

    @Autowired
    private ElogSheetQueryManager elogSheetQueryManager;

    @Autowired
    private EquipmentManager equipmentManager;

    @Override
    public List<SpcDataCollectionDto> buildRTSpcDataForMeasure(List<Map> dcolStepInfos) {
        List<SpcDataCollectionDto> dataCollectionList = new ArrayList<>();

        Boolean batchFlag = false;
        for (Map dcolStepInfo : dcolStepInfos) {
            List<DataCollection> dataCollections = (List<DataCollection>) MapUtils
                    .getObject(dcolStepInfo, "datacollections");

            long lotRrn = dataCollections.get(0).getLotRrn();
            Lot lot = lotQueryManager.getLot(lotRrn);
            batchFlag = diffBatchQueryManager.checkLotInBatch(lotRrn);

            SpcProcessDataInfoDto[] processDataInfos = buildProcessDataInfo(lot, batchFlag);

            SpcDataCollectionDto spcDataCollection = new SpcDataCollectionDto();

            Calendar nowTime = Calendar.getInstance();
            nowTime.setTime(new Date());

            spcDataCollection.setFabID(namedObjectManager.getInstanceId(LocalContext.getFacilityRrn()));
            spcDataCollection.setOperatorID(LocalContext.getUserId());
            spcDataCollection.setEquipmentId(namedObjectManager.getInstanceId(lot.getEqptRrn()));
            spcDataCollection.setLotId(lot.getLotId());
            spcDataCollection.setLotType(lot.getLotType());
            spcDataCollection.setProductId(lot.getProductId());
            spcDataCollection.setOperationNumber(
                    (StringUtils.isNotEmpty(lot.getRouteSeq()) ? lot.getRouteSeq() : "*") + "#$#" +
                            lot.getOperationId());
            spcDataCollection.setRouteSeq(lot.getRouteSeq());
            spcDataCollection.setRouteID(lot.getRouteId());
            spcDataCollection.setOperationSeq(lot.getOperationSeq());
            spcDataCollection.setFlowSeq(lot.getFlowSeq());
            spcDataCollection.setRecipeID(lot.getRecipeId());
            spcDataCollection.setCustomer(lot.getCustomerId());
            spcDataCollection.setCustomerLot(lot.getCustomerLotId());

            spcDataCollection.setProd_1(lot.getRecipeId());
            spcDataCollection.setProd_2(lot.getProcessId());
            spcDataCollection.setProd_3(lot.getProductId());
            spcDataCollection.setProd_6(lot.getStepSequence() + "");

            //发送p站点的eqpId,TrackOutTime
            LotProcessStepInfo lotProcessStepInfo = lotQueryManager
                    .getLotProcessStepInfo(lot.getLotRrn(), StepTypeConst.PROCESSING_STEP_TYPE);


            ContextValue actionCondition = reworkRouteContextValueManager.getReworkRouteContextValueByLot(lot);
            String processStepVersion = lot.getProcessStepVersion();
            if (actionCondition != null) {
                String countWay = actionCondition.getResultValue6();
                if (ReworkConst.CountWay.BY_ROUTE.getWay().equalsIgnoreCase(countWay)) {
                    processStepVersion = processStepVersion.substring(0, processStepVersion.lastIndexOf("|"));
                }
            }

            //返工次数
            List<Map<String, Long>> reworkUnitSeqs = unitQueryManager
                    .getReworkUnitSeq(lot.getLotRrn(), processStepVersion);
            List<Long> reworkCounts = reworkUnitSeqs.stream()
                                                    .map(reworkUnitSeq -> MapUtils.getLongValue(reworkUnitSeq, "num"))
                                                    .sorted(Comparator.reverseOrder()).collect(Collectors.toList());
            int reworkCount = CollectionUtils.isNotEmpty(reworkCounts) ? Math.toIntExact(reworkCounts.get(0)) : 0;
            spcDataCollection.setReworkCount(reworkCount);
            if (processDataInfos.length > 1) {
                spcDataCollection.setProcessDataInfos(processDataInfos);
                spcDataCollection.setBatchFlag("Y");
            } else {
                spcDataCollection.setProcessDataInfos(new SpcProcessDataInfoDto[0]);
                spcDataCollection.setBatchFlag("N");
            }

            if (batchFlag) {
                spcDataCollection.setDcItems(buildDiffBatchDCitems(dataCollections));
            } else {
                spcDataCollection.setDcItems(buildDCitems(dataCollections));
            }

            DataCollection mesDataCollection = dataCollections.get(0);
            spcDataCollection.setUsl(mesDataCollection.getUpperSpecificationLimit() != null ? mesDataCollection
                    .getUpperSpecificationLimit().doubleValue() : Double.NaN);
            spcDataCollection.setLsl(mesDataCollection.getLowerSpecificationLimit() != null ? mesDataCollection
                    .getLowerSpecificationLimit().doubleValue() : Double.NaN);
            spcDataCollection.setTartget(mesDataCollection.getTargetValue() != null ? mesDataCollection.getTargetValue()
                                                                                                       .doubleValue() : Double.NaN);

            spcDataCollection.setJobNames(
                    buildSpcJobs(mesDataCollection.getParameterSetRrn(), mesDataCollection.getParameterSetVersion()));

            spcDataCollection.setCompletionDate(nowTime);
            spcDataCollection.setReceiveTime(nowTime);
            if (lotProcessStepInfo != null) {
                List<PInfosDto> p_infos = new ArrayList<PInfosDto>();
                PInfosDto pInfosDto = new PInfosDto();
                pInfosDto.setEquipment(lotProcessStepInfo.getProcessEqpId());
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(lotProcessStepInfo.getTrackOutTime());
                pInfosDto.setpTime(calendar);
                p_infos.add(pInfosDto);
                spcDataCollection.setP_Infos(p_infos);
                //判断是否是chamber设备,如果是将chamberId传给spc
                buildChamberId(spcDataCollection,lotProcessStepInfo.getProcessEqpId());
            }

            dataCollectionList.add(spcDataCollection);
        }

        if (batchFlag) {
            return rebuildBatchDataCollection(dataCollectionList);
        } else {
            return dataCollectionList;
        }
    }

    @Override
    public List<SpcDataCollectionDto> buildSpcDataForProcess(List<Lot> lots) {
        List<SpcDataCollectionDto> dataCollectionList = new ArrayList<>();
        for (Lot lot : lots) {
            if (lot != null && lot.getLotRrn() > 0) {
                lot = lotQueryManager.getLot(lot.getLotRrn());

                //                Operation operation = operationManager.getOperation(lot.getOperationRrn());
                //                if (!StringUtils.equalsIgnoreCase("on", operation.getUseSpcFlag())) {
                //                    continue;
                //                }

                SpcProcessDataInfoDto[] processDataInfos = buildProcessDataInfo(lot, false);

                SpcDataCollectionDto spcDataCollection = new SpcDataCollectionDto();

                Calendar nowTime = Calendar.getInstance();
                nowTime.setTime(new Date());

                spcDataCollection.setFabID(namedObjectManager.getInstanceId(LocalContext.getFacilityRrn()));
                spcDataCollection.setOperatorID(LocalContext.getUserId());
                spcDataCollection.setEquipmentId(namedObjectManager.getInstanceId(lot.getEqptRrn()));
                spcDataCollection.setFlowSeq(lot.getFlowSeq());
                spcDataCollection.setLotId(lot.getLotId());
                spcDataCollection.setLotType(lot.getLotType());
                spcDataCollection.setProductId(lot.getProductId());
                spcDataCollection.setOperationNumber(
                        (StringUtils.isNotEmpty(lot.getRouteSeq()) ? lot.getRouteSeq() : "*") + "#$#" +
                                lot.getOperationId());
                spcDataCollection.setRouteSeq(lot.getRouteSeq());
                spcDataCollection.setRouteID(lot.getRouteId());
                spcDataCollection.setOperationSeq(lot.getOperationSeq());
                spcDataCollection.setRecipeID(lot.getRecipeId());
                spcDataCollection.setCustomer(lot.getCustomerId());
                spcDataCollection.setCustomerLot(lot.getCustomerLotId());

                spcDataCollection.setProd_1(lot.getRecipeId());
                spcDataCollection.setProd_2(lot.getProcessId());
                spcDataCollection.setProd_3(lot.getProductId());
                spcDataCollection.setProd_6(lot.getStepSequence() + "");

                spcDataCollection.setDcItems(new SpcDCItemDto[0]);
                spcDataCollection.setBatchFlag("N");
                spcDataCollection.setProcessDataInfos(processDataInfos);

                ContextValue actionCondition = reworkRouteContextValueManager.getReworkRouteContextValueByLot(lot);
                String processStepVersion = lot.getProcessStepVersion();
                if (actionCondition != null) {
                    String countWay = actionCondition.getResultValue6();
                    if (ReworkConst.CountWay.BY_ROUTE.getWay().equalsIgnoreCase(countWay)) {
                        processStepVersion = processStepVersion.substring(0, processStepVersion.lastIndexOf("|"));
                    }
                }

                //返工次数
                List<Map<String, Long>> reworkUnitSeqs = unitQueryManager
                        .getReworkUnitSeq(lot.getLotRrn(), processStepVersion);
                List<Long> reworkCounts = reworkUnitSeqs.stream().map(reworkUnitSeq -> MapUtils
                        .getLongValue(reworkUnitSeq, "num")).sorted(Comparator.reverseOrder())
                                                        .collect(Collectors.toList());
                int reworkCount = CollectionUtils.isNotEmpty(reworkCounts) ? Math.toIntExact(reworkCounts.get(0)) : 0;
                spcDataCollection.setReworkCount(reworkCount);

                //                spcDataCollection.setJobNames(buildSpcJobs(mesDataCollection
                //                .getParameterSetRrn(),
                //                                                           mesDataCollection
                //                                                           .getParameterSetVersion()));

                spcDataCollection.setCompletionDate(nowTime);
                spcDataCollection.setReceiveTime(nowTime);

                dataCollectionList.add(spcDataCollection);
            }
        }

        return dataCollectionList;
    }

    @Override
    public void handleSpcCheckResults(String responseMsg, String requestMsg, Boolean rtFlag, Boolean processFlag,
                                      Boolean isOcapSend) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(HOLD_USER, "EDC2SPC");
        transactionLogManager.markTransactionLog(transactionLog);
        long transRrn = transactionLog.getTransRrn();
        String excuteResult = "Sucess";
        String errorCode = StringUtils.EMPTY;
        String errorMsg = StringUtils.EMPTY;

        try {
            Assert.isFalse(StringUtils.isEmpty(responseMsg),
                           Errors.create().key(MessageIdList.ERROR_SPC_RESPONSEMSG_EMPTY).content("SPC 返回信息为空!")
                                 .build());

            SpcCheckResultDto[] spcResults = JsonUtils.toObject(responseMsg, SpcCheckResultDto[].class);
            List<SpcCheckResultDto> spcResultList = Arrays.asList(spcResults);

            List<String> holdLotIds = new ArrayList<>();

            String edcType = StringUtils.EMPTY;
            if (processFlag) {
                edcType = "PROCESS";
                return;
            } else {
                edcType = rtFlag ? "RT" : "NORT";
            }

            for (SpcCheckResultDto spcCheckResult : spcResultList) {
                if (spcCheckResult.isLotHold() && !isOcapSend) {
                    holdLotForSpc(transactionLog, spcCheckResult, edcType);
                } else {
                    spcManager.recordSpcResult(transactionLog, spcCheckResult, edcType);
                }
            }

        } catch (Exception e) {
            logger.error(e);
            SystemIllegalException systemIllegalException = ExceptionUtils.findSystemException(e);
            excuteResult = "Fail";
            errorCode = systemIllegalException.getCode().getErrCode();
            errorMsg = systemIllegalException.getMessage();
            throw e;
        } finally {
            //记录request 和response消息
            spcManager.insertSpcMessageLog(requestMsg, responseMsg, transRrn, excuteResult, errorCode, errorMsg);
        }

    }

    @Override
    public void holdEquipmentForMyspc(SpcHoldEquipmentRequestDto spcHoldEquipmentRequestDto) {
        TransactionLog transactionLog = transactionLogManager.startTransactionLog(HOLD_USER, "EDC2SPC");
        transactionLogManager.markTransactionLog(transactionLog);
        long transRrn = transactionLog.getTransRrn();
        String excuteResult = "Sucess";
        String errorCode = StringUtils.EMPTY;
        String errorMsg = StringUtils.EMPTY;

        int seq = 1;
        try {
            List<SpcHoldEquipmentInfoDto> holdEquipmentInfos = spcHoldEquipmentRequestDto.getHoldEquipmentInfos();
            for (SpcHoldEquipmentInfoDto holdEquipmentDto : holdEquipmentInfos) {
                if (holdEquipmentDto.isEquipmentHold()) {
                    String equipmentId = holdEquipmentDto.getEquipmentId();
                    String holdType = holdEquipmentDto.getHoldType();
                    String reason = holdEquipmentDto.getReason();
                    String holdReasons = holdEquipmentDto.getReasonCode();
                    String alarmID = holdEquipmentDto.getAlarmID();
                    String spcErrorCode = holdEquipmentDto.getErrorCode();
                    String spcErrorMessage = holdEquipmentDto.getErrorMessage();
                    List<String> releaseEuipments = holdEquipmentDto.getReleaseEuipments();
                    spcManager.holdEquipmentForSpc("", equipmentId, HOLD_USER, HOLD_GROUP, HOLD_CODE, holdReasons, "",
                                                   holdType, alarmID, spcErrorCode, spcErrorMessage, transRrn, seq++);
                }
            }
        } catch (Exception e) {
            logger.error(e);
            SystemIllegalException systemIllegalException = ExceptionUtils.findSystemException(e);
            excuteResult = "Fail";
            errorCode = systemIllegalException.getCode().getErrCode();
            // errorMsg = systemIllegalException.getMessage(msg -> I18nUtils.getMessage(msg));
            errorMsg = systemIllegalException.getMessage();
            throw e;
        } finally {
            //2.记录request 和response消息
            spcManager.insertSpcMessageLog(JsonUtils.toString(spcHoldEquipmentRequestDto), StringUtils.EMPTY, transRrn,
                                           excuteResult, errorCode, errorMsg);
        }
    }

    private void holdLotForSpc(TransactionLog transactionLog, SpcCheckResultDto spcCheckResultDto, String edcType) {
        String holdUser = HOLD_USER;
        String holdGroup = HOLD_GROUP;
        String holdCode = HOLD_CODE;

        String holdDesp = spcCheckResultDto.getHoldDesp();
        List<String> holdRoles = new ArrayList<String>();
        holdRoles.add(holdDesp);
        holdRoles.add(LotStatus.ALL);
        List<Map> holdReasonCodes = lotQueryManager
                .getHoldReasonCodes(holdDesp, holdRoles, ReferenceDetailNames.HOLD_CODE);
        for (Map map : holdReasonCodes) {
            if (MapUtils.getString(map, LotHoldConts.MapKey.KEY_HOLD_CODE).contains(HoldCodeNames.SPC_HOLD_CODE)) {
                holdGroup = StringUtils.isNotBlank(holdDesp)?holdDesp:holdGroup;
                holdCode = MapUtils.getString(map, LotHoldConts.MapKey.KEY_HOLD_CODE);
                break;
            }
        }
        spcManager.holdLotForSpc(transactionLog,spcCheckResultDto,edcType,holdUser,holdGroup,holdCode);
    }

    private SpcDCItemDto[] buildDCitems(List<DataCollection> dataCollections) {
        List<SpcDCItemDto> dcItemList = new ArrayList<SpcDCItemDto>();

        for (DataCollection mesDataCollection : dataCollections) {
            Long parameterRrn = mesDataCollection.getParameterRrn();

            Parameter parameter = new Parameter();
            parameter.setInstanceRrn(parameterRrn);
            parameter = parameterManager.getParameter(parameter);

            // 根据SampleID对SampleList分组
            if (parameter != null) {
                List<Sample> samples = (List<Sample>) mesDataCollection.getSamples();

                for (Sample sample : samples) {
                    List<Reading> readings = (List<Reading>) sample.getReadings();
                    Unit unit = unitQueryManager.getUnit(LocalContext.getFacilityRrn(), sample.getSampleId());
                    for (Reading reading : readings) {
                        SpcDCItemDto item = new SpcDCItemDto();
                        item.setDataCollectionItemName(parameter.getInstanceId());
                        item.setWaferId(sample.getSampleId());
                        item.setWaferPosition(String.valueOf(unit.getPositionInCarrier()));
                        item.setSiteID(reading.getReadingId());
                        item.setSitePosition(String.valueOf(reading.getReadingSequence()));
                        item.setBumpPosition("");
                        item.setBumpID("");
                        item.setDataValue(String.valueOf(reading.getDataValue()));

                        dcItemList.add(item);
                    }
                }
            }

        }
        SpcDCItemDto[] dcItems = new SpcDCItemDto[dcItemList.size()];
        return orderByWaferId(dcItemList).toArray(dcItems);
    }

    private SpcDCItemDto[] buildDiffBatchDCitems(List<DataCollection> dataCollections) {
        List<SpcDCItemDto> dcItemList = new ArrayList<SpcDCItemDto>();

        for (DataCollection mesDataCollection : dataCollections) {
            Long parameterRrn = mesDataCollection.getParameterRrn();
            String lotId = lotInqManager.getLotId(mesDataCollection.getLotRrn());

            Parameter parameter = new Parameter();
            parameter.setInstanceRrn(parameterRrn);
            parameter = parameterManager.getParameter(parameter);

            // 根据SampleID对SampleList分组
            if (parameter != null) {
                List<Sample> samples = (List<Sample>) mesDataCollection.getSamples();

                for (Sample sample : samples) {
                    List<Reading> readings = (List<Reading>) sample.getReadings();
                    for (Reading reading : readings) {
                        SpcDCItemDto item = new SpcDCItemDto();
                        item.setLotId(lotId);
                        item.setDataCollectionItemName(parameter.getInstanceId());
                        item.setWaferId(sample.getSampleId());
                        item.setWaferPosition(StringUtils.toString(sample.getSampleSequence()));
                        item.setSiteID(reading.getReadingId());
                        item.setSitePosition(String.valueOf(reading.getReadingSequence()));
                        item.setBumpPosition("");
                        item.setBumpID("");
                        item.setDataValue(String.valueOf(reading.getDataValue()));

                        dcItemList.add(item);
                    }
                }
            }

        }
        SpcDCItemDto[] dcItems = new SpcDCItemDto[dcItemList.size()];
        return orderByWaferId(dcItemList).toArray(dcItems);
    }
    //需求40969  数据按照waferid从大到小的顺序排序
    private List<SpcDCItemDto> orderByWaferId(List<SpcDCItemDto> dcItemList){
        Collections.sort(dcItemList, new Comparator<SpcDCItemDto>() {
            @Override
            public int compare(SpcDCItemDto o1, SpcDCItemDto o2) {
               String[]o1Arr=  o1.getWaferId().split("#");
               String[]o2Arr= o2.getWaferId().split("#");
               return Integer.compare(Integer.parseInt(o1Arr.length>=2?o1Arr[1]:"0"),Integer.parseInt(o2Arr.length>=2?o2Arr[1]:"0"));
            }
        });
        return dcItemList;
    }
    private SpcProcessDataInfoDto[] buildProcessDataInfo(Lot lot, Boolean batchFlag) {
        List<SpcProcessDataInfoDto> processDataInfoList = new ArrayList();

        if (batchFlag) {
            List<BatchLotStore> lotBatchList = diffBatchQueryManager.getBatchStoreListByLot(lot.getLotRrn());
            for (int i = 0; i < lotBatchList.size(); i++) {
                Lot batchLot = lotQueryManager.getLot(lotBatchList.get(i).getLotRrn());

                if(!RunCardUtils.checkLotIdIsRunCardLot(batchLot.getLotId())) {
                    SpcProcessDataInfoDto processDataInfo = new SpcProcessDataInfoDto();
                    processDataInfo.setProcessLotId(batchLot.getLotId());
                    processDataInfo.setProcessLotType(batchLot.getLotType());
                    processDataInfo.setProcessOperationNumber(batchLot.getOperationId());
                    processDataInfo.setProcessSubLotType(batchLot.getLotType());
                    processDataInfo.setProcessRecipeId(batchLot.getRecipePhysicalId());
                    processDataInfo.setProcessProductId(batchLot.getProductId());

                    processDataInfoList.add(processDataInfo);
                    break;
                }
            }
        } else {
            SpcProcessDataInfoDto processDataInfo = new SpcProcessDataInfoDto();

            processDataInfo.setProcessLotId(lot.getLotId());
            processDataInfo.setProcessLotType(lot.getLotType());
            processDataInfo.setProcessOperationNumber(lot.getOperationId());
            processDataInfo.setProcessSubLotType(lot.getLotType());
            processDataInfo.setProcessRecipeId(lot.getRecipePhysicalId());
            processDataInfo.setProcessProductId(lot.getProductId());

            processDataInfoList.add(processDataInfo);
        }

        SpcProcessDataInfoDto[] processDataInfos = new SpcProcessDataInfoDto[processDataInfoList.size()];
        return processDataInfoList.toArray(processDataInfos);
    }

    private String handleSpcEmptyValue(String source) {
        return StringUtils.isEmpty(source) ? "" : source;
    }

    private String[] buildSpcJobs(long parameterSetRrn, int parameterSetVersion) {
        List parameters = parameterSetManager.getParameters(parameterSetRrn, parameterSetVersion);

        if (parameters != null && !parameters.isEmpty()) {
            String[] spcJob = new String[parameters.size()];
            for (int i = 0; i < parameters.size(); i++) {
                Map parameter = (Map) parameters.get(i);
                String parameterId = MapUtils.getString(parameter, "parameterId", StringUtils.EMPTY);
                // TODO: 2021/4/29 临时解决北京项目jobName,后期需要去掉 start
                if (StringUtils.isNotEmpty(parameterId) && parameterId.length() > 2) {
                    Integer mIndex = StringUtils.indexOf(parameterId, "M");
                    if (mIndex == 1) {
                        parameterId = new StringBuilder(parameterId).replace(1, 2, "").toString();
                    }
                }
                // 2021/4/29 临时解决北京项目jobName,后期需要去掉 end
                spcJob[i] = parameterId;
            }
            return spcJob;
        }
        return null;
    }

    private List<SpcDataCollectionDto> rebuildBatchDataCollection(List<SpcDataCollectionDto> baseDtoList) {

        if (baseDtoList.size() > 1) {
            SpcDataCollectionDto baseDataCollectionDto = baseDtoList.get(0);

            String lotId = baseDataCollectionDto.getLotId();
            List<BatchLotStore> batchLotStoreList = diffBatchQueryManager
                    .getBatchStoreListByLot(lotQueryManager.getLotRrn(lotId));
            setBatchDataCollectionBaseInfo(baseDataCollectionDto, batchLotStoreList);
            setBatchDataCollectionDcItemAndJobNames(baseDtoList, baseDataCollectionDto);

            List<SpcDataCollectionDto> targetDcList = new ArrayList<SpcDataCollectionDto>();
            targetDcList.add(baseDataCollectionDto);
            return targetDcList;
        }
        return baseDtoList;
    }

    private void setBatchDataCollectionBaseInfo(SpcDataCollectionDto baseDataCollectionDto,
                                                List<BatchLotStore> batchLotStoreList) {
        String batchLotIds = StringUtils.EMPTY;
        String batchProductIds = StringUtils.EMPTY;
        String batchId = StringUtils.EMPTY;
        for (BatchLotStore batchLotStore : batchLotStoreList) {
            Lot batchLot = lotQueryManager.getLot(batchLotStore.getLotRrn());
            batchId = batchLotStore.getBatchId();
            batchLotIds += batchLot.getLotId() + LotConstants.DEFAULY_SEPARATOR;
            batchProductIds += batchLot.getProductId() + LotConstants.DEFAULY_SEPARATOR;
        }

        baseDataCollectionDto.setBatchInfo(batchId);
        baseDataCollectionDto.setBatchLot(StringUtils.substringBeforeLast(batchLotIds, LotConstants.DEFAULY_SEPARATOR));
        baseDataCollectionDto
                .setBatchProductID(StringUtils.substringBeforeLast(batchProductIds, LotConstants.DEFAULY_SEPARATOR));
        baseDataCollectionDto.setBatchSize(batchLotStoreList.size());
    }

    private void setBatchDataCollectionDcItemAndJobNames(List<SpcDataCollectionDto> baseDtoList,
                                                         SpcDataCollectionDto baseDataCollectionDto) {
        List<String> jobNames = new ArrayList<>();
        List<SpcDCItemDto> dcItemDtoList = new ArrayList<>();
        dcItemDtoList.addAll(Arrays.asList(baseDataCollectionDto.getDcItems()));
        for (SpcDCItemDto baseDcItemDto : dcItemDtoList) {
            String jobName = ChartNamingRule.getChartNameByParameterId(baseDcItemDto.getDataCollectionItemName());
            if (!jobNames.contains(jobName)) {
                jobNames.add(jobName);
            }
        }
        for (SpcDataCollectionDto dataCollection : baseDtoList) {
            for (SpcDCItemDto dcItemDto : dataCollection.getDcItems()) {
                String itemName = dcItemDto.getDataCollectionItemName();
                if (!jobNames.contains(ChartNamingRule.getChartNameByParameterId(itemName))) {
                    dcItemDtoList.add(dcItemDto);
                }
            }
        }
        for (SpcDCItemDto baseDcItemDto : dcItemDtoList) {
            String jobName = ChartNamingRule.getChartNameByParameterId(baseDcItemDto.getDataCollectionItemName());
            if (!jobNames.contains(jobName)) {
                jobNames.add(jobName);
            }
        }
        baseDataCollectionDto.setJobNames(jobNames.toArray(new String[jobNames.size()]));
        baseDataCollectionDto.setDcItems(dcItemDtoList.toArray(new SpcDCItemDto[dcItemDtoList.size()]));
    }

    private void buildChamberId(SpcDataCollectionDto spcDataCollection,String equipmentId){

        boolean isChamberEquipment = false;
        String lotId = spcDataCollection.getLotId();
        if (StringUtils.isNotBlank(equipmentId)) {
            Equipment equipment = equipmentManager.getEquipment(equipmentId, LocalContext.getFacilityRrn());

            isChamberEquipment = BooleanUtils.toBoolean(equipment.getIsChamberEquip());
        }
        if (isChamberEquipment) {
            List<Map<String, Object>> elogChamberSheets = elogSheetQueryManager.getElogChamberSheet(lotId, equipmentId);
            HashMap<String, String> chamMap = MapUtils.newHashMap();

            for (Map<String, Object> elogSheet : elogChamberSheets) {
                String unitId = MapUtils.getString(elogSheet, "unitId");
                String eqptId = MapUtils.getString(elogSheet, "eqptId");
                String chamberType = MapUtils.getString(elogSheet, "chamberType");
                chamMap.put(unitId, eqptId + CHAMBER_ID_FLAG + chamberType);
            }

           SpcDCItemDto[] dcItems = spcDataCollection.getDcItems();
           for (SpcDCItemDto dcItem : dcItems) {
               String chamberId = chamMap.get(dcItem.getWaferId());
               if (StringUtils.isNotBlank(chamberId)) {
                   dcItem.setChamberID(chamberId);
               }else {
                   dcItem.setChamberID(StringUtils.EMPTY);
               }

           }
        }
    }

}