CarrierFlipAction.java
package com.mycim.webapp.actions.carrier.carrierflip;
import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.SystemConstant;
import com.mycim.valueobject.consts.ReferenceDetailNames;
import com.mycim.valueobject.consts.SorterEnum;
import com.mycim.valueobject.ems.Carrier;
import com.mycim.valueobject.runcard.util.RunCardConstants;
import com.mycim.valueobject.runcard.util.RunCardUtils;
import com.mycim.valueobject.sorter.FilterParam;
import com.mycim.valueobject.sys.ReferenceFileDetail;
import com.mycim.valueobject.wip.*;
import com.mycim.webapp.Constants;
import com.mycim.webapp.WebUtils;
import com.mycim.webapp.actions.CarrierSetupAction;
import com.mycim.webapp.forms.LotBaseInfoForm;
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.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: yibing.liu
* @Date: 2021/10/19 14:15
*/
public class CarrierFlipAction extends CarrierSetupAction {
@Override
public ActionForward init(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
if (WebUtils.getParameterBoolean(Constants.INIT_KEY, request)) {
return mapping.findForward(Constants.SETUP_KEY);
}
long facilityRrn = LocalContext.getFacilityRrn();
LotBaseInfoForm theform = (LotBaseInfoForm) form;
String flipCarrierId = theform.getCarrierId().trim().toUpperCase();
Carrier flipCarrier = carrierService.getCarrier(facilityRrn, flipCarrierId);
//check sortJob and Lot
Lot lot = checkCarrierAndLot(flipCarrier, facilityRrn);
FilterParam filterParam = new FilterParam<>("lotId", String.class);
filterParam.setMark(lot.getFlipType());
filterParam.setCustomColumn("mark");
// source和target都放一样的数据,表示不会wafer的位置不会受影响
List<Map> list;
if (RunCardUtils.checkLotIdIsRunCardLot(lot.getLotId())){
list = parseUnits(wipQueryService.getUnitList(lot.getLotRrn()));
} else {
list = wipQueryService.getUnitListByCarrier(flipCarrier.getInstanceRrn());
}
String sourceList = sorterQueryService.parseToJsonT(list, filterParam);
theform.setSourceListValues(sourceList);
filterParam.setMark(SorterEnum.Constant.getOpposite(lot.getFlipType()));
String targetList = sorterQueryService.parseToJsonT(list, filterParam);
theform.setTargetListValues(targetList);
theform.setLotId(lot.getLotId());
theform.setCarrierId(flipCarrier.getInstanceId());
theform.setSourceFlipType(lot.getFlipType());
theform.setTargetFlipType(SorterEnum.Constant.getOpposite(lot.getFlipType()));
if (request.getAttribute("exchangeSuccess") == null){
request.setAttribute("success",0);
} else {
request.setAttribute("success",1);
}
return mapping.findForward(Constants.MODIFY_KEY);
}
protected List<Map> parseUnits(List<Unit> unitList) {
List<Map> unitMapList = new ArrayList<>();
for (Unit u:unitList){
Map unit = new HashMap<>();
unit.put("lotRrn", u.getLotRrn());
unit.put("unitRrn", u.getUnitRrn());
unit.put("unitId", u.getUnitId());
unit.put("position", u.getPositionInCarrier());
unit.put("unitstatus", u.getUnitStatus());
unit.put("lotid", u.getLotId());
unit.put("lotId", u.getLotId());
unit.put("t7code", u.getT7code());
unit.put("ppid", u.getRecipeId());
unit.put("recipeId", u.getRecipeId());
unit.put("unitAlias1", u.getUnitAlias1());
unit.put("unitAlias2", u.getUnitAlias2());
unit.put("itemId", u.getItemId());
unitMapList.add(unit);
}
return unitMapList;
}
/**
* 翻面操作
*/
public ActionForward flipSide(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
long facilityRrn = LocalContext.getFacilityRrn();
LotBaseInfoForm theform = (LotBaseInfoForm) form;
String flipCarrierId = theform.getCarrierId().trim().toUpperCase();
String targetFlip = theform.getTargetFlipType();
Carrier flipCarrier = carrierService.getCarrier(facilityRrn, flipCarrierId);
//check sortJob and Lot
Lot lot = checkCarrierAndLot(flipCarrier, facilityRrn);
Assert.isFalse(StringUtils.equalsIgnoreCase(targetFlip, lot.getFlipType()),
Errors.create().key(MessageIdList.FLIP_HAVE_BEEN_MODIFY)
.content("The properties of Lot Flip have been modified,please refresh and try again!").build());
lotService.flipSideByLot(lot, targetFlip);
request.setAttribute("exchangeSuccess", "1");
return init(mapping, form, request, response);
}
protected Lot checkCarrierAndLot(Carrier flipCarrier, long facilityRrn) {
ReferenceFileDetail referenceFileDetail = getReferenceFileDetail(ReferenceDetailNames.SORT_HOLD_CODE, SorterEnum.Constant.FLIP_SIDE, LocalContext.getFacilityRrn());
Assert.isFalse(referenceFileDetail == null,
Errors.create().key(MessageIdList.REFERENCE_NOT_EXIST).args(ReferenceDetailNames.SORT_HOLD_CODE).build());
String sortHoldCode = referenceFileDetail.getData1Value();
Assert.isFalse(StringUtils.isBlank(sortHoldCode),
Errors.create().key(MessageIdList.REFERENCE_NOT_EXIST_VALUE).args(SorterEnum.Constant.FLIP_SIDE, ReferenceDetailNames.SORT_HOLD_CODE).build());
this.checkWaitJobs(flipCarrier.getInstanceRrn(), 0L, 0L);
List<String> lotIds = carrierService.getInUseCarrierLotIdList(flipCarrier.getInstanceRrn());
String lotId;
Assert.isFalse(lotIds == null || lotIds.size() != 1,
Errors.create().key(MessageIdList.CARRIER_CASSETTE_HAVE_SOME_LOTS).content("该晶舟内有{}个批次")
.args(lotIds == null ? 0 : lotIds.size()).build());
lotId = SorterEnum.getListFirst(lotIds);
Lot lot = lotQueryService.getLot(lotId, facilityRrn);
//先查询是否为RC的LOT
if (lotRunCardQueryService.checkLotInRunCard(lot.getLotRrn())){
if (LotStatus.isRunCardHold(lot.getLotStatus())) {
lot = lotQueryService.getLot(RunCardUtils.buildMainRcLotId(lot.getLotId()));
}
}
Assert.isFalse(StringUtils.isBlank(lot.getFlipType()),
Errors.create().key(MessageIdList.LOT_NOT_SET).content("Flip property is not set for Lot {}!").args(lot.getLotId()).build());
Assert.isFalse(flipCarrier.getCarrierMapRrn() == null || flipCarrier.getCarrierMapRrn() <= 0,
Errors.create().key(MessageIdList.NOT_FOUND_UNIT).content("Not found unit in fromCassette!").build());
//2、检查HoldCode
List<Map> holdInfos = wipQueryService.getHoldReasons(lot.getLotRrn());
boolean holdCodeFlag = false;
for (Map map : holdInfos){
String holdCode = MapUtils.getString(map, "reasonCode", StringUtils.EMPTY);
if (sortHoldCode.equalsIgnoreCase(holdCode)){
holdCodeFlag = true;
break;
}
}
Assert.isFalse(!holdCodeFlag, Errors.create().key(MessageIdList.HOLD_CODE_NOT_FOUND).build());
return lot;
}
}