SortAbsAction.java
package com.mycim.webapp.actions.sort;
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.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.valueobject.consts.SorterEnum;
import com.mycim.valueobject.sorter.*;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.Unit;
import com.mycim.webapp.actions.WipSetupAction;
import java.util.*;
public abstract class SortAbsAction extends WipSetupAction {
public static final String COMMA = "、";
public static final String MARK = "1";
private static final int DEFAULT_SLOTCOUNT = 25;
private void dealRepeatUnitPosition(List<Map> sourceUnitList, List<Map> targetUnitList, List<Map> repeatUnitList,
int[] oldPositionArr) {
sourceUnitList.addAll(targetUnitList);
if (!repeatUnitList.isEmpty()) {
for (Map rm : repeatUnitList) {
int oldPosition = MapUtils.getIntValue(rm, "oldPosition");
int blankPositon = -1;
for (int i = 1; i < oldPositionArr.length; i++) {
if (oldPositionArr[i] == 0) {
blankPositon = i;
oldPositionArr[i] = i;
break;
}
}
rm.put("oldPosition", blankPositon);
rm.put("repeat", "[Position:" + oldPosition + "]");
sourceUnitList.add(rm);
}
}
}
private List<Map> rebuildSourceUnitList(List<Map> sourceUnitList, List<Unit> oldCarrierMapList) {
String lotId = MapUtils.getString(SorterEnum.getListFirst(sourceUnitList), "lotId");
Unit[] unitArr = new Unit[26];
Map[] unitMapArr = new Map[26];
for (Unit u : oldCarrierMapList) {
unitArr[u.getPositionInCarrier()] = u;
}
for (Map m : sourceUnitList) {
unitMapArr[MapUtils.getIntValue(m, "oldPosition", 0)] = m;
}
for (int i = 1; i < unitMapArr.length; i++) {
if (unitMapArr[i] == null && unitArr[i] != null) {
//源晶舟中的位置上有晶圆
Map um = new HashMap<>();
um.put("lotId", lotId);
um.put("lotRrn", unitArr[i].getLotRrn());
um.put("unitId", unitArr[i].getUnitId());
um.put("unitRrn", unitArr[i].getUnitRrn());
um.put("position", unitArr[i].getPositionInCarrier());
um.put("carrierId", StringUtils.EMPTY);
um.put("oldPosition", unitArr[i].getPositionInCarrier());
unitMapArr[i] = um;
}
}
sourceUnitList = Arrays.asList(unitMapArr);
return sourceUnitList;
}
protected Map<String, Object> buildSortJobDetail(SortJobBean sortJobBean) {
if(SorterEnum.Check.isAutoMonitorType(sortJobBean.getJobType())) {
return buildAutoMonitorSortJobDetail(sortJobBean);
}
Map<String, Object> lotInfo = new HashMap<>();
//转换成List<Map>
List<Map> targetUnitList = new ArrayList<>();
List<Map> sourceUnitList = new ArrayList<>();
String lotIds = StringUtils.EMPTY;
String targetLotIds = StringUtils.EMPTY;
String flipType = StringUtils.EMPTY;
StringBuilder sourceCarrierId = new StringBuilder();
int[] oldPositionArr = new int[26];
long oldCarrierMapRrn = -1L;
List<Map> repeatUnitList = new ArrayList<>();
for (SorterBean sb : sortJobBean.getSorterBeans()) {
flipType = sb.getJsonAttributeData3();
sourceCarrierId.append(COMMA).append(sb.getSourceCarrierId());
targetLotIds = (StringUtils.isNotEmpty(sb.getJsonAttributeData4()) &&
!targetLotIds.contains(sb.getJsonAttributeData4())) ?
targetLotIds + COMMA + sb.getJsonAttributeData4() : targetLotIds;
if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
oldCarrierMapRrn = NumberUtils.toLong(sb.getJsonAttributeData5(), -1);
}
for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
lotIds = (StringUtils.isNotEmpty(sdb.getLotId()) && !lotIds.contains(sdb.getLotId())) ?
lotIds + COMMA + sdb.getLotId() : lotIds;
Map um = new HashMap<>();
um.put("lotId", sdb.getLotId());
um.put("lotRrn", sdb.getLotRrn());
um.put("unitId", sdb.getUnitId());
um.put("unitRrn", sdb.getUnitRrn());
um.put("position", sdb.getTargetPosition());
um.put("carrierId", sb.getSourceCarrierId());
um.put("targetPosition", sdb.getTargetPosition());//暂定
um.put("completedTime", sb.getUpdateTime());
int op = sdb.getSourcePosition();
if (oldPositionArr[op] > 0) {
repeatUnitList.add(um);
} else {
oldPositionArr[op] = op;
}
um.put("oldPosition", sdb.getSourcePosition());//暂定
targetUnitList.add(um);
}
}
FilterParam<String> filterParam = new FilterParam<>();
if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
filterParam = new FilterParam<>("lotId", String.class);
String[] flipArr = StringUtils.split(flipType, "|");
filterParam.setMark(flipArr[1]);
filterParam.setCustomColumn("mark");
}
filterParam.addColumn("carrierId");
filterParam.addColumn("oldPosition");
filterParam.addColumn("completedTime");
if (SorterEnum.Constant.SPLIT_3PORT.equalsIgnoreCase(sortJobBean.getJobType())) {
filterParam.setSlotCount(13);
}
String targetListStr = sorterQueryService.parseToJsonT(targetUnitList, filterParam);
filterParam.setIntegerColumn("oldPosition");
filterParam.addColumn("repeat");
dealRepeatUnitPosition(sourceUnitList, targetUnitList, repeatUnitList, oldPositionArr);
//目标晶舟的槽位数 TODO
if (oldCarrierMapRrn > 0 && !SorterEnum.Constant.EXCHANGE.equalsIgnoreCase(sortJobBean.getJobType())
&& !SorterEnum.Check.isOffLineCheckT7Code(sortJobBean.getJobType())) {
List<Unit> oldCarrierMapList = wipQueryService.getUnitHistoryListByCarrierMapRrn(oldCarrierMapRrn);
if (CollectionUtils.isNotEmpty(oldCarrierMapList) && oldCarrierMapList.size() <= 25) {
sourceUnitList = rebuildSourceUnitList(sourceUnitList, oldCarrierMapList);
}
}
filterParam.setSlotCount(25);
if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
String[] flipArr = StringUtils.split(flipType, "|");
filterParam.setMark(flipArr[0]);
}
String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
lotInfo.put("lotId", lotIds.length() > 1 ? lotIds.substring(1) : lotIds);
lotInfo.put("targetLotId", targetLotIds.length() > 0 ? targetLotIds.substring(1) : targetLotIds);
lotInfo.put("sourceListValue", sourceListStr);
lotInfo.put("targetListValue", targetListStr);
lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
lotInfo.put("sourceCarrierId", sourceCarrierId.length() > 0 ? sourceCarrierId.substring(1) : sourceCarrierId);
lotInfo.put("status", sortJobBean.getStatus());
lotInfo.put("jobStatus", sortJobBean.getStatusParse());
lotInfo.put("jobType", sortJobBean.getJobTypeParse());
return lotInfo;
}
private Map<String, Object> buildAutoMonitorSortJobDetail(SortJobBean sortJobBean) {
Map<String, Object> lotInfo = new HashMap<>();
//转换成List<Map>
List<Map> targetUnitList = new ArrayList<>();
List<Map> sourceUnitList = new ArrayList<>();
for (SorterBean sb : sortJobBean.getSorterBeans()) {
List<SorterCarrierMap> carrierMapList = sorterQueryService.getSorterCarrierMapList(sb.getSubJobRrn());
for (int i = 1; i <= DEFAULT_SLOTCOUNT; i++) {
Map sourceUnit = null;
Map targetUnit = null;
for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
if(sdb.getTargetPosition()==i){
targetUnit = MapUtils.newHashMap();
targetUnit.put("lotId", sdb.getLotId());
targetUnit.put("lotRrn", sdb.getLotRrn());
targetUnit.put("unitId", sdb.getUnitId());
targetUnit.put("unitRrn", sdb.getUnitRrn());
targetUnit.put("position", sdb.getTargetPosition());
targetUnit.put("carrierId", sb.getSourceCarrierId());
}
}
for (SorterCarrierMap carrierMap : carrierMapList) {
if (sb.getSourceCarrierRrn() == carrierMap.getCarrierRrn().longValue() &&
carrierMap.getPosition().intValue() == i) {
sourceUnit = BeanUtils.copyBeanToMap(carrierMap);
}
if (sb.getTargetCarrierRrn() == carrierMap.getCarrierRrn().longValue() &&
carrierMap.getPosition().intValue() == i && targetUnit == null) {
targetUnit = BeanUtils.copyBeanToMap(carrierMap);
}
}
sourceUnitList.add(sourceUnit);
targetUnitList.add(targetUnit);
}
}
FilterParam<String> filterParam = new FilterParam<>();
String targetListStr = sorterQueryService.parseToJsonT(targetUnitList, filterParam);
String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
lotInfo.put("lotId", StringUtils.EMPTY);
lotInfo.put("targetLotId", StringUtils.EMPTY);
lotInfo.put("sourceListValue", sourceListStr);
lotInfo.put("targetListValue", targetListStr);
lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
lotInfo.put("sourceCarrierId", sortJobBean.getSourceCarrierId());
lotInfo.put("status", sortJobBean.getStatus());
lotInfo.put("jobStatus", sortJobBean.getStatusParse());
lotInfo.put("jobType", sortJobBean.getJobTypeParse());
return lotInfo;
}
protected Map<String, Object> buildExchangeSortJobDetail(SortJobBean sortJobBean) {
Map<String, Object> lotInfo = new HashMap<>();
//转换成List<Map>
List<Map> targetUnitList = new ArrayList<>();
List<Map> sourceUnitList = new ArrayList<>();
String lotIds = StringUtils.EMPTY;
String targetLotIds = StringUtils.EMPTY;
String flipType = StringUtils.EMPTY;
StringBuilder sourceCarrierId = new StringBuilder();
int[] oldPositionArr = new int[26];
long oldCarrierMapRrn = -1L;
List<Map> repeatUnitList = new ArrayList<>();
for (SorterBean sb : sortJobBean.getSorterBeans()) {
flipType = sb.getJsonAttributeData3();
sourceCarrierId.append(COMMA).append(sb.getSourceCarrierId());
targetLotIds = (StringUtils.isNotEmpty(sb.getJsonAttributeData4()) &&
!targetLotIds.contains(sb.getJsonAttributeData4())) ?
targetLotIds + COMMA + sb.getJsonAttributeData4() : targetLotIds;
if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
oldCarrierMapRrn = NumberUtils.toLong(sb.getJsonAttributeData5(), -1);
}
for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
lotIds = (StringUtils.isNotEmpty(sdb.getLotId()) && !lotIds.contains(sdb.getLotId())) ?
lotIds + COMMA + sdb.getLotId() : lotIds;
Map um = new HashMap<>();
um.put("lotId", sdb.getLotId());
um.put("lotRrn", sdb.getLotRrn());
um.put("unitId", sdb.getUnitId());
um.put("unitRrn", sdb.getUnitRrn());
um.put("position", sdb.getTargetPosition());
um.put("carrierId", sb.getSourceCarrierId());
um.put("targetPosition", sdb.getTargetPosition());//暂定
um.put("completedTime", sb.getUpdateTime());
int op = sdb.getSourcePosition();
if (oldPositionArr[op] > 0) {
repeatUnitList.add(um);
} else {
oldPositionArr[op] = op;
}
um.put("oldPosition", sdb.getSourcePosition());//暂定
targetUnitList.add(um);
}
}
FilterParam<String> filterParam = new FilterParam<>();
if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
filterParam = new FilterParam<>("lotId", String.class);
String[] flipArr = StringUtils.split(flipType, "|");
filterParam.setMark(flipArr[1]);
filterParam.setCustomColumn("mark");
}
filterParam.addColumn("carrierId");
filterParam.addColumn("oldPosition");
filterParam.addColumn("completedTime");
String targetListStr = sorterQueryService.parseToJsonT(targetUnitList, filterParam);
filterParam.setIntegerColumn("oldPosition");
filterParam.addColumn("repeat");
dealRepeatUnitPosition(sourceUnitList, targetUnitList, repeatUnitList, oldPositionArr);
filterParam.setSlotCount(25);
if (SorterEnum.Check.isFlip(sortJobBean.getJobType())) {
String[] flipArr = StringUtils.split(flipType, "|");
filterParam.setMark(flipArr[0]);
}
String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
lotInfo.put("lotId", lotIds.length() > 1 ? lotIds.substring(1) : lotIds);
lotInfo.put("targetLotId", targetLotIds.length() > 0 ? targetLotIds.substring(1) : targetLotIds);
lotInfo.put("sourceListValue", sourceListStr);
lotInfo.put("targetListValue", targetListStr);
lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
lotInfo.put("sourceCarrierId", sourceCarrierId.length() > 0 ? sourceCarrierId.substring(1) : sourceCarrierId);
lotInfo.put("status", sortJobBean.getStatus());
lotInfo.put("jobStatus", sortJobBean.getStatusParse());
lotInfo.put("jobType", sortJobBean.getJobTypeParse());
if (SorterEnum.Constant.EXCHANGE.equalsIgnoreCase(sortJobBean.getJobType())) {
String lotId = MapUtils.getString(lotInfo, "lotId");
Lot lot = lotInqService.getLot(lotId);
String targetCSTType = lotQueryService.getToCarrierTypeForChange(lot);
lotInfo.put("targetCarrierType", targetCSTType);
lotInfo.put("createCategory", lot.getCreateCategory());
}
return lotInfo;
}
protected Map<String, Object> buildReadT7CodeSortJobDetail(SortJobBean sortJobBean) {
Map<String, Object> lotInfo = new HashMap<>();
//转换成List<Map>
List<Map> targetUnitList = new ArrayList<>();
List<Map> sourceUnitList = new ArrayList<>();
String lotIds = StringUtils.EMPTY;
StringBuilder sourceCarrierId = new StringBuilder();
int[] oldPositionArr = new int[26];
long oldCarrierMapRrn = -1L;
List<Map> repeatUnitList = new ArrayList<>();
for (SorterBean sb : sortJobBean.getSorterBeans()) {
sourceCarrierId.append(COMMA).append(sb.getSourceCarrierId());
if (StringUtils.isNotEmpty(sb.getJsonAttributeData5())) {
oldCarrierMapRrn = NumberUtils.toLong(sb.getJsonAttributeData5(), -1);
}
for (SorterDetailBean sdb : sb.getSorterDetailBeanList()) {
lotIds = (StringUtils.isNotEmpty(sdb.getLotId()) && !lotIds.contains(sdb.getLotId())) ?
lotIds + COMMA + sdb.getLotId() : lotIds;
Map um = new HashMap<>();
um.put("lotId", sdb.getLotId());
um.put("lotRrn", sdb.getLotRrn());
um.put("unitId", sdb.getUnitId());
um.put("unitRrn", sdb.getUnitRrn());
um.put("position", sdb.getTargetPosition());
um.put("carrierId", sb.getSourceCarrierId());
um.put("targetPosition", sdb.getTargetPosition());//暂定
um.put("completedTime", sb.getUpdateTime());
int op = sdb.getSourcePosition();
if (oldPositionArr[op] > 0) {
repeatUnitList.add(um);
} else {
oldPositionArr[op] = op;
}
um.put("oldPosition", sdb.getSourcePosition());//暂定
targetUnitList.add(um);
}
}
FilterParam<String> filterParam = new FilterParam<>();
filterParam.addColumn("carrierId");
filterParam.addColumn("oldPosition");
filterParam.addColumn("completedTime");
if (SorterEnum.Constant.SPLIT_3PORT.equalsIgnoreCase(sortJobBean.getJobType())) {
filterParam.setSlotCount(13);
}
filterParam.setIntegerColumn("oldPosition");
filterParam.addColumn("repeat");
dealRepeatUnitPosition(sourceUnitList, targetUnitList, repeatUnitList, oldPositionArr);
//目标晶舟的槽位数 TODO
if (oldCarrierMapRrn > 0 && !SorterEnum.Constant.EXCHANGE.equalsIgnoreCase(sortJobBean.getJobType())) {
List<Unit> oldCarrierMapList = wipQueryService.getUnitHistoryListByCarrierMapRrn(oldCarrierMapRrn);
if (CollectionUtils.isNotEmpty(oldCarrierMapList) && oldCarrierMapList.size() <= 25) {
sourceUnitList = rebuildSourceUnitList(sourceUnitList, oldCarrierMapList);
}
}
filterParam.setSlotCount(25);
filterParam.setCustomColumn("customerT7Code");
filterParam.addColumn("customerT7Code", "customerT7Code");
String sourceListStr = sorterQueryService.parseToJsonT(sourceUnitList, filterParam);
lotInfo.put("mainJobRrn", sortJobBean.getMainJobRrn());
lotInfo.put("lotId", lotIds.length() > 1 ? lotIds.substring(1) : lotIds);
lotInfo.put("sourceListValue", sourceListStr);
lotInfo.put("targetCarrierId", sortJobBean.getTargetCarrierId());
lotInfo.put("sourceCarrierId", sourceCarrierId.length() > 0 ? sourceCarrierId.substring(1) : sourceCarrierId);
lotInfo.put("status", sortJobBean.getStatus());
lotInfo.put("jobStatus", sortJobBean.getStatusParse());
lotInfo.put("jobType", sortJobBean.getJobTypeParse());
return lotInfo;
}
}