MaterialMappingAction.java

package com.mycim.webapp.actions.operation.run;

import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.consts.SessionNames;
import com.mycim.valueobject.wip.Job;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.Unit;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.WipSetupAction;
import com.mycim.webapp.forms.LbrdLotInfoForm;
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.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author Johnson.Wang
 * @version 6.0.0
 * @date 2019/10/9
 **/
public class MaterialMappingAction extends WipSetupAction {

    private static String UNITID_KEY = "unitId";

    private static String MATERIAL_KEY = "materialId";

    @Override
    public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                              HttpServletResponse response) throws Exception {
        LbrdLotInfoForm theform = (LbrdLotInfoForm) form;
        Job job = (Job) request.getAttribute(SessionNames.JOB_KEY);
        if (job == null && theform.getCacheJob() != null) {
            job = (Job) WebUtils.getCacheString2Obj(theform.getCacheJob());
            request.setAttribute(SessionNames.JOB_KEY, job);
        }
        Map parameters = (Map) request.getAttribute(SessionNames.PARAMETERSINFO_KEY);
        if (parameters == null && theform.getCacheParametersInfo() != null) {
            parameters = (Map) WebUtils.getCacheString2Obj(theform.getCacheParametersInfo());
            request.setAttribute(SessionNames.PARAMETERSINFO_KEY, parameters);
        }
        List<Map> lots = (List<Map>) request.getAttribute(SessionNames.COLLECTION_KEY);
        if (lots == null && theform.getCacheCollection() != null) {
            lots = (List<Map>) WebUtils.getCacheString2Obj(theform.getCacheCollection());
            request.setAttribute(SessionNames.COLLECTION_KEY, lots);
        }
        //        if (StringUtils.isNotBlank(WebUtils.getParameter("validateUnitAlias2", request))) {
        //            return validateUnitAlias2(request, response);
        //        }
        //        if (StringUtils.isNotBlank(WebUtils.getParameter("addMaterialInfo", request))) {
        //            return addMaterialInfo(mapping, request, response);
        //        }

        return validateIsNeedMaterialMapping(mapping, request, response, theform);
    }

    public void validateUnitAlias2(HttpServletRequest request, HttpServletResponse response) {
        String unitId = WebUtils.getParameterUpperCase("materialId", request);
        Long unitRrn = WebUtils.getParameterLong("unitRrn", request);
        Unit unit = wipQueryService.getUnit4Alias2(unitRrn, unitId);

        Assert.isFalse(unit.getUnitRrn() > 0,
                       Errors.create().key(MessageIdList.UNIT_NOT_EMPTY).content("Unit is not Empty!").build());
    }

    public ActionForward addMaterialInfo(ActionMapping mapping, HttpServletRequest request,
                                         HttpServletResponse response) throws Exception {
        Map parameters = (Map) request.getAttribute(SessionNames.PARAMETERSINFO_KEY);
        List<Map> lots = (List<Map>) request.getAttribute(SessionNames.COLLECTION_KEY);
        List<Map> materialMappinglots = filterMaterialMappingLots(lots);

        List<Unit> unitsList = getUnitsList(materialMappinglots);
        List<Unit> units = new ArrayList<>();

        String unitId;
        String materialId;
        Unit unit;
        for (int i = 0; i < unitsList.size(); i++) {
            unit = new Unit();
            unitId = WebUtils.getParameterUpperCase(UNITID_KEY + i, request);
            materialId = WebUtils.getParameterUpperCase(MATERIAL_KEY + i, request);
            unit = wipQueryService.getUnit(LocalContext.getFacilityRrn(), unitId);
            unit.setUnitAlias2(materialId);
            units.add(unit);
        }

        wipService.updateUnitAlias2(units);

        parameters.put(SessionNames.RUNSTEP_FLAG, "0");
        request.getRequestDispatcher(mapping.findForward("workflow").getPath()).forward(request, response);
        return null;
    }

    private ActionForward validateIsNeedMaterialMapping(ActionMapping mapping, HttpServletRequest request,
                                                        HttpServletResponse response,
                                                        LbrdLotInfoForm theform) throws Exception {
        List<Map> lots = (List<Map>) request.getAttribute(SessionNames.COLLECTION_KEY);
        Map parameters = (Map) request.getAttribute(SessionNames.PARAMETERSINFO_KEY);
        Assert.isFalse(lots == null || parameters == null,
                       Errors.create().content("Parameters are not enough!").build());

        List<Map> materialMappinglots = filterMaterialMappingLots(lots);
        if (materialMappinglots != null && !materialMappinglots.isEmpty()) {
            List<Unit> unitsList = getUnitsList(materialMappinglots);
            request.setAttribute("units", unitsList);
            setCache4WFL(request, theform);
            return mapping.findForward("materialMapping");
        } else {
            parameters.put(SessionNames.RUNSTEP_FLAG, "0");
            request.getRequestDispatcher(mapping.findForward("workflow").getPath()).forward(request, response);
            return null;
        }
    }

    private List<Map> filterMaterialMappingLots(List<Map> lots) {
        List<Map> materialMappinglots = new ArrayList<>();
        for (Map item : lots) {
            Lot currentLot = lotQueryService.getLot(MapUtils.getLongValue(item, "lotRrn"));
            if (lotQueryService.isMaterialMapping(currentLot)) {
                materialMappinglots.add(item);
            }
        }

        return materialMappinglots;
    }

    private List<Unit> getUnitsList(List<Map> lots) {
        List<Unit> units = new ArrayList<>();

        for (Map tmpLot : lots) {
            List<Unit> unitsList = wipQueryService.getUnitList(MapUtils.getLongValue(tmpLot, "lotRrn"));
            units.addAll(unitsList);
        }

        return units;
    }

}