瀏覽代碼

风机矩阵功能修改和websocket优化

shilin 4 年之前
父節點
當前提交
e5298c242f

+ 4 - 3
src/main/java/com/gyee/frame/common/conf/RedisConfig.java

@@ -26,7 +26,8 @@ public class RedisConfig
 
         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
         jedisPoolConfig.setMaxIdle(2000);
-        jedisPoolConfig.setMaxWaitMillis(500);
+        jedisPoolConfig.setMaxTotal(20000);
+        jedisPoolConfig.setMaxWaitMillis(5000);
 
         // 是否启用pool的jmx管理功能, 默认true
         jedisPoolConfig.setJmxEnabled(true);
@@ -39,8 +40,8 @@ public class RedisConfig
 
         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
         jedisPoolConfig.setMaxIdle(2000);
-        jedisPoolConfig.setMaxWaitMillis(500);
-
+        jedisPoolConfig.setMaxWaitMillis(5000);
+        jedisPoolConfig.setMaxTotal(20000);
         // 是否启用pool的jmx管理功能, 默认true
         jedisPoolConfig.setJmxEnabled(true);
         JedisPool jedisPool = new JedisPool(jedisPoolConfig, redis_ls_ip, redis_ls_port);

+ 2 - 5
src/main/java/com/gyee/frame/common/quartz/AbstractQuartzJob.java

@@ -1,19 +1,16 @@
 package com.gyee.frame.common.quartz;
 
 import cn.hutool.core.exceptions.ExceptionUtil;
-
-import com.gyee.frame.common.spring.SpringUtils;
 import com.gyee.frame.model.auto.SysQuartzJob;
 import com.gyee.frame.model.auto.SysQuartzJobLog;
-import com.gyee.frame.service.SysQuartzJobLogService;
 import com.gyee.frame.util.StringUtils;
