2023-03-03 16:07:50 +08:00
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 ;
2023-04-27 15:02:45 +08:00
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 ;
2023-07-27 15:19:54 +08:00
using System.Security.Cryptography ;
using System.Threading ;
using System.Data ;
using iTextSharp.text ;
2023-08-11 16:04:39 +08:00
using Serenity.Data ;
using Quartz ;
2024-10-12 11:15:47 +08:00
using static iTextSharp . text . pdf . XfaForm ;
using HT.Cloud.Domain.Entity.ReportManage ;
2023-03-03 16:07:50 +08:00
namespace HT.Cloud.Service.ReportManage
{
public class HistoryReportService : BaseService < HistoryReportEntity > , IDenpendency
{
2023-08-24 09:28:09 +08:00
/// <summary>
/// 绑定数据仓库的数据库ID
/// </summary>
private string dataDBNumber = GlobalContext . SystemConfig . DataDBNumber ;
public HistoryReportService ( ISqlSugarClient context ) : base ( context )
2023-03-03 16:07:50 +08:00
{
}
2023-07-27 15:19:54 +08:00
public async Task < string > GetDriverGroupList ( )
{
2023-08-24 09:28:09 +08:00
var list_group = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . ToList ( ) ;
2023-07-27 15:19:54 +08:00
return list_group . ToJson ( ) ;
}
2023-03-03 16:07:50 +08:00
public async Task < string > 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 )
} ;
2023-08-24 09:28:09 +08:00
var Report = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . UseStoredProcedure ( ) . GetDataTable ( "Query_Report_YL" , sqlParameters ) ;
2023-03-03 16:07:50 +08:00
Report . TableName = "Report" ;
var value = new Dictionary < string , object > ( )
{
["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<string> result = new Result<string>();
//result.data = fileurl;
return fileurl ;
}
2023-07-27 15:19:54 +08:00
/// <summary>
/// sql获取count
/// </summary>
/// <param name="startdt"></param>
/// <param name="enddt"></param>
/// <param name="timeinterval"></param>
/// <returns></returns>
public async Task < object > GetReportNewInitPara ( string startdt , string enddt , int timeinterval )
{
SugarParameter [ ] sqlParameters = {
new SugarParameter ( "@startdt" , startdt ) ,
new SugarParameter ( "@enddt" , enddt ) ,
new SugarParameter ( "@timeinterval" , timeinterval )
} ;
2023-08-24 09:28:09 +08:00
var dt_Counts = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . UseStoredProcedure ( ) . GetDataTable ( "Query_Report_YL_COUNT" , sqlParameters ) ;
2023-07-27 15:19:54 +08:00
int counts = dt_Counts . Rows [ 0 ] [ 0 ] . ToInt ( ) ;
return counts ;
}
/// <summary>
/// 代码计算count
/// </summary>
/// <param name="startdt"></param>
/// <param name="enddt"></param>
/// <param name="timeinterval"></param>
/// <returns></returns>
public async Task < object > GetReportNewInitParaInCode ( long startdt , long enddt , int timeinterval )
{
var startS = startdt / 1000 ;
var endS = enddt / 1000 ;
var counts = ( ( endS - startS ) / timeinterval ) + 1 ;
return counts ;
}
2023-08-11 16:04:39 +08:00
public async Task < string > GetReportNewAsync ( string page , string limit , string Startdt , string Enddt , string Timeinterval , string systemName )
2023-07-27 15:19:54 +08:00
{
2023-08-24 09:28:09 +08:00
var groupName = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . GroupName ;
2023-07-27 15:19:54 +08:00
//SugarParameter[] sqlParameters ={
// new SugarParameter("@startdt",Startdt),
// new SugarParameter("@enddt",Enddt),
// new SugarParameter("@timeinterval",Timeinterval)
//};
2023-08-24 09:28:09 +08:00
//var dt_Counts = _context.AsTenant().GetConnection(dataDBNumber).Ado.UseStoredProcedure().GetDataTable("Query_Report_YL_COUNT", sqlParameters);
2023-07-27 15:19:54 +08:00
//int counts = dt_Counts.Rows[0][0].ToInt();
string msg = "" ;
int code = 0 ;
SugarParameter [ ] sqlReportParameters = {
new SugarParameter ( "@startdt" , Startdt ) ,
new SugarParameter ( "@enddt" , Enddt ) ,
2023-08-11 16:04:39 +08:00
new SugarParameter ( "@groupname" , groupName ) ,
2023-07-27 15:19:54 +08:00
new SugarParameter ( "@timeinterval" , Timeinterval ) ,
new SugarParameter ( "@hpage" , page . ToInt ( ) ) ,
new SugarParameter ( "@hlimit" , limit . ToInt ( ) )
} ;
2023-08-24 09:28:09 +08:00
var Report = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . UseStoredProcedure ( ) . GetDataTable ( "Query_Report_PAGE" , sqlReportParameters ) ;
2023-04-27 15:02:45 +08:00
2023-07-27 15:19:54 +08:00
var jsonResult = JsonConvert . SerializeObject ( Report ) ;
var result = new
{
code = code ,
msg = msg ,
//count = counts,
data = jsonResult
} ;
string serJson = JsonConvert . SerializeObject ( result ) ;
return serJson ;
}
2023-04-27 15:02:45 +08:00
public async Task < object > GetReportNew ( string startdt , string enddt , int timeinterval )
{
SugarParameter [ ] sqlParameters = {
new SugarParameter ( "@startdt" , startdt ) ,
new SugarParameter ( "@enddt" , enddt ) ,
new SugarParameter ( "@timeinterval" , timeinterval )
} ;
2023-08-24 09:28:09 +08:00
var Report = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . UseStoredProcedure ( ) . GetDataTable ( "Query_Report_YL" , sqlParameters ) ;
2023-04-27 15:02:45 +08:00
Report . TableName = "Report" ;
//return JsonConvert.SerializeObject(Report);
return Report ;
}
2023-08-11 16:04:39 +08:00
public async Task < string > GetReportFirstHead ( string systemName )
2023-04-27 15:02:45 +08:00
{
2023-08-24 09:28:09 +08:00
var groupName = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . GroupName ;
var driverId = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . DriverID ;
var driverName = _context . AsTenant ( ) . QueryableWithAttr < MetaDriverEntity > ( ) . Where ( x = > x . DriverID = = driverId ) . First ( ) . DriverName ;
var list = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . SqlQuery < Ht_History_ReportEntity > ( $"SELECT * FROM HT_{driverName}_{groupName}_REPORT" ) ;
//var list = _context.AsTenant().QueryableWithAttr<Ht_History_ReportEntity>().ToList();
2023-04-27 15:02:45 +08:00
List < string > list_name_two = list . Select ( t = > t . HSYS ) . GroupBy ( c = > c ) . Select ( c = > c . First ( ) ) . ToList ( ) ;
return list_name_two . ToJson ( ) ;
}
2023-08-11 16:04:39 +08:00
public async Task < string > GetReportSecondHead ( string systemName )
2023-04-27 15:02:45 +08:00
{
2023-08-24 09:28:09 +08:00
var groupName = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . GroupName ;
var driverId = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . DriverID ;
var driverName = _context . AsTenant ( ) . QueryableWithAttr < MetaDriverEntity > ( ) . Where ( x = > x . DriverID = = driverId ) . First ( ) . DriverName ;
var list = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . SqlQuery < Ht_History_ReportEntity > ( $"SELECT * FROM HT_{driverName}_{groupName}_REPORT" ) ;
2023-04-27 15:02:45 +08:00
List < string > list_name_two = list . Select ( t = > t . HSYS ) . GroupBy ( c = > c ) . Select ( c = > c . First ( ) ) . ToList ( ) ;
var relist = new List < SecondHead > ( ) ;
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 < string > ( ) ;
var listTitleString = new List < string > ( ) ;
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();
}
2023-07-27 15:19:54 +08:00
2024-07-10 16:08:09 +08:00
public async Task < string > GetReportDownLoad ( DateTime startTime , DateTime endTime , int interval , string systemName )
2023-07-27 15:19:54 +08:00
{
2024-07-10 16:08:09 +08:00
var groupName = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . GroupName ;
2024-10-12 11:15:47 +08:00
var driverId = _context . AsTenant ( ) . QueryableWithAttr < MetaGroupEntity > ( ) . Where ( x = > x . GroupDescription = = systemName ) . First ( ) . DriverID ;
var driverName = _context . AsTenant ( ) . QueryableWithAttr < MetaDriverEntity > ( ) . Where ( x = > x . DriverID = = driverId ) . First ( ) . DriverName ;
var list = _context . AsTenant ( ) . GetConnection ( dataDBNumber ) . Ado . SqlQuery < HistoryReportPathEntity > ( $"SELECT * FROM HT_{driverName}_{groupName}_REPORTPATH" ) ;
var f3dpath = list . First ( ) . ReportPath ;
2023-07-27 15:19:54 +08:00
2024-10-12 11:15:47 +08:00
var listSub = TimeInOneDay ( startTime , endTime ) ;
2023-07-27 15:19:54 +08:00
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}
2024-10-12 11:15:47 +08:00
var path3d = @f3dpath + fileurl ;
2023-07-27 15:19:54 +08:00
var sheets = new Dictionary < string , object > ( ) ;
2024-10-12 11:15:47 +08:00
var sheets3D = new Dictionary < string , object > ( ) ;
2023-07-27 15:19:54 +08:00
try
{
for ( int i = 0 ; i < listSub . Count ; i + + )
{
var item = listSub [ i ] ;
var fstartTime = item . starttime ;
var fendTime = item . endtime ;
2024-07-10 16:08:09 +08:00
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();
2023-07-27 15:19:54 +08:00
//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 ) ;
2024-10-12 11:15:47 +08:00
sheets3D . Add ( sheetName , reader ) ;
2023-07-27 15:19:54 +08:00
//sqlConnection.Close();
}
}
catch ( Exception ex )
{
Console . WriteLine ( ex . ToString ( ) ) ;
}
2024-10-12 11:15:47 +08:00
try
{
//var sheets3d = new Dictionary<string, object>(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);
2023-07-27 15:19:54 +08:00
//bool a = true;
////MiniExcel.SaveAs(path, reader);
//while (a)
//{
// Thread.Sleep(1000);
//}
return fileurl . ToJson ( ) ;
}
/// <summary>
/// 处理分段,截头去尾还需添加
/// </summary>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public List < TimeMDL > 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 < TimeMDL > ListTime = new List < TimeMDL > ( ) ;
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 ; }
}
2023-04-27 15:02:45 +08:00
public class SecondHead
{
public string HSYS { get ; set ; }
public List < string > Head { get ; set ; }
public List < string > Title { get ; set ; }
}
2023-03-03 16:07:50 +08:00
}
}