EdcValueOfLotHistoryTask.java
package com.mycim.webapp.actions.lot.edcvalueoflothistory.threadtask;
import com.fa.sesa.i18n.I18nUtils;
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.framework.utils.lang.time.DateUtils;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.prp.Operation;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
public class EdcValueOfLotHistoryTask implements Runnable {
final private List<Map<String,Object>> resultArray ;
final private Map<String,Object> item;
final private boolean byUnitFlag;
final private String unitId;
final private Map<String,String> routeDescMap;
final private Map<Long,Map<String,Object>> operationMap;
final private Map<Long,List<Map<String,Object>>> parameterDataMap;
final private Map<Long,List<Map<String,Object>>> operationParamDataMap;
final private Map<Long,List<Map<String,Object>>> stepCommentsMap;
final private AtomicInteger seq;
public EdcValueOfLotHistoryTask(List<Map<String, Object>> resultArray, Map<String, Object> item, boolean byUnitFlag,
String unitId, Map<String, String> routeDescMap,
Map<Long, Map<String, Object>> operationMap,
Map<Long, List<Map<String, Object>>> parameterDataMap,
Map<Long, List<Map<String, Object>>> operationParamDataMap,
Map<Long, List<Map<String, Object>>> stepCommentsMap, AtomicInteger seq) {
this.resultArray = resultArray;
this.item = item;
this.byUnitFlag=byUnitFlag;
this.unitId = unitId;
this.routeDescMap = routeDescMap;
this.operationMap = operationMap;
this.parameterDataMap = parameterDataMap;
this.operationParamDataMap = operationParamDataMap;
this.stepCommentsMap = stepCommentsMap;
this.seq = seq;
}
List<Object[]> $PTR = Arrays.asList(
new Object[]{"holdReson", TransactionNames.HOLD_KEY,new ArrayList<String>(), "reason"},
new Object[]{"holdComments", TransactionNames.HOLD_KEY,new ArrayList<String>(), "comments"},
new Object[]{"holdUser", TransactionNames.HOLD_KEY,new ArrayList<String>(), "trans_performed_by"},
new Object[]{"releaseComment", TransactionNames.RELEASE_KEY,new ArrayList<String>(), "reason"},
new Object[]{"trackInTime", TransactionNames.MOVEIN_KEY,new ArrayList<String>(), "trans_start_timestamp"},
new Object[]{"trackInUser", TransactionNames.MOVEIN_KEY,new ArrayList<String>(), "trans_performed_by"},
new Object[]{"trackOutTime", TransactionNames.MOVEOUT_KEY,new ArrayList<String>(), "trans_start_timestamp"},
new Object[]{"trackOutUser", TransactionNames.MOVEOUT_KEY,new ArrayList<String>(), "trans_start_timestamp"},
new Object[]{"splitLots", TransactionNames.SPLIT_KEY,new ArrayList<String>(), "to_lot_id"},
new Object[]{"mergeLots", TransactionNames.MERGE_KEY,new ArrayList<String>(), "to_lot_id"},
new Object[]{"reworkFlag", TransactionNames.EXTERNALREWORK_KEY,new ArrayList<String>(), "rework"},
new Object[]{"scrapFlag", TransactionNames.SCRAP_KEY,new ArrayList<String>(), "lotId"});
private void makeValue(Map<String,Object> lotTransMap){
String tempTransId = MapUtils.getString(item,"trans_id");
for(Object[] arr :$PTR){
if(StringUtils.equalsIgnoreCase((String)arr[1],tempTransId)){
((List<String>)arr[2]).add(MapUtils.getString(item,item.get(arr[3])));
}
}
}
private void fillValue(Map<String,Object> result){
for(Object[]arr:$PTR){
result.put((String)arr[0],StringUtils.join(((List<String>) arr[2])," "));
}
}
private final Set<String> blackList =new HashSet<String>(){{
add(TransactionNames.MOVEIN_KEY);
add(TransactionNames.MOVEOUT_KEY);
add(TransactionNames.DISPATCH_KEY);
add(TransactionNames.MOVENEXT_KEY);
add(TransactionNames.CREATE_KEY);
add(TransactionNames.SPLIT_HOLD_KEY);
add(TransactionNames.SPLIT_RELEASE_KEY);
add(TransactionNames.LBRD_KEY);
}};
@Override
public void run() {
boolean firstFlag = true;
Long currentSeq=0L;
Map<String,Object> result = new HashMap();
List<String> reticleIds = new ArrayList<>();
List<String>transIds =new ArrayList<>();
String lastTrackOutTime=null;
String lastTrackInTime=null;
List<String> stepCommentList =new ArrayList<>();
StringBuilder action =new StringBuilder();
List<Map<String,Object>> operationList = (List) item.get(item.get("operationRrn"));
for (Map<String,Object> lotTransMap : operationList) {
if (firstFlag) {
firstFlag=false;
result.put("lotId", lotTransMap.get("lot_id"));
result.put("carrierId", lotTransMap.get("carrierId"));
result.put("productId", lotTransMap.get("product_id"));
result.put("processId", lotTransMap.get("technology_id"));
result.put("stageId", lotTransMap.get("stageId"));
result.put("routeId", lotTransMap.get("route_id"));
result.put("routeDesc",routeDescMap.get(MapUtils.getString(lotTransMap,"route_id")));
addOperation(result, lotTransMap);
result.put("recipeId", lotTransMap.get("recipeId"));
result.put("recipeParam", lotTransMap.get("recipeParam"));
result.put("quantity", MapUtils.getLongValue(lotTransMap,"qty_1"));
result.put("equipId", lotTransMap.get("equipment_id"));
result.put("stepSequence", lotTransMap.get("step_sequence"));
result.put("lotPollutionLevel", lotTransMap.get("lotPollutionLevel"));
result.put("lotPollutionLevelAfter", "");
result.put("operationDesc", lotTransMap.get("operationDesc"));
result.put("operationSeq", lotTransMap.get("operationSeq"));
result.put("routeSeq", lotTransMap.get("routeSeq"));
result.put("hotFlag", lotTransMap.get("hotFlag"));
result.put("priority", lotTransMap.get("priority"));
result.put("createCategory", lotTransMap.get("createCategory"));
result.put("flowSeq", lotTransMap.get("flowSeq"));
result.put("performedBy", lotTransMap.get("trans_performed_by"));
currentSeq=MapUtils.getLong(lotTransMap,"step_sequence");
result.put("processStepIdVersion", MapUtils.getString(lotTransMap, "processStepIdVersion"));
List<Map<String,Object>> comments = stepCommentsMap.get(MapUtils.getLong(lotTransMap,"step_sequence"));
if(CollectionUtils.isNotEmpty(comments)){
for (Map<String,Object> comment : comments) {
stepCommentList.add(String.format("(%s)", comment.get("commentSequence")));
stepCommentList.add(String.format("%s;", comment.get("stepComment")));
}
}
}
result.put("reticleId", lotTransMap.get("reticleId"));
result.put("stepSeq",seq.get());
String reticleId = MapUtils.getString(lotTransMap,"reticleId");
if (StringUtils.isNotEmpty(reticleId)&&!reticleIds.contains(reticleId)) {
reticleIds.add(reticleId);
}
makeValue(lotTransMap);
String tempTransId = MapUtils.getString(item,"trans_id");
transIds.add(tempTransId);
if (TransactionNames.MOVEIN_KEY.equals(tempTransId)) {
lastTrackInTime = MapUtils.getString(lotTransMap,"trans_start_timestamp");
}
if (TransactionNames.MOVEOUT_KEY.equals(tempTransId)) {
lastTrackOutTime = MapUtils.getString(lotTransMap,"trans_start_timestamp");
}
if(!blackList.contains(tempTransId)){
if (StringUtils.equalsIgnoreCase("CN", I18nUtils.getCurrentLanguage().toString())) {
action.append(tempTransId).append(": ").append(lotTransMap.get("trans_start_timestamp"))
.append(" 操作者: ").append(lotTransMap.get("trans_performed_by")).append(" 原因: ")
.append(convertNull2Blank(lotTransMap.get("reason"))).append(" 备注: ")
.append(convertNull2Blank(lotTransMap.get("comments")));
} else {
action.append(tempTransId).append(": ").append(lotTransMap.get("trans_start_timestamp"))
.append(" Operator: ").append(lotTransMap.get("trans_performed_by"))
.append(" Reason: ").append(convertNull2Blank(lotTransMap.get("reason")))
.append(" Remarks: ").append(convertNull2Blank(lotTransMap.get("comments")));
}
}
}
String processTime = "";
if (lastTrackInTime != null && lastTrackOutTime != null) {
Date lastTrackInDate = DateUtils.stringToTimestamp(lastTrackInTime);
Date lastTrackOutDate = DateUtils.stringToTimestamp(lastTrackOutTime);
if (lastTrackOutDate.getTime() > lastTrackInDate.getTime()) {
processTime = DateUtils
.formatDateForSeconds((lastTrackOutDate.getTime() - lastTrackInDate.getTime()) / 1000);
}
}
result.put("processTime", processTime);
List<String> holdReason = (List<String>)$PTR.get(0)[2];
if (holdReason.size() > 0) {
result.put("holdFlag", holdReason.size());
}
// 去除action中的最后一个<br>
String actionStr = action.toString().trim();
if (actionStr.length() > 0) {
if (actionStr.endsWith("<br>")) {
actionStr = actionStr.substring(0, actionStr.length() - 4);
}
}
result.put("action", actionStr);
result.put("stepComment", StringUtils.join(stepCommentList,""));
Long stepSequence = MapUtils.getLong(result, "stepSequence");
result.put("spcJobInfo", "");
List<String> operationParamList=new ArrayList<>();
List<Map<String,Object>> operationParameterList = Optional.ofNullable(operationParamDataMap.get(stepSequence)).orElse(new ArrayList<>());
for (Map<String,Object> operationParameter : operationParameterList) {
String value = MapUtils.getString(operationParameter, "PARAMETER_VALUE");
String desc = MapUtils.getString(operationParameter, "PARAM_DESC");
operationParamList.add(desc);
operationParamList.add(":");
operationParamList.add(value);
}
if(CollectionUtils.isNotEmpty(operationParamList)){
operationParamList.add("<br>");
}
result.put("operationParameters",StringUtils.join(operationList,""));
fillValue(result);
List parameterData = parameterDataMap.get(currentSeq);
for (Object parameterDatum : parameterData) {
Map m2 = (Map) parameterDatum;
Map newMap = new HashMap();
newMap.putAll(result);
newMap.put("edcId", m2.get("edcId"));
newMap.put("unitId", m2.get("unitId"));
newMap.put("dataValue", m2.get("dataValue"));
newMap.put("collectionTimestamp", m2.get("collectionTimeStamp"));
newMap.put("stepSeq", seq.get());
newMap.put("sampleX",MapUtils.getString(m2,"sampleX"));
newMap.put("sampleY",MapUtils.getString(m2,"sampleY"));
newMap.put("averageValue",MapUtils.getString(m2,"averageValue"));
newMap.put("readingSequence",MapUtils.getString(m2,"readingSequence"));
newMap.put("edcPlanId",MapUtils.getString(m2,"edcPlanId"));
newMap.put("processVersion",MapUtils.getIntValue(m2,"processVersion"));
if (!byUnitFlag || StringUtils.equalsIgnoreCase((String) m2.get("unitId"), unitId.trim())) {
resultArray.add(newMap);
seq.incrementAndGet();
}
}
}
private void addOperation(Map<String,Object>result, Map<String,Object> object) {
String operationRrnStr = MapUtils.getString(object, "operation_rrn");
if (NumberUtils.isCreatable(operationRrnStr)) {
Map<String,Object> operationMap = this.operationMap.get(Long.valueOf(operationRrnStr));
if (MapUtils.isNotEmpty(operationMap)) {
result.put("operationDesc", MapUtils.getString(operationMap,"INSTANCE_DESC"));
result.put("operationId", MapUtils.getString(operationMap,"INSTANCE_ID"));
result.put("operationType", MapUtils.getString(operationMap,"OPERATION_TYPE"));
result.put("workArea", MapUtils.getString(operationMap,"WORK_AREA"));
result.put("edcFlag", MapUtils.getString(operationMap,"MOVE_IN_REQUIRED"));
}
}
}
private String convertNull2Blank(Object obj) {
String str = "";
if ((obj instanceof String) && !"null".equals(obj)) {
return obj.toString();
}
return str;
}
}