-
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
+
 import java.util.Date;
 
 /**
@@ -95,7 +92,7 @@ public abstract class AbstractQuartzJob implements Job {
             sysJobLog.setStatus(ScheduleConstants.SUCCESS_STATUS);
         }
         //  这里获取service然后插入库中
-        SpringUtils.getBean(SysQuartzJobLogService.class).insertSelective(sysJobLog);
+       // SpringUtils.getBean(SysQuartzJobLogService.class).insertSelective(sysJobLog);
     }
 
     /**

+ 5 - 6
src/main/java/com/gyee/frame/common/quartz/QuartzSchedulerUtil.java

@@ -1,22 +1,21 @@
 package com.gyee.frame.common.quartz;
 
+import com.gyee.frame.model.auto.SysQuartzJob;
+import com.gyee.frame.model.auto.SysQuartzJobExample;
+import com.gyee.frame.service.SysQuartzJobService;
 import com.gyee.frame.util.DateUtils;
+import com.gyee.frame.util.StringUtils;
 import org.quartz.*;
 import org.quartz.impl.JobDetailImpl;
 import org.quartz.impl.matchers.GroupMatcher;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
-import com.gyee.frame.model.auto.SysQuartzJob;
-import com.gyee.frame.model.auto.SysQuartzJobExample;
-import com.gyee.frame.service.SysQuartzJobService;
-import com.gyee.frame.util.StringUtils;
 
+import javax.annotation.PostConstruct;
 import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Set;
 
-import javax.annotation.PostConstruct;
-
 /**
  * @CLASSNAME QuartzConfig
  * @Description  Quartz配置类

+ 3 - 0
src/main/java/com/gyee/frame/common/quartz/SocketTaskUtil.java

@@ -60,8 +60,11 @@ public class SocketTaskUtil {
         this.deleteJob(sysQuartzJob1);//符合标准步骤删除-创建-启动流程
         try {
            // System.out.println(sysQuartzJob1.getJobName());
+
             sysQuartzJob1.setStatus(0);//开启任务
             quartzSchedulerUtil.createSchedule(sysQuartzJob1);
+
+            //startJob(sysQuartzJob1);
         } catch (SchedulerException e) {
             e.printStackTrace();
         }

+ 28 - 0
src/main/java/com/gyee/frame/common/spring/InitialRunner.java

@@ -10,6 +10,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 /**
  * 服务启动执行
@@ -48,6 +49,8 @@ public class InitialRunner implements CommandLineRunner {
 
     public static Map<String, Map<String, WindTurbineTestingPointAi>> wtpAimap = new HashMap<String, Map<String, WindTurbineTestingPointAi>>();// 风电机测点AI表
     public static Map<String, Map<String, WindPowerstationTestingPoint>> stationPointmap = new HashMap<String, Map<String, WindPowerstationTestingPoint>>();//场站测点
+    public static Map<String, CopyOnWriteArraySet<String>> keyidMap = new HashMap<String, CopyOnWriteArraySet<String>>();
+
     @Override
     public void run(String... args) throws Exception {
         System.out.println(">>>>>>>>>>>>>>>服务启动执行,换成测点关联数据 <<<<<<<<<<<<<");
@@ -167,6 +170,31 @@ public class InitialRunner implements CommandLineRunner {
             }
         }
 
+
+//        String pageNumber = "pageNumber_4";
+//        String functionNumber = "functionNumber_2";
+//        StringBuilder sb = new StringBuilder();
+//        sb.append(pageNumber).append("_").append(functionNumber);
+//
+//        String jobkey = String.valueOf(sb);
+//
+//
+//        CopyOnWriteArraySet<String> set=new CopyOnWriteArraySet<String>();
+//        for(Windpowerstation wp: wpls)
+//        {
+//            StringBuilder sb2 = new StringBuilder();
+//            sb2.append("wp_").append(wp.getId());
+//            set.add(String.valueOf(sb2));
+//        }
+//
+//        for(Project pj: pjls)
+//        {
+//            StringBuilder sb2 = new StringBuilder();
+//            sb2.append("pj_").append(pj.getId());
+//            set.add(String.valueOf(sb2));
+//        }
+//
+//        keyidMap.put(jobkey,set);
     }
 
 }

+ 6 - 6
src/main/java/com/gyee/frame/model/custom/MatrixVo.java

@@ -15,8 +15,8 @@ public class MatrixVo {
 
     private String id;
     private String icon;
-    private Double speed;
-    private Double power;
+    private String speed;
+    private String power;
 
 
     public String getId() {
@@ -35,19 +35,19 @@ public class MatrixVo {
         this.icon = icon;
     }
 
-    public Double getSpeed() {
+    public String getSpeed() {
         return speed;
     }
 
-    public void setSpeed(Double speed) {
+    public void setSpeed(String speed) {
         this.speed = speed;
     }
 
-    public Double getPower() {
+    public String getPower() {
         return power;
     }
 
-    public void setPower(Double power) {
+    public void setPower(String power) {
         this.power = power;
     }
 }

+ 73 - 34
src/main/java/com/gyee/frame/netty/websocket/WebSocketServer.java

@@ -3,6 +3,7 @@ package com.gyee.frame.netty.websocket;
 import cn.hutool.log.Log;
 import cn.hutool.log.LogFactory;
 import com.gyee.frame.common.quartz.SocketTaskUtil;
+import com.gyee.frame.netty.websocket.util.WebsocketUtil;
 import com.gyee.frame.util.StringUtils;
 import org.springframework.stereotype.Component;
 
@@ -11,12 +12,13 @@ import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
 import java.net.BindException;
+import java.net.InetSocketAddress;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
-
 /**
  *@author:Wang Jiawen
  *
@@ -34,13 +36,14 @@ public class WebSocketServer extends SocketTaskUtil {
     //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
     private static int onlineCount = 0;
     //concurrent包的线程安全Set,功能名称与页面名称+对象编号(风场、项目、线路、风机)为key
-    private static Map<String,CopyOnWriteArraySet<WebSocketServer>> webSocketMapSet = new HashMap();
-    //功能名称与页面名称为key 举例 页面名称_功能名称>>WebSocketServer
-    private static Map<String,WebSocketServer> webSocketMap = new HashMap();
+    private static Map<String,CopyOnWriteArraySet<WebSocketServer>> webSocketMapSet = new HashMap<>();
+
+//    //功能名称与页面名称为key 举例 页面名称_功能名称>>WebSocketServer
+//    private static Map<String,WebSocketServer> webSocketMap = new HashMap();
     //用来存储每个调度任务请求的数量
-    private static Map<String,Integer> funcationNunberMap = new HashMap();
+    private static ConcurrentHashMap<String,Integer> funcationNunberMap = new ConcurrentHashMap();
 
-    public static Map<String, Set<String>> keyidMap = new HashMap();
+    public static ConcurrentHashMap<String, CopyOnWriteArraySet<String>> keyidMap = new ConcurrentHashMap();
 
 
     //与某个客户端的连接会话,需要通过它来给客户端发送数据
@@ -67,6 +70,7 @@ public class WebSocketServer extends SocketTaskUtil {
 
         //目标连接成功后注入基本信息
         this.session = session;
+
         this.sid=session.getId();
         this.pageNumber=pageNumber; //页面编码
         this.functionNumber=functionNumber;//功能编码
@@ -86,7 +90,6 @@ public class WebSocketServer extends SocketTaskUtil {
 
         //根据调度任务key进行map分组,二级存储不同seesion的WebSocketServer对象
 
-        webSocketMap.put(pfkey,this);
 
 
         //根据调度任务统计数量
@@ -100,12 +103,32 @@ public class WebSocketServer extends SocketTaskUtil {
                 funcationNunberMap.put(jobkey,1);
             }
 
+
+        Set<Map.Entry<String, CopyOnWriteArraySet<WebSocketServer>>> webSocketset = webSocketMapSet.entrySet();
+        for (Iterator<Map.Entry<String, CopyOnWriteArraySet<WebSocketServer>>> it = webSocketset.iterator(); it.hasNext();) {
+            Map.Entry<String, CopyOnWriteArraySet<WebSocketServer>> entry = (Map.Entry<String, CopyOnWriteArraySet<WebSocketServer>>) it.next();
+            for(WebSocketServer item:entry.getValue())
+            {
+                InetSocketAddress curryip=WebsocketUtil.getRemoteAddress(session);
+                InetSocketAddress itemip=WebsocketUtil.getRemoteAddress(item.session);
+                if(curryip.getHostString().equals(itemip.getHostString()) &&
+                           (item.session.getRequestURI().getPath().indexOf("/wp_")>0 ||
+                                   item.session.getRequestURI().getPath().indexOf("/pj_")>0
+                                )
+                )
+                {
+                    entry.getValue().remove(item);
+                }
+            }
+          //  System.out.println(entry.getKey() + "--->" + entry.getValue());
+        }
+
         //页数和功能数组合+对象编号(风场、项目、线路、风机)作为KEY,保存对应的set集合
         if(webSocketMapSet.containsKey(pfkey))
         {
             CopyOnWriteArraySet<WebSocketServer> set=webSocketMapSet.get(pfkey);
             set.add(this);
-
+            webSocketMapSet.put(pfkey,set);
         }else
         {
             CopyOnWriteArraySet<WebSocketServer> set=new CopyOnWriteArraySet<>();
@@ -123,7 +146,7 @@ public class WebSocketServer extends SocketTaskUtil {
             set.add(keyid);
         }else
         {
-            Set<String> set= new HashSet<String>();
+            CopyOnWriteArraySet<String> set= new CopyOnWriteArraySet<String>();
             set.add(keyid);
             keyidMap.put(jobkey,set);
         }
@@ -161,16 +184,17 @@ public class WebSocketServer extends SocketTaskUtil {
 
         pfkey=String.valueOf(sb);
 
+//        if(webSocketMap.containsKey(pfkey))
+//        {
+//            webSocketMap.remove(pfkey);
+//
+//        }
 
-        if(webSocketMap.containsKey(pfkey))
-        {
-            webSocketMap.remove(pfkey);
-
-        }
         if(webSocketMapSet.containsKey(pfkey))
         {
             CopyOnWriteArraySet<WebSocketServer> set=webSocketMapSet.get(pfkey);
             set.remove(this);
+            webSocketMapSet.put(pfkey,set);
         }
         subOnlineCount();           //在线数减1
         log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
@@ -186,13 +210,13 @@ public class WebSocketServer extends SocketTaskUtil {
             funcationNunberMap.put(jobkey,fnumber);
             if(fnumber==0){
                 this.deleteJob((jobkey));//关闭任务
-                keyidMap=new HashMap<>();
+                keyidMap=new ConcurrentHashMap<>();
             }
         }
 
         if(getOnlineCount()==0){
             this.deleteJob((jobkey));//关闭任务
-            keyidMap=new HashMap<>();
+            keyidMap=new ConcurrentHashMap<>();
         }
     }
 
@@ -202,19 +226,23 @@ public class WebSocketServer extends SocketTaskUtil {
      * @param message 客户端发送过来的消息*/
     @OnMessage
     public void onMessage(String message, Session session) {
-    	log.info("收到来自窗口:"+pageNumber+",功能编码:"+functionNumber+"的信息:"+message);
-        //群发消息
-        if(webSocketMapSet.containsKey(pfkey))
-        {
-            CopyOnWriteArraySet<WebSocketServer> set=webSocketMapSet.get(pfkey);
-            for (WebSocketServer item : set) {
-                try {
-                    item.sendMessage(message);
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
+//    	log.info("收到来自窗口:"+pageNumber+",功能编码:"+functionNumber+"的信息:"+message);
+//        //群发消息
+//        if(webSocketMapSet.containsKey(pfkey))
+//        {
+//            CopyOnWriteArraySet<WebSocketServer> set=webSocketMapSet.get(pfkey);
+//            for (WebSocketServer item : set) {
+//                try {
+//                    if(item.session.isOpen())
+//                    {
+//                        item.sendMessage(message);
+//                    }
+//
+//                } catch (IOException e) {
+//                    e.printStackTrace();
+//                }
+//            }
+//        }
 
     }
 
@@ -293,15 +321,26 @@ public class WebSocketServer extends SocketTaskUtil {
         }
 
         pfkey=String.valueOf(sb);
-        if(webSocketMap.containsKey(pfkey))
+        if(webSocketMapSet.containsKey(pfkey))
         {
-            WebSocketServer item =webSocketMap.get(pfkey);
 
             //这里可以设定只推送给这个sid的,为null则全部推送
             if(functionNumber==null||pageNumber==null) {
                 throw new BindException("请核对编码信息(包括页面编码以及功能编码非空)");
-            }else if(item.pageNumber.equals(pageNumber)&&item.functionNumber.equals(functionNumber)){
-                item.sendMessage(message);
+            }else{
+                if(webSocketMapSet.containsKey(pfkey))
+                {
+                    CopyOnWriteArraySet<WebSocketServer> set=webSocketMapSet.get(pfkey);
+                    for (WebSocketServer item : set) {
+                        try {
+                            item.sendMessage(message);
+
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+
             }
 
         }

+ 50 - 0
src/main/java/com/gyee/frame/netty/websocket/util/WebsocketUtil.java

@@ -0,0 +1,50 @@
+package com.gyee.frame.netty.websocket.util;
+
+import javax.websocket.RemoteEndpoint.Async;
+import javax.websocket.Session;
+import java.lang.reflect.Field;
+import java.net.InetSocketAddress;
+
+
+public class WebsocketUtil {
+
+    public static InetSocketAddress getRemoteAddress(Session session) {
+        if (session == null) {
+            return null;
+        }
+        Async async = session.getAsyncRemote();
+
+        //在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+        //在Tomcat 8.5以上版本有效
+        InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+        return addr;
+    }
+
+    private static Object getFieldInstance(Object obj, String fieldPath) {
+        String fields[] = fieldPath.split("#");
+        for (String field : fields) {
+            obj = getField(obj, obj.getClass(), field);
+            if (obj == null) {
+                return null;
+            }
+        }
+
+        return obj;
+    }
+
+    private static Object getField(Object obj, Class<?> clazz, String fieldName) {
+        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
+            try {
+                Field field;
+                field = clazz.getDeclaredField(fieldName);
+                field.setAccessible(true);
+                return field.get(obj);
+            } catch (Exception e) {
+            }
+        }
+
+        return null;
+    }
+
+}

+ 116 - 50
src/main/java/com/gyee/frame/service/monitor/MonitorService.java

@@ -3,68 +3,42 @@ package com.gyee.frame.service.monitor;
 
 import com.gyee.frame.common.spring.Constant;
 import com.gyee.frame.common.spring.InitialRunner;
-import com.gyee.frame.model.auto.WindTurbineTestingPointAi;
-import com.gyee.frame.model.auto.Windturbine;
+import com.gyee.frame.model.auto.*;
 import com.gyee.frame.model.custom.MatrixVo;
 import com.gyee.frame.model.custom.PointData;
 import com.gyee.frame.model.enumeration.Messagetype;
 import com.gyee.frame.netty.websocket.WebSocketServer;
 import com.gyee.frame.netty.websocket.util.SocketToolService;
+import com.gyee.frame.service.ProjectService;
+import com.gyee.frame.service.WindpowerstationService;
 import com.gyee.frame.util.IRealTimeDataBaseUtil;
 import com.gyee.frame.util.RealTimeDataBaseFactory;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 @Service
 public class MonitorService extends SocketToolService {
 
+    @Resource
+    private WindpowerstationService windpowerstationService;
+    @Resource
+    private ProjectService projectService;
+
     private int decimal_digit = 2;
     private IRealTimeDataBaseUtil mongodb = RealTimeDataBaseFactory.createRealTimeDataBase();
 
-    private void setMatrixValue(List<MatrixVo> vos, Map<String, Map<String, WindTurbineTestingPointAi>> wtpAimap, Windturbine wt) {
-        MatrixVo vo = new MatrixVo();
-        StringBuilder sb = new StringBuilder();
-        vo.setId(wt.getCode());
-        try {
-            //风机状态
-            PointData fjzt_real = mongodb.getRealData(wtpAimap.get(wt.getId()).get(Constant.FJZT).getId());
-            sb.append("00");
-            int fjzt = new BigDecimal(fjzt_real.getPointValueInDouble()).setScale(decimal_digit, RoundingMode.HALF_EVEN).intValue();
-            vo.setIcon(String.valueOf(sb.append(fjzt)));
-
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
 
-        try {
-            //功率
-            PointData power_real = mongodb.getRealData(wtpAimap.get(wt.getId()).get(Constant.TPOINT_WT_FJGL).getId());
-            double power = new BigDecimal(power_real.getPointValueInDouble()).setScale(decimal_digit, RoundingMode.HALF_EVEN).doubleValue();
-            vo.setPower(power);
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-
-        try {
-            //风速
-            PointData speed_real = mongodb.getRealData(wtpAimap.get(wt.getId()).get(Constant.TPOINT_WT_FJSSFS).getId());
-            double speed = new BigDecimal(speed_real.getPointValueInDouble()).setScale(decimal_digit, RoundingMode.HALF_EVEN).doubleValue();
-            vo.setSpeed(speed);
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-        vos.add(vo);
-    }
 
     public void monitor_target_matrixMonitor() throws Exception {
 
-        List<MatrixVo> vos = new ArrayList<>();
+
         Map<String, Map<String, WindTurbineTestingPointAi>> wtpAimap = InitialRunner.wtpAimap;
         String pageNumber = "pageNumber_4";
         String functionNumber = "functionNumber_2";
@@ -72,11 +46,61 @@ public class MonitorService extends SocketToolService {
         sb.append(pageNumber).append("_").append(functionNumber);
 
         String jobkey = String.valueOf(sb);
-        Map<String, Set<String>> keyidMap = WebSocketServer.keyidMap;
-        if (keyidMap.containsKey(jobkey)) {
-            Set<String> set = keyidMap.get(jobkey);
+        Map<String, CopyOnWriteArraySet<String>> keyidMap = WebSocketServer.keyidMap;
+
+
+        if(WebSocketServer.keyidMap.isEmpty())
+        {
+            WindpowerstationExample windpowerstationExample=new WindpowerstationExample();
+            windpowerstationExample.setOrderByClause("ordernum ASC");
+            windpowerstationExample.createCriteria().getAllCriteria();
+            List<Windpowerstation> wpls= windpowerstationService.selectByExample(windpowerstationExample);
+
+            ProjectExample projectExample=new ProjectExample();
+            projectExample.setOrderByClause("ordernum ASC");
+            projectExample.createCriteria().getAllCriteria();
+            List<Project> pjls= projectService.selectByExample(projectExample);
+
+            CopyOnWriteArraySet<String> set=new CopyOnWriteArraySet<String>();
+            for(Windpowerstation wp: wpls)
+            {
+                StringBuilder sb2 = new StringBuilder();
+                sb2.append("wp_").append(wp.getId());
+                set.add(String.valueOf(sb2));
+            }
+
+            for(Project pj: pjls)
+            {
+                StringBuilder sb2 = new StringBuilder();
+                sb2.append("pj_").append(pj.getId());
+                set.add(String.valueOf(sb2));
+            }
+            keyidMap.put(jobkey,set);
+        }
+
+//        CopyOnWriteArraySet<String> set=new CopyOnWriteArraySet<String>();
+//        set.add("wp_CL_FDC");
+//        set.add("wp_DX_FDC");
+//        set.add("wp_KB_FDC");
+//
+//        set.add("pj_CL01_GC");
+//        set.add("pj_CL02_GC");
+//        set.add("pj_DX01_GC");
+//        set.add("pj_KB01_GC");
+//        set.add("pj_KB02_GC");
+//        set.add("pj_KB03_GC");
+//        set.add("pj_KB04_GC");
+//
+//        keyidMap.put(jobkey,set);
+
+        if(keyidMap.containsKey(jobkey))
+        {
+            CopyOnWriteArraySet<String> set=keyidMap.get(jobkey);
+
             for (String str : set) {
 
+                List<MatrixVo> vos = new ArrayList<>();
+
                 if (str.equals("all")) {
                     continue;
                 }
@@ -88,9 +112,9 @@ public class MonitorService extends SocketToolService {
                     if (InitialRunner.wp_wtmap.containsKey(keyid)) {
                         List<Windturbine> ls = InitialRunner.wp_wtmap.get(keyid);
                         if (null != ls && !ls.isEmpty()) {
-                            for (Windturbine wt : ls) {
-                                setMatrixValue(vos, wtpAimap, wt);
-                            }
+
+                            setMatrixValue(wtpAimap, vos, ls);
+
                         }
                     }
 
@@ -99,9 +123,7 @@ public class MonitorService extends SocketToolService {
                     if (InitialRunner.pj_wtmap.containsKey(keyid)) {
                         List<Windturbine> ls = InitialRunner.pj_wtmap.get(keyid);
                         if (null != ls && !ls.isEmpty()) {
-                            for (Windturbine wt : ls) {
-                                setMatrixValue(vos, wtpAimap, wt);
-                            }
+                            setMatrixValue(wtpAimap, vos, ls);
                         }
                     }
 
@@ -109,18 +131,62 @@ public class MonitorService extends SocketToolService {
                     if (InitialRunner.ln_wtmap.containsKey(keyid)) {
                         List<Windturbine> ls = InitialRunner.ln_wtmap.get(keyid);
                         if (null != ls && !ls.isEmpty()) {
-                            for (Windturbine wt : ls) {
-                                setMatrixValue(vos, wtpAimap, wt);
-                            }
+                            setMatrixValue(wtpAimap, vos, ls);
                         }
                     }
                 }
 
-                this.pushToWeb("pageNumber_4", "functionNumber_2", keyid, vos, Messagetype.MESSAGE);
+                this.pushToWeb("pageNumber_4", "functionNumber_2", str, vos, Messagetype.MESSAGE);
 
             }
 
         }
 
+
+    }
+
+    private void setMatrixValue(Map<String, Map<String, WindTurbineTestingPointAi>> wtpAimap, List<MatrixVo> vos, List<Windturbine> ls) throws Exception {
+        List<String> fjztls=new ArrayList<>();
+        List<String> glls=new ArrayList<>();
+        List<String> fsls=new ArrayList<>();
+        for (Windturbine wt : ls) {
+
+            if(wtpAimap.containsKey(wt.getId()))
+            {
+                fjztls.add(wtpAimap.get(wt.getId()).get(Constant.FJZT).getId());
+                glls.add(wtpAimap.get(wt.getId()).get(Constant.TPOINT_WT_FJGL).getId());
+                fsls.add(wtpAimap.get(wt.getId()).get(Constant.TPOINT_WT_FJSSFS).getId());
+            }
+
+        }
+        List<PointData> fjztvaluels=mongodb.getRealData(fjztls);
+        List<PointData> glvaluels=mongodb.getRealData(glls);
+        List<PointData> fsvaluels=mongodb.getRealData(fsls);
+
+        if(null !=fjztvaluels && null !=glvaluels && null !=fsvaluels && glvaluels.size()==fjztvaluels.size() && fsvaluels.size()==ls.size() && fjztvaluels.size()==ls.size())
+        {
+            for ( int i=0;i<ls.size();i++) {
+
+                Windturbine wt=ls.get(i);
+                MatrixVo vo = new MatrixVo();
+                StringBuilder sbs = new StringBuilder();
+                vo.setId(wt.getCode());
+                //风机状态
+                PointData fjzt_real =fjztvaluels.get(i);
+                sbs.append("00");
+                int fjzt = new BigDecimal(fjzt_real.getPointValueInDouble()).setScale(decimal_digit, RoundingMode.HALF_EVEN).intValue();
+                vo.setIcon(String.valueOf(sbs.append(fjzt)));
+                //功率
+                PointData power_real = glvaluels.get(i);
+                double power = new BigDecimal(power_real.getPointValueInDouble()).setScale(decimal_digit, RoundingMode.HALF_EVEN).doubleValue();
+                vo.setPower(String.valueOf(power));
+
+                //风速
+                PointData speed_real =fsvaluels.get(i);
+                double speed = new BigDecimal(speed_real.getPointValueInDouble()).setScale(decimal_digit, RoundingMode.HALF_EVEN).doubleValue();
+                vo.setSpeed(String.valueOf(speed));
+                vos.add(vo);
+            }
+        }
     }
 }