189 lines
7.0 KiB
C#
189 lines
7.0 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using YiDa_WinForm.Service;
|
||
|
||
namespace YiDa_WinForm.Business
|
||
{
|
||
/// <summary>
|
||
/// 配方业务服务类
|
||
/// </summary>
|
||
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<DataRow> SelectedFormula1 { get; private set; } // 设备1选中配方
|
||
public List<DataRow> SelectedFormula2 { get; private set; } // 设备2选中配方
|
||
#endregion
|
||
|
||
#region 构造函数
|
||
/// <summary>
|
||
/// 构造函数(注入数据库操作服务)
|
||
/// </summary>
|
||
/// <param name="buttonOperationService">数据库操作服务实例</param>
|
||
public FormulaBusinessService(ButtonOperationService buttonOperationService)
|
||
{
|
||
_buttonOperationService = buttonOperationService ?? throw new ArgumentNullException(nameof(buttonOperationService));
|
||
OriginalFormula = new DataTable();
|
||
UniqueFormula = new DataTable();
|
||
MqttDic = new DataTable();
|
||
SelectedFormula1 = new List<DataRow>();
|
||
SelectedFormula2 = new List<DataRow>();
|
||
}
|
||
#endregion
|
||
|
||
#region 公开方法(供MainForm调用,封装配方核心业务)
|
||
/// <summary>
|
||
/// 加载配方数据(从数据库查询并去重,供下拉框绑定)
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 加载MQTT参数字典(用于参数名中文映射)
|
||
/// </summary>
|
||
public async Task LoadMqttDicAsync()
|
||
{
|
||
DataTable dt = await _buttonOperationService.InitMqttDic();
|
||
MqttDic = dt ?? new DataTable();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 刷新选中的配方(根据下拉框选择值筛选)
|
||
/// </summary>
|
||
/// <param name="selectedPart1">设备1下拉框选中的 part_number_name</param>
|
||
/// <param name="selectedPart2">设备2下拉框选中的 part_number_name</param>
|
||
public void RefreshSelectedFormula(string selectedPart1, string selectedPart2)
|
||
{
|
||
// 筛选设备1配方
|
||
SelectedFormula1 = FilterFormulaBySelectedPart(selectedPart1);
|
||
|
||
// 筛选设备2配方
|
||
SelectedFormula2 = FilterFormulaBySelectedPart(selectedPart2);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 映射MQTT参数名(英文 → 中文,从字典表匹配)
|
||
/// </summary>
|
||
/// <param name="paramCode">MQTT原始参数编码(英文)</param>
|
||
/// <returns>映射后的中文参数名(无匹配则返回原始编码)</returns>
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据参数名匹配配方中的对应行
|
||
/// </summary>
|
||
/// <param name="formulaList">目标配方列表</param>
|
||
/// <param name="paramName">参数名(中文)</param>
|
||
/// <returns>匹配到的配方行(无匹配返回null)</returns>
|
||
public DataRow MatchFormulaByParamName(List<DataRow> formulaList, string paramName)
|
||
{
|
||
if (formulaList == null || formulaList.Count == 0 || string.IsNullOrEmpty(paramName))
|
||
{
|
||
return null;
|
||
}
|
||
|
||
return formulaList.FirstOrDefault(r => r.Field<string>("parameter_name") == paramName);
|
||
}
|
||
#endregion
|
||
|
||
#region 内部辅助方法(私有,封装核心筛选逻辑)
|
||
/// <summary>
|
||
/// 根据下拉框选中值筛选对应的配方列表
|
||
/// </summary>
|
||
/// <param name="selectedPart">下拉框选中的 part_number_name</param>
|
||
/// <returns>筛选后的配方列表</returns>
|
||
private List<DataRow> FilterFormulaBySelectedPart(string selectedPart)
|
||
{
|
||
if (string.IsNullOrEmpty(selectedPart) || selectedPart == "-1" || OriginalFormula.Rows.Count == 0)
|
||
{
|
||
return new List<DataRow>();
|
||
}
|
||
|
||
// 拆分 part_number|part_name
|
||
string[] partArr = selectedPart.Split('|');
|
||
if (partArr.Length != 2)
|
||
{
|
||
return new List<DataRow>();
|
||
}
|
||
|
||
string partNumber = partArr[0];
|
||
string partName = partArr[1];
|
||
|
||
// 筛选匹配的配方行
|
||
return OriginalFormula.AsEnumerable()
|
||
.Where(r => r.Field<string>("part_number") == partNumber
|
||
&& r.Field<string>("part_name") == partName)
|
||
.ToList();
|
||
}
|
||
#endregion
|
||
}
|
||
} |