feat: 初始化 PCB 检测 WPF 应用程序

* 创建 AxiOmron.PcbCheck 项目主框架及解决方案
* 添加 Dashboard 和系统设置页面
* 实现 Modbus TCP PLC、扫码枪、SFTP 查询等核心服务
* 集成 Andon 报警、工作流托管服务与日志配置
* 补充项目文档和 UI 设计规范
This commit is contained in:
2026-04-17 10:43:51 +08:00
parent 660ee99442
commit 49f113dcf3
46 changed files with 8042 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
using System.IO;
using System.Text.Json;
using AxiOmron.PcbCheck.Options;
using AxiOmron.PcbCheck.Services.Interfaces;
namespace AxiOmron.PcbCheck.Services.Implementations;
/// <summary>
/// 提供应用配置文件的读取与保存能力。
/// </summary>
public sealed class AppConfigService : IAppConfigService
{
private static readonly JsonSerializerOptions JsonOptions = new()
{
PropertyNameCaseInsensitive = true,
WriteIndented = true
};
/// <summary>
/// 读取当前应用配置。
/// </summary>
/// <returns>根配置对象。</returns>
public AppConfig Load()
{
var configPath = GetConfigPath();
if (!File.Exists(configPath))
{
var defaultConfig = new AppConfig();
Save(defaultConfig);
return defaultConfig;
}
var json = File.ReadAllText(configPath);
var config = JsonSerializer.Deserialize<AppConfig>(json, JsonOptions);
return config ?? new AppConfig();
}
/// <summary>
/// 保存当前应用配置。
/// </summary>
/// <param name="config">待保存的配置对象。</param>
public void Save(AppConfig config)
{
ArgumentNullException.ThrowIfNull(config);
var configPath = GetConfigPath();
var directory = Path.GetDirectoryName(configPath);
if (!string.IsNullOrWhiteSpace(directory))
{
Directory.CreateDirectory(directory);
}
var json = JsonSerializer.Serialize(config, JsonOptions);
File.WriteAllText(configPath, json);
}
/// <summary>
/// 获取主配置文件路径。
/// </summary>
/// <returns>配置文件绝对路径。</returns>
public string GetConfigPath()
{
return Path.Combine(AppContext.BaseDirectory, "appConfig.json");
}
}