DoorReleaseAction.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.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;
/**
* Door release
*
* @author yanbing.chen
* @date 2019/9/01
* @since 1.8
**/
public class DoorReleaseAction 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.releaseDoor(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 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", "/doorRelease");
return mapping.findForward("doorRelease");
}
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);
}
}