添加项目文件。

This commit is contained in:
Administrator
2026-06-29 14:46:32 +08:00
parent 9a9c508618
commit d9e0324b1d
175 changed files with 17983 additions and 0 deletions

View File

@@ -0,0 +1,308 @@
using Microsoft.EntityFrameworkCore;
using Serilog;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Xml.Linq;
using WPFWCSDemo.Data;
using WPFWCSDemo.StateCode;
namespace WPFWCSDemo.Utilities
{
/// <summary>
/// 数据维护操作相关
/// </summary>
public class SqlDatabaseMaintenance
{
/// <summary>
/// 手动备份根文件夹路径
/// </summary>
static string rootPath = @"E:\SqlDataBackup";
/// <summary>
/// 自动备份根文件夹路径
/// </summary>
static string rootPathAuto = @"E:\SqlAutoBackup";
/// <summary>
/// sql库名
/// </summary>
static string dbName = "FT479";
/// <summary>
/// 备份当前数据库
/// </summary>
public static void SQLBackup()
{
try
{
// 连接字符串
string connectionString = SqlHelper.ConStr;
// 指定备份文件的路径
string backupPath = $@"{rootPath}\{dbName}_{DateTime.Now.ToString("yyyyMMdd_hhmmss")}.bak";
// SQL 查询备份数据库
string backupQuery = $"BACKUP DATABASE {dbName} TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;";
GetOrCreateDirectory(backupPath);
// 打开数据库连接
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 执行备份查询
using (SqlCommand command = new SqlCommand(backupQuery, connection))
{
command.ExecuteNonQuery();
}
MessageBox.Show("数据库备份成功!");
}
}
catch (Exception ex)
{
MessageBox.Show($"数据库备份失败: {ex.Message}");
}
}
/// <summary>
/// 自动备份当前数据库
/// 包含删除旧数据功能
/// </summary>
public static void SQLBackupAuto()
{
try
{
// 连接字符串
string connectionString = SqlHelper.ConStr;
// 指定备份文件的路径
string backupPath = $@"{rootPathAuto}\{DateTime.Now.AddMonths(-4).ToString("yyyy")}\{dbName}_{DateTime.Now.AddMonths(-4).ToString("yyyy-MM")}.bak";
// SQL 查询备份数据库
string backupQuery = $"BACKUP DATABASE {dbName} TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;";
GetOrCreateDirectory(backupPath);
Log.Warning("【定期自动备份】自动备份数据中...");
using var context = new AppDbContext();
//备份前删除前3个月外的调度任务记录
context.TaskHistories
.Where(t => t.FinishTime < DateTime.Now.AddMonths(-3))
.ExecuteDelete();
//备份前删除前1年前的报警任务记录
context.AlarmHistories
.Where(t => t.End_Time < DateTime.Now.AddYears(-1))
.ExecuteDelete();
context.SaveChanges();
// 打开数据库连接
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 执行备份查询
using (SqlCommand command = new SqlCommand(backupQuery, connection))
{
command.ExecuteNonQuery();
}
}
Log.Warning("【定期自动备份】备份完成!");
}
catch (Exception ex)
{
Log.Warning($"【定期自动备份】备份发生错误:{ex.Message}");
}
SqlHelper.NewEventLog("系统自动备份操作", "SYSTEM");
}
/// <summary>
/// SQL备份-调度任务表
/// </summary>
public static void SQLTaskBackup(string yearOrMonthOrDay,int count,bool delete)
{
try
{
// 连接字符串
string connectionString = SqlHelper.ConStr;
// 指定备份文件的路径
string backupPath = $"{rootPath}\\{dbName}_{DateTime.Now.ToString("yyyyMMdd_hhmmss")}.bak";
// SQL 查询备份数据库
string backupQuery = $"BACKUP DATABASE FT_WCS TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;" +
$"SELECT * FROM TASK_HISTORY WHERE CREATETIME >= DATEADD({yearOrMonthOrDay}, {count}, GETDATE())";
GetOrCreateDirectory(backupPath);
// 打开数据库连接
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 执行备份查询
using (SqlCommand command = new SqlCommand(backupQuery, connection))
{
command.ExecuteNonQuery();
//选择是否删除已备份的数据
if (delete)
{
SQLClearByTime("TASK_HISTORY", yearOrMonthOrDay, count);
}
}
MessageBox.Show("数据库备份成功!");
Log.Warning($"【手动动备份】备份完成!");
}
SqlHelper.NewEventLog("发生了手动备份操作", "USER");
}
catch (Exception ex)
{
MessageBox.Show($"数据库备份失败: {ex.Message}");
Log.Warning($"【手动备份】备份发生错误:{ex.Message}");
}
}
/// <summary>
/// SQL备份-历史报警表
/// </summary>
public static void SQLAlarmBackup(string yearOrMonthOrDay, int count,bool delete)
{
try
{
// 连接字符串
string connectionString = SqlHelper.ConStr;
// 指定备份文件的路径
string backupPath = $"{rootPath}\\{dbName}_{DateTime.Now.ToString("yyyyMMdd_hhmmss")}.bak";
// SQL 查询备份数据库
string backupQuery = $"BACKUP DATABASE FT_WCS TO DISK = '{backupPath}' WITH COPY_ONLY, STATS = 10;" +
$"SELECT * FROM ALARM_LOG WHERE GEN_TIME >= DATEADD({yearOrMonthOrDay}, {count}, GETDATE())";
GetOrCreateDirectory(backupPath);
// 打开数据库连接
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 执行备份查询
using (SqlCommand command = new SqlCommand(backupQuery, connection))
{
command.ExecuteNonQuery();
//选择是否删除已备份的数据
if (delete)
{
SQLClearByTime("ALARM_LOG", yearOrMonthOrDay, count);
}
}
MessageBox.Show("数据库备份成功!");
}
}
catch (Exception ex)
{
MessageBox.Show($"数据库备份失败: {ex.Message}");
}
}
/// <summary>
/// 删除SQL数据
/// </summary>
public static void SQLClearByTime(string tableName, string yearOrMonthOrDay, int count)
{
SqlHelper.ExecuteNonQuery($"DELETE FROM {tableName} WHERE GEN_TIME >= DATEADD({yearOrMonthOrDay}, {count}, GETDATE()");
}
/// <summary>
/// 查找文件夹(不存在则创建)
/// 查找后为文件夹设定权限-完全控制
/// </summary>
/// <param name="backupPath"></param>
private static void GetOrCreateDirectory(string backupPath)
{
// 检查备份路径是否存在,如果不存在则创建
if (!Directory.Exists(Path.GetDirectoryName(backupPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(backupPath));
try
{
// 定义文件夹路径
string folderPath = rootPath;
// 获取文件夹信息
DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);
// 获取当前文件夹的安全性设置
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
// 定义 "Authenticated Users" 用户组
NTAccount authenticatedUsers = new NTAccount("Authenticated Users");
// 定义权限(这里使用读取和执行权限)
FileSystemRights fileSystemRights = FileSystemRights.FullControl;
// 定义授权类型
InheritanceFlags inheritanceFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
PropagationFlags propagationFlags = PropagationFlags.None;
AccessControlType accessControlType = AccessControlType.Allow;
// 创建权限规则
FileSystemAccessRule rule = new FileSystemAccessRule(authenticatedUsers, fileSystemRights, inheritanceFlags, propagationFlags, accessControlType);
// 添加权限规则到文件夹的安全性设置
directorySecurity.AddAccessRule(rule);
// 设置新的安全性设置到文件夹
directoryInfo.SetAccessControl(directorySecurity);
//Console.WriteLine("权限已成功添加到文件夹: " + folderPath);
}
catch
{
//Console.WriteLine("添加权限失败: " + ex.Message);
}
}
}
}
}