using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Net; using System.Timers; using Dicom.Imaging; using DicomTool.Model; using DicomTool.Utils; namespace DicomTool { internal class Program { // 设置循环间隔时间为10分钟 private const int intervalInMinutes = 60; // PACS 共享文件访问 private const string UserName = "XBDLISUser"; private const string Password = "BlueFlag.Lis!@#"; // DCM文件下载存放路径 private static readonly string DcmPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DicomFiles/"); private static readonly string EcgPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EcgFiles/"); private const string ConnectionString = @"Data Source=200.200.200.71;Initial Catalog=peisdb;User ID=sa;Password=wVJeC28@eY*&F#5NGL^eYC3m;"; private static void Main(string[] args) { Console.WriteLine($"【启动】{DateTime.Now:yyyy-MM-dd HH:mm}"); // 创建一个 Timer 实例 var timer = new Timer(); try { DownEcgFtpImage(); Console.ReadKey(); timer.Interval = intervalInMinutes * 60 * 1000; // 设置为 true,使得 Timer 每隔设定的间隔时间自动触发一次 Elapsed 事件 timer.AutoReset = true; // 绑定 Elapsed 事件处理程序 timer.Elapsed += Timer_Elapsed; // 启动 Timer timer.Start(); // 阻止控制台程序退出 Console.ReadKey(); // 停止 Timer timer.Stop(); } catch (Exception e) { Console.WriteLine(e.Message); timer.Stop(); } Console.WriteLine($"【停止】{DateTime.Now:yyyy-MM-dd HH:mm}"); Console.ReadKey(); } /// /// 定时执行任务 /// /// /// private static void Timer_Elapsed(object sender, ElapsedEventArgs e) { Console.WriteLine($@"执行-{DateTime.Now:yyyy-MM-dd HH:mm}"); DownEcgFtpImage(); } public static void DownEcgFtpImage() { Console.WriteLine("-----------------------------------"); Console.WriteLine($"【ECG-START】{DateTime.Now:yyyy-MM-dd HH:mm}"); var files = DAOHelp.GetDataBySQL ($@"SELECT id,ReportUrl FROM Report_GSEXD WHERE ReportUrl is not null and ReportData is null"); Console.WriteLine("[ECG-ReportCount]" + files.Count); if (files.Count == 0) return; var name = "TJ_HXECG"; var password = "123456"; if (!Directory.Exists(EcgPath)) { Directory.CreateDirectory(EcgPath); } DownloadFtpFile(files, name, password, EcgPath); UploadEcgImg(EcgPath, files.Select(s => s.ID.ToString()).ToList()); Console.WriteLine("ECG 下载完毕"); Console.WriteLine($"【ECG-END】{DateTime.Now:yyyy-MM-dd HH:mm}"); Console.WriteLine("-----------------------------------"); } /// /// 1、将ecg图片发送到服务器 /// public static void UploadEcgImg(string folderPath, List idList) { var i = 0; // 建立数据库连接 using (var connection = new SqlConnection(ConnectionString)) { // 遍历文件路径并输出 foreach (var id in idList) { var jpgFilePath = Path.Combine(folderPath, id + ".jpg"); try { if (!File.Exists(jpgFilePath)) { Console.WriteLine(id + "NotFound" + jpgFilePath); continue; } // 加载JPG图片 using (var image = Image.FromFile(jpgFilePath)) { // 创建内存流 using (MemoryStream memoryStream = new MemoryStream()) { // 将图像保存到内存流中,指定图像格式为JPEG image.Save(memoryStream, ImageFormat.Jpeg); // 将内存流中的数据复制到字节数组 var imgBytes = memoryStream.ToArray(); //上传 { connection.Open(); // 创建插入记录的 SQL 查询 string updateEcgRpt = @"update Report_GSEXD set ReportData=@ReportData where id=@ID"; // 创建命令对象 using (var command = new SqlCommand(updateEcgRpt, connection)) { // 设置参数值 command.Parameters.AddWithValue("@ReportData", imgBytes); command.Parameters.AddWithValue("@ID", id); Console.WriteLine($@"【上传】{id}.jpg"); // 执行插入操作 command.ExecuteNonQuery(); i++; } connection.Close(); } } } File.Delete(jpgFilePath); } catch (Exception e) { Console.WriteLine(id + "-" + e.Message); } } } Console.WriteLine($@"【上传成功】{i}"); } /// /// 下载ECG图片 /// /// /// /// /// public static void DownloadFtpFile(List ftpUriList, string username, string password, string localFilePath) { // 确保本地文件路径是目录 if (!Directory.Exists(localFilePath)) { Directory.CreateDirectory(localFilePath); } foreach (var reportEcg in ftpUriList) { // 创建 FtpWebRequest 对象 try { var request = (FtpWebRequest)WebRequest.Create(reportEcg.ReportUrl); request.Method = WebRequestMethods.Ftp.DownloadFile; request.Credentials = new NetworkCredential(username, password); // 获取响应并读取数据 var response = (FtpWebResponse)request.GetResponse(); var responseStream = response.GetResponseStream(); // 获取文件名 // string fileName = Path.GetFileName(new Uri(reportEcg.ReportUrl).LocalPath); var fileName = reportEcg.ID + ".jpg"; Console.WriteLine("【下载】" + reportEcg.ID + ".jpg"); var localFileFullPath = Path.Combine(localFilePath, fileName); // 将 FTP 文件内容写入本地文件 using (FileStream fileStream = new FileStream(localFileFullPath, FileMode.Create, FileAccess.Write)) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) != 0) { fileStream.Write(buffer, 0, bytesRead); } } responseStream.Close(); response.Close(); } catch (WebException ex) { // 处理异常,例如打印错误信息 Console.WriteLine("Download failed for " + reportEcg + ": " + ex.Message); continue; } } } } }