AHAQ_QGNH/AnQing/Commons/Common.cs
2025-05-19 09:31:47 +08:00

274 lines
9.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AnQing.View;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using System.Windows;
using System.Drawing.Imaging;
using System.IO;
using System.ComponentModel;
using AnQing.Models;
using OfficeOpenXml;
using Newtonsoft.Json.Linq;
namespace AnQing.Commons
{
public class Common
{
public static MainWindow main;
/// <summary>
/// 查询页面
/// </summary>
public static History historycontrol;
/// <summary>
/// 设置页面
/// </summary>
public static SetUpView setupview;
public static string ConnectionString
{
get
{
var conn = ConfigurationManager.ConnectionStrings["ConnectionString"];
if (conn == null)
{
throw new Exception("未找到数据库连接字符串,请检查 App.config 是否正确!");
}
return conn.ConnectionString;
}
}
/// <summary>
/// DataView 转 ObservableCollection
/// </summary>
public static ObservableCollection<T> ConvertDataViewToObservableCollection<T>(DataView view) where T : class, new()
{
ObservableCollection<T> collection = new ObservableCollection<T>();
if (view == null || view.Count == 0)
{
return collection; // 返回空集合
}
// 获取 DataTable 结构(从 DataView 取出)
DataTable table = view.Table;
// 缓存属性信息
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (DataRowView rowView in view)
{
DataRow row = rowView.Row;
T obj = new T();
foreach (PropertyInfo info in properties)
{
if (table.Columns.Contains(info.Name))
{
if (row[info.Name] != DBNull.Value)
{
// 获取属性类型
Type propertyType = info.PropertyType;
// 获取DataRow中的值
object value = row[info.Name];
// 进行类型转换
if (propertyType.IsEnum)
{
value = Enum.ToObject(propertyType, value);
}
else if (propertyType == typeof(int) && value is long)
{
value = Convert.ToInt32(value);
}
else if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
if (value != null)
{
propertyType = Nullable.GetUnderlyingType(propertyType);
value = Convert.ChangeType(value, propertyType);
}
}
else
{
value = Convert.ChangeType(value, propertyType);
}
// 设置属性值
info.SetValue(obj, value, null);
}
}
}
collection.Add(obj);
}
return collection;
}
public static void MenuViewQuit()
{
main.MenuView.Children.Clear();
main.MenuView.Visibility = System.Windows.Visibility.Collapsed;
}
public static void SaveImage(Bitmap bitmap)
{
try
{
string directory = @"E:\Images";
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string filePath = Path.Combine(directory, $"Image_{DateTime.Now:yyyyMMdd_HHmmss}.bmp");
bitmap.Save(filePath, ImageFormat.Bmp); // 直接保存 BMP避免二次转换
}
catch (Exception e)
{
MessageBox.Show($"保存图片失败: {e.Message}");
}
}
public static BitmapSource BitmapToBitmapSource2(Bitmap bitmap)
{
IntPtr hBitmap = IntPtr.Zero;
BitmapSource bitmapSource = null;
try
{
// 使用 GetThumbnailImage 进行快速缩放
using (Bitmap resizedBitmap = (Bitmap)bitmap.GetThumbnailImage(760, 600, null, IntPtr.Zero))
{
hBitmap = resizedBitmap.GetHbitmap();
bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
bitmapSource.Freeze(); // 让 BitmapSource 可跨线程使用
}
}
finally
{
if (hBitmap != IntPtr.Zero)
{
DeleteObject(hBitmap); // 避免 GDI 资源泄漏
}
}
return bitmapSource;
}
public static BitmapSource BitmapToBitmapSource(Bitmap bitmap)
{
IntPtr hBitmap = IntPtr.Zero;
BitmapSource bitmapSource = null;
try
{
hBitmap = bitmap.GetHbitmap();
bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
finally
{
if (hBitmap != IntPtr.Zero)
{
DeleteObject(hBitmap); // 避免 GDI 资源泄漏
}
}
return bitmapSource;
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);
/// <summary>
/// 保存ObservableCollection数据为excel
/// </summary>
/// <param name="tagInfos"></param>
/// <param name="filePath"></param>
public static void SaveToExcel(ObservableCollection<SCAN_MAIN> tagInfos, string filePath)
{
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("历史报废数据");
// 添加标题行
worksheet.Cells[1, 1].Value = "时间";
worksheet.Cells[1, 2].Value = "资产编号";
worksheet.Cells[1, 3].Value = "报废前图片路径";
worksheet.Cells[1, 4].Value = "报废后图片路径";
// 设置第一列时间列为文本格式防止Excel自动转换日期
worksheet.Column(1).Style.Numberformat.Format = "@";
worksheet.Column(2).Style.Numberformat.Format = "@";
worksheet.Column(3).Style.Numberformat.Format = "@";
worksheet.Column(4).Style.Numberformat.Format = "@";
// 添加数据行
for (int i = 0; i < tagInfos.Count; i++)
{
worksheet.Cells[i + 2, 1].Value = tagInfos[i].time.ToString("yyyy-MM-dd HH:mm:ss"); // 添加单引号,强制 Excel 识别为文本
worksheet.Cells[i + 2, 2].Value = tagInfos[i].goodcode;
worksheet.Cells[i + 2, 3].Value = tagInfos[i].img;
worksheet.Cells[i + 2, 4].Value = tagInfos[i].img_after;
}
// 保存到文件
var fileInfo = new FileInfo(filePath);
package.SaveAs(fileInfo);
System.Windows.MessageBox.Show("数据导出成功!");
}
}
public static void EnsureFolderExists(string folderName)
{
string projectRoot = AppDomain.CurrentDomain.BaseDirectory;
string folderPath = Path.Combine(projectRoot, folderName);
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
else
{
string todayFolderName = DateTime.Now.ToString("yyyy-MM-dd");
string todayFolderPath = Path.Combine(folderPath, todayFolderName);
// 如果今天日期的文件夹不存在,则创建
if (!Directory.Exists(todayFolderPath))
{
Directory.CreateDirectory(todayFolderPath);
}
}
}
private static string configPath = "config.json";
public static string GetSetting(string key)
{
var json = JObject.Parse(File.ReadAllText(configPath));
return json["Settings"]?[key]?.ToString();
}
public static void SetSetting(string key, string value)
{
var json = JObject.Parse(File.ReadAllText(configPath));
json["Settings"][key] = value;
File.WriteAllText(configPath, json.ToString());
}
}
}