ProcessLocationContextManagerImpl.java

package com.mycim.server.ctx.exec.manager.impl;

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.ctx.exec.manager.ProcessLocationContextManager;
import com.mycim.server.ctx.manager.ContextValueManager;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.prp.ContextValue;
import com.mycim.valueobject.prp.ProcessLocationContextValue;
import com.mycim.valueobject.wip.Lot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * @author sandy
 * @version 6.0.0
 * @date 2019/9/3
 **/
@Service
@Transactional
public class ProcessLocationContextManagerImpl implements ProcessLocationContextManager {

    @Autowired
    private ContextValueManager contextValueManager;

    @Autowired
    private NamedObjectManager namedObjectManager;

    @Override
    public String getProccessLocation(Map<String, Object> contextValueInfo) {
        ProcessLocationContextValue processLocationContextValue = buildNewProcessLocationContextValueInfo(
                contextValueInfo);
        ContextValue contextValue = contextValueManager.getContextValueNoFilter(processLocationContextValue);
        if (contextValue != null) {
            return contextValue.getResultValue1();
        }
        return StringUtils.EMPTY;
    }

    @Override
    public ContextValue getProccessLocationContextValue(Long productRrn, Long processRrn, Integer processVersion,
                                                        Long routeRrn, Long operationRrn) {
        ProcessLocationContextValue processLocationContextValue = buildNewProcessLocationContextValueInfo(productRrn,
                                                                                                          processRrn,
                                                                                                          processVersion,
                                                                                                          routeRrn,
                                                                                                          operationRrn);
        ContextValue contextValue = contextValueManager.getContextValueNoFilter(processLocationContextValue);
        return contextValue;
    }

    @Override
    public String getCurrentProcessLocation(Long facilityRrn, Lot lot) {
        String location = StringUtils.EMPTY;
        ProcessLocationContextValue ctx = new ProcessLocationContextValue();
        ctx.setContextRrn(
                namedObjectManager.getNamedObjectRrn(ctx.getContextId(), facilityRrn, ObjectList.CONTEXT_KEY));
        ctx.setProductRrn(lot.getProductRrn());
        ctx.setProcessRrn(lot.getProcessRrn());
        ctx.setRouteRrn(lot.getRouteRrn());
        ctx.setOperationRrn(lot.getOperationRrn());
        ctx.setProcessVersion(lot.getProcessVersion());
        ContextValue contextValue;
        contextValue = contextValueManager.getContextValueNoFilter(ctx);
        if (contextValue != null && StringUtils.isNotBlank(contextValue.getResultValue1())) {
            location = contextValue.getResultValue1();
        }
        return location;
    }

    @Override
    public List<ContextValue> getProcessLocationContextValueList(long productRrn, long processRrn, int processVersion) {
        long facilityRrn = LocalContext.getFacilityRrn();
        ProcessLocationContextValue processLocationContextValue = new ProcessLocationContextValue();
        processLocationContextValue.setContextRrn(namedObjectManager
                                                          .getNamedObjectRrn(processLocationContextValue.getContextId(),
                                                                             facilityRrn, ObjectList.CONTEXT_KEY));
        processLocationContextValue.setProductRrn(productRrn);
        processLocationContextValue.setProcessRrn(processRrn);
        processLocationContextValue.setProcessVersion(processVersion);
        return contextValueManager.getContextValuesByContextKey(processLocationContextValue);
    }

    @Override
    public Map buildContextValueForProcessLocation(Long facilityRrn, Map contextValueInfo) {
        ProcessLocationContextValue processLocationContextValue = new ProcessLocationContextValue();
        BeanUtils.copyMapToBean(processLocationContextValue, contextValueInfo);
        processLocationContextValue.setProductRrn(MapUtils.getLong(contextValueInfo, "productRrn"));
        processLocationContextValue.setProcessRrn(MapUtils.getLong(contextValueInfo, "processRrn"));
        processLocationContextValue.setOperationRrn(MapUtils.getLong(contextValueInfo, "operationRrn"));
        processLocationContextValue.setRouteRrn(MapUtils.getLong(contextValueInfo, "routeRrn"));
        processLocationContextValue.setContextRrn(namedObjectManager
                                                          .getNamedObjectRrn(processLocationContextValue.getContextId(),
                                                                             namedObjectManager
                                                                                     .getNamedSpace(facilityRrn,
                                                                                                    ObjectList.CONTEXT_KEY),
                                                                             ObjectList.CONTEXT_KEY));

        ContextValue contextValue = contextValueManager.getContextValueNoFilter(processLocationContextValue);
        if (contextValue != null) {
            contextValueInfo.put("processLocation", contextValue.getResultValue1());
            contextValueInfo.put("activeProcessLocation", contextValue.getResultValue1());
            if (contextValue.getEcnRrn() != null && contextValue.getEcnRrn() > 0) {
                contextValueInfo.put("ecnRrn", contextValue.getEcnRrn());
                contextValueInfo.put("status", contextValue.getStatus());
                contextValueInfo.put("effectiveDateFrom", contextValue.getEffectiveDateFrom());
                contextValueInfo.put("effectiveDateTo", contextValue.getEffectiveDateTo());
            }
        }
        return contextValueInfo;
    }

    public ProcessLocationContextValue buildNewProcessLocationContextValue() {
        ProcessLocationContextValue contextValue = new ProcessLocationContextValue();
        contextValue.setContextRrn(namedObjectManager.getNamedObjectRrn(contextValue.getContextId(),
                                                                        LocalContext.getFacilityRrn(),
                                                                        ObjectList.CONTEXT_KEY));
        return contextValue;
    }

    private ProcessLocationContextValue buildNewProcessLocationContextValueInfo(Long productRrn, Long processRrn,
                                                                                Integer processVersion, Long routeRrn,
                                                                                Long operationRrn) {
        ProcessLocationContextValue processLocationContextValue = buildNewProcessLocationContextValue();

        processLocationContextValue.setOperationRrn(operationRrn);
        processLocationContextValue.setProductRrn(productRrn);
        processLocationContextValue.setRouteRrn(routeRrn);
        processLocationContextValue.setProcessRrn(processRrn);
        processLocationContextValue.setProcessVersion(processVersion);

        return processLocationContextValue;
    }

    private ProcessLocationContextValue buildNewProcessLocationContextValueInfo(Map<String, Object> lotInfo) {
        ProcessLocationContextValue processLocationContextValue = buildNewProcessLocationContextValue();
        Long productRrn = MapUtils.getLong(lotInfo, "productRrn");
        Long routeRrn = MapUtils.getLong(lotInfo, "routeRrn");
        Long processRrn = MapUtils.getLong(lotInfo, "processRrn");
        Long operationRrn = MapUtils.getLong(lotInfo, "operationRrn");
        Integer processVersion = MapUtils.getInteger(lotInfo, "processVersion");

        processLocationContextValue.setOperationRrn(operationRrn);
        processLocationContextValue.setProductRrn(productRrn);
        processLocationContextValue.setRouteRrn(routeRrn);
        processLocationContextValue.setProcessRrn(processRrn);
        processLocationContextValue.setProcessVersion(processVersion);

        return processLocationContextValue;
    }

}