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 System.Reflection.PortableExecutable; using Newtonsoft.Json; using HT.Cloud.Code; using HT.Cloud.Domain.DevicesManage; using System.Text.RegularExpressions; using Org.BouncyCastle.Asn1.X509; using System.Security.Cryptography; using System.Threading; using System.Data; using iTextSharp.text; using Serenity.Data; using Quartz; using static iTextSharp.text.pdf.XfaForm; using HT.Cloud.Domain.Entity.ReportManage; namespace HT.Cloud.Service.ReportManage { public class HistoryOutPutService : BaseService, IDenpendency { /// /// 绑定数据仓库的数据库ID /// private string dataDBNumber = GlobalContext.SystemConfig.DataDBNumber; public HistoryOutPutService(ISqlSugarClient context) : base(context) { } public async Task GetDriverGroupList() { var list_group = _context.AsTenant().QueryableWithAttr().ToList(); return list_group.ToJson(); } public async Task GetReportFileName(string startdt, string enddt, int timeinterval) { //SqlParameter[] sqlParameters = //{ // new SqlParameter("@startdt",startdt), // new SqlParameter("@enddt",enddt), // new SqlParameter("@timeinterval",timeinterval) //}; ////* //string conn = db.Database.GetConnectionString(); //"Data Source=192.168.110.32;Initial Catalog=SCADA;User Id= sa;Password= Sa1qaz;Integrated Security=False;Encrypt=True;TrustServerCertificate=True;"; //SqlConnection sqlConnection = new SqlConnection(conn); //var ds = sqlConnection.SqlQueryex("Query_Report_YL", sqlParameters); //* //var ds = db.SqlQuery("Query_Report_Period", sqlParameters);/// SugarParameter[] sqlParameters ={ new SugarParameter("@startdt",startdt), new SugarParameter("@enddt",enddt), new SugarParameter("@timeinterval",timeinterval) }; var Report = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("Query_Report_YL", sqlParameters); Report.TableName = "Report"; var value = new Dictionary() { ["title"] = "Report", ["Report"] = Report, }; //var pathroot = ""; //var Isdebug = Configuration["Isdebug"]; //if (Isdebug.Equals("yes")) //{ // pathroot = Directory.GetCurrentDirectory(); //} //else //{ // pathroot = AppContext.BaseDirectory; //} var pathroot = Directory.GetCurrentDirectory(); var templatePath = pathroot + "\\wwwroot\\report\\" + "报表预设模板" + ".xlsx"; string fileurl = "Report" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; //var fileurl = $"电子报表2023_01_03_11_19_53.xlsx"; var path = pathroot + "\\wwwroot\\report\\" + fileurl;//{StartTime}-{EndTime} MiniExcel.SaveAsByTemplate(path: path, templatePath: templatePath, value: value); ////await Task.Delay(1); //Result result = new Result(); //result.data = fileurl; return fileurl; } /// /// sql获取count /// /// /// /// /// public async Task GetReportNewInitPara(string startdt, string enddt, int timeinterval) { SugarParameter[] sqlParameters ={ new SugarParameter("@startdt",startdt), new SugarParameter("@enddt",enddt), new SugarParameter("@timeinterval",timeinterval) }; var dt_Counts = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("Query_Report_YL_COUNT", sqlParameters); int counts = dt_Counts.Rows[0][0].ToInt(); return counts; } /// /// 代码计算count /// /// /// /// /// public async Task GetReportNewInitParaInCode(long startdt, long enddt, int timeinterval) { var startS = startdt / 1000; var endS = enddt / 1000; var counts = ((endS - startS) / timeinterval) + 1; return counts; } public async Task GetReportNewAsync(string page, string limit, string Startdt, string Enddt, string Timeinterval, string systemName) { var groupName = _context.AsTenant().QueryableWithAttr().Where(x => x.GroupDescription == systemName).First().GroupName; //SugarParameter[] sqlParameters ={ // new SugarParameter("@startdt",Startdt), // new SugarParameter("@enddt",Enddt), // new SugarParameter("@timeinterval",Timeinterval) //}; //var dt_Counts = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("Query_Report_YL_COUNT", sqlParameters); //int counts = dt_Counts.Rows[0][0].ToInt(); string msg = ""; int code = 0; SugarParameter[] sqlReportParameters ={ new SugarParameter("@startdt",Startdt), new SugarParameter("@enddt",Enddt), new SugarParameter("@groupname",groupName), new SugarParameter("@timeinterval",Timeinterval), new SugarParameter("@hpage",page.ToInt()), new SugarParameter("@hlimit",limit.ToInt()) }; var Report = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("Query_Report_PAGE", sqlReportParameters); var jsonResult = JsonConvert.SerializeObject(Report); var result = new { code = code, msg = msg, //count = counts, data = jsonResult }; string serJson = JsonConvert.SerializeObject(result); return serJson; } public async Task GetReportNew(string startdt, string enddt, int timeinterval) { SugarParameter[] sqlParameters ={ new SugarParameter("@startdt",startdt), new SugarParameter("@enddt",enddt), new SugarParameter("@timeinterval",timeinterval) }; var Report = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("Query_Report_YL", sqlParameters); Report.TableName = "Report"; //return JsonConvert.SerializeObject(Report); return Report; } public async Task GetReportFirstHead(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}_REPORT"); //var list = _context.AsTenant().QueryableWithAttr().ToList(); List list_name_two = list.Select(t => t.HSYS).GroupBy(c => c).Select(c => c.First()).ToList(); return list_name_two.ToJson(); } public async Task GetReportSecondHead(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}_REPORT"); List list_name_two = list.Select(t => t.HSYS).GroupBy(c => c).Select(c => c.First()).ToList(); var relist = new List(); foreach(var t in list_name_two) { var secondHead = new SecondHead(); secondHead.HSYS = t; var listHead = list.Where(x=> x.HSYS == t).ToList(); var listHeadString = new List(); var listTitleString = new List(); foreach(var h in listHead) { listHeadString.Add(h.HPRO.ToString()); listTitleString.Add(h.HVAR.ToString()); } secondHead.Head = listHeadString; secondHead.Title = listTitleString; relist.Add(secondHead); } return relist.ToJson(); //return Report.ToJson(); } public async Task GetReportDownLoad(DateTime startTime, DateTime endTime ,int interval, 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}_REPORTPATH"); var f3dpath = list.First().ReportPath; var listSub = TimeInOneDay(startTime, endTime); var pathroot = Directory.GetCurrentDirectory(); string fileurl = "报表 " + startTime.ToString("yyyy年MM月dd日 HH.mm.ss") + "至" + endTime.ToString("yyyy年MM月dd日 HH.mm.ss") + "(" + "时间间隔" + interval.ToString() + "秒" + ")" + "_" + DateTime.Now.ToString("yyyy年MM月dd日 HH.mm.ss") + "导出" + ".xlsx"; //var fileurl = $"电子报表2023_01_03_11_19_53.xlsx"; var path = pathroot + "\\wwwroot\\report\\" + fileurl;//{StartTime}-{EndTime} var path3d = @f3dpath + fileurl; var sheets = new Dictionary(); var sheets3D = new Dictionary(); try { for (int i = 0; i < listSub.Count; i++) { var item = listSub[i]; var fstartTime = item.starttime; var fendTime = item.endtime; SugarParameter[] sqlParameters ={ new SugarParameter("@enddt", fendTime.ToString("yyyy-MM-dd HH:mm:ss")), new SugarParameter("@groupname", groupName), new SugarParameter("@startdt", fstartTime.ToString("yyyy-MM-dd HH:mm:ss")), new SugarParameter("@timeinterval",interval) }; var reader = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataReader("Query_Report_YL_CHN", sqlParameters); //string conn = _context.CurrentConnectionConfig.ConnectionString; //"Data Source=192.168.110.32;Initial Catalog=SCADA;User Id= sa;Password= Sa1qaz;Integrated Security=False;Encrypt=True;TrustServerCertificate=True;"; // SqlConnection sqlConnection = new SqlConnection(conn); // SqlCommand command = new SqlCommand("dbo.Query_Report_YL_CHN", sqlConnection); // command.CommandType = CommandType.StoredProcedure; //command.Parameters.Add(new SqlParameter("@enddt", fendTime.ToString("yyyy-MM-dd HH:mm:ss"))); //command.Parameters.Add(new SqlParameter("@groupname", groupName)); //command.Parameters.Add(new SqlParameter("@startdt", fstartTime.ToString("yyyy-MM-dd HH:mm:ss"))); //command.Parameters.Add(new SqlParameter("@timeinterval", interval)); // command.CommandTimeout = 999999; // sqlConnection.Open(); // var reader = command.ExecuteReader(); //var pathroot = Directory.GetCurrentDirectory(); //string fileurl = "报表_" + startTime.ToString("yyyy_MM_dd_HH_mm_ss")+"至"+ endTime.ToString("yyyy_MM_dd_HH_mm_ss")+"("+"时间间隔"+interval.ToString()+"秒"+")"+"_"+DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")+"导出" + ".xlsx"; ////var fileurl = $"电子报表2023_01_03_11_19_53.xlsx"; //var path = pathroot + "\\wwwroot\\report\\" + fileurl;//{StartTime}-{EndTime} var sheetName = fstartTime.ToString("yyyy年MM月dd日 HH.mm.ss") + "至" + fendTime.ToString("HH.mm.ss"); //MiniExcel.SaveAs(path, reader, true, sheetName, ExcelType.XLSX, null, false); sheets.Add(sheetName, reader); sheets3D.Add(sheetName, reader); //sqlConnection.Close(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } try { //var sheets3d = new Dictionary(sheets.ToDictionary(pair => pair.Key, pair => pair.Value)); //await Task.Delay(1000); MiniExcel.SaveAs(path, sheets); File.Copy(path, path3d, true); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } //await Task.WhenAll(taskCloud, task3D); //bool a = true; ////MiniExcel.SaveAs(path, reader); //while (a) //{ // Thread.Sleep(1000); //} return fileurl.ToJson(); } /// /// 处理分段,截头去尾还需添加 /// /// /// /// public List TimeInOneDay(DateTime startTime, DateTime endTime) { var hour = startTime.Hour; var minute = startTime.Minute; var second = startTime.Second; var oneendtime = new DateTime(startTime.Year,startTime.Month,startTime.Day,23,59,59); var twostarttime = startTime.AddHours(0 - hour).AddMinutes(0 - minute).AddSeconds(0 - second).AddDays(1); var twoendtime = new DateTime( twostarttime.Year, twostarttime.Month,twostarttime.Day,23,59,59); List ListTime = new List(); int day = (endTime - startTime).Days; for (int i = 0; i <= day; i++) { TimeMDL temptime = new TimeMDL(); if (i == 0) { temptime.starttime = startTime; temptime.endtime = oneendtime; ListTime.Add(temptime); } else { temptime.starttime = twostarttime; temptime.endtime = twoendtime; twostarttime = twostarttime.AddDays(1); twoendtime = twoendtime.AddDays(1); ListTime.Add(temptime); } } //list在处理 第一行和最后一行 //ListTime[0].starttime = startTime; ListTime[ListTime.Count-1].endtime = endTime; return ListTime; } public class TimeMDL { public DateTime starttime { get; set; } public DateTime endtime { get; set; } } public class SecondHead { public string HSYS { get; set;} public List Head { get; set;} public List Title { get; set; } } } }