EqptGroupBuildTask.java

package com.mycim.webapp.actions.operation.query.threadtask;

import com.fa.sesa.i18n.I18nUtils;
import com.mycim.framework.utils.lang.StringUtils;

import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.ems.Entity;
import com.mycim.valueobject.ems.EntityGroup;
import com.mycim.valueobject.security.Station;
import com.mycim.valueobject.wip.LotStatus;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

public class EqptGroupBuildTask implements Runnable{
    private final EntityGroup entityGroup;
    private final Station station;
    private final String filter;
    private final ConcurrentHashMap<String,Map<String,Object>> eqptGroupResultMap;
    public EqptGroupBuildTask(EntityGroup entityGroup, Station station, String filter,
                              ConcurrentHashMap<String, Map<String, Object>> eqptGroupResultMap) {
        this.entityGroup = entityGroup;
        this.station = station;
        this.filter = filter;
        this.eqptGroupResultMap = eqptGroupResultMap;
    }
    @Override
    public void run() {
        Map jsonEntityGroup = new HashMap<>();
        jsonEntityGroup.put("id", entityGroup.getInstanceId() + "_" +station.getInstanceRrn());
        jsonEntityGroup.put("text", entityGroup.getInstanceId());
        jsonEntityGroup.put("leaf", Boolean.valueOf(false));
        jsonEntityGroup.put("objectType", ObjectList.ENTITYGROUP_KEY);
        jsonEntityGroup.put("iconCls", "iconCls-entityGroup");

        String entityGroupDesc =StringUtils.trim(entityGroup.getInstanceDesc()) == null ? StringUtils.EMPTY : StringUtils
                        .trim(entityGroup.getInstanceDesc());
        if (StringUtils.equalsIgnoreCase("CN", I18nUtils.getCurrentLanguage().toString())) {
            jsonEntityGroup.put("qtip", "设备分组号:&nbsp;" + entityGroup.getInstanceId() + "<br>" + "设备组描述:&nbsp;" +
                    entityGroupDesc);
        } else {
            jsonEntityGroup.put("qtip",
                                "Sub Station ID:&nbsp;" + entityGroup.getInstanceId() + "<br>" + "Sub Station" +
                                        " Desc.:&nbsp;" + entityGroupDesc);
        }
        jsonEntityGroup.put("callback",callback);
        jsonEntityGroup.put("cacheKey",String.format("%s_%s",station.getInstanceId(),entityGroup.getInstanceId()));
        jsonEntityGroup.put("entities",entityGroup.getEntities());
        jsonEntityGroup.put("filter",filter);
        eqptGroupResultMap.put(String.format("%s_%s",station.getInstanceId(),entityGroup.getInstanceId()),jsonEntityGroup);
    }

    private BiConsumer<Map<Long,Object>,Map<String,Object>> callback = (source,self)->{
        if(MapUtils.isEmpty(self)||MapUtils.isEmpty(source)){
            return;
        }
        Object entitiesObj =  self.get("entities");
        String filter =String.valueOf(self.get("filter"));
        if(entitiesObj instanceof Collection){
            Set<String> entityIds= (Set<String>)
                    ((Collection)entitiesObj).stream().filter(e-> e instanceof Entity)
                    .map(e->((Entity)e).getInstanceId()).collect(
                    Collectors.toSet());
            if(entityIds!=null){
                List<Map<String,Object>> jsonEntityArray=new ArrayList<>();
                for(String entityId : entityIds){
                    String cacheKey = self.get("cacheKey")+String.format("_%s",entityId);
                    Object entityObj =  source.get(cacheKey);
                    if(!(entityObj instanceof Map)){
                        continue;
                    }
                    Map<String,Object>entityMap = (Map)entityObj;
                    if(MapUtils.isEmpty(entityMap)){
                       continue;
                    }
                    TreeSet clsSet= (TreeSet) entityMap.get("clsSet");
                    if ("ALL".equalsIgnoreCase(filter)) {
                        jsonEntityArray.add(entityMap);
                    } else if (LotStatus.STATUSLIGTH_HAV.equals(filter) && clsSet.contains("icon2_wait")) {
                        jsonEntityArray.add(entityMap);
                    } else if (LotStatus.STATUSLIGTH_HOLD_NO_RUN.equals(filter) && clsSet.contains("icon3_hold")) {
                        jsonEntityArray.add(entityMap);
                    } else if (LotStatus.STATUSLIGTH_RUN.equals(filter) && clsSet.contains("icon1_run")) {
                        jsonEntityArray.add(entityMap);
                    }
                }
                if (jsonEntityArray.size() > 0) {
                    self.put("children", jsonEntityArray);
                }
            }
        }
        self.remove("callback");
        self.remove("entities");
        self.remove("filter");
        self.remove("cacheKey");
    };

}