EPLAN_PROD_Plugin/Sinvo.EplanHpD.Plugin.WPFUI/Utils/ExcelHelper.cs

111 lines
4.1 KiB
C#
Raw Normal View History

2024-10-24 18:01:26 +08:00
using MiniExcelLibs;
using MiniExcelLibs.OpenXml;
using Sinvo.EplanHpD.Plugin.WPFUI.Models;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
{
public class ExcelHelper
{
private static IEnumerable<InsulationModel> _insulations;
2024-10-24 18:01:26 +08:00
private static IEnumerable<ExcelModel> _terminalMappingCache = [];
/// <summary>
/// 线材端子对照表
/// </summary>
2024-10-26 14:00:04 +08:00
public static IEnumerable<ExcelModel> GetWireTerminalMappingTable(string wireModel, string prefix = "")
2024-10-24 18:01:26 +08:00
{
CheckAndGetCache();
改进电缆数据处理和检查逻辑,更新版本号 在 `CheckTest.cs` 文件中,添加了多个测试方法,包括 `DPETerminalCheckTest`、`DPETerminalCrossSectionCheckTest` 和 `TerminalCheckTest`,用于检查不同端子的测试逻辑。 在 `AssemblyInfo.cs` 文件中,更新了程序集版本号和文件版本号。 在 `StuffTest.cs` 文件中,注释掉了一些断言语句,并添加了一个新的测试方法 `StuffedNameTubeTest`,用于测试号码管处理逻辑。 在 `LectotypeWindow.xaml` 文件中,添加了 `util` 命名空间引用,并定义了多个 `ControlTemplate` 模板和一个 `LectotypeLengthDataTemplateSelector` 模板选择器,用于根据线材类型选择不同的显示模板。同时,将 `DataGrid` 控件替换为 `ListView` 控件,并添加了上下文菜单和样式触发器。 在 `LectotypeWindow.xaml.cs` 文件中,添加了 `ToSourceMenuItem_Click` 方法,用于处理上下文菜单项的点击事件。 在 `MainWindow.xaml.cs` 文件中,重构了 `AddToDesignerSelectSet` 方法,添加了异常处理逻辑。 在 `Sinvo.EplanHpD.Plugin.WPFUI.csproj` 文件中,添加了 `LectotypeLengthDataTemplateSelector.cs` 文件的编译项。 在 `ExcelHelper.cs` 文件中,修改了 `GetWireTerminalMappingTable` 方法的过滤逻辑。 新增了 `LectotypeLengthDataTemplateSelector.cs` 文件,定义了 `LectotypeLengthDataTemplateSelector` 类,用于根据线材类型选择不同的数据模板。 在 `LectotypeViewModel.cs` 文件中: * 添加了对 `EPLAN.Harness.ProjectCore.Occurrences` 命名空间的引用。 * 添加了 `StuffedWires` 属性及其对应的私有字段 `_stuffedWires`。 * 在 `LoadData` 方法中,添加了对 `StuffData` 方法的调用,并将结果赋值给 `Wires`。 * 添加了 `StuffData` 方法,用于整理和合并电缆数据。 * 在 `ToSource` 方法中,添加了根据电缆名称获取设计器并设置可见性的逻辑。 * 修改了 `CableType` 的默认值从 "位置类型" 改为 "未知类型"。 在 `MainViewModel.Check.cs` 文件中: * 添加了 `CheckDPETerminals` 方法,用于检查地排端子。 * 修改了 `CheckTerminals` 方法,移除了对 `D-PE` 前缀的特殊处理逻辑。 * 修改了 `GetD_PECanUsedTerminal` 方法,注释掉了获取不包含前缀的端子的逻辑。 在 `DesignPluginEntry.cs` 文件中: * 注释掉了 `DesignPluginEntry` 类实现的 `IHpDPlugin` 接口。 在 `AssemblyInfo.cs` 文件中: * 更新了程序集版本号,从 `1.0.0.6` 更新到 `1.0.0.14`。
2024-11-08 08:34:20 +08:00
return _terminalMappingCache.Where(item => item.WireModelSpecification == wireModel && (item.Prefix == prefix || prefix == ""));
更新多个文件,添加新功能和修复bug 在 `CheckTest.cs` 文件中,添加了三个新的测试方法:`CheckWireErpNrTest`、`ChecImprintTest` 和 `CheckSizeTest`。 在 `AssemblyInfo.cs` 文件中,将程序集版本和文件版本从 `1.0.0.5` 更新为 `1.0.0.6`。 在 `StuffTest.cs` 文件中,添加了一个新的断言 `Assert.IsTrue(result.Where(it => it.Imprint == "EC5L3").First().WireColor == "BK");`。 在 `LectotypeWindow.xaml` 文件中,添加了一个新的 `Window` 定义,包括资源字典、按钮和 `TabControl` 控件。 在 `LectotypeWindow.xaml.cs` 文件中,添加了 `LectotypeWindow` 类的定义和相关的事件处理方法。 在 `MainWindow.xaml` 文件中,移除了旧的样式定义,添加了新的资源字典引用,并更新了 `GroupBox` 为 `hc:Card` 控件,调整了按钮样式和 `DataGrid` 的样式。 在 `MainWindow.xaml` 文件中,更新了 `DataGrid` 的 `RowStyle` 和 `CellStyle`,并添加了新的触发器和样式设置。 在 `MainWindow.xaml` 文件中,更新了检查配置项的布局,使用 `hc:Card` 控件替换了 `GroupBox`,并调整了文本块的样式和布局。 在 `MainWindow.xaml.cs` 文件中: * 在 `MainWindow` 类中添加了对 `model.IsError` 的检查,如果为 `true`,则将 `model.IsIgnore` 设置为 `true`。 * 在 `Copy_Click` 方法中添加了 `try-catch` 块来捕获异常,并在捕获到异常时显示错误消息。 * 在 `GoToSource_Click` 方法中添加了 `try-catch` 块来捕获异常,并在捕获到异常时显示错误消息。 * 将 `Array.Empty<object>()` 替换为 `[]`。 在 `CheckedModel.cs` 文件中: * 注释掉了 `SetProperty` 方法中对 `Equals` 方法的检查。 在 `LectotypeModel.cs` 文件中: * 新增了 `LectotypeModel` 类,包含多个属性和相应的 `OnPropertyChanged` 调用。 在 `LineSegmentModel.cs` 文件中: * 新增了 `LineSegmentModel` 类,包含 `LineAxisNo`、`LineType` 和 `LineParagraph` 属性。 在 `AssemblyInfo.cs` 文件中: * 更新了程序集版本号,从 `1.0.0.5` 更新到 `1.0.0.6`。 在 `Sinvo.EplanHpD.Plugin.WPFUI.csproj` 文件中: * 添加了对 `EPLAN.Harness.MathLib` 的引用。 * 添加了 `LectotypeWindow.xaml` 和 `TestWindow.xaml` 及其对应的代码文件。 * 添加了 `HandyControl` 包的引用。 在 `TestWindow.xaml` 文件中: * 新增了 `TestWindow` 窗口的 XAML 定义,包含一个 `DataGrid` 控件。 在 `TestWindow.xaml.cs` 文件中: * 新增了 `TestWindow` 类,包含加载数据的方法。 在 `ExcelHelper.cs` 文件中: * 修改了 `GetWireTerminalMappingTable` 方法,使其在 `Prefix` 为 `null` 时也能匹配。 * 新增了 `GetWireInfo` 方法,用于获取线材信息。 在 `LectotypeViewModel.cs` 文件中: * 新增了 `LectotypeViewModel` 类,包含加载数据的方法和多个辅助方法。 在 `MainViewModel.Check.cs` 文件中: * 在 `ValidateItem` 方法中添加了对 `CheckWireErpNr` 方法的调用。 * 新增了 `CheckWireErpNr` 方法,用于检查线材料号。 * 在 `CheckNumberTube` 方法中添加了对 `item.Imprint` 是否为空的检查。 将 `data.AsParallel().WithDegreeOfParallelism(8).ForAll(entry =>` 修改为 `data.Where(it => it.OrigOcc == "OccWire" && !(it?.Properties["WireName"]?.GetDisplayValue()?.StartsWith("导线") ?? false)).AsParallel().WithDegreeOfParallelism(1).ForAll(entry =>`,以过滤出 `OrigOcc` 为 "OccWire" 且 `WireName` 不以 "导线" 开头的数据,并将并行度设置为 1。 将 `data.FrontTerminalModel = item.ConnectorFrom.Contains(":") ? item.ConnectorFrom.Split(':')[0] : item.ConnectorFrom;` 修改为 `data.FrontTerminalModel = item.ConnectorFrom?.Contains(":") ?? false ? item.ConnectorFrom.Split(':')[0] : item.ConnectorFrom ?? "";`,以处理 `ConnectorFrom` 可能为 null 的情况。 将 `data.RearTerminalModel = item.ConnectorTo.Contains(":") ? item.ConnectorTo.Split(':')[0] : item.ConnectorTo;` 修改为 `data.RearTerminalModel = item.ConnectorTo?.Contains(":") ?? false ? item.ConnectorTo.Split(':')[0] : item.ConnectorTo ?? "";`,以处理 `ConnectorTo` 可能为 null 的情况。 删除了 `if (insulationModels.Any()) { data.Insulation = insulationModels.First(); }` 语句块,简化了代码逻辑。 更新了 `GetWireColorCode` 方法中的注释,将原来的注释替换为更简洁的版本。
2024-11-07 12:14:44 +08:00
}
/// <summary>
/// 获取线材信息
/// </summary>
public static IEnumerable<ExcelModel> GetWireInfo(string wireModel, string prefix = "")
{
CheckAndGetCache();
return _terminalMappingCache.Where(item => item.WireModelSpecification == wireModel && (item.Prefix == prefix || item.Prefix == null));
2024-10-24 18:01:26 +08:00
}
public static void CheckAndGetCache(bool isForceReload = false)
2024-10-24 18:01:26 +08:00
{
lock (_terminalMappingCache)
{
if ((_terminalMappingCache == null || !_terminalMappingCache.Any()) || isForceReload)
2024-10-24 18:01:26 +08:00
{
GetAllWireTerminalMappingTable();
}
}
}
private static void GetAllWireTerminalMappingTable()
{
var config = new OpenXmlConfiguration()
{
FillMergedCells = true
};
var path = Path.Combine(Consts.DATA_FILE_PATH, Consts.DATA_FILE_PATH_WIRE_TERMINAL);
var result = MiniExcel.Query<ExcelModel>(path, configuration: config)
//.Where(item => item.WireModelSpecification == wireModel)
.ToList();
_terminalMappingCache = result;
}
/// <summary>
/// 绝缘软套
/// </summary>
public static IEnumerable<InsulationModel> GetInsulationSoftSleeveTable(string wireModel)
{
if(_insulations != null)
{
return _insulations.Where(item => item.Specification == wireModel);
}
2024-10-24 18:01:26 +08:00
var path = Path.Combine(Consts.DATA_FILE_PATH, Consts.DATA_FILE_PATH_INSULATION);
var results = MiniExcel.Query<InsulationModel>(path);
if(_insulations == null)
{
_insulations = results;
}
2024-10-24 18:01:26 +08:00
//.Where(item => item.Specification == wireModel)
//.ToList();
return results.Where(item => item.Specification == wireModel);
}
//public static List<IDictionary<string, object>> GetWireTerminalMappingTable()
//{
// var config = new OpenXmlConfiguration()
// {
// FillMergedCells = true
// };
// return MiniExcel.Query("D:\\Desktop\\123\\线材端子号码管配对表(配CE端子)2024-10-18.xlsm", useHeaderRow: true, configuration: config)
// //.Where(item => item.WireModelSpecification == wireModel)
// .Cast<IDictionary<string, object>>()
// .ToList();
//}
2024-11-02 11:56:50 +08:00
public static dynamic GetNumberTube(string tubeModel)
2024-10-24 18:01:26 +08:00
{
CheckAndGetCache();
2024-11-02 11:56:50 +08:00
return _terminalMappingCache.Where(item => item.TubeModel == tubeModel)
.Select(item => new
{
item.TubeModel,
item.TubeMaterialCode,
})
2024-10-24 18:01:26 +08:00
.FirstOrDefault();
}
public static void SaveByTemplate(object data, string newFilePath)
{
var config = new OpenXmlConfiguration()
{
IgnoreTemplateParameterMissing = true,
};
var path = Path.Combine(Consts.DATA_FILE_PATH, Consts.TEMPLATE_FILE_NAME);
MiniExcel.SaveAsByTemplate(newFilePath, path, new
{
items = data
}, configuration: config);
}
}
}