using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using YiDa_WinForm.Service; namespace YiDa_WinForm.Business { /// /// 配方业务服务类 /// public class FormulaBusinessService { #region 依赖注入与缓存 // 依赖数据库操作服务 private readonly ButtonOperationService _buttonOperationService; // 配方缓存(全局复用,避免重复查询数据库) public DataTable OriginalFormula { get; private set; } // 原始完整配方表 public DataTable UniqueFormula { get; private set; } // 去重后配方表(用于下拉框) public DataTable MqttDic { get; private set; } // MQTT参数字典表 // 选中的配方缓存(供外部调用) public List SelectedFormula1 { get; private set; } // 设备1选中配方 public List SelectedFormula2 { get; private set; } // 设备2选中配方 #endregion #region 构造函数 /// /// 构造函数(注入数据库操作服务) /// /// 数据库操作服务实例 public FormulaBusinessService(ButtonOperationService buttonOperationService) { _buttonOperationService = buttonOperationService ?? throw new ArgumentNullException(nameof(buttonOperationService)); OriginalFormula = new DataTable(); UniqueFormula = new DataTable(); MqttDic = new DataTable(); SelectedFormula1 = new List(); SelectedFormula2 = new List(); } #endregion #region 公开方法(供MainForm调用,封装配方核心业务) /// /// 加载配方数据(从数据库查询并去重,供下拉框绑定) /// public async Task LoadFormulaAsync() { // 1. 从数据库查询原始配方 DataTable dt = await _buttonOperationService.QueryFormulaAsync(); if (dt == null || dt.Rows.Count == 0) { OriginalFormula = new DataTable(); UniqueFormula = new DataTable(); return; } // 2. 新增拼接列(part_number|part_name) if (!dt.Columns.Contains("part_number_name")) { dt.Columns.Add("part_number_name", typeof(string)); } foreach (DataRow row in dt.Rows) { row["part_number_name"] = $"{row["part_number"]}|{row["part_name"]}"; } // 3. 配方去重(按 part_number_name 分组) var uniqueParts = dt.AsEnumerable() .GroupBy(r => r["part_number_name"].ToString()) .Select(g => g.First()) .ToList(); // 4. 构建去重后的数据表(添加空白行供下拉框默认选择) DataTable dtUnique = dt.Clone(); foreach (var row in uniqueParts) { dtUnique.ImportRow(row); } // 新增空白行(索引0) DataRow blankRow = dtUnique.NewRow(); blankRow["id"] = -1; blankRow["part_number_name"] = string.Empty; dtUnique.Rows.InsertAt(blankRow, 0); // 5. 更新缓存 OriginalFormula = dt; UniqueFormula = dtUnique; } /// /// 加载MQTT参数字典(用于参数名中文映射) /// public async Task LoadMqttDicAsync() { DataTable dt = await _buttonOperationService.InitMqttDic(); MqttDic = dt ?? new DataTable(); } /// /// 刷新选中的配方(根据下拉框选择值筛选) /// /// 设备1下拉框选中的 part_number_name /// 设备2下拉框选中的 part_number_name public void RefreshSelectedFormula(string selectedPart1, string selectedPart2) { // 筛选设备1配方 SelectedFormula1 = FilterFormulaBySelectedPart(selectedPart1); // 筛选设备2配方 SelectedFormula2 = FilterFormulaBySelectedPart(selectedPart2); } /// /// 映射MQTT参数名(英文 → 中文,从字典表匹配) /// /// MQTT原始参数编码(英文) /// 映射后的中文参数名(无匹配则返回原始编码) public string MapMqttParamName(string paramCode) { if (string.IsNullOrEmpty(paramCode) || MqttDic.Rows.Count == 0) { return paramCode; } try { DataRow[] drs = MqttDic.Select($"param_code = '{paramCode}'"); return drs != null && drs.Length > 0 ? drs[0]["param_name"].ToString() : paramCode; } catch (Exception) { return paramCode; } } /// /// 根据参数名匹配配方中的对应行 /// /// 目标配方列表 /// 参数名(中文) /// 匹配到的配方行(无匹配返回null) public DataRow MatchFormulaByParamName(List formulaList, string paramName) { if (formulaList == null || formulaList.Count == 0 || string.IsNullOrEmpty(paramName)) { return null; } return formulaList.FirstOrDefault(r => r.Field("parameter_name") == paramName); } #endregion #region 内部辅助方法(私有,封装核心筛选逻辑) /// /// 根据下拉框选中值筛选对应的配方列表 /// /// 下拉框选中的 part_number_name /// 筛选后的配方列表 private List FilterFormulaBySelectedPart(string selectedPart) { if (string.IsNullOrEmpty(selectedPart) || selectedPart == "-1" || OriginalFormula.Rows.Count == 0) { return new List(); } // 拆分 part_number|part_name string[] partArr = selectedPart.Split('|'); if (partArr.Length != 2) { return new List(); } string partNumber = partArr[0]; string partName = partArr[1]; // 筛选匹配的配方行 return OriginalFormula.AsEnumerable() .Where(r => r.Field("part_number") == partNumber && r.Field("part_name") == partName) .ToList(); } #endregion } }