274 lines
9.7 KiB
C#
274 lines
9.7 KiB
C#
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());
|
||
}
|
||
}
|
||
}
|