fg_yida_2/YiDa_WinForm/Service/FormulaBusinessService.cs
2026-01-29 08:39:56 +08:00

189 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}