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/");
// 188
//private const string connectionString = "Data Source=192.168.12.188;Initial Catalog=peisdb;User ID=sa;Password=000626;";
// 盈江妇幼
// private const string ConnectionString = @"Data Source=172.172.100.12;Initial Catalog=peisdb;User ID=sa;Password=xbdLis!@#77911;";
// 芒市妇幼
// private const string ConnectionString = @"Data Source=192.168.11.5;Initial Catalog=peisdb;User ID=XBDLISUser;Password=BlueFlag.Lis!@#;";
// 德宏中医
private const string ConnectionString = @"Data Source=200.200.200.71;Initial Catalog=peisdb;User ID=sa;Password=wVJeC28@eY*&F#5NGL^eYC3m;";
///
/// PACS报告中已选的图片
///
private const string InsertExamPacsImage =
@"INSERT INTO Exam_PacsImage (Image,EID,ReportNo,InTime) VALUES (@ImageData,@EID,@ReportNo,@InTime);
INSERT INTO Report_Pacs(Image, EID, ReportNo, InTime) VALUES(@ImageData, @EID, @ReportNo, @InTime);";
private static void Main(string[] args)
{
Console.WriteLine($"【启动】{DateTime.Now:yyyy-MM-dd HH:mm}");
// 创建一个 Timer 实例
var timer = new Timer();
try
{
//DownEcgFtpImage();
Execute();
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();
Execute();
SyncPacsReport();
//DelDownFiles();
}
///
/// 下载选择的
///
private static void Execute()
{
Console.WriteLine($"【开始同步PACS报告图片】{DateTime.Now:yyyy-MM-dd HH:mm}------------");
//--将PACS检查报告同步到体检系统中
if (!Directory.Exists(DcmPath))
{
Directory.CreateDirectory(DcmPath);
}
var reportList = PacsSqlHelper.GetPacsReportList();
var fileNameList = new List();
int i = 1;
foreach (var report in reportList)
{
try
{
// 已选图片UID
var selectedList = PacsSqlHelper.GetReportUidList(report.AccessionNumber);
if (selectedList.Count <= 0) continue;
// DCM图片路径
var imageFiles = PacsSqlHelper.GetPacsImageFile(report.PatientCode,report.ExamFeeitem_Code);
if (string.IsNullOrEmpty(imageFiles)) continue;
// 得到DCM共享文件地址
var dcmPaths = imageFiles.Split(';');
// 路径为空
if (!(dcmPaths?.Length > 0)) continue;
//获取远程共享文件
using (var client = new WebClient())
{
// 配置授权账户密码
var credentials = new NetworkCredential(UserName, Password);
client.Credentials = credentials;
selectedList.ForEach(selected =>
{
var file = selected + ".DCM";
var dcmPacsDict = dcmPaths[0].Substring(dcmPaths[0].Length , file.Length);
string downPath = dcmPaths[0].Replace(dcmPacsDict, file);
if (Path.HasExtension(downPath))
{
//下载远程文件
var buffer = client.DownloadData(downPath);
// 保存本地
var name = $"{report.PatientCode?.Trim()}-{report.ExamFeeitem_Code?.Trim()}-" + i;
Bytes2File(buffer, DcmPath, $"{name}.DCM");
fileNameList.Add($"{name}.DCM");
Console.WriteLine($"下载:{name}.DCM");
i++;
};
});
// 循环路径
for (var index = 0; index < dcmPaths.Count(); index++)
{
try
{
// 当前路径
var dcmPath = dcmPaths[index];
if (string.IsNullOrEmpty(dcmPath)) continue;
if (!Path.HasExtension(dcmPath) ) continue;
selectedList.ForEach(selected =>
{
if (dcmPath.Contains(selected))
{
//下载远程文件
var buffer = client.DownloadData(dcmPath);
// 保存本地
var name = $"{report.PatientCode?.Trim()}-{report.ExamFeeitem_Code?.Trim()}-" + i;
Bytes2File(buffer, DcmPath, $"{name}.DCM");
fileNameList.Add($"{name}.DCM");
Console.WriteLine($"下载:{name}.DCM");
i++;
}
});
}
catch (Exception e)
{
Console.WriteLine($"01." + e.Message);
}
}
}
}
catch (Exception e)
{
Console.WriteLine($"02." + e.Message);
}
}
Console.WriteLine($@"【下载】{fileNameList.Count}");
if (fileNameList.Count > 0)
// 保存到本地后上传到服务器
UploadDcmImg(DcmPath, fileNameList, InsertExamPacsImage);
Console.WriteLine($@"【等待】{intervalInMinutes}min");
Console.WriteLine($"------------------------------------------");
}
///
/// 1、将本地文件PACS影像图片发送到服务器
///
public static void UploadDcmImg(string folderPath, List fileNameList, string insertSql)
{
var time = DateTime.Now;
// 获取文件夹下所有文件的路径
var files = Directory.GetFiles(folderPath);
var i = 0;
// 建立数据库连接
using (var connection = new SqlConnection(ConnectionString))
{
// 遍历文件路径并输出
foreach (var filePath in files)
{
try
{
var fileName = System.IO.Path.GetFileName(filePath);
if (!fileNameList.Contains(fileName)) continue;
var eid = Convert.ToInt64(fileName.Split('-')[0]);
var reportNo = fileName.Split('-')[1];
var image = new DicomImage(filePath);
//image.NumberOfFrames 如果有多帧图片需要将每帧都转成jpeg
//DCM转Bitmap
var bitmap = image.RenderImage().AsBitmap();
using (var streamImg = new MemoryStream())
{
//Bitmap To byte[]
bitmap.Save(streamImg, System.Drawing.Imaging.ImageFormat.Jpeg);
var imgBytes = streamImg.ToArray();
// File.WriteAllBytes(Path.Combine(DcmPath, i+".jpeg"), imgBytes);
//上传
{
connection.Open();
// 创建插入记录的 SQL 查询
// 创建命令对象
using (var command = new SqlCommand(insertSql, connection))
{
// 设置参数值
command.Parameters.AddWithValue("@ImageData", imgBytes);
command.Parameters.AddWithValue("@EID", eid);
command.Parameters.AddWithValue("@ReportNo", reportNo);
command.Parameters.AddWithValue("@InTime", time);
Console.WriteLine($@"【上传】{fileName}");
// 执行插入操作
command.ExecuteNonQuery();
i++;
}
connection.Close();
}
}
// 删除上传成功的文件
File.Delete(filePath);
}
catch (Exception e)
{
Console.WriteLine(System.IO.Path.GetFileName(filePath));
Console.WriteLine(e.Message);
}
}
}
Console.WriteLine($@"【上传成功】{i}");
}
///
/// 将byte数组转换为文件并保存到指定地址
///
/// byte数组
/// 保存地址
///
public static void Bytes2File(byte[] buff, string path, string fileName)
{
try
{
//如果不存在就创建Enclosure文件夹
if (Directory.Exists(path) == false)
Directory.CreateDirectory(path);
if (File.Exists(path + fileName))
File.Delete(path + fileName);
var fs = new FileStream(path + fileName, FileMode.CreateNew);
var bw = new BinaryWriter(fs);
bw.Write(buff, 0, buff.Length);
bw.Close();
fs.Close();
}
catch (Exception e)
{
Console.WriteLine("【下载失败】" + fileName + "--" + e.Message);
}
}
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);
}
FtpHelper.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}");
}
public static void SyncPacsReport()
{
DAOHelp.ExecuteSql("EXEC sp_PacsRptInsert;");
}
}
}