duheng
2024-03-25 de6cca765801bf519d72dc4271ee8ae81d1b4fec
WebApi/ÖÚÒãµ÷¶È/ZyConnectHelper.cs
@@ -1,4 +1,5 @@

using IStation.Model;
using IStation.ZyDto;
using Microsoft.Ajax.Utilities;
using System;
@@ -9,6 +10,9 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using IsOpen = IStation.ZyDto.IsOpen;
using PumpIsopen = IStation.ZyDto.PumpIsopen;
using PumpTotalelectricity = IStation.ZyDto.PumpTotalelectricity;
namespace IStation
{
@@ -433,6 +437,246 @@
        /// <summary>
        /// èŽ·å–æ³µçš„å¼€æœºæƒ…å†µ
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="resolution">时间步长,默认300秒</param>
        /// <returns></returns>
        public static async Task<List<ZyDto.PumpIsopen>> GetPumpIsopen(DateTime StartTime, DateTime EndTime, string resolution = "300")
        {
            List<IsOpen> listopen = new List<IsOpen> {
            new IsOpen
            {
                DateTime = DateTime.Now.AddDays(1),
                Isopen = "0"
            }
             };
            List<PumpIsopen> pumpIsopens = new List<PumpIsopen> {
               new PumpIsopen
            {
                Tag = "_0402010204012101001",
                Values = listopen
            }
        };
            if (isDebug)
            {
                return pumpIsopens;
            }
            var tagDict = new Dictionary<string, string>
            {
                  { "_0402010204012101001", "二取水1号泵开关状态" },
                  { "_0402010204012201001", "二取水2号泵开关状态" },
                  { "_0402010204012301001","二取水3号泵开关状态" },
                  { "_0402010204012401001", "二取水4号泵开关状态" },
                  {" _0402010204012501001", "二取水5号泵开关状态" },
            };
            var input = new ScadaDispatchInput
            {
                search = "history",
                starttime = new DateTime(StartTime.Year, StartTime.Month, StartTime.Day, 0, 0, 0).ToString("G"),
                endtime = new DateTime(EndTime.Year, EndTime.Month, EndTime.Day, 23, 59, 59).ToString("G"),
                Resolution = resolution,
                taglist = tagDict.Select(x => x.Key).ToArray()
            };
            var realScadaDataList = await GetRealScadaResultSate(input);
            return realScadaDataList;
        }
        /// <summary>
        /// èŽ·å–å®žæ—¶æ•°æ®å­—å…¸
        /// èŽ·å–å¼€æœºçŠ¶æ€
        /// </summary>
        /// <returns></returns>
        public static async Task<List<ZyDto.PumpIsopen>> GetRealScadaResultSate(ScadaDispatchInput input)
        {
            if (input == null)
                return default;
            var ws = new ClientWebSocket();
            await ws.ConnectAsync(new Uri(_url_root), CancellationToken.None);
            if (ws.State != WebSocketState.Open)
            {
                return default;
            }
            var realScadaDataList = new List<PumpIsopen>();
            var inputJson = JsonHelper.Object2Json(input);
            var inputBytes = Encoding.UTF8.GetBytes(inputJson);
            await ws.SendAsync(new ArraySegment<byte>(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None);
            try
            {
                List<byte> outputBytes = new List<byte>();//全部消息容器
                var buffer = new byte[1024 * 4];//缓冲区
                var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); //监听Socket信息
                while (!result.CloseStatus.HasValue)  //是否关闭
                {
                    if (result.MessageType == WebSocketMessageType.Text)//文本消息
                    {
                        outputBytes.AddRange(buffer.Take(result.Count));
                        if (result.EndOfMessage)//消息是否已接收完全
                        {
                            //发送过来的消息
                            string outputJson = Encoding.UTF8.GetString(outputBytes.ToArray(), 0, outputBytes.Count);
                            var scadaDict = JsonHelper.Json2Object<Dictionary<string, Dictionary<DateTime, string>>>(outputJson);
                            if (scadaDict != null && scadaDict.Any())
                            {
                                foreach (var dict in scadaDict)
                                {
                                    var data = new PumpIsopen();
                                    data.Tag = dict.Key;
                                    foreach (var item in dict.Value)
                                    {
                                        var State = new IsOpen();
                                        State.DateTime = item.Key;
                                        State.Isopen = item.Value;
                                        data.Values.Add(State);
                                    }
                                    realScadaDataList.Add(data);
                                }
                            }
                            break;
                        }
                    }
                    result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);//继续监听Socket信息
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                try
                {
                    //关闭WebSocket
                    await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                ws.Abort();
                ws.Dispose();
            }
            return realScadaDataList;
        }
        /// <summary>
        /// èŽ·å–æŸæ®µæ—¶é—´çš„ç”¨ç”µé‡
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <param name="resolution"></param>
        /// <returns></returns>
        public static async Task<List<ZyDto.PumpTotalelectricity>> GetPumpTotalElectricity(DateTime StartTime, DateTime EndTime, string resolution = "300")
        {
            var tagDict = new Dictionary<string, string>
            {
                  { "_0402010204040193046", "二取水1号泵有功电能" },
                  { "_0402010204040193047", "二取水2号泵有功电能" },
                  { "_0402010204012308007", "二取水3号泵有功电能" },
                  { "_0402010204012408007", "二取水4号泵有功电能" },
                  {" _0402010204012508007", "二取水5号泵有功电能" },
            };
            var input = new ScadaDispatchInput
            {
                search = "history",
                starttime = new DateTime(StartTime.Year, StartTime.Month, StartTime.Day, 0, 0, 0).ToString("G"),
                endtime = new DateTime(EndTime.Year, EndTime.Month, EndTime.Day, 23, 59, 59).ToString("G"),
                Resolution = resolution,
                taglist = tagDict.Select(x => x.Key).ToArray()
            };
            var realScadaDataList = await GetRealScadaResultElectricity(input);
            return realScadaDataList;
        }
        /// <summary>
        /// èŽ·å–å®žæ—¶æ•°æ®å­—å…¸
        /// ç”¨ç”µé‡
        /// </summary>
        /// <returns></returns>
        public static async Task<List<ZyDto.PumpTotalelectricity>> GetRealScadaResultElectricity(ScadaDispatchInput input)
        {
            if (input == null)
                return default;
            var ws = new ClientWebSocket();
            await ws.ConnectAsync(new Uri(_url_root), CancellationToken.None);
            if (ws.State != WebSocketState.Open)
            {
                return default;
            }
            var realScadaDataList = new List<PumpTotalelectricity>();
            var inputJson = JsonHelper.Object2Json(input);
            var inputBytes = Encoding.UTF8.GetBytes(inputJson);
            await ws.SendAsync(new ArraySegment<byte>(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None);
            try
            {
                List<byte> outputBytes = new List<byte>();//全部消息容器
                var buffer = new byte[1024 * 4];//缓冲区
                var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); //监听Socket信息
                while (!result.CloseStatus.HasValue)  //是否关闭
                {
                    if (result.MessageType == WebSocketMessageType.Text)//文本消息
                    {
                        outputBytes.AddRange(buffer.Take(result.Count));
                        if (result.EndOfMessage)//消息是否已接收完全
                        {
                            //发送过来的消息
                            string outputJson = Encoding.UTF8.GetString(outputBytes.ToArray(), 0, outputBytes.Count);
                            var scadaDict = JsonHelper.Json2Object<Dictionary<DateTime, double>>(outputJson);
                            if (scadaDict != null && scadaDict.Any())
                            {
                                foreach (var dict in scadaDict)
                                {
                                    var data = new PumpTotalelectricity();
                                    data.DateTime = dict.Key;
                                    data.value = dict.Value;
                                    realScadaDataList.Add(data);
                                }
                            }
                            break;
                        }
                    }
                    result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);//继续监听Socket信息
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                try
                {
                    //关闭WebSocket
                    await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                ws.Abort();
                ws.Dispose();
            }
            return realScadaDataList;
        }
        /// <summary>
        /// èŽ·å–å®žæ—¶æ•°æ®å­—å…¸
        /// </summary>