# EenLotContextValueManagerImpl.java

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

    import com.fa.sesa.threadlocal.LocalContext;
    import com.mycim.framework.utils.lang.collections.CollectionUtils;
    import com.mycim.framework.utils.lang.math.NumberUtils;
    import com.mycim.server.base.manager.NamedObjectManager;
    import com.mycim.server.ctx.exec.manager.EenLotContextValueManager;
    import com.mycim.server.ctx.manager.ContextValueManager;
    import com.mycim.utils.WipUtils;
    import com.mycim.valueobject.ObjectList;
    import com.mycim.valueobject.context.EenLotContextValue;
    import com.mycim.valueobject.prp.ContextValue;
    import com.mycim.valueobject.wip.Lot;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;

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

    /**
     * @author Johnson.Wang
     * @version 6.0.0
     * @date 2019/10/8
     **/
    @Service
    @Transactional
    public class EenLotContextValueManagerImpl implements EenLotContextValueManager {

        private final NamedObjectManager namedObjectManager;

        private final ContextValueManager contextValueManager;

        public EenLotContextValueManagerImpl(NamedObjectManager namedObjectManager,
                                             ContextValueManager contextValueManager) {
            this.namedObjectManager = namedObjectManager;
            this.contextValueManager = contextValueManager;
        }

        @Override
        public List<Long> getFutureActionRrns(Lot lot, String actionPoint) {
            EenLotContextValue actionCondition = buildNewEenLotContextValue(lot, actionPoint);
            ContextValue actionConditionContextValue = contextValueManager
                    .filterContextValueToRrn(actionCondition, LocalContext.getFacilityRrn());
            List<ContextValue> contextValues = contextValueManager.simulateContextValues(actionConditionContextValue);
            if (CollectionUtils.isEmpty(contextValues)) {
                return null;
            }

            List<Long> actionRrns = new ArrayList<>();
            for (ContextValue contextValue : contextValues) {
                actionRrns.add(NumberUtils.toLong(contextValue.getResultValue1()));
            }
            return actionRrns;
        }

        private EenLotContextValue buildNewEenLotContextValue(Lot lot, String actionPoint) {
            EenLotContextValue actionCondition = buildNewEenLotContextValue();

            actionCondition.setContextKey1(namedObjectManager.getNamedObjectId(lot.getProductRrn()));
            actionCondition.setContextKey2(namedObjectManager.getNamedObjectId(lot.getProcessRrn()));
            actionCondition.setContextKey3(
                    Objects.requireNonNull(WipUtils.getRouteByProcessStepVersion(lot.getProcessStepIdVersion()))[0]);
            actionCondition.setContextKey4(namedObjectManager.getNamedObjectId(lot.getOperationRrn()));

            if (lot.getRecipeLogicalRrn() != null) {
                actionCondition.setContextKey5(namedObjectManager.getNamedObjectId(lot.getRecipeLogicalRrn()));
            } else {
                actionCondition.setContextKey5(null);
            }
            actionCondition.setContextKey6(lot.getLotId());
            actionCondition.setContextKey7(actionPoint);

            return actionCondition;
        }

        private EenLotContextValue buildNewEenLotContextValue() {
            EenLotContextValue eenLotContextValue = new EenLotContextValue();
            eenLotContextValue.setContextRrn(namedObjectManager.getNamedObjectRrn(eenLotContextValue.getContextId(),
                                                                                  LocalContext.getFacilityRrn(),
                                                                                  ObjectList.CONTEXT_KEY));

            return eenLotContextValue;
        }

    }