LotInqManagerImpl.java

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

import com.fa.sesa.i18n.I18nUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.server.automonitor.manager.LotAutoMonitorInqManager;
import com.mycim.server.carrier.manager.CarrierInqManager;
import com.mycim.server.carrier.manager.CarrierManager;
import com.mycim.server.ctx.exec.manager.PollutionLevelContextValueManager;
import com.mycim.server.ctx.exec.manager.ProcessOperationDescContextValueManager;
import com.mycim.server.ctx.exec.manager.RecipeContextManager;
import com.mycim.server.ctx.exec.manager.ResequenceContextValueManager;
import com.mycim.server.ems.manager.EquipmentInqManager;
import com.mycim.server.prp.manager.OperationInqManager;
import com.mycim.server.prp.manager.ProcessInqManager;
import com.mycim.server.prp.manager.ProductInqManager;
import com.mycim.server.reticle.manager.LocationInqManager;
import com.mycim.server.reticle.manager.ReticleFamilyInqManager;
import com.mycim.server.reticle.manager.ReticleInqManager;
import com.mycim.server.runcard.manager.RunCardLotInqManager;
import com.mycim.server.wip.dao.LotInqDAO;
import com.mycim.server.wip.manager.DiffBatchQueryManager;
import com.mycim.server.wip.manager.LotAttributeQueryManager;
import com.mycim.server.wip.manager.LotInqManager;
import com.mycim.utils.WipUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.consts.LotInfoConstants;
import com.mycim.valueobject.ems.Carrier;
import com.mycim.valueobject.prp.Item;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.LotStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @author finatice.yang
 * @date 2021/12/13
 **/
@Service
public class LotInqManagerImpl implements LotInqManager {

    @Autowired
    LotInqDAO lotInqDAO;

    @Autowired
    RunCardLotInqManager runCardLotInqManager;

    @Autowired
    LotAutoMonitorInqManager lotAutoMonitorInqManager;

    @Autowired
    LotAttributeQueryManager lotAttributeQueryManager;

    @Autowired
    PollutionLevelContextValueManager pollutionLevelContextValueManager;

    @Autowired
    ProcessOperationDescContextValueManager operationDescContextValueManager;

    @Autowired
    ResequenceContextValueManager resequenceContextValueManager;

    @Autowired
    CarrierInqManager carrierInqManager;

    @Autowired
    EquipmentInqManager equipmentInqManager;

    @Autowired
    ProductInqManager productInqManager;

    @Autowired
    ProcessInqManager processInqManager;

    @Autowired
    OperationInqManager operationInqManager;

    @Autowired
    ReticleInqManager reticleInqManager;

    @Autowired
    ReticleFamilyInqManager reticleFamilyInqManager;

    @Autowired
    DiffBatchQueryManager diffBatchQueryManager;

    @Autowired
    RecipeContextManager recipeContextManager;

    @Autowired
    CarrierManager carrierManager;

    @Autowired
    LocationInqManager locationInqManager;

    @Override
    public String getLotId(Long lotRrn) {
        return lotInqDAO.getLotId(lotRrn);
    }

    @Override
    public Long getLotRrn(String lotId) {
        return lotInqDAO.getLotRrn(lotId);
    }

    @Override
    public Lot getLot(String lotId) {
        Lot lot = lotInqDAO.getLot(lotId);
        return fillLotInfo(lot);
    }

    @Override
    public Lot getLot(Long lotRrn) {
        Lot lot = lotInqDAO.getLot(lotRrn);
        return fillLotInfo(lot);
    }

    @Override
    public List<Lot> getLotListByCarrierRrn(Long carrierRrn) {
        List<Lot> lotList = lotInqDAO.getLotListByCarrierRrn(carrierRrn);
        for (Lot lot : lotList) {
            lot = fillLotInfo(lot);
        }
        return lotList;
    }

    @Override
    public List<Lot> getLotListByCarrierId(String carrierId) {
        Long carrierRrn = carrierInqManager.getCarrierRrn(carrierId);
        if (Objects.nonNull(carrierRrn) && carrierRrn.longValue() > 0) {
            return this.getLotListByCarrierRrn(carrierRrn);
        }
        return new ArrayList<>();
    }

    @Override
    public List<Lot> getLotListByJobRrn(Long jobRrn) {
        List<Lot> lotList = lotInqDAO.getLotListByJobRrn(jobRrn);
        for (Lot lot : lotList) {
            lot = fillLotInfo(lot);
        }
        return lotList;
    }

    @Override
    public List<Lot> getLotListByEqptRrn(Long eqptRrn) {
        List<Lot> lotList = lotInqDAO.getLotListByEqptRrn(eqptRrn);
        for (Lot lot : lotList) {
            lot = fillLotInfo(lot);
        }
        return lotList;
    }

    @Override
    public String getLotStatus(Long lotRrn) {
        return lotInqDAO.getLotStatus(lotRrn);
    }

    @Override
    public Lot fillLotSpec(Lot lot) {
        if (LotInfoConstants.SysType.isRunCardLot(lot.getSysType())) {
            return runCardLotInqManager.fillLotRunCardSpec(lot);
        } else if (LotInfoConstants.SysType.isAutoMonitorLot(lot.getSysType())) {
            return lotAutoMonitorInqManager.fillLotAutoMonitorSpec(lot);
        } else {
            return this.fillLotProcessSpec(lot);
        }
    }

