DoorHoldAction.java

package com.mycim.webapp.actions.door.doorholdrelease;

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.Door;
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.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Door hold
 *
 * @author yanbing.chen
 * @date 2019/9/01
 * @since 1.8
 **/
public class DoorHoldAction extends CarrierSetupAction {

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

    public ActionForward hold(ActionMapping mapping, HoldReleasePCDInfoForm theform,
                              HttpServletRequest request) throws Exception {
        Long userRrn = LocalContext.getUserRrn();
        Long facilityRrn = LocalContext.getFacilityRrn();

        Assert.isFalse(StringUtils.isEmpty(theform.getDepartment()),
                       Errors.create().key(MessageIdList.PCD_DEPARTMENT_ID_CANNOT_EMPTY).content("部门号不可为空!").build());

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

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

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

        NamedObject pcd = baseService.isExisted(pcdId, entityNamedSpace, ObjectList.ENTITY_KEY);

        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());

        String reason =
                theform.getReasonGroup() + " " + theform.getDepartment() + " " + " Reason:" + theform.getReason();
        TransReason transReason = new TransReason();
        transReason.setReasonCode(theform.getReasonCode());
        transReason.setReason(reason);
        User user = new User();
        user.setInstanceRrn(userRrn);
        user = securityService.getUser(user);
        transReason.setResponsibility(user.getInstanceId());
        transReason.setReasonCategory(TransactionNames.HOLD_PCD_KEY);
        transReason.setAccountCode("");

        HashMap holdInfo = new HashMap(10);
        holdInfo.put("transPerformedBy", user.getInstanceId());
        holdInfo.put("holdBy", userRrn);
        holdInfo.put("transReason", transReason);
        holdInfo.put("pcd", pcd);
        holdInfo.put("facilityRrn", facilityRrn);

        holdInfo.put("objectType", pcd.getObjectType());
        carrierService.holdDoor(holdInfo);

        theform.setReason("");
        theform.setReasonCode("");
        theform.setReasonGroup("");
        theform.setDepartment("");
        theform.setTransId(Constants.HOLD_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 door = carrierService.getDoorInfoDetailById(pcd.getInstanceId(), entityNamedSpace);
        form.setInstanceDesc((MapUtils.getString(door, "doorDesc", StringUtils.EMPTY)));
        form.setStatus((MapUtils.getString(door, "doorStatus", StringUtils.EMPTY)));
        form.setObjectSubtype((MapUtils.getString(door, "doorType", StringUtils.EMPTY)));
        form.setFlagType((MapUtils.getString(door, "doorCategory", StringUtils.EMPTY)));
        form.setAllowableEventsId((MapUtils.getString(door, "doorAllowable", StringUtils.EMPTY)));
        form.setPodId((MapUtils.getString(door, "podId", StringUtils.EMPTY)));
        form.setCarrierId((MapUtils.getString(door, "carrierId", 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", "/doorHold");
        return mapping.findForward("doorHold");
    }

    private boolean holdReleaseAllowed(NamedObject pcd, Boolean isAssembledPcd) {
        Door door = carrierService.getDoor(pcd.getInstanceRrn());
        return StringUtils.equalsIgnoreCase(door.getDoorStatus(), PcdStatus.FREE_KEY) ||
                (StringUtils.equalsIgnoreCase(door.getDoorStatus(), PcdStatus.HOLD_KEY) && !isAssembledPcd);
    }

}