PodReleaseAction.java

package com.mycim.webapp.actions.pod.podholdrelease;

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.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.consts.PcdStatus;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.ems.POD;
import com.mycim.valueobject.ems.PcdAssembly;
import com.mycim.valueobject.security.User;
import com.mycim.valueobject.wip.TransReason;
import com.mycim.webapp.Constants;
import com.mycim.webapp.actions.CarrierSetupAction;
import com.mycim.webapp.forms.HoldReleasePCDInfoForm;
import org.apache.commons.collections.MapUtils;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Pod release
 *
 * @author yanbing.chen
 * @date 2019/8/31
 * @since 1.8
 **/
public class PodReleaseAction extends CarrierSetupAction {

    @Override
    public String inItMethod() {
        return "getPcdDetail";
    }

    public ActionForward release(ActionMapping mapping, HttpServletRequest request,
                                 HoldReleasePCDInfoForm theform) throws Exception {

        Long userRrn = LocalContext.getUserRrn();
        Long facilityRrn = LocalContext.getFacilityRrn();

        String pcdId = request.getParameter("instanceId").toUpperCase();
        Assert.isFalse(StringUtils.isBlank(pcdId),
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_EMPTY).content("晶舟号不能为空!").build());

        String entityNamedSpace = getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn);

        NamedObject pcd = baseService.isExisted(pcdId, entityNamedSpace, ObjectList.ENTITY_KEY);
        Assert.isFalse(pcd == null || pcd.getInstanceRrn() == 0,
                       Errors.create().key(MessageIdList.PCD_PCD_MISSING).content("PCD 不存在!").build());

        Assert.isFalse(StringUtils.isEmpty(theform.getReasonGroup()),
                       Errors.create().key(MessageIdList.PCD_RELEASE_GROUP_CANNOT_EMPTY).content("释放组不可为空!").build());

        Assert.isFalse(StringUtils.isEmpty(theform.getReasonCode()),
                       Errors.create().key(MessageIdList.PCD_RELEASE_CODE_CANNOT_EMPTY).content("释放代码不可为空!").build());

        Assert.isFalse(StringUtils.isEmpty(theform.getReason()),
                       Errors.create().key(MessageIdList.PCD_RELEASE_REASON_CANNOT_EMPTY).content("释放原因不可为空!").build());
        Boolean isAssembledPCD = carrierService.isAssembledPCD(pcd.getInstanceRrn());

        Assert.isFalse(isAssembledPCD && !StringUtils.equalsIgnoreCase(pcd.getObjectType(), ObjectList.CARRIER_KEY),
                       Errors.create().key(MessageIdList.PCD_ASSEMBLED_POD_AND_DOOR_RELEASED_BY_CASSETTE)
                             .content("组装后的Pod 和 Door 只允许通过Cassette 暂停!!").build());

        List<Map> holdReasons = carrierService.getHoldReasons(pcd.getInstanceRrn());
        List releaseReasons = new ArrayList();
        Object[] holdReasonArrays = holdReasons.toArray();
        HashMap holdReason = new HashMap();

        for (int i = 0; i < holdReasonArrays.length; i++) {
            String fieldFlag = request.getParameter("fieldFlag" + i);
            if (StringUtils.equalsIgnoreCase("on", fieldFlag)) {
                holdReason = (HashMap) holdReasonArrays[i];
                HashMap releaseReason = new HashMap();
                releaseReason.putAll(holdReason);
                releaseReasons.add(releaseReason);
            }
        }

        User user = new User();
        user.setInstanceRrn(userRrn);

        user = securityService.getUser(user);

        HashMap releaseInfo = new HashMap();
        releaseInfo.put("releaseReasons", releaseReasons);
        releaseInfo.put("transPerformedBy", user.getInstanceId());

        TransReason transReason = new TransReason();
        String reason = theform.getReasonGroup() + " " + theform.getReasonCode() + " Reason:" + theform.getReason();
        transReason.setReasonCode(theform.getReasonCode());
        transReason.setResponsibility(user.getInstanceId());
        transReason.setReasonCategory(TransactionNames.RELEASE_PCD_KEY);
        transReason.setReason(reason);
        releaseInfo.put("transReason", transReason);
        releaseInfo.put("pcd", pcd);
        releaseInfo.put("facilityRrn", facilityRrn);

        String preStatus = emsService.getPreStatusByEntityRrn(pcd.getInstanceRrn());
        String targetStatus = StringUtils.EMPTY;
        if (StringUtils.isNotBlank(preStatus)) {
            targetStatus = releaseReasons.size() == holdReasons.size() ? preStatus : PcdStatus.HOLD_KEY;
        } else {
            PcdAssembly assembly = null;
            assembly = carrierService.getPcdAssembly(pcd.getInstanceRrn(), null, null);
            if (assembly != null && StringUtils.isNotBlank(assembly.getCarrierId())) {
                targetStatus = PcdStatus.ASSEMBLY_KEY;
            } else {
                targetStatus = PcdStatus.FREE_KEY;
            }
        }
        releaseInfo.put("targetStatus", targetStatus);

        carrierService.releasePod(releaseInfo);
        theform.setPasswordConfirm("");
        theform.setReason("");
        theform.setReasonCode("");
        theform.setReasonGroup("");
        theform.setDepartment("");
        theform.setTransId(Constants.RELEASE_KEY);
        return getPcdDetail(mapping, theform, request);
    }

    public ActionForward getPcdDetail(ActionMapping mapping, HoldReleasePCDInfoForm form, HttpServletRequest request) {
        Long facilityRrn = LocalContext.getFacilityRrn();
        String pcdId = request.getParameter("instanceId");
        Assert.isFalse(StringUtils.isBlank(pcdId),
                       Errors.create().key(MessageIdList.CARRIER_CASSETTE_EMPTY).content("晶舟号不能为空!").build());

        String entityNamedSpace = getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn);

        NamedObject pcd = baseService.isExisted(pcdId, entityNamedSpace, ObjectList.ENTITY_KEY);
        Assert.isFalse(pcd == null || pcd.getInstanceRrn() == 0,
                       Errors.create().key(MessageIdList.PCD_PCD_MISSING).content("PCD 不存在!").build());

        Map pod = carrierService.getPodInfoDetailById(pcd.getInstanceId(), entityNamedSpace);
        form.setInstanceDesc((MapUtils.getString(pod, "podDesc", StringUtils.EMPTY)));
        form.setStatus((MapUtils.getString(pod, "podStatus", StringUtils.EMPTY)));
        form.setObjectSubtype((MapUtils.getString(pod, "podType", StringUtils.EMPTY)));
        form.setFlagType((MapUtils.getString(pod, "podCategory", StringUtils.EMPTY)));
        form.setAllowableEventsId((MapUtils.getString(pod, "podAllowable", StringUtils.EMPTY)));
        form.setCarrierId((MapUtils.getString(pod, "carrierId", StringUtils.EMPTY)));
        form.setDoorId((MapUtils.getString(pod, "doorId", StringUtils.EMPTY)));
        String transId = request.getParameter("transId");

        form.setTransId(transId);
        form.setObjectType(pcd.getObjectType());
        Boolean isAssembledPCD = carrierService.isAssembledPCD(pcd.getInstanceRrn());
        form.setHoldReleaseAllowed(holdReleaseAllowed(pcd, isAssembledPCD));

        List<Map> holdReasons = carrierService.getHoldReasons(pcd.getInstanceRrn());
        request.setAttribute("collection", holdReasons);
        request.setAttribute("transUrl", "/podRelease");
        return mapping.findForward("podRelease");
    }

    private boolean holdReleaseAllowed(NamedObject pcd, Boolean isAssembledPCD) {
        POD pod = carrierService.getPod(pcd.getInstanceRrn());
        return StringUtils.equalsIgnoreCase(pod.getPodStatus(), PcdStatus.FREE_KEY) ||
                (StringUtils.equalsIgnoreCase(pod.getPodStatus(), PcdStatus.HOLD_KEY) && !isAssembledPCD);
    }

}