From 17b4e899ff6bc8cd235e7d0d503e928b2ed2ac4a Mon Sep 17 00:00:00 2001 From: dell Date: Mon, 6 Nov 2023 21:26:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HT.Cloud.Code/DefaultStartUp.cs | 48 +- .../HT.Cloud.CodeGenerator.csproj | 2 +- HT.Cloud.Data/HT.Cloud.DataBase.csproj | 5 +- .../ReportManage/RTApplicationStateEntity.cs | 30 + HT.Cloud.Domain/HT.Cloud.Domain.csproj | 2 +- .../ChartsManage/RtTechChartsService.cs | 70 +- .../ReportManage/ApplicationStateService.cs | 80 + .../ReportManage/HistoryAlarmService.cs | 67 +- .../SystemManage/CoderuleService.cs | 2 +- .../Views/HistoryCharts/Index.cshtml | 3 +- .../ChartsManage/Views/Rtcharts/Index.cshtml | 1 + .../PenMeiHistoryChartsController.cs | 6 +- .../PenMeiHistoryTechChartsController.cs | 4 +- .../PenMeiRtTechChartsController.cs | 8 +- .../Views/PenMeiHistoryCharts/Index.cshtml | 3 +- .../Views/PenMeiHistoryCharts/Index1.cshtml | 2 +- .../PenMeiHistoryTechCharts/Index.cshtml | 3 +- .../Views/PenMeiRtTechCharts/Index.cshtml | 322 +-- .../Views/PenMeiRtcharts/Index.cshtml | 9 +- .../PenMeiHistoryAlarmController.cs | 88 +- .../PenMeiHistoryAlarmNewController.cs | 236 +++ .../PenMeiHistoryReportController.cs | 4 +- .../Views/PenMeiHistoryAlarm/Index.cshtml | 577 +++++- .../Views/PenMeiHistoryAlarmNew/Index.cshtml | 1841 +++++++++++++++++ .../Views/PenMeiHistoryReport/Index.cshtml | 2 +- .../Views/HistoryReport/Index.cshtml | 2 +- .../Views/MetaTagAlarm/Index.cshtml | 4 +- .../Views/ApplicationState/Index.cshtml | 402 ++++ HT.Cloud.Web/Controllers/BaseController.cs | 1 - ...y-e2f052f6-1509-4c55-84de-04eb742fe28f.xml | 16 + HT.Cloud.Web/HT.Cloud.Web.csproj | 4 +- HT.Cloud.Web/Startup.cs | 2 +- HT.Cloud.Web/Views/Home/Default.cshtml | 6 +- HT.Cloud.Web/WaterCloud.Web.xml | 12 + HT.Cloud.Web/appsettings.json | 4 +- 原ORM-SqlSugar版本纪安装类库.png | Bin 0 -> 16642 bytes 36 files changed, 3491 insertions(+), 377 deletions(-) create mode 100644 HT.Cloud.Domain/Entity/ReportManage/RTApplicationStateEntity.cs create mode 100644 HT.Cloud.Service/ReportManage/ApplicationStateService.cs create mode 100644 HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryAlarmNewController.cs create mode 100644 HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryAlarmNew/Index.cshtml create mode 100644 HT.Cloud.Web/Areas/SystemSecurity/Views/ApplicationState/Index.cshtml create mode 100644 HT.Cloud.Web/DataProtection/key-e2f052f6-1509-4c55-84de-04eb742fe28f.xml create mode 100644 原ORM-SqlSugar版本纪安装类库.png diff --git a/HT.Cloud.Code/DefaultStartUp.cs b/HT.Cloud.Code/DefaultStartUp.cs index 7b1fdfc..43eb778 100644 --- a/HT.Cloud.Code/DefaultStartUp.cs +++ b/HT.Cloud.Code/DefaultStartUp.cs @@ -310,16 +310,46 @@ namespace HT.Cloud.Code this IServiceCollection @this) { var ret = new List(); - var assemblies = Directory.GetFiles(AppContext.BaseDirectory, "*.dll") - .Select(x => x.Substring(@"\").Substring(@"/").Replace(".dll", "")) - .Select(x => Assembly.Load(x)).ToArray(); - //排除列表 - var ignoreList= new List{ "EventBusHostedService" }; - foreach (var item in assemblies) + try { - ret.AddRange(item.GetTypes() //获取当前类库下所有类型 - .Where(t => typeof(BackgroundService).IsAssignableFrom(t)) //获取间接或直接继承t的所有类型 - .Where(t => !t.IsAbstract && t.IsClass && !ignoreList.Contains(t.Name)));//获取非抽象类 排除接口继承 + var listAssemblies = new List(); + + var assemblies1 = Directory.GetFiles(AppContext.BaseDirectory, "*.dll"); + + foreach( var assembly in assemblies1) + { + Console.WriteLine(assembly); + } + + var assemblies = Directory.GetFiles(AppContext.BaseDirectory, "*.dll") + .Select(x => x.Substring(@"\").Substring(@"/").Replace(".dll", "")); + //.Select(x => Assembly.Load(x)).ToArray(); + foreach (var assembliesFile in assemblies) + { + try + { + Console.WriteLine(assembliesFile+"\n"); + listAssemblies.Add(Assembly.Load(assembliesFile)); + } + catch(Exception ex) + { + Console.WriteLine(ex.ToString()); + } + + } + var arrAssemblies = listAssemblies.ToArray(); + //排除列表 + var ignoreList = new List { "EventBusHostedService" }; + foreach (var item in arrAssemblies) + { + ret.AddRange(item.GetTypes() //获取当前类库下所有类型 + .Where(t => typeof(BackgroundService).IsAssignableFrom(t)) //获取间接或直接继承t的所有类型 + .Where(t => !t.IsAbstract && t.IsClass && !ignoreList.Contains(t.Name)));//获取非抽象类 排除接口继承 + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); } foreach (var item in ret) { diff --git a/HT.Cloud.CodeGenerator/HT.Cloud.CodeGenerator.csproj b/HT.Cloud.CodeGenerator/HT.Cloud.CodeGenerator.csproj index 3e97079..40c607e 100644 --- a/HT.Cloud.CodeGenerator/HT.Cloud.CodeGenerator.csproj +++ b/HT.Cloud.CodeGenerator/HT.Cloud.CodeGenerator.csproj @@ -9,7 +9,7 @@ - + diff --git a/HT.Cloud.Data/HT.Cloud.DataBase.csproj b/HT.Cloud.Data/HT.Cloud.DataBase.csproj index 372ade4..b6552a8 100644 --- a/HT.Cloud.Data/HT.Cloud.DataBase.csproj +++ b/HT.Cloud.Data/HT.Cloud.DataBase.csproj @@ -9,7 +9,10 @@ - + + + + diff --git a/HT.Cloud.Domain/Entity/ReportManage/RTApplicationStateEntity.cs b/HT.Cloud.Domain/Entity/ReportManage/RTApplicationStateEntity.cs new file mode 100644 index 0000000..2168a31 --- /dev/null +++ b/HT.Cloud.Domain/Entity/ReportManage/RTApplicationStateEntity.cs @@ -0,0 +1,30 @@ +using System; +using System.ComponentModel.DataAnnotations; +using SqlSugar; + +namespace HT.Cloud.Domain.Entity.ReportManage +{ + /// + /// 创 建:cdl + /// 日 期:2023-03-30 14:52 + /// 描 述:实时报表SQL转换实体类 + /// + [SugarTable("HT_REALTIME_APPSTATE")] + [Tenant("1")] + public class RTApplicationStateEntity + { + + + /// + /// + /// + [SugarColumn(ColumnName = "ID", ColumnDescription = "", ColumnDataType = "int(10)")] + public int Id { get; set; } + /// + /// 显示名称 + /// + [SugarColumn(ColumnName = "ApplicationName", ColumnDescription = "", ColumnDataType = "int(128)", IsNullable = true)] + public string Description { get; set; } + + } +} diff --git a/HT.Cloud.Domain/HT.Cloud.Domain.csproj b/HT.Cloud.Domain/HT.Cloud.Domain.csproj index b835a79..dc89b2d 100644 --- a/HT.Cloud.Domain/HT.Cloud.Domain.csproj +++ b/HT.Cloud.Domain/HT.Cloud.Domain.csproj @@ -10,7 +10,7 @@ - + diff --git a/HT.Cloud.Service/ChartsManage/RtTechChartsService.cs b/HT.Cloud.Service/ChartsManage/RtTechChartsService.cs index f511350..9f0e788 100644 --- a/HT.Cloud.Service/ChartsManage/RtTechChartsService.cs +++ b/HT.Cloud.Service/ChartsManage/RtTechChartsService.cs @@ -14,6 +14,7 @@ using HT.Cloud.Domain.ReportManage; using Quartz; using Newtonsoft.Json.Linq; using System.Threading; +using System.Security.Cryptography.Xml; namespace HT.Cloud.Service.ChartsManage { @@ -107,8 +108,9 @@ namespace HT.Cloud.Service.ChartsManage return reList.ToJson(); } - public async Task GetChartsTagValueInit(string[] charts_TagNames,string systemName) + public async Task GetChartsTagValueInit(string[] charts_TagNames, string[] Tables, string systemName) { + var tagName_list = new List(); var result_list = new List>(); @@ -121,7 +123,23 @@ namespace HT.Cloud.Service.ChartsManage result_list.Add(new List()); } var remoteRtDataServer = _context.AsTenant().QueryableWithAttr().First().remotertdataserver + $"?groupName={groupName}"; - for (int i = 0; i < 3; i++) + + + /**/ + var timeEnd = DateTime.Now.AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss"); + var timeStart = DateTime.Now.AddHours(-2).ToString("yyyy-MM-dd HH:mm:ss"); + var timeinterval = 1; + bool finish = false; + var initDbData = new List>(); + Task.Run(() => + { + GetTagValueInit_Backgroud(Tables, charts_TagNames, timeStart, timeEnd, timeinterval, out finish, out initDbData); + }); + + /**/ + + + while (!finish) { var responseStr = RemoteHttpRequest.HttpGet(remoteRtDataServer); @@ -150,9 +168,52 @@ namespace HT.Cloud.Service.ChartsManage } Thread.Sleep(980); } - return result_list.ToJson(); + + for(int ii =0;ii> initDbData) + { + finish = false; + initDbData = new List>(); + for(int i = 0;i.ConvertDataTableToList(dt); + var resultlist = new List(); + foreach (var value in valuelist) + { + resultlist.Add(new ChartData() + { + name = value.HDATETIME, + value = value.VALUE + }); + } + initDbData.Add(resultlist); + } + finish = true; + } + + public async Task GetChartsTagValue(string[] charts_TagNames, string systemName) { var tagName_list = new List(); @@ -227,5 +288,6 @@ namespace HT.Cloud.Service.ChartsManage public String HDATETIME { get; set; } public decimal VALUE { get; set; } } - } + + } } diff --git a/HT.Cloud.Service/ReportManage/ApplicationStateService.cs b/HT.Cloud.Service/ReportManage/ApplicationStateService.cs new file mode 100644 index 0000000..444c092 --- /dev/null +++ b/HT.Cloud.Service/ReportManage/ApplicationStateService.cs @@ -0,0 +1,80 @@ +using MiniExcelLibs; +using Serenity.Services; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HT.Cloud.Domain.ReportManage; +using Newtonsoft.Json.Linq; +using System.Data; +using HT.Cloud.Code; +using HT.Cloud.Domain.ChartsManage; +using HT.Cloud.Domain.DevicesManage; +using Quartz; +using Microsoft.Extensions.Logging; +using HT.Cloud.Domain.Entity.ReportManage; +using System.Diagnostics; +using System.Threading; + +namespace HT.Cloud.Service.ReportManage +{ + public class ApplicationStateService : BaseService, IDenpendency + { + /// + /// 绑定数据仓库的数据库ID + /// + private string dataDBNumber = GlobalContext.SystemConfig.DataDBNumber; + + public ApplicationStateService(ISqlSugarClient context) : base(context) + { + } + + public async Task GetApplicationList(string systemName) + { + var groupName = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().GroupName; + var driverId = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().DriverID; + var driverName = _context.AsTenant().QueryableWithAttr().Where(x => x.DriverID == driverId).First().DriverName; + var list = _context.AsTenant().GetConnection(dataDBNumber).Ado.SqlQuery($"SELECT * FROM HT_{driverName}_{groupName}_STATE"); + + return list.ToJson(); + } + + public async Task GetRtApplicationState(string systemName) + { + var groupName = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().GroupName; + var driverId = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().DriverID; + var driverName = _context.AsTenant().QueryableWithAttr().Where(x => x.DriverID == driverId).First().DriverName; + var list = _context.AsTenant().GetConnection(dataDBNumber).Ado.SqlQuery($"SELECT * FROM HT_{driverName}_{groupName}_STATE"); + + var interval = 1000; + + foreach ( var item in list ) + { + var process = Process.GetProcessesByName("HT.Cloud.Web")[0]; + var startTime = DateTime.UtcNow; + var startCpuUsage = process.TotalProcessorTime; + // Perform some work + Thread.Sleep(interval); + var endTime = DateTime.UtcNow; + var endCpuUsage = process.TotalProcessorTime; + var cpuUsage = (endCpuUsage - startCpuUsage) / (endTime - startTime) / Environment.ProcessorCount * 100; + var memory = process.WorkingSet64 / (1024 * 1024); + Console.WriteLine($"CPU usage: {cpuUsage}% Memory: {memory}MB"); + } + return list.ToJson(); + } + + + + public class RealTimeDataFormat + { + public string Description { get; set; } + public string Value { get; set; } + public string RtTime { get; set; } + } + } +} diff --git a/HT.Cloud.Service/ReportManage/HistoryAlarmService.cs b/HT.Cloud.Service/ReportManage/HistoryAlarmService.cs index 3b52dc8..55ec250 100644 --- a/HT.Cloud.Service/ReportManage/HistoryAlarmService.cs +++ b/HT.Cloud.Service/ReportManage/HistoryAlarmService.cs @@ -177,6 +177,49 @@ namespace HT.Cloud.Service.ReportManage var subSystem = list.Where(x => x.Description == alarmName).First().Subsystem; return subSystem.ToJson(); } + + public async Task GetAlarm_ACC(string startdt, string enddt, string systemName) + { + var groupName = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().GroupName; + SugarParameter[] sqlParameters = + { + new SugarParameter("@HGROUPNAME",groupName), + new SugarParameter("@Hstartdt",startdt), + new SugarParameter("@Henddt",enddt) + }; + var dt = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("HT_BI_Alarm_ACC", sqlParameters); + var valuelist = DataTableConvertModel.ConvertDataTableToList(dt); + return valuelist.ToJson(); + } + + public async Task GetAlarm_Histogram(string startdt, string enddt, string systemName) + { + var groupName = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().GroupName; + SugarParameter[] sqlParameters = + { + new SugarParameter("@HGROUPNAME",groupName), + new SugarParameter("@Hstartdt",startdt), + new SugarParameter("@Henddt",enddt) + }; + var dt = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("HT_BI_Alarm_Histogram", sqlParameters); + var valuelist = DataTableConvertModel.ConvertDataTableToList(dt); + return valuelist.ToJson(); + } + + public async Task GetAlarm_Pie(string startdt, string enddt, string systemName) + { + var groupName = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().GroupName; + SugarParameter[] sqlParameters = + { + new SugarParameter("@HGROUPNAME",groupName), + new SugarParameter("@Hstartdt",startdt), + new SugarParameter("@Henddt",enddt) + }; + var dt = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("HT_BI_Alarm_Pie", sqlParameters); + var valuelist = DataTableConvertModel.ConvertDataTableToList(dt); + return valuelist.ToJson(); + } + private class AlarmValueCount { public string Alarmtype { get; set; } @@ -218,5 +261,27 @@ namespace HT.Cloud.Service.ReportManage public string Description { get; set; } public string Units { get; set; } } - } + + private class AlarmACC + { + public string TAGNAME { get; set; } + public string Description { get; set; } + public int hcount { get; set; } + public int hztime { get; set; } + } + private class AlarmHistogram + { + public string HDATE { get; set; } + public string TAGNAME { get; set; } + public string Description { get; set; } + public int hcount { get; set; } + public int hztime { get; set; } + } + private class AlarmPie + { + public string TAGNAME { get; set; } + public string Description { get; set; } + public double Hpercent { get; set; } + } + } } diff --git a/HT.Cloud.Service/SystemManage/CoderuleService.cs b/HT.Cloud.Service/SystemManage/CoderuleService.cs index b7ff550..52a89fe 100644 --- a/HT.Cloud.Service/SystemManage/CoderuleService.cs +++ b/HT.Cloud.Service/SystemManage/CoderuleService.cs @@ -8,7 +8,7 @@ using HT.Cloud.DataBase; using HT.Cloud.Domain.SystemManage; using HT.Cloud.Code.Model; using System.Globalization; -using NetTaste; +//using NetTaste; namespace HT.Cloud.Service.SystemManage { diff --git a/HT.Cloud.Web/Areas/ChartsManage/Views/HistoryCharts/Index.cshtml b/HT.Cloud.Web/Areas/ChartsManage/Views/HistoryCharts/Index.cshtml index 9ef5ce3..b8ac4b1 100644 --- a/HT.Cloud.Web/Areas/ChartsManage/Views/HistoryCharts/Index.cshtml +++ b/HT.Cloud.Web/Areas/ChartsManage/Views/HistoryCharts/Index.cshtml @@ -691,6 +691,7 @@ //bool变量取消平滑采取折线 let issmooth = !(StaticSelectTagList[si].Units ==='Y/N') let seriesdata = { + symbol: "none", data: yDataArr[si], // 曲线名 name: JSON.parse(JSON.stringify(StaticSelectTagList[si].Description)), @@ -872,7 +873,7 @@
[Area("PenMeiChartsManage")] - public class PenMeiHistoryChartsController : BaseController - { + [HandlerLogin(needLogin:false)] + [HandlerAuthorize(needAuth:false)] + public class PenMeiHistoryChartsController : BaseController //BaseController + { public HistoryChartsService _historyChartsService { get;set;} /// /// 绑定数据仓库的数据库ID diff --git a/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiHistoryTechChartsController.cs b/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiHistoryTechChartsController.cs index 0f7b8dc..b745631 100644 --- a/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiHistoryTechChartsController.cs +++ b/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiHistoryTechChartsController.cs @@ -20,7 +20,9 @@ namespace HT.Cloud.Web.Areas.ChartsManage.Controllers /// 描 述:历史趋势控制器类 /// [Area("PenMeiChartsManage")] - public class PenMeiHistoryTechChartsController : BaseController + [HandlerLogin(needLogin: false)] + [HandlerAuthorize(needAuth: false)] + public class PenMeiHistoryTechChartsController : BaseController { public HistoryTechChartsService _historyTechChartsService { get;set;} /// diff --git a/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiRtTechChartsController.cs b/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiRtTechChartsController.cs index 07fd9ef..42cf786 100644 --- a/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiRtTechChartsController.cs +++ b/HT.Cloud.Web/Areas/PenMeiChartsManage/Controllers/PenMeiRtTechChartsController.cs @@ -20,7 +20,9 @@ namespace HT.Cloud.Web.Areas.ChartsManage.Controllers /// 描 述:历史趋势控制器类 /// [Area("PenMeiChartsManage")] - public class PenMeiRtTechChartsController : BaseController + [HandlerLogin(needLogin: false)] + [HandlerAuthorize(needAuth: false)] + public class PenMeiRtTechChartsController : BaseController { public RtTechChartsService _rtTechChartsService { get;set;} /// @@ -65,10 +67,10 @@ namespace HT.Cloud.Web.Areas.ChartsManage.Controllers } [HttpPost] - public async Task GetChartsTagValueInit(string[] charts_TagNames) + public async Task GetChartsTagValueInit(string[] charts_TagNames, string[] Tables) { var systemName = "喷煤系统"; - var data = await _rtTechChartsService.GetChartsTagValueInit(charts_TagNames, systemName); + var data = await _rtTechChartsService.GetChartsTagValueInit(charts_TagNames, Tables, systemName); return Content(data); } diff --git a/HT.Cloud.Web/Areas/PenMeiChartsManage/Views/PenMeiHistoryCharts/Index.cshtml b/HT.Cloud.Web/Areas/PenMeiChartsManage/Views/PenMeiHistoryCharts/Index.cshtml index bcefc28..065fb97 100644 --- a/HT.Cloud.Web/Areas/PenMeiChartsManage/Views/PenMeiHistoryCharts/Index.cshtml +++ b/HT.Cloud.Web/Areas/PenMeiChartsManage/Views/PenMeiHistoryCharts/Index.cshtml @@ -691,6 +691,7 @@ //bool变量取消平滑采取折线 let issmooth = !(StaticSelectTagList[si].Units ==='Y/N') let seriesdata = { + symbol: "none", data: yDataArr[si], // 曲线名 name: JSON.parse(JSON.stringify(StaticSelectTagList[si].Description)), @@ -872,7 +873,7 @@
{ return x.value }); - // let xdata = chardatalist[listindex].map(x => { return x.name }); - // xDataArr.push(xdata); - // yDataArr.push(ydata); - // } - // var lightwhite = 0; - // if (unitsrc.length > 0) { - // lightwhite = (unitsrc.length ) * 40; - // } - - // //var lightwhite = (chardatalist.length) * 100; - // var color = new Array(); - // for (var colori = 0; colori < StaticSelectTagList.length; colori++) { - // //color.push(roundrgb()) - // color.push(StaticSelectTagList[colori].HTRGB); - // //color.push("#000000"); - // } - - - // var yAxis = new Array(); - // debugger; - // var maxYs = unitsrc.length; - // for (var ci = 0; ci < unitsrc.length; ci++) { - // if (ci == 0) - // { - // let yAxisdata = { - // name: JSON.parse(JSON.stringify(unitnames[ci])), - // nameLocation: 'center', - // type: 'value', - // //position:'left', - // //坐标轴两边留白策略,设置max、min后失效 - // boundaryGap: ['5%', '2%'], - // // max: 700, - // // min: 0, - // // 让表格的刻度向靠里侧显示 - // axisTick: { - // inside: true - // }, - // axisLabel: { - // inside: true, - // align: 'left', - // verticalAlign: 'bottom', - // }, - // // 设置刻度线的颜色等样式 - // axisLine: { - // show: true, - // onZero: true, - // onZeroAxisIndex:0, - // lineStyle: { - // //color: color[ci], - - // color: unitcolor[ci], - // width: 3 - // } - // }, - // splitLine: { - // show: true, //想要不显示网格线,改为false - // lineStyle: { - // // 设置网格为虚线 - // type: 'dashed' - // } - // }, - // //offset: (ci - 1) * 100 - // } - // yAxis.push(yAxisdata); - // } - // else { - // let yAxisdata = { - // name: JSON.parse(JSON.stringify(unitnames[ci])), - // nameLocation: 'center', - // // max: 800, - // // min: 0, - // type: 'value', - // position: 'left', - // //坐标轴两边留白策略,设置max、min后失效 - // boundaryGap: ['5%', '2%'], - // axisLabel: { - // inside: true, - // align: 'left', - // verticalAlign: 'bottom', - // }, - // axisLine: { - // show: true, - // onZero: false, - // lineStyle: { - // //color: color[ci], - // color: unitcolor[ci], - // width: 3 - // } - // }, - // splitLine: { - // show: false //想要不显示网格线,改为false - // }, - // // 设置坐标轴偏移位置 - // offset: (ci) * 40 - // //offset: (ci) * 100 - // } - // yAxis.push(yAxisdata); - // } - // } - - - // //for (var ci = 0; ci < StaticSelectTagList.length; ci++) { - // // if (ci == 0) { - // // let yAxisdata = { - // // name: JSON.parse(JSON.stringify(StaticSelectTagList[ci].Description)), - // // nameLocation: 'center', - // // type: 'value', - // // //坐标轴两边留白策略,设置max、min后失效 - // // boundaryGap: ['5%', '2%'], - // // // max: 700, - // // // min: 0, - // // // 让表格的刻度向靠里侧显示 - // // axisTick: { - // // inside: true - // // }, - // // axisLabel: { - // // inside: true, - // // align: 'left', - // // verticalAlign: 'bottom', - // // }, - // // // 设置刻度线的颜色等样式 - // // axisLine: { - // // show: true, - // // lineStyle: { - // // //color: color[ci], - // // color: StaticSelectTagList[ci].HTRGB, - // // width: 3 - // // } - // // }, - // // splitLine: { - // // show: true, //想要不显示网格线,改为false - // // lineStyle: { - // // // 设置网格为虚线 - // // type: 'dashed' - // // } - // // } - // // } - // // yAxis.push(yAxisdata); - // // } - // // else { - // // let yAxisdata = { - // // name: JSON.parse(JSON.stringify(StaticSelectTagList[ci].Description)), - // // nameLocation: 'center', - // // // max: 800, - // // // min: 0, - // // type: 'value', - // // //坐标轴两边留白策略,设置max、min后失效 - // // boundaryGap: ['5%', '2%'], - // // axisLabel: { - // // inside: true, - // // align: 'right', - // // verticalAlign: 'bottom', - // // }, - // // axisLine: { - // // show: true, - // // lineStyle: { - // // //color: color[ci], - // // color: StaticSelectTagList[ci].HTRGB, - // // width: 3 - // // } - // // }, - // // splitLine: { - // // show: false //想要不显示网格线,改为false - // // }, - // // // 设置坐标轴偏移位置 - // // offset: (ci - 1) * 100 - // // //offset: (ci) * 100 - // // } - // // yAxis.push(yAxisdata); - // // } - // //} - - // var series = new Array(); - // for (var si = 0; si < StaticSelectTagList.length; si++) { - // var unitIndex = 0; - // var unitss = StaticSelectTagList[si].Units; - // for(var ui = 0;ui GetAlarmACC(Alarm_ACC_Params alarm_ACC_Params) + { + string systemName = "喷煤系统"; + + var StartTime = Gettime(alarm_ACC_Params.StartTime); + var EndTime = Gettime(alarm_ACC_Params.EndTime); + + var data = await _historyAlarmService.GetAlarm_ACC(StartTime, EndTime, systemName); + return Content(data); + } + + [HttpPost] + public async Task GetAlarmHistogram(Alarm_Histogram_Params alarm_Histogram_Params) + { + string systemName = "喷煤系统"; + + var StartTime = Gettime_(alarm_Histogram_Params.StartTime); + var EndTime = Gettime_(alarm_Histogram_Params.EndTime); + + var data = await _historyAlarmService.GetAlarm_Histogram(StartTime, EndTime, systemName); + return Content(data); + } + + [HttpPost] + public async Task GetAlarmPie(Alarm_Pie_Params alarm_Pie_Params) + { + string systemName = "喷煤系统"; + + var StartTime = Gettime(alarm_Pie_Params.StartTime); + var EndTime = Gettime(alarm_Pie_Params.EndTime); + + var data = await _historyAlarmService.GetAlarm_Pie(StartTime, EndTime, systemName); + return Content(data); + } + + //public class SubAllTagReturn + //{ + // //x.TagID, x.Description, x.Units + // public short TagID { get; set; } + // public string Description { get; set; } + // public string Units { get; set; } + //} + + //public class SubsysytemNameList + //{ + // public string Lable { get; set; } + // public string Value { get; set; } + //} + + public class ChartSubsysytemName { public string SubsysytemName { get; set; } } @@ -153,5 +198,22 @@ namespace HT.Cloud.Web.Areas.ReportManage.Controllers public string Hhour { get; set; } } + + + public class Alarm_ACC_Params + { + public string StartTime { get; set; } + public string EndTime { get; set; } + } + public class Alarm_Histogram_Params + { + public string StartTime { get; set; } + public string EndTime { get; set; } + } + public class Alarm_Pie_Params + { + public string StartTime { get; set; } + public string EndTime { get; set; } + } } } diff --git a/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryAlarmNewController.cs b/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryAlarmNewController.cs new file mode 100644 index 0000000..a825378 --- /dev/null +++ b/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryAlarmNewController.cs @@ -0,0 +1,236 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using HT.Cloud.Code; +using HT.Cloud.Domain.ChartsManage; +using HT.Cloud.Service; +using Microsoft.AspNetCore.Authorization; +using HT.Cloud.Service.ChartsManage; +using HT.Cloud.Service.ReportManage; +using Serenity.Services; + +namespace HT.Cloud.Web.Areas.ReportManage.Controllers +{ + /// + /// 创 建:cdl + /// 日 期:2023-02-23 11:10 + /// 描 述:历史趋势控制器类 + /// + [Area("PenMeiReportManage")] + public class PenMeiHistoryAlarmNewController : BaseController + { + public HistoryAlarmService _historyAlarmService { get;set;} + /// + /// 绑定数据仓库的数据库ID + /// + private string groupDescription = GlobalContext.SystemConfig.GroupDescription; + [HttpGet] + public async Task GetDriverGroupList() + { + var data = await _historyAlarmService.GetDriverGroupList(); + return Content(data); + } + + [HttpGet] + public async Task GetAllSubsystemTag() + { + string systemName = "喷煤系统"; + + var data = await _historyAlarmService.GetAllSubsystemTag(systemName); + return Content(data); + } + + [HttpPost] + public async Task GetSubsystemAllTag(ChartSubsysytemName chartSubsysytemName) + { + string systemName = "喷煤系统"; + + var data = await _historyAlarmService.GetSubsystemAllTag(chartSubsysytemName.SubsysytemName, systemName); + return Content(data); + } + + [HttpPost] + public async Task GetAlarmRecord(Alarm_Params charts_Params) + { + string systemName = "喷煤系统"; + + short TagID = short.Parse(charts_Params.TagID); + var StartTime = Gettime(charts_Params.StartTime); + var EndTime = Gettime(charts_Params.EndTime); + + var data = await _historyAlarmService.GetAlarmRecord(TagID, StartTime, EndTime, systemName); + return Content(data); + } + [HttpPost] + public async Task GetAlarmRecordQuick(Alarm_Quick_Params alarm_Quick_Params) + { + string systemName = "喷煤系统"; + + var Alarmtype = alarm_Quick_Params.Alarmtype; + var StartTime = Gettime(alarm_Quick_Params.StartTime); + var EndTime = Gettime(alarm_Quick_Params.EndTime); + + var data = await _historyAlarmService.GetAlarmRecordQuick(Alarmtype, StartTime, EndTime, systemName); + return Content(data); + } + [HttpPost] + public async Task GetAlarmRecordQuickDesc(Alarm_Quick_Desc_Params alarm_Quick_Desc_Params) + { + string systemName = "喷煤系统"; + + var hhour = alarm_Quick_Desc_Params.Hhour; + + var data = await _historyAlarmService.GetAlarmRecordQuickDesc(hhour, systemName); + return Content(data); + } + [HttpPost] + public async Task GetAlarmSubSystem(SubSystem_Params subSystem_Params) + { + string systemName = "喷煤系统"; + + var AlarmName = subSystem_Params.AlarmName; + var data = await _historyAlarmService.GetAlarmSubSystem(AlarmName,systemName); + return Content(data); + } + + public string Gettime(string longtime) + { + long jsTimeStamp = long.Parse(longtime); + System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 + DateTime dt = startTime.AddMilliseconds(jsTimeStamp); + return (dt.ToString("yyyy/MM/dd HH:mm:ss")); + } + + public string Gettime_(string longtime) + { + long jsTimeStamp = long.Parse(longtime); + System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 + DateTime dt = startTime.AddMilliseconds(jsTimeStamp); + return (dt.ToString("yyyy-MM-dd HH:mm:ss")); + } + + + [HttpPost] + public async Task GetAlarmACC(Alarm_ACC_Params alarm_ACC_Params) + { + string systemName = "喷煤系统"; + + var StartTime = Gettime(alarm_ACC_Params.StartTime); + var EndTime = Gettime(alarm_ACC_Params.EndTime); + + var data = await _historyAlarmService.GetAlarm_ACC(StartTime, EndTime, systemName); + return Content(data); + } + + [HttpPost] + public async Task GetAlarmHistogram(Alarm_Histogram_Params alarm_Histogram_Params) + { + string systemName = "喷煤系统"; + + var StartTime = Gettime_(alarm_Histogram_Params.StartTime); + var EndTime = Gettime_(alarm_Histogram_Params.EndTime); + + var data = await _historyAlarmService.GetAlarm_Histogram(StartTime, EndTime, systemName); + return Content(data); + } + + [HttpPost] + public async Task GetAlarmPie(Alarm_Pie_Params alarm_Pie_Params) + { + string systemName = "喷煤系统"; + + var StartTime = Gettime(alarm_Pie_Params.StartTime); + var EndTime = Gettime(alarm_Pie_Params.EndTime); + + var data = await _historyAlarmService.GetAlarm_Pie(StartTime, EndTime, systemName); + return Content(data); + } + + /* + * 一 + * 1、重绘管理系统所有趋势曲线,曲线的数据点上不在绘制图形圆点。 + * 2、实时趋势开放拖动和JS代码添加可向前加载数据集的动态方法。 + * 二 + * 1、后台服务在获取实时趋势初始化数据时进行向前的数据获取,为初始数据集添加一段历史数据。 + * 2、参加公司组织的拍摄技术培训。 + * 三 + * 1、使用异步和函数回调来执行历史数据查询,在实时数据获取后进行时间戳对其,避免出现重复时间和漏掉时间。 + * 2、报警分析柱图优化,单日柱状图从堆叠图修改为平铺柱状图。 + * 四 + * 1、柱状图添加工具条,可支持堆叠图、平铺图、折线图切换显示,并支持下载功能。 + * 2、添加图表联动功能,增加柱状图和饼图的点击事件,在柱状区域或饼状区域内点击可跳转至该报警信息的详细查询。 + * 五 + * 1、 + * 2、整理管理系统以前相关的设计、宣传素材,编写管理系统演示用ppt。 + */ + //public class SubAllTagReturn + //{ + // //x.TagID, x.Description, x.Units + // public short TagID { get; set; } + // public string Description { get; set; } + // public string Units { get; set; } + //} + + //public class SubsysytemNameList + //{ + // public string Lable { get; set; } + // public string Value { get; set; } + //} + + public class ChartSubsysytemName + { + public string SubsysytemName { get; set; } + } + + //public class HDATETIMEVALUE + //{ + // public String HDATETIME { get; set; } + // public decimal VALUE { get; set; } + //} + //public class ChartData + //{ + // public decimal value { get; set; } + // public String name { get; set; } + //} + public class SubSystem_Params + { + public string AlarmName { get; set; } + } + public class Alarm_Params + { + public string TagID { get; set; } + public string StartTime { get; set; } + public string EndTime { get; set; } + } + public class Alarm_Quick_Params + { + public string Alarmtype { get; set; } + public string StartTime { get; set; } + public string EndTime { get; set; } + } + public class Alarm_Quick_Desc_Params + { + public string Hhour { get; set; } + } + + + + public class Alarm_ACC_Params + { + public string StartTime { get; set; } + public string EndTime { get; set; } + } + public class Alarm_Histogram_Params + { + public string StartTime { get; set; } + public string EndTime { get; set; } + } + public class Alarm_Pie_Params + { + public string StartTime { get; set; } + public string EndTime { get; set; } + } + } +} diff --git a/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryReportController.cs b/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryReportController.cs index 5d2b431..2c0fab5 100644 --- a/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryReportController.cs +++ b/HT.Cloud.Web/Areas/PenMeiReportManage/Controllers/PenMeiHistoryReportController.cs @@ -15,7 +15,9 @@ using HT.Cloud.Code; namespace HT.Cloud.Web.Areas.PenMeiReportManage.Controllers { [Area("PenMeiReportManage")] - public class PenMeiHistoryReportController : BaseController + [HandlerLogin(needLogin: false)] + [HandlerAuthorize(needAuth: false)] + public class PenMeiHistoryReportController : BaseController { public HistoryReportService _historyReportService { get; set; } /// diff --git a/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryAlarm/Index.cshtml b/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryAlarm/Index.cshtml index 9ab7298..3a29ba8 100644 --- a/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryAlarm/Index.cshtml +++ b/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryAlarm/Index.cshtml @@ -701,6 +701,60 @@ value: getFormatDateone(endtime), }); }); + lay('#dateReStartTimeSD').each(function () { + laydate.render({ + elem: this, + trigger: 'click', + format: "yyyy-MM-dd HH:mm:ss", + //value: "2023-02-23 13:56:25", + value: getFormatDateone(starttime), + }); + }); + lay('#dateReEndTimeSD').each(function () { + laydate.render({ + elem: this, + trigger: 'click', + format: "yyyy-MM-dd HH:mm:ss", + //value: "2023-02-23 13:56:25", + value: getFormatDateone(endtime), + }); + }); + lay('#dateReStartTimeZhu').each(function () { + laydate.render({ + elem: this, + trigger: 'click', + format: "yyyy-MM-dd HH:mm:ss", + //value: "2023-02-23 13:56:25", + value: getFormatDateone(starttime), + }); + }); + lay('#dateReEndTimeZhu').each(function () { + laydate.render({ + elem: this, + trigger: 'click', + format: "yyyy-MM-dd HH:mm:ss", + //value: "2023-02-23 13:56:25", + value: getFormatDateone(endtime), + }); + }); + lay('#dateReStartTimeBing').each(function () { + laydate.render({ + elem: this, + trigger: 'click', + format: "yyyy-MM-dd HH:mm:ss", + //value: "2023-02-23 13:56:25", + value: getFormatDateone(starttime), + }); + }); + lay('#dateReEndTimeBing').each(function () { + laydate.render({ + elem: this, + trigger: 'click', + format: "yyyy-MM-dd HH:mm:ss", + //value: "2023-02-23 13:56:25", + value: getFormatDateone(endtime), + }); + }); }); function getFormatDate(date) { let year = date.getFullYear(); @@ -1157,8 +1211,239 @@ return result; } + ShowSDChart = async function() { + var alarmlist = new Array(); + debugger; + let datetimestart = $('#dateReStartTimeSD')[0].value; + let datetimeend = $('#dateReEndTimeSD')[0].value; - + //getChecked + //var checkRow = $('#subsystemTagList').datalist("getChecked"); + let datapa = { "StartTime": Date.parse(new Date(datetimestart)), "EndTime": Date.parse(new Date(datetimeend)) }; + let result; + debugger; + + myajax = await $.ajax({ + url: "/PenMeiReportManage/PenMeiHistoryAlarm/GetAlarmACC", + type: "Post", + //dataType: "json", + data: datapa, + success: function (redata) { + debugger; + result = JSON.parse(redata); + var myChart = echarts.init(document.getElementById('resultsandian'), 'walden'); + myChart.dispose(); + myChart = echarts.init(document.getElementById('resultsandian'), 'walden'); + myChart.hideLoading(); + myChart.showLoading(); + var sdata = []; + var ldata = []; + // for (var i = 0; i < result.length; i++) { + for (var i = 0; i < 10; i++) { + sdata.push({ + + name: result[i].Description, + data:[result[i].hcount, result[i].hztime], + symbolSize: 50, + type:'scatter' + }); + ldata.push(result[i].Description); + } + + var option = { + xAxis: { + + name: '报警次数', + nameGap: 16, + nameTextStyle: { + fontSize: 16 + }, + //max: 31, + splitLine: { + show: true + } + }, + yAxis: { + + name: '报警总时长', + nameLocation: 'end', + nameGap: 20, + nameTextStyle: { + fontSize: 16 + }, + splitLine: { + show: true + } + }, + legend: { + data:ldata + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'cross' + } + }, + series:sdata, + // series: [{ + // SymbolSize:20, + // data:data, + // type:'scatter', + // }, + //] + } + myChart.hideLoading(); + myChart.setOption(JSON.parse(JSON.stringify(option))); + } + }); + + } + + ShowZhuChart = async function () { + var alarmlist = new Array(); + debugger; + let datetimestart = $('#dateReStartTimeZhu')[0].value; + let datetimeend = $('#dateReEndTimeZhu')[0].value; + + //getChecked + //var checkRow = $('#subsystemTagList').datalist("getChecked"); + let datapa = { "StartTime": Date.parse(new Date(datetimestart)), "EndTime": Date.parse(new Date(datetimeend)) }; + let result; + debugger; + + myajax = await $.ajax({ + url: "/PenMeiReportManage/PenMeiHistoryAlarm/GetAlarmHistogram", + type: "Post", + //dataType: "json", + data: datapa, + success: function (redata) { + debugger; + var data = JSON.parse(redata); + var myChart = echarts.init(document.getElementById('resultzhu')); + myChart.dispose(); + myChart = echarts.init(document.getElementById('resultzhu')); + myChart.hideLoading(); + myChart.showLoading(); + + let date = []; //x轴日期 + let lenged = []; //series的个数 + let s = []; + data.map((item) => { + date.push(item['HDATE']); + lenged.push(item['Description']); + }); + debugger; + date = [...new Set(date)]; //去重 + lenged = [...new Set(lenged)]; + console.log(date, lenged); + let series = []; + lenged.map((item) => { + //生成 series + let obj = { + name: item, + type: 'bar', + stack: 'As', + emphasis: { + focus: 'series' + }, + data: [] + }; + series.push(obj); + }); + + data.map((item) => { + //对series 的data进行处理 + + series.map((item1) => { + if (item1.name == item['Description'] && date.indexOf(item['HDATE']) > -1) { + item1.data[date.indexOf(item['HDATE'])] = item['hztime']; + } + }); + }); + var option = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + legend: {}, + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + xAxis: [ + { + type: 'category', + data: date + } + ], + yAxis: [ + { + type: 'value' + } + ], + series: series + }; + myChart.hideLoading(); + option && myChart.setOption(option); + // myChart.setOption(JSON.parse(JSON.stringify(option))); + } + }); + } + + ShowBingChart = async function () { + var alarmlist = new Array(); + debugger; + let datetimestart = $('#dateReStartTimeBing')[0].value; + let datetimeend = $('#dateReEndTimeBing')[0].value; + + //getChecked + //var checkRow = $('#subsystemTagList').datalist("getChecked"); + let datapa = { "StartTime": Date.parse(new Date(datetimestart)), "EndTime": Date.parse(new Date(datetimeend)) }; + let result; + debugger; + + myajax = await $.ajax({ + url: "/PenMeiReportManage/PenMeiHistoryAlarm/GetAlarmPie", + type: "Post", + //dataType: "json", + data: datapa, + success: function (redata) { + debugger; + result = JSON.parse(redata); + + var myChart = echarts.init(document.getElementById('resultbing'), 'walden'); + myChart.dispose(); + myChart = echarts.init(document.getElementById('resultbing'), 'walden'); + myChart.hideLoading(); + myChart.showLoading(); + var data = []; + for (var i = 0; i < result.length; i++) { + + data.push({ value: result[i].Hpercent, name: result[i].Description + "\n" + result[i].Hpercent + "%" }); + } + debugger; + var option = { + title: { + text: '报警时长占比统计', + // subtext: '纯属虚构', + left: 'center' + }, + series:[ + { + type: 'pie', + data:data + } + ] + } + myChart.hideLoading(); + myChart.setOption(JSON.parse(JSON.stringify(option))); + } + }); + } }); @@ -1166,15 +1451,297 @@ - +
@**@
    -
  • 报警汇总
  • +
  • 散点图
  • +
  • 柱状图
  • +
  • 饼图图
  • +
  • 报警汇总
  • 报警查询
+
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + +
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + + +
@*
@@ -1277,7 +1844,7 @@
+ + .layui-table-tool > .layui-table-tool-temp { + padding-right: 0px; + } + + + + + +
+ @**@ +
    + @*
  • 散点图
  • *@ +
  • 重点报警统计
  • +
  • 报警时长占比
  • +
  • 报警汇总
  • +
  • 报警查询
  • +
+
+ + @*
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
*@ + +
+
+
+ +
+ + +
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ + @*
+
+ +
+ + + +
+
+
*@ +
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+ @*
+
+
+
+
+
+
+
+ +
+ +
+
+
*@ +
+ @*
+
+
+
+
*@ + +
+ +
+ @*
+
+ +
+ + + +
+
+
*@ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ @*
+
+ +
+ + + +
+
+
*@ +
+
+ +
+ + + +
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
@*style="width: 100%; height: 100% "*@ + +
+
+
+
+
+
+
+
+
+
+
+ @*
    *@ +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + @*
    +
    +
    +
    +
    *@ + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + + + +
    +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    @*style="width: 100%; height: 100% "*@ +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryReport/Index.cshtml b/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryReport/Index.cshtml index 15d2738..24c78c4 100644 --- a/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryReport/Index.cshtml +++ b/HT.Cloud.Web/Areas/PenMeiReportManage/Views/PenMeiHistoryReport/Index.cshtml @@ -75,7 +75,7 @@
    + + + + +
    +
    +
    +
    +
    +
    状态信息
    +
    +
    +
    +
    +
    +
    +
    + 实时 +
    CPU使用率
    +
    +
    +

    + 当前记录 +
    +
    +
    +
    +
    +
    +
    +
    + 实时 +
    ARM使用率
    +
    +
    +

    + 当前记录 +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    报表统计
    +
    +
    +
    +
    +
    +
    +
    +
    服务器信息
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    服务器名称 + @Environment.MachineName +
    总内存
    操作系统@System.Runtime.InteropServices.RuntimeInformation.OSDescription
    系统架构@System.Runtime.InteropServices.RuntimeInformation.OSArchitecture
    外网IP + +
    +
    +
    +
    +
    +
    +
    .NET信息
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    环境变量@Html.Raw(env.EnvironmentName)
    ContentRootPath + @Html.Raw(env.ContentRootPath) +
    WebRootPath@Html.Raw(env.WebRootPath)
    .NET版本 + @Html.Raw(System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription) +
    启动时间 + @System.Diagnostics.Process.GetCurrentProcess().StartTime.ToString("yyyy-MM-dd HH:mm:ss") +
    +
    +
    +
    +
    +
    +
    diff --git a/HT.Cloud.Web/Controllers/BaseController.cs b/HT.Cloud.Web/Controllers/BaseController.cs index 86af4bb..9845763 100644 --- a/HT.Cloud.Web/Controllers/BaseController.cs +++ b/HT.Cloud.Web/Controllers/BaseController.cs @@ -59,7 +59,6 @@ namespace HT.Cloud.Web } [HttpGet] - [HandlerAuthorize] public virtual ActionResult Index() { return View(); diff --git a/HT.Cloud.Web/DataProtection/key-e2f052f6-1509-4c55-84de-04eb742fe28f.xml b/HT.Cloud.Web/DataProtection/key-e2f052f6-1509-4c55-84de-04eb742fe28f.xml new file mode 100644 index 0000000..e446386 --- /dev/null +++ b/HT.Cloud.Web/DataProtection/key-e2f052f6-1509-4c55-84de-04eb742fe28f.xml @@ -0,0 +1,16 @@ + + + 2023-10-26T06:08:18.4927965Z + 2023-10-26T06:08:18.4519268Z + 2024-01-24T06:08:18.4519268Z + + + + + + + VfIzIpwFUHHKnUpgU9+YB6hSl0rbMsdUVz6nl/7btIoiBsd7lUY61AX4hKJrqQ9ACz4CSODJ4trRjmXnkSP3OA== + + + + \ No newline at end of file diff --git a/HT.Cloud.Web/HT.Cloud.Web.csproj b/HT.Cloud.Web/HT.Cloud.Web.csproj index 7297a75..4607add 100644 --- a/HT.Cloud.Web/HT.Cloud.Web.csproj +++ b/HT.Cloud.Web/HT.Cloud.Web.csproj @@ -11,6 +11,7 @@ false false true + true @@ -60,9 +61,10 @@ - + + diff --git a/HT.Cloud.Web/Startup.cs b/HT.Cloud.Web/Startup.cs index 7438165..cea2ba5 100644 --- a/HT.Cloud.Web/Startup.cs +++ b/HT.Cloud.Web/Startup.cs @@ -54,7 +54,7 @@ namespace HT.Cloud.Web .ReviseSuperSysem() .AddEventBus() .AddRabbitMq() - .AddWorkerService() + //.AddWorkerService()//23/11/2,注释,修复初始化报错 .AddSignalR(options => { //客户端发保持连接请求到服务端最长间隔,默认30秒,改成4分钟,网页需跟着设置connection.keepAliveIntervalInMilliseconds = 12e4;即2分钟 diff --git a/HT.Cloud.Web/Views/Home/Default.cshtml b/HT.Cloud.Web/Views/Home/Default.cshtml index 98b2dcd..967318d 100644 --- a/HT.Cloud.Web/Views/Home/Default.cshtml +++ b/HT.Cloud.Web/Views/Home/Default.cshtml @@ -572,6 +572,7 @@ legendArr.push(StaticChartList[ci].Description); ySeries.push( { + // symbol: "none", name: StaticChartList[ci].Description, type: 'line', data: yData[ci], @@ -590,7 +591,7 @@ }, smooth: true, symbol: 'circle', - symbolSize: 6, + symbolSize: 1, showAllSymbol: true, color: colorArr[ci], } @@ -697,7 +698,8 @@ // show: true, // position: 'top' //}, - type: 'value' + type: 'value', + scale: true }, series:ySeries, //series: [ diff --git a/HT.Cloud.Web/WaterCloud.Web.xml b/HT.Cloud.Web/WaterCloud.Web.xml index f3f3fab..d81181f 100644 --- a/HT.Cloud.Web/WaterCloud.Web.xml +++ b/HT.Cloud.Web/WaterCloud.Web.xml @@ -165,6 +165,18 @@ 绑定数据仓库的数据库ID
    + + + 创 建:cdl + 日 期:2023-02-23 11:10 + 描 述:历史趋势控制器类 + + + + + 绑定数据仓库的数据库ID + + 绑定数据仓库的数据库ID diff --git a/HT.Cloud.Web/appsettings.json b/HT.Cloud.Web/appsettings.json index d1fe1cf..ac529ae 100644 --- a/HT.Cloud.Web/appsettings.json +++ b/HT.Cloud.Web/appsettings.json @@ -13,7 +13,7 @@ "LoginMultiple": false, // 是否允许一个账户在多处登录 "AllowCorsSite": "http://localhost:8058", // 允许的其他站点访问Api "DBProvider": "SqlServer", //SqlServer //Oracle - "DBConnectionString": "Zk48ARnbLq1Lk+lzxvCij/8Pt/tnmDwn+rE3IgYGjbmDk32vhkYsxag9amyZ1OOMwPA3yWW1gKjVgKPpDBSgVaiansOQtPtF5IQDwQ7q12LOaKRfCsNZGg56LRoA5R2eybLLG8j/xLWDC8/X7aDMHvZ2G8SWZzlDTt8jTQulouSVBP7JtlWXsAj1B5NVUxvlqn5yJiaz89ISUyPp1+A/XQ==", + "DBConnectionString": "Zk48ARnbLq1Lk+lzxvCij6YiQpV5DIw6JRzXXsYlzoJ+bUF4h97SyChJobnKFm1EOA4aBGj+/Aje1MD7G13GOXplGKNnRzOB6qvav/vGq4xLAOc1EyKCHAMDCgWSEpu5uXl7LYv8gGNRQzIjv6UkUBLzX1Jetj7Hf9iYws19sCoRXI/1Vm5bZIVwLQThEctF8imcaVDPhGNcPCH1kr+h5A==", "DBCommandTimeout": 180, // 数据库超时时间,单位秒 "CacheProvider": "Memory", // 缓存使用方式 Redis/Memory "RedisConnectionString": "127.0.0.1:6379", //docker部署 172.17.0.1 @@ -34,7 +34,7 @@ { "DBNumber": "1", "DBProvider": "SqlServer", //MySql //Oracle - "DBConnectionString": "Zk48ARnbLq1Lk+lzxvCij/8Pt/tnmDwn+rE3IgYGjbnYiY85KP1HOOhZ7C60SCx1TwEmcNLYzAsnfEdOBXU0nU0Oy8su8Qtkf/CPFKNyOJYTJKdUqu23gKYXItXANHKYm37ayRrKmUCNtdRkxoN9I6Y8N+yLiP1Qjk207DBIXR4vgChSgSPr9USeuNmLVsiBiUuDY+4KnQF8uHwQxMBvWg==" + "DBConnectionString": "Zk48ARnbLq1Lk+lzxvCij6YiQpV5DIw6JRzXXsYlzoJ+bUF4h97SyChJobnKFm1EOA4aBGj+/Aje1MD7G13GOXplGKNnRzOB6qvav/vGq4xLAOc1EyKCHAMDCgWSEpu5uXl7LYv8gGNRQzIjv6UkUBLzX1Jetj7Hf9iYws19sCoRXI/1Vm5bZIVwLQThEctF8imcaVDPhGNcPCH1kr+h5A==" } ], "RabbitMq": { diff --git a/原ORM-SqlSugar版本纪安装类库.png b/原ORM-SqlSugar版本纪安装类库.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f64c7bf460b3dd5cc2a234dc71d503f94167aa GIT binary patch literal 16642 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%0A^tp?c@Ec>f~=PI?1H)FKPAb9wQn9MMezs_%ns3 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 MMP)@QzUcY>KU;slpa1{> literal 0 HcmV?d00001