ReworkRouteContextValueManagerImpl.java

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

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.ctx.exec.manager.ReworkRouteContextValueManager;
import com.mycim.server.ctx.manager.ContextValueManager;
import com.mycim.valueobject.NamedSpaceList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.prp.ContextValue;
import com.mycim.valueobject.prp.Operation;
import com.mycim.valueobject.prp.ReworkRouteContextValue;
import com.mycim.valueobject.wip.Lot;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Johnson.Wang
 * @version 6.0.0
 * @date 2019/9/1
 **/
@Service
@Transactional
public class ReworkRouteContextValueManagerImpl implements ReworkRouteContextValueManager {

    private final ContextValueManager contextValueManager;

    private final NamedObjectManager namedObjectManager;

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

    @Override
    public void copyContextValueForProcessVersionWithActivatedEcn(long processRrn, int currentVersion) {
        contextValueManager
                .copyContextValueForContextKeyWithActivatedEcn(LocalContext.getUserRrn(), "copyByLastProcessVersion",
                                                               buildContextValueForProcessVersion(processRrn,
                                                                                                  currentVersion),
                                                               "CONTEXT_KEY8",
                                                               StringUtils.toString(currentVersion + 1));

    }

    @Override
    public ReworkRouteContextValue buildNewReworkRouteContextValue() {
        ReworkRouteContextValue contextValue = new ReworkRouteContextValue();
        contextValue.setContextRrn(namedObjectManager.getNamedObjectRrn(contextValue.getContextId(),
                                                                        LocalContext.getFacilityRrn(),
                                                                        ObjectList.CONTEXT_KEY));
        return contextValue;
    }

    @Override
    public void deleteContextValueForProcessVersion(long instanceRrn, int instanceVersion) {
        contextValueManager.deleteContextValueByContextKey("deleteProcessVersion",
                                                           buildContextValueForProcessVersion(instanceRrn,
                                                                                              instanceVersion));
    }

    @Override
    public List<ReworkRouteContextValue> getContextValues(long processRrn, int processVersion) {
        List<ContextValue> contextValues = contextValueManager.getContextValues(LocalContext.getFacilityRrn(),
                                                                                buildContextValueForProcessVersion(
                                                                                        processRrn, processVersion));
        List<ReworkRouteContextValue> reworkRouteContextValues = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(contextValues)) {
            for (ContextValue contextValue : contextValues) {
                ReworkRouteContextValue routeContextValue = new ReworkRouteContextValue();
                routeContextValue.copy(contextValue);
                reworkRouteContextValues.add(routeContextValue);
            }
        }
        return reworkRouteContextValues;
    }

    @Override
    public List<ReworkRouteContextValue> getContextValuesByContextKey(long processRrn, int processVersion) {
        List<ContextValue> contextValues = contextValueManager
                .getContextValuesByContextKey(buildContextValueForProcessVersion(processRrn, processVersion));
        List<ReworkRouteContextValue> reworkRouteContextValues = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(contextValues)) {
            for (ContextValue contextValue : contextValues) {
                ReworkRouteContextValue routeContextValue = new ReworkRouteContextValue();
                routeContextValue.copy(contextValue);
                reworkRouteContextValues.add(routeContextValue);
            }
        }
        return reworkRouteContextValues;
    }

    @Override
    public long getProcessReworkRouteRrn(Long processRrn, Integer processVersion, Long routeRrn, Long operationRrn) {
        ReworkRouteContextValue routeContextValue = buildContextValueForProcess(processRrn, processVersion, routeRrn,
                                                                                operationRrn);

        ContextValue contextValue = contextValueManager.simulateContextValue(routeContextValue);
        if (contextValue != null) {
            return NumberUtils.createLong(StringUtils.trimToNull(contextValue.getResultValue1()));
        }
        return 0L;
    }

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

    @Override
    public ContextValue getReworkRouteContextValueByLot(Lot lot) {
        ReworkRouteContextValue reworkRouteContextValue = buildNewReworkRouteContextValue();

        reworkRouteContextValue.setProductRrn(lot.getProductRrn());
        reworkRouteContextValue.setProcessRrn(lot.getProcessRrn());
        reworkRouteContextValue.setRouteRrn(lot.getRouteRrn());
        reworkRouteContextValue.setOperationRrn(lot.getOperationRrn());
        reworkRouteContextValue.setEntityRrn(lot.getEqptRrn());
        reworkRouteContextValue.setLotRrn(lot.getLotRrn());
        reworkRouteContextValue.setProcessVersion(lot.getProcessVersion());
        ContextValue contextValue = contextValueManager.simulateContextValue(reworkRouteContextValue);
        return contextValue;
    }

    @Override
    public ReworkRouteContextValue getProcessReworkRoute(Lot lot) {
        ReworkRouteContextValue reworkRouteContextValue = buildNewReworkRouteContextValue();

        reworkRouteContextValue.setProductRrn(lot.getProductRrn());
        reworkRouteContextValue.setProcessRrn(lot.getProcessRrn());
        reworkRouteContextValue.setRouteRrn(lot.getRouteRrn());
        reworkRouteContextValue.setOperationRrn(lot.getOperationRrn());
        reworkRouteContextValue.setEntityRrn(lot.getEqptRrn());
        reworkRouteContextValue.setLotRrn(lot.getLotRrn());
        reworkRouteContextValue.setProcessVersion(lot.getProcessVersion());

        ContextValue contextValue = contextValueManager.simulateContextValue(reworkRouteContextValue);
        if (contextValue != null) {
            reworkRouteContextValue.copy(contextValue);
        }
        return reworkRouteContextValue;
    }

    @Override
    public ContextValue buildReworkCondition(Operation operation) {
        ContextValue contextValue = new ContextValue();
        contextValue.setContextId("REWORK_ROUTE_CONTEXT");
        contextValue.setContextRrn(namedObjectManager
                                           .getNamedObjectRrn("REWORK_ROUTE_CONTEXT", NamedSpaceList.DEFAULT_KEY,
                                                              ObjectList.CONTEXT_KEY));
        contextValue.setStatus("ACTIVE");
        SimpleDateFormat formatter = new java.text.SimpleDateFormat(DateUtils.DATE_FORMAT4DAY);
        java.util.Date currentTime = new java.util.Date(System.currentTimeMillis());
        contextValue.setEffectiveDateFrom(formatter.format(currentTime));

        int i = 0;
        contextValue.setSequenceNumber(new Integer(0));
        if (operation.getInstanceRrn() != 0) {
            contextValue.setContextKey4(operation.getInstanceRrn() + "");
            i++;
        }
        Assert.isFalse(i == 0, Errors.create().content("At least one is required!").build());

        contextValue.setResultValue1(operation.getReworkRouteRrn() + "");
        contextValue.setResultValue4(operation.getMaxReworkTimes());
        return contextValue;
    }

    private ReworkRouteContextValue buildContextValueForProcessVersion(Long processRrn, Integer processVersion) {
        ReworkRouteContextValue contextValue = buildNewReworkRouteContextValue();

        contextValue.setProcessRrn(processRrn);
        contextValue.setProcessVersion(processVersion);

        return contextValue;
    }

    private ReworkRouteContextValue buildContextValueForProcess(Long processRrn, Integer processVersion, Long routeRrn,
                                                                Long operationRrn) {
        ReworkRouteContextValue contextValue = buildNewReworkRouteContextValue();

        contextValue.setProcessRrn(processRrn);
        contextValue.setProcessVersion(processVersion);
        contextValue.setRouteRrn(routeRrn);
        contextValue.setOperationRrn(operationRrn);
        return contextValue;
    }

}