AutoMonitorLogEventTaskManagerImpl.java

package com.mycim.server.automonitor.manager.impl.job.task;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.fa.sesa.threadlocal.LocalContextNames;
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.automonitor.manager.LotAutoMonitorInqManager;
import com.mycim.server.automonitor.manager.job.task.AutoMonitorLogEventTaskManager;
import com.mycim.server.base.manager.EventManager;
import com.mycim.server.ems.manager.EntityManager;
import com.mycim.server.ems.manager.EquipmentInqManager;
import com.mycim.server.ems.manager.EquipmentManager;
import com.mycim.server.ems.manager.LogEventReqManager;
import com.mycim.server.rcp.manager.RecipeManager;
import com.mycim.server.system.manager.ReferenceFileManager;
import com.mycim.server.wip.manager.DiffBatchQueryManager;
import com.mycim.server.wip.manager.JobManager;
import com.mycim.server.wip.manager.LotInqManager;
import com.mycim.server.wip.manager.LotQueryManager;
import com.mycim.server.wip.manager.job.EquipmentCheckManager;
import com.mycim.server.wip.manager.job.RecipeCheckManager;
import com.mycim.utils.WipUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.automonitor.dto.DispatchLotTransDataDTO;
import com.mycim.valueobject.automonitor.entity.LotAutoMonitorInfo;
import com.mycim.valueobject.automonitor.util.AutoMonitorOperationConstants;
import com.mycim.valueobject.automonitor.util.AutoMonitorUtils;
import com.mycim.valueobject.consts.*;
import com.mycim.valueobject.ems.Entity;
import com.mycim.valueobject.ems.Equipment;
import com.mycim.valueobject.ems.Event;
import com.mycim.valueobject.prp.Recipe;
import com.mycim.valueobject.security.User;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.LotStatus;
import com.mycim.valueobject.wip.dto.LotInfoDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @author finatice.yang
 * @date 2021/9/9
 **/
@Service
@Transactional
public class AutoMonitorLogEventTaskManagerImpl implements AutoMonitorLogEventTaskManager {

    @Autowired
    LotInqManager lotInqManager;

    @Autowired
    EntityManager entityManager;

    @Autowired
    EquipmentManager equipmentManager;

    @Autowired
    EquipmentInqManager equipmentInqManager;

    @Autowired
    ReferenceFileManager referenceFileManager;

    @Autowired
    RecipeManager recipeManager;

    @Autowired
    RecipeCheckManager recipeCheckManager;

    @Autowired
    LotAutoMonitorInqManager lotAutoMonitorInqManager;

    @Autowired
    JobManager jobManager;

    @Autowired
    EventManager eventManager;

    @Autowired
    DiffBatchQueryManager diffBatchQueryManager;

    @Autowired
    LogEventReqManager logEventReqManager;

    @Override
    public Map doExecute(Map parameters) {

        Long entityRrn = MapUtils.getLongValue(parameters, "eqptRrn");

        List<LotInfoDto> lotInfoDtos = (List<LotInfoDto>) MapUtils.getObject(parameters, "transData");
        Assert.state(CollectionUtils.isNotEmpty(lotInfoDtos),
                     Errors.create().content("Parameters are not enough!").build());

        LotInfoDto lotInfoDto = lotInfoDtos.iterator().next();

        Lot lot = lotInqManager.getLot(lotInfoDto.getLotBaseInfo().getLotId());

        String trackFlag = lotInfoDto.getLotBaseInfo().getTrackFlag();

        String recipeId = lotInfoDto.getLotBaseInfo().getPpid();
        if (StringUtils.isBlank(recipeId)) {
            recipeId = lot.getRecipePhysicalId();
        }

        Equipment equipment = equipmentManager.getEquipment(entityRrn);

        logEventEqpt(equipment, lot, trackFlag, recipeId);

        parameters.put(SessionNames.RUNSTEP_FLAG, "0");
        return parameters;
    }

    private void logEventEqpt(Equipment equipment, Lot lot, String trackFlag, String recipeId) {
        Boolean isChamberEqpt = equipmentInqManager.checkIsChamberEquipment(equipment);
        if (StringUtils.equalsIgnoreCase(ActionPointList.MOVEIN_KEY, trackFlag)) {
            String targetEventId = EquipmentStatus.RUN;

            LotAutoMonitorInfo monitorInfo = lotAutoMonitorInqManager.getLotAutoMonitorInfo(lot.getLotRrn());
            if (monitorInfo != null) {
                targetEventId = AutoMonitorUtils.checkStepIsMainProcessStep(
                        monitorInfo.getEqptType()) ? EquipmentStatus.MON_R : EquipmentStatus.RUN;
            }

            Boolean specialFlag = checkSpecialFlag(equipment, lot, trackFlag);

            if (Boolean.FALSE.equals(isChamberEqpt) && Boolean.FALSE.equals(specialFlag)) {
                logEventReqManager.logEventEquipmentByMoveIn(equipment, targetEventId);
            }

            if (Boolean.TRUE.equals(isChamberEqpt)) {
                logEventReqManager.logEventChamberByMoveIn(equipment, targetEventId, recipeId);
            }
        } else {
            logEventReqManager.logEventEquipmentByMoveOut(equipment, lot.getJobRrn());
        }
    }

    private Boolean checkSpecialFlag(Equipment equipment, Lot lot, String trackFlag) {
        if (StringUtils.equalsIgnoreCase(ActionPointList.MOVEIN_KEY, trackFlag)) {

            List<ReferenceFileDetail> detailList = referenceFileManager
                    .getRefFileValues(ReferenceDetailNames.AUTO_MONITOR_SPECIAL_EQPT, LocalContext.getFacilityRrn());

            for (ReferenceFileDetail detail : detailList) {
                if (StringUtils.equals(detail.getData1Value(), equipment.getInstanceId())) {
                    return true;
                }
            }
        } else {
            if (StringUtils.isNotBlank(lot.getBatchId())) {
                return true;
            }
        }
        return false;
    }

}