duheng
2024-03-28 6c93aedfeeb66023f9506083517aee1a4e18e24d
WebApi/ÖÚÒãµ÷¶È/ZyConnectHelper.cs
@@ -1,12 +1,18 @@


using IStation.Model;
using IStation.ZyDto;
using Microsoft.Ajax.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Security.Permissions;
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
{
@@ -15,67 +21,13 @@
    /// </summary> 
    internal class ZyConnectHelper
    {
        public static bool isDebug = true;
        public static bool isDebug = true ;
        /// <summary>
        /// 
        /// </summary>
        static string _url_root = "ws://192.168.201.17:40001";
        /// <summary>
        /// æäº¤è°ƒåº¦é¡¹ç›®
        /// </summary>
        /// <param name="currentViewPrj"></param>
        /// <param name="cbSuccess"></param>
        /// <param name="cbFail"></param>
        /// <returns></returns>
        public static async Task<bool> SubmitPrj(IStation.CalcModel.AnaPrj currentViewPrj, Action cbSuccess, Action<string> cbFail)
        {
            if (currentViewPrj == null)
            {
                return false;
            }
            IStation.ZyDto.SubmitPrj dto_prj = new ZyDto.SubmitPrj();
            dto_prj.Day = currentViewPrj.StartTime.ToString("yyyy-MM-dd");
            dto_prj.Items = new List<ZyDto.SubmitPrjItem>();
            foreach (var bt in currentViewPrj.BlockTimes)
            {
                if (bt.OpenPumpCount == 0)
                    continue;
                ZyDto.SubmitPrjItem dto_item = new ZyDto.SubmitPrjItem();
                dto_item.StartTime = bt.StartTime;
                dto_item.EndTime = bt.EndTime;
                dto_item.OpenPumpCount = bt.OpenPumpCount;
                dto_prj.Items.Add(dto_item);
            }
            var ws = new ClientWebSocket();
            try
            {
                await ws.ConnectAsync(new Uri(_url_root), CancellationToken.None);
                if (ws.State != WebSocketState.Open)
                {
                    return default;
                }
                var inputJson = JsonHelper.Object2Json(dto_prj);
                var inputBytes = Encoding.UTF8.GetBytes(inputJson);
                await ws.SendAsync(new ArraySegment<byte>(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None);
                //关闭WebSocket
                await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None);
            }
            catch (Exception ex)
            {
                cbFail.Invoke(ex.Message);
                ws.Abort(); ws.Dispose();
                return false;
            }
            ws.Abort();
            ws.Dispose();
            cbSuccess.Invoke();
            return true;
        }
        //static string _url_root = "ws://localhost:40001";
        //static string _url_prj = "ws://localhost:8001";
        public static string _url_root = "ws://192.168.201.17:40001";
        /// <summary>
@@ -87,6 +39,8 @@
        /// <returns></returns>
        public static async Task<double> GetTotalWaterByTimeRange_In(DateTime startTime, DateTime endTime, string resolution = "300")
        {
            if (isDebug)
                return  0;
            var tagDict = new Dictionary<string, string>
            {
                  { "_0402010204012103002", "二取水1号泵累计流量" },
@@ -133,8 +87,8 @@
        /// <returns></returns>
        public static async Task<double> GetTotalWaterByDay_In(DateTime day, string resolution = "300")
        {
            if(isDebug)
            return 125 + new Random().Next(1, 10);
            if (isDebug)
                return 125 + new Random().Next(1, 10);
            var tagDict = new Dictionary<string, string>
            {
@@ -162,7 +116,6 @@
                    if (r.MonitorRecords == null || !r.MonitorRecords.Any())
                        continue;
                    var rrr = r.MonitorRecords.Where(x => x.Value != null).Select(x => x.Value.Value).ToList();
                    //var rrr = (from x in r.MonitorRecords where x.Value != null orderby x select x.Value.Value)?.ToList();
                    if (rrr == null || !rrr.Any())
                        continue;
@@ -229,7 +182,7 @@
        /// <param name="endTime">结束时间</param>
        /// <param name="resolution">时间步长,默认300秒</param>
        /// <returns></returns>
        public static async Task<double> GetTotalWaterByDay_Out(DateTime day, string resolution = "300")
        public static async Task<double> GetTotalWaterByDay_Out(DateTime dayD, string resolution = "300")
        {
            if (isDebug)
                return 135 + new Random().Next(10);
@@ -244,12 +197,15 @@
            var input = new ZyDto.ScadaDispatchInput
            {
                search = "history",
                starttime = new DateTime(day.Year, day.Month, day.Day, 0, 0, 0).ToString("G"),
                endtime = new DateTime(day.Year, day.Month, day.Day, 23, 59, 59).ToString("G"),
                starttime = new DateTime(dayD.Year, dayD.Month, dayD.Day, 0, 0, 0).ToString("G"),
                endtime = new DateTime(dayD.Year, dayD.Month, dayD.Day, 23, 59, 59).ToString("G"),
                Resolution = resolution,
                taglist = tagDict.Select(x => x.Key).ToArray()
            };
            if (dayD == DateTime.Today)
            {
                input.endtime = DateTime.Now.AddMinutes(-5).ToString("G");
            }
            double totalWaterSupply = 0;
            var realScadaDataList = await GetRealScadaResult(input);
            if (realScadaDataList != null && realScadaDataList.Any())
@@ -261,7 +217,10 @@
                    var rrr = r.MonitorRecords.Where(x => x.Value != null).Select(x => x.Value.Value).ToList();
                    if (rrr == null || !rrr.Any())
                        continue;
                    if (double.IsNaN(rrr.Last()) || double.IsNaN(rrr.First()))
                    {
                        throw new Exception("获取监控数据失败");
                    }
                    totalWaterSupply += (rrr.Last() - rrr.First());
                }
@@ -354,7 +313,7 @@
        /// <param name="endTime">结束时间</param>
        /// <param name="resolution">时间步长,默认300秒</param>
        /// <returns></returns>
        public static async Task<List<IStation.ZyDto.MonitorRecord>> GetRealRiverWaterLevel (DateTime startTime, DateTime endTime, string resolution = "300")
        public static async Task<List<IStation.ZyModel.MonitorRecord>> GetRealRiverWaterLevel(DateTime startTime, DateTime endTime, string resolution = "300")
        {
            var tag = "_0402010204089903001";
            var input = new ScadaDispatchInput
@@ -374,11 +333,81 @@
        /// <summary>
        /// èŽ·å–æ³µçš„å¼€æœºæƒ…å†µ
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="resolution">时间步长,默认300秒</param>
        /// <returns></returns>
        public static async Task<List<ZyModel.RealScadaData>> GetPumpOpenStatusBySingleDay(DateTime StartTime,   string resolution = "300")
        {
             if (isDebug)
            {
                return null;
            }
            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(StartTime.Year, StartTime.Month, StartTime.Day, 23, 59, 59).ToString("G"),
                Resolution = resolution,
                taglist = tagDict.Select(x => x.Key).ToArray()
            };
            var realScadaDataList = await GetRealScadaResult(input);
            return realScadaDataList;
        }
        /// <summary>
        /// èŽ·å–æŸæ®µæ—¶é—´çš„ç”¨ç”µé‡
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <param name="resolution"></param>
        /// <returns></returns>
        public static async Task<List<ZyModel.RealScadaData>> 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 GetRealScadaResult(input);
            return realScadaDataList;
        }
        /// <summary>
        /// èŽ·å–å®žæ—¶æ•°æ®å­—å…¸
        /// </summary> 
        /// <returns></returns>
        public static async Task<List<RealScadaRecord>> GetRealScadaResult(List<string> tags, object input)
        public static async Task<List<ZyModel.RealScadaRecord>> GetRealScadaResult(List<string> tags, object input)
        {
            if (tags == null || !tags.Any())
                return default;
@@ -391,7 +420,7 @@
                return default;
            }
            var realScadaRecordList = new List<RealScadaRecord>();
            var realScadaRecordList = new List<ZyModel.RealScadaRecord>();
            var inputJson = JsonHelper.Object2Json(input);
            var inputBytes = Encoding.UTF8.GetBytes(inputJson);
            await ws.SendAsync(new ArraySegment<byte>(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None);
@@ -417,7 +446,7 @@
                                    var tag = dict.Value.keys.Trim();
                                    if (tags.Contains(tag))
                                    {
                                        var data = new RealScadaRecord();
                                        var data = new ZyModel.RealScadaRecord();
                                        data.TagName = tag;
                                        if (double.TryParse(dict.Value.vals, out double value))
@@ -460,7 +489,7 @@
        /// èŽ·å–å®žæ—¶æ•°æ®å­—å…¸
        /// </summary>  
        /// <returns></returns>
        public static async Task<List<RealScadaData>> GetRealScadaResult(ScadaDispatchInput input)
        public static async Task<List<ZyModel.RealScadaData>> GetRealScadaResult(ScadaDispatchInput input)
        {
            if (input == null)
                return default;
@@ -470,8 +499,7 @@
            {
                return default;
            }
            var realScadaDataList = new List<RealScadaData>();
            var realScadaDataList = new List<ZyModel.RealScadaData>();
            var inputJson = JsonHelper.Object2Json(input);
            var inputBytes = Encoding.UTF8.GetBytes(inputJson);
            await ws.SendAsync(new ArraySegment<byte>(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None);
@@ -494,12 +522,12 @@
                            {
                                foreach (var dict in scadaDict)
                                {
                                    var data = new RealScadaData();
                                    var data = new ZyModel.RealScadaData();
                                    data.TagName = dict.Key;
                                    data.MonitorRecords = new List<IStation.ZyDto.MonitorRecord>();
                                    data.MonitorRecords = new List<IStation.ZyModel.MonitorRecord>();
                                    foreach (var item in dict.Value)
                                    {
                                        var record = new IStation.ZyDto.MonitorRecord();
                                        var record = new IStation.ZyModel.MonitorRecord();
                                        record.Time = item.Key;
                                        if (double.TryParse(item.Value, out double value))
                                        {
@@ -509,6 +537,7 @@
                                    }
                                    realScadaDataList.Add(data);
                                }
                            }
                            break;
                        }
@@ -735,6 +764,21 @@
        }
        /// <summary>
        /// Test1
        /// </summary>
        /// <returns></returns>
        public static async Task<double> async_debug()
        {
            //var ws = new ClientWebSocket();
            // await ws.ConnectAsync(new Uri(_url_root), CancellationToken.None);
            await Task.Run(() =>
            {
                Thread.Sleep(1000);
            });
            return 1;
        }
        /// <summary>
        /// 
@@ -746,33 +790,6 @@
        }
        /// <summary>
        ///
        /// </summary>
        public class RealScadaData
        {
            /// <summary>
            ///
            /// </summary>
            public string TagName { get; set; }
            /// <summary>
            ///
            /// </summary>
            public List<IStation.ZyDto.MonitorRecord> MonitorRecords { get; set; }
        }
        /// <summary>
        ///
        /// </summary>
        public class RealScadaRecord
        {
            /// <summary>
            ///
            /// </summary>
            public string TagName { get; set; }
            /// <summary>
            ///
            /// </summary>
            public double Value { get; set; }
        }
    }
}