DispatchAction.java

package com.mycim.webapp.actions.step;

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.consts.VersionStatus;
import com.mycim.valueobject.ocap.OcapCard;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.OcapStepAbstractAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author songpy
 * @version 1.0.0
 * @date 2021/5/25
 **/
public class DispatchAction extends OcapStepAbstractAction {

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        String ocapId = WebUtils.getParameterUpperCase("ocapId", request);
        long ocapRrn = WebUtils.getParameterLong("ocapRrn", request);
        String lotId = WebUtils.getParameterUpperCase("lotId", request);
        lotId = StringUtils.isBlankCheckNull(lotId) ? StringUtils.EMPTY : lotId;

        Map parameters = new HashMap();
        parameters.put("lotId", lotId);
        parameters.put("ocapRrn", ocapRrn);
        parameters.put("ocapId", ocapId);
        request.setAttribute(SessionNames.PARAMETERSINFO_KEY, parameters);

        Long executionRrn = 0L;
        Long wflRrn = 0L;

        OcapCard ocapCard = wipQueryService.getOcapCardByUniqueKey(LocalContext.getFacilityRrn(), ocapId, lotId);
        if (Objects.nonNull(ocapCard) && StringUtils.isEqual(ocapCard.getStatus(), VersionStatus.CLOSED_KEY)) {
            return super.init(mapping, form, request, response);
        }
        wflRrn = ocapCard.getWorkflowRrn();
        executionRrn = ocapCard.getExecutionRrn();

        boolean existFlag = wipWorkflowQueryService.isExistExecutionRrn(executionRrn);
        if (executionRrn <= 0 || !existFlag) {
            ocapService.startWorkflowCase(ocapCard);
            ocapCard = wipQueryService.getOcapCardByUniqueKey(LocalContext.getFacilityRrn(), ocapId, lotId);
            executionRrn = ocapCard.getExecutionRrn();
        }

        buildWorkFlowParameters(wflRrn, executionRrn, parameters);
        request.getRequestDispatcher(mapping.findForward("workflow").getPath() + "?action=init")
               .forward(request, response);
        return null;
    }

    @Override
    protected void setActionUrl(HttpServletRequest request) {
        request.setAttribute(ACTION_URL_KEY, "ocapDispatch.do");
    }


    private void buildWorkFlowParameters(Long wflRrn, Long executionRrn, Map parameters) {
        parameters.put(SessionNames.WFL_RRN, wflRrn);
        parameters.put(SessionNames.OCAP_FLAG, "1");
        parameters.put(SessionNames.RUNSTEP_FLAG, "1");
        String multiRootInstanceRrn = "0";
        parameters.put(SessionNames.ROOT_WFL_EXEC_RRN, multiRootInstanceRrn);
        long parentInstanceRrn = 0;
        parameters.put(SessionNames.PARENT_WFL_EXEC_RRN, parentInstanceRrn + "");
        parameters.put(SessionNames.RUNPARENTSTEP_FLAG, "0");
        parameters.put(SessionNames.WFL_EXEC_RRN, executionRrn + "");
    }

}