EquipmentConstrainSetupAction.java
package com.mycim.webapp.actions.constrain;
import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.i18n.I18nUtils;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.time.DateUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.ems.Entity;
import com.mycim.valueobject.ems.Equipment;
import com.mycim.valueobject.prp.EquipmentConstrainInfo;
import com.mycim.valueobject.security.UserGroup;
import com.mycim.valueobject.wip.Lot;
import com.mycim.webapp.actions.PrpSetupAction;
import com.mycim.webapp.forms.EquipmentConstrainSetupForm;
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.sql.Timestamp;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.regex.Pattern;
/**
* @author shijie.deng
* @version 6.0.0
* @date 2019/9/11
**/
public class EquipmentConstrainSetupAction extends PrpSetupAction {
public static String REJECT_STOP_KEY = "REJECT-STOP";
public static String ACCEPT_KEY = "ACCEPT";
@Override
public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute("userId", LocalContext.getUserId());
String[] types = new String[]{"PRIORITY", "HOTFLAG"};
registerOptionType(LocalContext.getFacilityRrn(), Arrays.asList(types), request);
return mapping.getInputForward();
}
public Page qryEquipmentConstrain(EquipmentConstrainSetupForm theform, HttpServletRequest request) {
String userId = LocalContext.getUserId();
long userRrn = LocalContext.getUserRrn();
long facilityRrn = LocalContext.getFacilityRrn();
String equipmentId = StringUtils.trimToUpperCase(theform.getEquipmentId());
if (StringUtils.isNotBlank(equipmentId)) {
equipmentId = equipmentId.replace("*", "%");
}
Map<String, Object> conditionInfo = new HashMap<>();
String checkFlag = request.getParameter("checkFlag");
conditionInfo.put("checkFlag", checkFlag);
conditionInfo.put("equipmentId", equipmentId);
conditionInfo.put("isQeUser", isQeUser(userRrn) &&
!emsService.checkUserAndEqptStationJurisdiction(userId, theform.getEquipmentId(), facilityRrn));
conditionInfo.put("runFunc", theform.getRunFunc());
conditionInfo.put("isExpired", theform.getIsExpired());
List<String> constrainRule = Arrays.asList(EquipmentConstrainInfo.NORMAL_EQUIPMENT_RULE,
EquipmentConstrainInfo.FREE_EQUIPMENT_RULE);
conditionInfo.put("constrainRule", constrainRule);
Page equipmentConstrainPage = new Page(theform.getPage(), theform.getLimit());
equipmentConstrainPage = constrainService.qryEquipmentConstrainInfos(equipmentConstrainPage, conditionInfo);
return equipmentConstrainPage;
}
public String saveEquipmentConstrain(EquipmentConstrainSetupForm theform) {
String userId = LocalContext.getUserId();
long facilityRrn = LocalContext.getFacilityRrn();
if (theform.getTotalWaferCount() > 0 || theform.getDailyWaferCount() > 0) {
Assert.isFalse(StringUtils.isBlank(theform.getExpireDate()) && StringUtils.isBlank(theform.getExpireTime()),
Errors.create().key(MessageIdList.EQUIPMENT_CONSTRAIN_EXPIREDATE_NOT_NULL)
.content("When the wafer count is selected, the expire date cannot be empty").build());
if (StringUtils.isBlank(theform.getExpireDates())) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY/MM/dd");
theform.setExpireDates(dtf.format(LocalDate.now()));
}
}
if (StringUtils.isNotEmpty(theform.getExpireDates())) {
theform.setExpireDate(theform.getExpireDates() + " " +
(StringUtils.isEmpty(theform.getExpireTime()) ? "00:00:00" : theform
.getExpireTime()));
}
validateLotConstainInfo(theform);
Map condtionInfo = new HashMap();
condtionInfo.put("equipmentId", theform.getEquipmentId());
condtionInfo.put("productId", theform.getProductId());
condtionInfo.put("processId", theform.getProcessId());
condtionInfo.put("lotId", theform.getLotId());
condtionInfo.put("operationId", theform.getOperationId());
condtionInfo.put("recipeId", theform.getRecipeId());
condtionInfo.put("constrainSeq", theform.getConstrainSeq());
condtionInfo.put("routeId", theform.getRouteId());
condtionInfo.put("customerId", theform.getCustomerId());
condtionInfo.put("stageId", theform.getStageId());
condtionInfo.put("dailyWaferCount", theform.getDailyWaferCount());
condtionInfo.put("totalWaferCount", theform.getTotalWaferCount());
EquipmentConstrainInfo equipmentConstrainInfo = new EquipmentConstrainInfo();
BeanUtils.copyProperties(theform, equipmentConstrainInfo);
equipmentConstrainInfo.setCreateBy(userId);
equipmentConstrainInfo.setFacilityRrn(facilityRrn);
//如果是腔体,查询出它的父设备,统计waferCount用
Entity entity = emsService.getEntity(
getInstanceRrn(equipmentConstrainInfo.getEquipmentId(), LocalContext.getFacilityRrn(),
ObjectList.ENTITY_KEY));
equipmentConstrainInfo
.setParentEquipmentRrn(entity.getParentEntityRrn() == null ? 0 : entity.getParentEntityRrn());
equipmentConstrainInfo.setParentEquipmentId(entity.getParentEntityId());
if (theform.getConstrainRrn() <= 0) {
Collection constrainRules = Arrays
.asList(new String[]{EquipmentConstrainInfo.NORMAL_EQUIPMENT_RULE,
EquipmentConstrainInfo.FREE_EQUIPMENT_RULE});
condtionInfo.put("constrainRule", constrainRules);
List<EquipmentConstrainInfo> equipmentConstrainInfos = constrainService
.validationEquipmentConstrainInfos(condtionInfo);
Assert.isFalse(CollectionUtils.isNotEmpty(equipmentConstrainInfos),
Errors.create().key(MessageIdList.CONSTRAIN_EXIST_PLEASE_MODIFY).content(
"The process " + "limitation " + "has" + " " + "existed. " + "Please check " +
"the process " + "limit and " + "modify it.").build());
constrainService.insertEquipmentConstrainInfo(equipmentConstrainInfo);
} else {
equipmentConstrainInfo.setModifyBy(userId);
constrainService.modifyEquipmentConstrainInfo(equipmentConstrainInfo);
}
return I18nUtils.getMessage("system.operate_successfully", "operate successfully!");
}
public String deleteLotConstrain(EquipmentConstrainSetupForm theform) {
String userId = LocalContext.getUserId();
EquipmentConstrainInfo equipmentConstrainInfo = new EquipmentConstrainInfo();
long constrainRrn = theform.getConstrainRrn();
if (constrainRrn > 0) {
equipmentConstrainInfo.setConstrainRrn(constrainRrn);
equipmentConstrainInfo = constrainService.getEquipmentConstrainInfo(equipmentConstrainInfo, false);
}
Assert.isFalse(theform.getConstrainRrn() <= 0,
Errors.create().key(MessageIdList.CONSTRAIN_NOT_EXIST_PLEASE_CONFIRM)
.content("This process limit does not exist, please" + " " + "confirm!").build());
equipmentConstrainInfo.setModifyBy(userId);
constrainService.deleteEquipmentConstrainInfo(equipmentConstrainInfo);
return I18nUtils.getMessage("system.operate_successfully", "operate successfully!");
}
public EquipmentConstrainInfo getEquipmentConstrain(EquipmentConstrainSetupForm theform) {
EquipmentConstrainInfo equipmentConstrainInfo = new EquipmentConstrainInfo();
BeanUtils.copyProperties(theform, equipmentConstrainInfo);
String constrainRule = theform.getConstrainRule();
Boolean approveFlag = StringUtils.equalsIgnoreCase(EquipmentConstrainInfo.CHECK_EQUIPMENT_RULE, constrainRule);
long constrainRrn = theform.getConstrainRrn();
if (constrainRrn > 0) {
equipmentConstrainInfo.setConstrainRrn(constrainRrn);
equipmentConstrainInfo = constrainService.getEquipmentConstrainInfo(equipmentConstrainInfo, approveFlag);
Map<String, Object> conditionMap = new HashMap<String, Object>();
conditionMap.put("type", "eqptConstrain");
conditionMap.put("constrainInfo", equipmentConstrainInfo);
conditionMap.put("facilityRrn", LocalContext.getFacilityRrn());
Date date = DateUtils.parse(DateUtils.getNowTime(DateUtils.DATE_FORMAT4DAYD), DateUtils.DATE_FORMAT4DAYD);
if (date.before(equipmentConstrainInfo.getModifyTime())) {
conditionMap.put("startTime", DateUtils
.formatDate(equipmentConstrainInfo.getModifyTime(), DateUtils.DATE_FORMAT4DATE));
} else {
conditionMap.put("startTime", DateUtils.getNowTime(DateUtils.DATE_FORMAT4DAYD));
}
conditionMap.put("level", EquipmentConstrainInfo.LOT);
equipmentConstrainInfo
.setCurrentDailyLotCount(lotQueryService.getLotCountFormHistoryByCondition(conditionMap));
conditionMap.put("level", EquipmentConstrainInfo.WAFER);
equipmentConstrainInfo
.setCurrentDailyWaferCount(lotQueryService.getLotCountFormHistoryByCondition(conditionMap));
conditionMap.put("startTime",
DateUtils.formatDate(equipmentConstrainInfo.getModifyTime(), DateUtils.DATE_FORMAT4DATE));
conditionMap.put("level", EquipmentConstrainInfo.LOT);
equipmentConstrainInfo
.setCurrentTotalLotCount(lotQueryService.getLotCountFormHistoryByCondition(conditionMap));
conditionMap.put("level", EquipmentConstrainInfo.WAFER);
equipmentConstrainInfo
.setCurrentTotalWaferCount(lotQueryService.getLotCountFormHistoryByCondition(conditionMap));
Date modifyTime = equipmentConstrainInfo.getModifyTime();
long autoInterval = DateUtils.getSecondsTime(equipmentConstrainInfo.getAutoSwitchTimeInterval());
if (autoInterval > 0 &&
!StringUtils.equals(equipmentConstrainInfo.getConstrainStatus(), EquipmentConstrainInfo.ENABLE)) {
equipmentConstrainInfo.setNextEnableTime(DateUtils.addSeconds(modifyTime, (int) autoInterval));
}
}
return equipmentConstrainInfo;
}
public Page buildQryEquipmentConstrain(EquipmentConstrainSetupForm theform) {
long facilityRrn = LocalContext.getFacilityRrn();
Collection equipmentConstrainInfoValueList = new ArrayList();
Map condtionInfo = new HashMap();
condtionInfo.put("checkFlag", theform.getCheckFlag());
condtionInfo.put("equipmentId", theform.getEquipmentId());
List<String> constrainRule = Arrays.asList(EquipmentConstrainInfo.NORMAL_EQUIPMENT_RULE, EquipmentConstrainInfo.FREE_EQUIPMENT_RULE);
condtionInfo.put("constrainRule", constrainRule);
Page equipmentConstrainPage = new Page(theform.getPage(), theform.getLimit());
if (StringUtils.isNotEmpty(theform.getConstranin())) {
Lot lot = new Lot();
BeanUtils.copyProperties(theform, lot);
String equipmentId = theform.getEquipmentId();
Equipment equipment = new Equipment(equipmentId, getNamedSpace(ObjectList.ENTITY_KEY, facilityRrn),
ObjectList.ENTITY_KEY);
// equipment = getEquipment(equipment);
equipmentConstrainInfoValueList = lotConstrain(equipment, lot);
} else {
equipmentConstrainPage = constrainService.qryEquipmentConstrainInfos(equipmentConstrainPage, condtionInfo);
List equipmentConstrainInfoList = (List) equipmentConstrainPage.getResults();
String equipmentId = theform.getEquipmentId();
for (int i = 0; i < equipmentConstrainPage.getTotalItems(); i++) {
EquipmentConstrainInfo equipmentConstrainInfo = (EquipmentConstrainInfo) equipmentConstrainInfoList
.get(i);
if (equipmentConstrainInfo.matchesEquipmentId(equipmentId)) {
equipmentConstrainInfoValueList.add(equipmentConstrainInfo);
}
}
}
equipmentConstrainPage.setResults(equipmentConstrainInfoValueList);
return equipmentConstrainPage;
}
public String checkEquipmentConstrain(EquipmentConstrainSetupForm theform) {
long facilityRrn = LocalContext.getFacilityRrn();
String userId = LocalContext.getUserId();
long userRrn = LocalContext.getUserRrn();
validateLotConstainInfo(theform);
EquipmentConstrainInfo equipmentConstrainInfo = new EquipmentConstrainInfo();
BeanUtils.copyProperties(theform, equipmentConstrainInfo);
equipmentConstrainInfo.setFacilityRrn(facilityRrn);
Assert.isFalse(StringUtils.equals(equipmentConstrainInfo.getModifyBy(), userId),
Errors.create().key(MessageIdList.ECS_NO_PERMISSION_DOUBLE_CHECK)
.content("Current login user does not have permission to double check").build());
equipmentConstrainInfo.setModifyBy(userId);
if (StringUtils.equalsIgnoreCase("on", equipmentConstrainInfo.getQeFlag())) {
List<UserGroup> userGroups = securityService.getUserGroupByUserRrn(userRrn);
boolean notQE = false;
for (UserGroup userGroup : userGroups) {
if (StringUtils.equals("QE", userGroup.getInstanceId())) {
notQE = true;
}
}
Assert.isTrue(notQE, Errors.create().key(MessageIdList.ECS_NO_PERMISSION_QE)
.content("You have no permission to double check ,please contact QE").build());
}
constrainService.checkAndModifyEquipmentConstrainInfo(equipmentConstrainInfo);
return I18nUtils.getMessage("system.operate_successfully", "operate successfully!");
}
public String getMaxConstrainSeqByEqpt(ActionMapping mapping, EquipmentConstrainSetupForm theform,
HttpServletRequest request, HttpServletResponse response) {
Integer maxConstrainSeqByEqpt = constrainService
.getMaxConstrainSeqByEqpt(StringUtils.trimToUpperCase(theform.getEquipmentId()));
return StringUtils.toString(maxConstrainSeqByEqpt + 1);
}
private Collection lotConstrain(Equipment equipment, Lot lot) {
Collection equipmentConstrainInfoValueList = new ArrayList();
// 检查批次上的工艺限制
List<String> constrainRule = Arrays.asList(EquipmentConstrainInfo.NORMAL_EQUIPMENT_RULE, EquipmentConstrainInfo.FREE_EQUIPMENT_RULE);
Collection equipmentConstrainInfos = constrainService
.qryEnableEquipmentConstrainInfos(constrainRule, equipment.getInstanceId(), "");
for (Iterator iterator = equipmentConstrainInfos.iterator(); iterator.hasNext(); ) {
EquipmentConstrainInfo equipmentConstrainInfo = (EquipmentConstrainInfo) iterator.next();
Pattern pattern = Pattern.compile(equipmentConstrainInfo.getReplaceEquipmentConstrain());
if (pattern.matcher(equipmentConstrainInfo.matchesEquipmenConstrainInfo(equipment, lot)).matches()) {
if (StringUtils
.equals(equipmentConstrainInfo.getConstrainAction(), EquipmentConstrainInfo.REJECTSTOP)) {
equipmentConstrainInfoValueList.add(equipmentConstrainInfo);
break;
}
}
}
return equipmentConstrainInfoValueList;
}
private void validateLotConstainInfo(EquipmentConstrainSetupForm theform) {
if (!StringUtils.equals(theform.getConstrainType(), "1")) {
String equipmentIds = StringUtils.trimToUpperCase(theform.getEquipmentId());
if (StringUtils.isNotBlank(equipmentIds)) {
String equipmentIdStr = validAndbuildEquipmentIds(equipmentIds);
theform.setEquipmentId(equipmentIdStr.toString());
}
}
if (StringUtils.isNotBlank(theform.getExpireDate())) {
long nowTime = System.currentTimeMillis();
Timestamp dueDate = DateUtils.stringToTimestamp(theform.getExpireDate());
Integer daliyWaferCount = theform.getDailyWaferCount();
Assert.isTrue(dueDate != null,
Errors.create().key(MessageIdList.ASM_DATEFORMAT_CHECK).content("Date format is wrong!")
.build());
Assert.isFalse(dueDate.getTime() < nowTime && (daliyWaferCount == null || daliyWaferCount == 0),
Errors.create().key(MessageIdList.ASM_EXPIRY_DATE_INVALID)
.content("Expire date must after the current date").build());
}
}
private String validAndbuildEquipmentIds(String equipmentIds) {
long facilityRrn = LocalContext.getFacilityRrn();
String userId = LocalContext.getUserId();
Long userRrn = LocalContext.getUserRrn();
String[] equipmentIdArray = StringUtils.split(equipmentIds, ',');
StringBuilder equipmentIdStr = new StringBuilder();
for (int i = 0; i < equipmentIdArray.length; i++) {
String equipmentId = StringUtils.trimToUpperCase(equipmentIdArray[i]);
if (StringUtils.isBlank(equipmentId)) {
continue;
}
long equipmentRrn = this.getInstanceRrn(equipmentId, facilityRrn, ObjectList.ENTITY_KEY);
Assert.isFalse(equipmentRrn <= 0,
Errors.create().key(MessageIdList.EQUIPMENT_ID_NOT_EXIST).content("EQP id input error")
.build());
if (!this.emsService.checkUserAndEqptStationJurisdiction(userId, equipmentIds, facilityRrn)) {
Assert.isTrue(isQeUser(userRrn), Errors.create().key(MessageIdList.EQUIPMENT_NO_PERMISSION_MODIFY)
.content("No permission to modify the {}!").args(equipmentId)
.build());
}
equipmentIdStr.append(equipmentId);
equipmentIdStr.append(",");
}
equipmentIdStr.deleteCharAt(equipmentIdStr.length() - 1);
return equipmentIdStr.toString();
}
private boolean isQeUser(long userRrn) {
boolean isQeUser = false;
List<UserGroup> userGroups = securityService.getUserGroupByUserRrn(userRrn);
for (UserGroup userGroup : userGroups) {
if (StringUtils.equals("QE", userGroup.getInstanceId())) {
isQeUser = true;
break;
}
}
return isQeUser;
}
}