private void CollectAndSaveSnesors()
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start(); //  开始监视代码运行时间

            Dictionary <int, Station> dicStations = new Dictionary <int, Station>();

            #region 查询sensor表
            string    sqlSensors = @"select * from( select t.ID stationID, t.GUID as stationCode,t.Name stationName,t1.ID sensorID,t1.Name sensorName,t1.PointAddressID 
                                                 from SCADA_Station t ,SCADA_Sensor t1 where t.ID=t1.StationID and t.ReadMode='WEB-YL') x
                                                 left join PointAddressEntry x1 on x.PointAddressID=x1.ID;";
            DataTable dtSensors  = DBUtil.ExecuteDataTable(sqlSensors, out string errMsg);
            if (!string.IsNullOrWhiteSpace(errMsg))
            {
                TraceManagerForWeb.AppendErrMsg("查询sensor列表失败:" + errMsg);
                return;
            }
            foreach (DataRow dr in dtSensors.Rows)
            {
                Station station = new Station()
                {
                    _ID     = DataUtil.ToInt(dr["stationID"]),
                    _GUID   = DataUtil.ToString(dr["stationCode"]),
                    _Name   = DataUtil.ToString(dr["stationName"]),
                    sensors = new List <Sensor>()
                };
                Sensor sensor = new Sensor()
                {
                    sensorID          = DataUtil.ToString(dr["sensorID"]),
                    sensorName        = DataUtil.ToString(dr["sensorName"]),
                    _PointAddressID   = DataUtil.ToInt(dr["PointAddressID"]),
                    versionID         = DataUtil.ToInt(dr["版本ID"]),
                    dataSourceAddress = DataUtil.ToString(dr["数据源地址"]).Trim(),
                    type     = Point.ToType(DataUtil.ToString(dr["数据类型"])),
                    isActive = DataUtil.ToInt(dr["是否激活"]),
                    scale    = DataUtil.ToDouble(dr["倍率"])
                };

                if (dicStations.Keys.Contains(station._ID))
                {
                    dicStations[station._ID].sensors.Add(sensor);
                }
                else
                {
                    station.sensors.Add(sensor);
                    dicStations.Add(station._ID, station);
                }
            }
            if (dicStations.Keys.Count == 0)
            {
                TraceManagerForWeb.AppendWarning("站点表没有读取模式:WEB-YL的站点表");
                return;
            }
            #endregion

            #region 是否需求请求新token
            if (tokenCache == null || DateTime.Compare(DateTime.Now, DataUtil.ToDateTime(tokenCache.data.expireTime)) > 0)
            {
                tokenCache = GetToken();
            }
            if (tokenCache == null)
            {
                return;
            }
            if (DateTime.Compare(DateTime.Now, DataUtil.ToDateTime(tokenCache.data.expireTime)) > 0)
            {
                TraceManagerForWeb.AppendErrMsg("获取熊猫标记参数为过期标记");
                return;// 获取后还是过期秘钥
            }
            #endregion

            #region 请求监测点数据并存入
            List <YaLiDian> yaLiDians = GetWebYaLiData();
            Collect(yaLiDians, ref dicStations);
            string saveSQL = GetSaveSensorsSQL(dicStations);
            if (string.IsNullOrWhiteSpace(saveSQL))
            {
                TraceManagerForWeb.AppendWarning(string.Format(@"采集WEB-监测点数量{0}获取存入数据库SQL失败,可能原因没有在线的站点", dicStations.Keys.Count));
                return;
            }
            DBUtil.ExecuteNonQuery(saveSQL, out string err);
            stopwatch.Stop();                                   //  停止监视
            TimeSpan timespan     = stopwatch.Elapsed;          //  获取当前实例测量得出的总时间
            double   milliseconds = timespan.TotalMilliseconds; //  总毫秒数

            if (!string.IsNullOrWhiteSpace(err))
            {
                TraceManagerForWeb.AppendErrMsg("更新WEB-监测点实时数据失败" + ",耗时:" + milliseconds.ToString() + "毫秒," + err);
            }
            else
            {
                TraceManagerForWeb.AppendDebug("更新WEB-监测点实时数据成功" + ",耗时:" + milliseconds.ToString() + "毫秒");
            }
            #endregion
        }
        private void Collect(List <YaLiDian> yaLiDians, ref Dictionary <int, Station> dicStations)
        {
            if (yaLiDians == null)
            {
                return;
            }
            if (dicStations == null)
            {
                return;
            }

            foreach (int key in dicStations.Keys)
            {
                Station station    = dicStations[key];
                int     errorTimes = 0; // 三个离线就认为其离线了
                foreach (Sensor sensor in dicStations[key].sensors)
                {
                    // 防止采集的点多了,错误消息炸了,每个都报出来了---直接让其离线
                    if (errorTimes >= 3)
                    {
                        TraceManagerForWeb.AppendErrMsg("StationName:" + station._Name + "三个条目采集失败,已跳过该站点采集,请检查点表和数据源");
                        dicStations[key].IsOnline = false;
                        break;
                    }

                    // 检查未通过
                    if (!sensor.CheckScadaWeb(out string err))
                    {
                        sensor.MakeFail(sensor.sensorName + err);
                        TraceManagerForWeb.AppendErrMsg("StationName:" + station._Name + "SensorName" + sensor.sensorName + " " + err);
                        errorTimes++;
                        continue;
                    }

                    // 拿到数据源
                    YaLiDian[] curYaLiDians = yaLiDians.Where(y => y.ID.ToUpper() == station._GUID.ToUpper()).ToArray();// 注意转换大写在比较
                    if (curYaLiDians.Length == 0)
                    {
                        sensor.MakeFail("未在WEB监测点数据源中找到配置站点信息,站点编码:" + station._GUID);
                        TraceManagerForWeb.AppendErrMsg("未在WEB监测点数据源中找到配置站点信息,站点编码:" + station._GUID);
                        errorTimes++;
                        continue;
                    }
                    object pointDataSource;
                    string tempTime     = DataUtil.ToDateString(DateTime.Now);
                    bool   tempTimeFlag = false;
                    try
                    {
                        YaLiDian curYaLiDian = curYaLiDians[0];
                        // 获取在线状态-防止sensor表没有配置在线状态
                        Type         typeOnLine         = curYaLiDian.GetType();             //获取类型
                        PropertyInfo propertyInfoOnLine = typeOnLine.GetProperty("FOnLine"); //获取采集时间的属性
                        object       curOnLine          = propertyInfoOnLine.GetValue(curYaLiDian, null);
                        if (curOnLine != null && DataUtil.ToInt(curOnLine) == 1)
                        {
                            dicStations[key].IsOnline = true;
                        }

                        // 先拿到时间
                        Type typeTempTime = curYaLiDian.GetType();                                                  //获取类型
                        System.Reflection.PropertyInfo propertyInfoTempTime = typeTempTime.GetProperty("TempTime"); //获取采集时间的属性
                        object curTempTime = propertyInfoTempTime.GetValue(curYaLiDian, null);
                        if (curTempTime != null && !string.IsNullOrWhiteSpace(curTempTime.ToString()))
                        {
                            tempTime     = DataUtil.ToDateString(curTempTime); //获取采集时间属性值
                            tempTimeFlag = true;
                        }
                        // 在拿到值
                        Type type = curYaLiDian.GetType();                                                        //获取类型
                        System.Reflection.PropertyInfo propertyInfo = type.GetProperty(sensor.dataSourceAddress); //获取指定名称的属性
                        pointDataSource = propertyInfo.GetValue(curYaLiDian, null);                               //获取属性值
                    }
                    catch (Exception e)
                    {
                        string er = string.Format("未在WEB监测点数据源中找到配置站点信息:{0}找到点地址为:{1}的点,错误原因:{2}" + station._Name, sensor.sensorName, e.Message);
                        sensor.MakeFail(er);
                        TraceManagerForWeb.AppendErrMsg(er);
                        errorTimes++;
                        continue;
                    }

                    // 根据数据源获取数据
                    sensor.ReadWEBPoint(pointDataSource);
                    sensor.LastTime = tempTime;// 使用采集时间,不要用当前时间

                    if (sensor.State == ValueState.Fail)
                    {
                        string er = string.Format("站点名称:{0},sensorName:{1},取值错误:{2}", station._Name, sensor.sensorName, sensor.Mess);
                        TraceManagerForWeb.AppendErrMsg(er);
                        errorTimes++;
                        continue;
                    }

                    // 判断采集时间是否正常
                    if (!tempTimeFlag)
                    {
                        dicStations[key].IsOnline = false;
                    }
                }
            }
        }