using System; using System.Configuration; using System.IO; using XP.Common.Logging.Interfaces; namespace XP.ReportEngine.Configs { /// /// 报告引擎配置加载器(读取 App.config)| Report engine configuration loader (reads from App.config) /// public class ConfigLoader { private readonly ILoggerService _logger; /// /// 构造函数 | Constructor /// /// 日志服务 | Logger service public ConfigLoader(ILoggerService logger) { _logger = logger.ForModule(); } /// /// 从 App.config 加载报告引擎配置 | Load report engine configuration from App.config /// /// 配置前缀,默认为 "Report" | Configuration prefix, default is "Report" /// 报告配置对象 | Report configuration object public ReportConfig LoadReportConfig(string prefix = "Report") { try { _logger.Info("开始从 App.config 加载报告引擎配置,前缀: {Prefix} | Loading report config from App.config, prefix: {Prefix}", prefix); var config = new ReportConfig(); // 读取输出目录 | Read output directory var outputDirectory = ConfigurationManager.AppSettings[$"{prefix}:OutputDirectory"]; if (!string.IsNullOrEmpty(outputDirectory)) { config.OutputDirectory = outputDirectory; } // 读取模板路径 | Read template path var templatePath = ConfigurationManager.AppSettings[$"{prefix}:TemplatePath"]; if (!string.IsNullOrEmpty(templatePath)) { config.TemplatePath = templatePath; } // 读取文件名模式 | Read file name pattern var fileNamePattern = ConfigurationManager.AppSettings[$"{prefix}:FileNamePattern"]; if (!string.IsNullOrEmpty(fileNamePattern)) { config.FileNamePattern = fileNamePattern; } // 读取重复文件名自动累加设置 | Read auto-increment on duplicate setting var autoIncrement = ConfigurationManager.AppSettings[$"{prefix}:AutoIncrementOnDuplicate"]; if (bool.TryParse(autoIncrement, out var autoIncrementValue)) { config.AutoIncrementOnDuplicate = autoIncrementValue; } // 读取自动打开设置 | Read auto-open setting var autoOpen = ConfigurationManager.AppSettings[$"{prefix}:AutoOpenAfterGenerate"]; if (bool.TryParse(autoOpen, out var autoOpenValue)) { config.AutoOpenAfterGenerate = autoOpenValue; } // 读取页面尺寸 | Read page size var pageSize = ConfigurationManager.AppSettings[$"{prefix}:DefaultPageSize"]; if (!string.IsNullOrEmpty(pageSize)) { config.DefaultPageSize = pageSize; } // 读取页面方向 | Read page orientation var orientation = ConfigurationManager.AppSettings[$"{prefix}:DefaultOrientation"]; if (!string.IsNullOrEmpty(orientation)) { config.DefaultOrientation = orientation; } // 读取边距配置 | Read margin configuration var marginTop = ConfigurationManager.AppSettings[$"{prefix}:MarginTop"]; if (float.TryParse(marginTop, out var marginTopValue)) { config.MarginTop = marginTopValue; } var marginBottom = ConfigurationManager.AppSettings[$"{prefix}:MarginBottom"]; if (float.TryParse(marginBottom, out var marginBottomValue)) { config.MarginBottom = marginBottomValue; } var marginLeft = ConfigurationManager.AppSettings[$"{prefix}:MarginLeft"]; if (float.TryParse(marginLeft, out var marginLeftValue)) { config.MarginLeft = marginLeftValue; } var marginRight = ConfigurationManager.AppSettings[$"{prefix}:MarginRight"]; if (float.TryParse(marginRight, out var marginRightValue)) { config.MarginRight = marginRightValue; } // 读取公司名称 | Read company name var companyName = ConfigurationManager.AppSettings[$"{prefix}:CompanyName"]; if (!string.IsNullOrEmpty(companyName)) { config.CompanyName = companyName; } // 读取公司 Logo 路径 | Read company logo path var companyLogo = ConfigurationManager.AppSettings[$"{prefix}:CompanyLogo"]; if (!string.IsNullOrEmpty(companyLogo)) { config.CompanyLogo = companyLogo; } // 验证配置 | Validate configuration ValidateConfig(config); _logger.Info("报告引擎配置加载成功:输出目录={OutputDir}, 模板={Template} | Report config loaded: OutputDir={OutputDir}, Template={Template}", config.OutputDirectory, config.TemplatePath); return config; } catch (Exception ex) { _logger.Warn("加载报告引擎配置失败,使用默认配置 | Failed to load report config, using defaults: {Message}", ex.Message); return new ReportConfig(); } } /// /// 验证配置参数 | Validate configuration parameters /// /// 报告配置对象 | Report configuration object private void ValidateConfig(ReportConfig config) { // 验证输出目录(不存在则尝试创建)| Validate output directory (create if not exists) if (string.IsNullOrWhiteSpace(config.OutputDirectory)) { _logger.Warn("OutputDirectory 为空,使用默认值 | OutputDirectory is empty, using default"); config.OutputDirectory = new ReportConfig().OutputDirectory; } // 验证模板路径 | Validate template path if (string.IsNullOrWhiteSpace(config.TemplatePath)) { _logger.Warn("TemplatePath 为空,使用默认值 | TemplatePath is empty, using default"); config.TemplatePath = @"Templates\StandardReportTemplate.json"; } // 验证文件名模式 | Validate file name pattern if (string.IsNullOrWhiteSpace(config.FileNamePattern)) { _logger.Warn("FileNamePattern 为空,使用默认值 | FileNamePattern is empty, using default"); config.FileNamePattern = "{ReportId}"; } // 验证页面方向 | Validate page orientation if (config.DefaultOrientation != "Portrait" && config.DefaultOrientation != "Landscape") { _logger.Warn("DefaultOrientation 无效: {Value},使用默认值 Portrait | DefaultOrientation invalid: {Value}, using default Portrait", config.DefaultOrientation); config.DefaultOrientation = "Portrait"; } // 验证边距范围(0-100mm)| Validate margin range (0-100mm) config.MarginTop = ClampMargin(config.MarginTop, "MarginTop"); config.MarginBottom = ClampMargin(config.MarginBottom, "MarginBottom"); config.MarginLeft = ClampMargin(config.MarginLeft, "MarginLeft"); config.MarginRight = ClampMargin(config.MarginRight, "MarginRight"); // 验证 Logo 路径(如果配置了则检查文件是否存在)| Validate logo path (check file exists if configured) if (!string.IsNullOrEmpty(config.CompanyLogo)) { var logoPath = Path.IsPathRooted(config.CompanyLogo) ? config.CompanyLogo : Path.Combine(AppDomain.CurrentDomain.BaseDirectory, config.CompanyLogo); if (!File.Exists(logoPath)) { _logger.Warn("公司 Logo 文件不存在: {Path},将不显示 Logo | Company logo file not found: {Path}, logo will not be displayed", logoPath); } } } /// /// 将边距值限制在有效范围内 | Clamp margin value to valid range /// private float ClampMargin(float value, string name) { if (value < 0 || value > 100) { _logger.Warn("{Name} 超出有效范围 [0, 100]: {Value},使用默认值 20 | {Name} out of valid range [0, 100]: {Value}, using default 20", name, value); return 20f; } return value; } } }