    @Override
    public String checkLotCarrierType(String lotId, String actionPoint) {
        Lot lot = getLot(lotId);
        String message = StringUtils.EMPTY;
        if (lot != null && lot.getLotRrn() > 0) {
            Carrier carrier = carrierInqManager.getCarrier(lot.getCarrierRrn());
            String targetCarrierType = carrierManager.getTargetCarrierTypeByActionPoint(actionPoint, lot);
            if (StringUtils.isBlank(targetCarrierType)) {
                message = I18nUtils.getMessage(MessageIdList.PROCESS_CARRIER_MUST_EMPTY,
                                               "Process location for {} cannot be empty!", lotId);
            }
            if (!StringUtils.equalsIgnoreCase(carrier.getObjectSubtype(), targetCarrierType) &&
                    lot.getAutoSplitMergFlag() != 1) {
                message = I18nUtils.getMessage(MessageIdList.PROCESS_NOT_MATCH_CASSETTE,
                                               "Cassette type for {} not match,Please exchange Cassette!", lotId);
            }
        }
        return message;
    }

    /**
     * 填充normal lot的context value设定内容
     *
     * @author finatice.yang
     * @date 2021/12/20
     * @version 6.0.0
     **/
    private Lot fillLotProcessSpec(Lot lot) {
        String flowSeq = resequenceContextValueManager
                .getFlowSeq(lot.getProcessRrn(), lot.getProcessVersion(), lot.getOperationRrn(), lot.getRouteRrn());
        lot.setFlowSeq(StringUtils.isNotBlank(lot.getFlowSeq()) ? lot.getFlowSeq() : flowSeq);

        lot.setStageId(lotAttributeQueryManager.getStageId(lot));
        lot.setWorkArea(lotAttributeQueryManager.getWorkArea(lot));
        lot.setStepType(lotAttributeQueryManager.getOperationType(lot));
        lot.setProcessLocationAfter(lotAttributeQueryManager.getProcessLocation(lot));
        lot.setPollutionLevelAfter(pollutionLevelContextValueManager.getPollutionLevelByLot(lot));

        String operationDesc = operationDescContextValueManager
                .getOperationDesc(lot.getProductRrn(), lot.getProcessRrn(), lot.getProcessVersion(), lot.getRouteRrn(),
                                  lot.getOperationRrn());
        lot.setOperationDesc(operationDesc);

        String recipeId = StringUtils.EMPTY;
        long recipeLogicalRrn = lot.getRecipeLogicalRrn();
        if (LotStatus.isProcessingStatus(lot.getLotStatus())) {
            recipeId = lot.getRecipePhysicalId();
        } else {
            String recipeString = recipeContextManager.getRecipeString(lot);
            recipeId = recipeContextManager.parseRecipeId(recipeString);
        }
        lot.setRecipeId(recipeId);

        return lot;
    }

    /**
     * 内部填充lot operation设置数据方法
     *
     * @author finatice.yang
     * @date 2021/12/20
     * @version 6.0.0
     **/
    private Lot fillLotInfo(Lot lot) {
        if (Objects.isNull(lot)) {
            return null;
        }
        lot = lotInqDAO.getLotExt(lot);
        fillLotAttribute(lot);

        return fillLotSpec(lot);
    }

    private void fillLotAttribute(Lot lot) {
        Carrier carrier = carrierInqManager.getCarrier(lot.getCarrierRrn());
        if (Objects.nonNull(carrier)) {
            lot.setCarrierId(carrier.getInstanceId());
            lot.setCarrierMapRrn(carrier.getCarrierMapRrn());
        }

        lot.setEqptID(equipmentInqManager.getEquipmentId(lot.getEqptRrn()));

        Item product = productInqManager.getProduct(lot.getProductRrn());
        if (Objects.nonNull(product)) {
            lot.setProductId(product.getInstanceId());
            lot.setProductType(product.getObjectType());
        }

        lot.setProcessId(processInqManager.getProcessId(lot.getProcessRrn()));

        lot.setRouteRrn(Long.valueOf(WipUtils.getRouteByProcessStepVersion(lot.getProcessStepVersion())[0]));
        lot.setRouteId(WipUtils.getRouteByProcessStepVersion(lot.getProcessStepIdVersion())[0]);

        lot.setOperationId(operationInqManager.getOperationId(lot.getOperationRrn()));
        lot.setNextOperationId1(operationInqManager.getOperationId(lot.getNextOperationRrn1()));
        lot.setPrevOperation(operationInqManager.getOperationId(lot.getPrevOperationRrn()));

        lot.setReticleId(reticleInqManager.getReticleId(lot.getReticleRrn()));
        lot.setReticleGroupId(reticleFamilyInqManager.getReticleFamilyId(lot.getReticleGroupRrn()));

        if (StringUtils.equalsIgnoreCase(LotStatus.BANKED, lot.getLotStatus()) ||
                StringUtils.equalsIgnoreCase(LotStatus.OUTSOURCING, lot.getLotStatus())) {
            lot.setPrevFlowSeq(resequenceContextValueManager
                                       .getFlowSeq(lot.getProcessRrn(), lot.getProcessVersion(), lot.getRouteRrn(),
                                                   lot.getPrevOperationRrn()));
            lot.setPrevOperationDesc(operationDescContextValueManager
                                             .getOperationDesc(lot.getProductRrn(), lot.getProcessRrn(),
                                                               lot.getProcessVersion(), lot.getRouteRrn(),
                                                               lot.getPrevOperationRrn()));
            lot.setOperationId(operationInqManager.getOperationId(lot.getPrevOperationRrn()));
        }
        // 兼容查询 equipmentId 和 locationId
        lot.setLocation(locationInqManager.getLocationIdOrEquipmentId(lot.getLocationRrn()));
        lot.setpLocation(locationInqManager.getLocationIdOrEquipmentId(lot.getpLocationRrn()));

        lot.setBatchId(diffBatchQueryManager.getLotBatchId(lot.getLotRrn()));
    }

}