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;
    }


}