Merge remote-tracking branch 'origin/master'

master
tongg 5 months ago
commit 55c95e13be
  1. BIN
      Resource/ResultReport.xlsx
  2. 15
      SparkClient.csproj
  3. 332
      ViewModel/Grading/GradingResultVM.cs
  4. 0
      csv/histroy.csv

Binary file not shown.

@ -35,6 +35,7 @@
<PackageReference Include="MethodDecorator.Fody" Version="1.1.1" /> <PackageReference Include="MethodDecorator.Fody" Version="1.1.1" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" /> <PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />
<PackageReference Include="Microsoft.Office.Interop.Excel" Version="15.0.4795.1001" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2903.40" /> <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2903.40" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NPOI" Version="2.7.2" /> <PackageReference Include="NPOI" Version="2.7.2" />
@ -44,7 +45,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="csv\histroy.csv" />
<None Remove="ffmpeg.exe" /> <None Remove="ffmpeg.exe" />
<None Remove="FodyWeavers.xml" /> <None Remove="FodyWeavers.xml" />
<None Remove="Resource\Document\Helper_en.pdf" /> <None Remove="Resource\Document\Helper_en.pdf" />
@ -73,9 +73,6 @@
<None Remove="Resource\Images\UIResource\round_P8-P8.png" /> <None Remove="Resource\Images\UIResource\round_P8-P8.png" />
<None Remove="Resource\Images\UIResource\round_select.png" /> <None Remove="Resource\Images\UIResource\round_select.png" />
<None Remove="Resource\Images\ze-add-o 1%403x.png" /> <None Remove="Resource\Images\ze-add-o 1%403x.png" />
<Content Include="csv\histroy.csv">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="ffmpeg.exe"> <Content Include="ffmpeg.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
@ -224,6 +221,9 @@
<Resource Include="Resource\Images\UIResource\Next.png" /> <Resource Include="Resource\Images\UIResource\Next.png" />
<None Remove="Resource\Images\UIResource\NextHover.png" /> <None Remove="Resource\Images\UIResource\NextHover.png" />
<Resource Include="Resource\Images\UIResource\NextHover.png" /> <Resource Include="Resource\Images\UIResource\NextHover.png" />
<None Update="Resource\ResultReport.xlsx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -275,9 +275,16 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="office">
<HintPath>C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL</HintPath>
</Reference>
<Reference Include="SparkDotNetCore"> <Reference Include="SparkDotNetCore">
<HintPath>bin\Debug\net8.0-windows\SparkDotNetCore.dll</HintPath> <HintPath>bin\Debug\net8.0-windows\SparkDotNetCore.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="csv\" />
</ItemGroup>
</Project> </Project>

@ -29,11 +29,15 @@ using FontFamily = System.Drawing.FontFamily;
using FontStyle = System.Drawing.FontStyle; using FontStyle = System.Drawing.FontStyle;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using System.Windows.Media; using System.Windows.Media;
using HandyControl.Tools.Extension;
using NPOI.SS.Util;
using Brush = System.Drawing.Brush; using Brush = System.Drawing.Brush;
using Brushes = System.Drawing.Brushes; using Brushes = System.Drawing.Brushes;
using SparkClient.Model.Attributes; using SparkClient.Model.Attributes;
using SparkClient.Model.Common; using SparkClient.Model.Common;
using PaperSize = System.Drawing.Printing.PaperSize; using PaperSize = System.Drawing.Printing.PaperSize;
using SharpDX.Direct2D1.Effects;
namespace SparkClient.ViewModel.Grading; namespace SparkClient.ViewModel.Grading;
/// <summary> /// <summary>
@ -284,7 +288,10 @@ public class GradingResultVM : BaseViewModel
using (var writer = new StreamWriter(filePath,true)) using (var writer = new StreamWriter(filePath,true))
{ {
Measurements info = algorithmResult.measurements; Measurements info = algorithmResult.measurements;
string line = $"{FormatDouble_A(info.M1)}(mm)," + string line =
$"{DiamondCode}," +
$"{Wight}(ct)," +
$"{FormatDouble_A(info.M1)}(mm)," +
$"{FormatDouble_A(info.M2)}(mm)," + $"{FormatDouble_A(info.M2)}(mm)," +
$"{FormatDouble_A(info.M3)}(mm)," + $"{FormatDouble_A(info.M3)}(mm)," +
$"{FormatDouble_P(info.TABLE)}%," + $"{FormatDouble_P(info.TABLE)}%," +
@ -302,6 +309,35 @@ public class GradingResultVM : BaseViewModel
writer.WriteLine(line); writer.WriteLine(line);
} }
} }
else
{
File.Create(filePath).Close();
string header = "Diamond Code,Wight,Measurement1, Measurement2, Measurement3, Table, Crown Height,Pavilion Depth, Total Depth,Crown Angle, Pavilion Angle,Culet Size, Girdle Percent,Girdle Name, POL or Pol/ Sym,SYM,CUT - PROP";
Measurements info = algorithmResult.measurements;
string line =
$"{DiamondCode}," +
$"{Wight}(ct)," +
$"{FormatDouble_A(info.M1)}(mm)," +
$"{FormatDouble_A(info.M2)}(mm)," +
$"{FormatDouble_A(info.M3)}(mm)," +
$"{FormatDouble_P(info.TABLE)}%," +
$"{FormatDouble_P(info.CROWN_HEIGHT)}%," +
$"{FormatDouble_P(info.PAV_DEPTH)}%," +
$"{FormatDouble_P(info.TOTAL_DEPTH)}%," +
$"{FormatDouble_A(info.CROWN_ANGLE)}°," +
$"{FormatDouble_A(info.PAV_ANGLE)}°," +
$"{FormatDouble_A(info.CULET_SIZE)}(mm)," +
$"{FormatDouble_P(info.GIRDLE)}%," +
$"{calGirdleName(info)}," +
$"," +
$"," +
$"{GetGradeEnName(GetGradeOrder(CutLevelTotal))}";
using (var writer = new StreamWriter(filePath, true))
{
writer.WriteLine(header);
writer.WriteLine(line);
}
}
} }
private void saveTempDS(string selValue) private void saveTempDS(string selValue)
@ -1586,7 +1622,7 @@ public class GradingResultVM : BaseViewModel
[Log] [Log]
public void ChangeSym(object norm) public void ChangeSym(object norm)
{ {
decimal? order = this.DtResults.Select(x => x.SymLevel).Max(); decimal? order = this.DtResults.Where(x => x.TestItemId != "TWIST").Select(x => x.SymLevel).Max();
if (order.HasValue) if (order.HasValue)
{ {
totalSymGrade = order.Value; totalSymGrade = order.Value;
@ -1939,90 +1975,139 @@ public class GradingResultVM : BaseViewModel
// 执行热敏打印的方法 // 执行热敏打印的方法
[Log] [Log]
private void ExecuteThermalPrint(object parameter) private void ExecuteThermalPrint(object parameter)
{ {
try MessageBox messageBox = new MessageBox();
MessageBoxResult boxResult = messageBox.ShowAsk(MultilingualHelper.getString("YesOrNo"));
if (boxResult != MessageBoxResult.OK)
{ {
// 创建打印文档 return;
PrintDocument printDocument = new PrintDocument(); }
//printDocument.PrintPage += PrintPageHandler;
// 订阅 PrintPage 事件
printDocument.PrintPage += PreparePrintData;
// 创建自定义打印预览窗体
CustomPrintPreviewForm customPreviewForm = new CustomPrintPreviewForm(printDocument);
// 显示自定义打印预览窗体
MessageBox messageBox = new MessageBox();
MessageBoxResult boxResult = messageBox.ShowAsk(MultilingualHelper.getString("YesOrNo"));
if (boxResult == MessageBoxResult.OK)
{
// 打开串口
// if (!_serialPort.IsOpen)
// {
// _serialPort.Open();
// }
// 将绘制内容转换为字节数组
// MemoryStream memoryStream = new MemoryStream();
// using (Bitmap bitmap = new Bitmap((int)printDocument.DefaultPageSettings.PrintableArea.Width, (int)printDocument.DefaultPageSettings.PrintableArea.Height))
// {
// using (var graphics = Graphics.FromImage(bitmap))
// {
// // 计算可打印区域的 Rectangle
// var margins = new Margins(0, 0, 0, 0);
// var printableArea = new System.Drawing.Rectangle(margins.Left, margins.Top,
// (int)printDocument.DefaultPageSettings.PrintableArea.Width - margins.Left - margins.Right,
// (int)printDocument.DefaultPageSettings.PrintableArea.Height - margins.Top - margins.Bottom);
//
// // 调用 PreparePrintData 方法绘制内容到 Graphics 对象
// // 注意这里的第三个参数应该是 Rectangle 类型
// PreparePrintData(printDocument, new PrintPageEventArgs(graphics, printableArea, printableArea, new PageSettings()));
// }
// // 将 Bitmap 保存到 MemoryStream 中
// bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
// }
// byte[] dataToSend = memoryStream.ToArray();
string? printName = ConfigurationManager.AppSettings["PrintName"];
string? printWidth = ConfigurationManager.AppSettings["PrintWidth"];
string? printHeight = ConfigurationManager.AppSettings["PrintHeight"];
int pageWidth = 400;
int pageHeight = 300;
if (string.IsNullOrWhiteSpace(printName) || string.IsNullOrWhiteSpace(printWidth) ||
string.IsNullOrWhiteSpace(printHeight) )
{
Logger.Info("缺少打印配置。");
throw new Exception("The printer parameter is invalid");
}
int.TryParse(printWidth, out pageWidth);
int.TryParse(printHeight, out pageHeight);
printDocument.PrinterSettings.PrinterName = printName;
printDocument.DefaultPageSettings.PaperSize = new PaperSize("mm", pageWidth, pageHeight);
printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
// DialogResult result = customPreviewForm.ShowDialog();
printDocument.Print();
// 发送数据到串口
//_serialPort.Write(dataToSend, 0, dataToSend.Length);
Logger.Info("数据已发送到热敏打印机。"); string tempFilePath = string.Empty;
} Microsoft.Office.Interop.Excel.Application excelApp = null;
try
{
// 步骤2:加载模板并填充数据
tempFilePath = GenerateTempExcelFile();
// 步骤3:使用Excel Interop静默打印
excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = false; // 不显示Excel窗口
excelApp.DisplayAlerts = false; // 禁用警告提示
Microsoft.Office.Interop.Excel.Workbook workbook = excelApp.Workbooks.Open(tempFilePath);
// 打印配置
workbook.PrintOut(
Copies: 1,
Preview: false // 禁用打印预览
);
// 关闭工作簿(不保存修改)
workbook.Close(SaveChanges: false);
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Error($"热敏打印发生错误: {ex.Message}"); new MessageBox().Show($"打印失败: {ex.Message}");
Growl.Error(MultilingualHelper.getString("DiamodResultPrintError"));
} }
finally finally
{ {
// 关闭串口 // 步骤4:清理资源
// if (_serialPort.IsOpen) if (excelApp != null)
// { {
// _serialPort.Close(); excelApp.Quit();
// } System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
}
// 删除临时文件
if (File.Exists(tempFilePath))
{
File.Delete(tempFilePath);
}
} }
// try
// {
// // 创建打印文档
// PrintDocument printDocument = new PrintDocument();
// //printDocument.PrintPage += PrintPageHandler;
// // 订阅 PrintPage 事件
// printDocument.PrintPage += PreparePrintData;
//
// // 创建自定义打印预览窗体
// CustomPrintPreviewForm customPreviewForm = new CustomPrintPreviewForm(printDocument);
//
// // 显示自定义打印预览窗体
//
// MessageBox messageBox = new MessageBox();
// MessageBoxResult boxResult = messageBox.ShowAsk(MultilingualHelper.getString("YesOrNo"));
// if (boxResult == MessageBoxResult.OK)
// {
// // 打开串口
// // if (!_serialPort.IsOpen)
// // {
// // _serialPort.Open();
// // }
//
// // 将绘制内容转换为字节数组
// // MemoryStream memoryStream = new MemoryStream();
// // using (Bitmap bitmap = new Bitmap((int)printDocument.DefaultPageSettings.PrintableArea.Width, (int)printDocument.DefaultPageSettings.PrintableArea.Height))
// // {
// // using (var graphics = Graphics.FromImage(bitmap))
// // {
// // // 计算可打印区域的 Rectangle
// // var margins = new Margins(0, 0, 0, 0);
// // var printableArea = new System.Drawing.Rectangle(margins.Left, margins.Top,
// // (int)printDocument.DefaultPageSettings.PrintableArea.Width - margins.Left - margins.Right,
// // (int)printDocument.DefaultPageSettings.PrintableArea.Height - margins.Top - margins.Bottom);
// //
// // // 调用 PreparePrintData 方法绘制内容到 Graphics 对象
// // // 注意这里的第三个参数应该是 Rectangle 类型
// // PreparePrintData(printDocument, new PrintPageEventArgs(graphics, printableArea, printableArea, new PageSettings()));
// // }
// // // 将 Bitmap 保存到 MemoryStream 中
// // bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
// // }
// // byte[] dataToSend = memoryStream.ToArray();
// string? printName = ConfigurationManager.AppSettings["PrintName"];
// string? printWidth = ConfigurationManager.AppSettings["PrintWidth"];
// string? printHeight = ConfigurationManager.AppSettings["PrintHeight"];
//
// int pageWidth = 400;
// int pageHeight = 300;
// if (string.IsNullOrWhiteSpace(printName) || string.IsNullOrWhiteSpace(printWidth) ||
// string.IsNullOrWhiteSpace(printHeight) )
// {
// Logger.Info("缺少打印配置。");
// throw new Exception("The printer parameter is invalid");
// }
// int.TryParse(printWidth, out pageWidth);
// int.TryParse(printHeight, out pageHeight);
//
// printDocument.PrinterSettings.PrinterName = printName;
// printDocument.DefaultPageSettings.PaperSize = new PaperSize("mm", pageWidth, pageHeight);
// printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
//
// // DialogResult result = customPreviewForm.ShowDialog();
// printDocument.Print();
// // 发送数据到串口
// //_serialPort.Write(dataToSend, 0, dataToSend.Length);
//
// Logger.Info("数据已发送到热敏打印机。");
// }
// }
// catch (Exception ex)
// {
// Logger.Error($"热敏打印发生错误: {ex.Message}");
// Growl.Error(MultilingualHelper.getString("DiamodResultPrintError"));
// }
// finally
// {
// // 关闭串口
// // if (_serialPort.IsOpen)
// // {
// // _serialPort.Close();
// // }
// }
} }
// 自定义打印预览窗体类 // 自定义打印预览窗体类
@ -2238,6 +2323,99 @@ public class GradingResultVM : BaseViewModel
} }
private string GenerateTempExcelFile()
{
string TemplatePath = @"Resource\ResultReport.xlsx";
using (FileStream templateStream = new FileStream(TemplatePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = new XSSFWorkbook(templateStream);
ISheet sheet = workbook.GetSheetAt(0);
//Row 1
SetCellValue(sheet, "A1", $"{MultilingualHelper.getString("Organization")}:{Standard}");
SetCellValue(sheet, "B1", $"{MultilingualHelper.getString("DiamondResultShape")}:{Shape}");
SetCellValue(sheet, "C1", $"{MultilingualHelper.getString("Code")}:{DiamondCode}");
SetCellValue(sheet, "E1", $"{MultilingualHelper.getString("Wight")}:{Wight}ct.");
//Row 2
SetCellValue(sheet, "A2", $"{MultilingualHelper.getString("Parameters")}");
SetCellValue(sheet, "B2", $"{MultilingualHelper.getString("DiamondResultGridAvgValue")}");
SetCellValue(sheet, "C2", $"{MultilingualHelper.getString("Interval")}(Min~Max)");
SetCellValue(sheet, "D2", $"{MultilingualHelper.getString("DiamondResultGridCutLevel")}");
SetCellValue(sheet, "E2", $"{MultilingualHelper.getString("DiamondResultSymmetryGrade")}");
//Row 3
var row3 = getSelectData("DIAMETER");
SetCellValue(sheet, "A3", $"{GetName("DIAMETER")}(mm)");
SetCellValue(sheet, "B3", $"{row3.Avg}");
SetCellValue(sheet, "C3", $"({row3.Min}~{row3.Max})");
SetCellValue(sheet, "D3", "--");
SetCellValue(sheet, "E3", $"{row3.SymLevel}");
//Row 4
var row4 = getSelectData("TOTAL_DEPTH");
SetCellValue(sheet, "A4", $"{GetName("TOTAL_DEPTH")}(%)");
SetCellValue(sheet, "B4", $"{row4.Avg}");
SetCellValue(sheet, "C4", "--");
SetCellValue(sheet, "D4", $"{row4.CutLevel}");
SetCellValue(sheet, "E4", "--");
// Row 5
var row5 = getSelectData("TABLE");
SetCellValue(sheet, "A5", $"{GetName("TABLE")}(%)");
SetCellValue(sheet, "B5", $"{row5.Avg}");
SetCellValue(sheet, "C5", $"({row5.Min}~{row5.Max})");
SetCellValue(sheet, "D5", $"{row5.CutLevel}");
SetCellValue(sheet, "E5", "--");
var row6 = getSelectData("CROWN_ANGLE");
SetCellValue(sheet, "A6", $"{GetName("CROWN_ANGLE")}(°)");
SetCellValue(sheet, "B6", $"{row6.Avg}");
SetCellValue(sheet, "C6", $"({row6.Min}~{row6.Max})");
SetCellValue(sheet, "D6", $"{row6.CutLevel}");
SetCellValue(sheet, "E6", $"{row6.SymLevel}");
var row7 = getSelectData("CROWN_HEIGHT");
SetCellValue(sheet, "A7", $"{GetName("CROWN_HEIGHT")}(%)");
SetCellValue(sheet, "B7", $"{row7.Avg}");
SetCellValue(sheet, "C7", $"({row7.Min}~{row7.Max})");
SetCellValue(sheet, "D7", $"{row7.CutLevel}");
SetCellValue(sheet, "E7", $"{row7.SymLevel}");
var row8 = getSelectData("GIRDLE");
SetCellValue(sheet, "A8", $"{GetName("GIRDLE")}(%)");
SetCellValue(sheet, "B8", $"{row8.Avg}");
SetCellValue(sheet, "C8", $"({row8.Min}~{row8.Max})");
SetCellValue(sheet, "D8", $"{row8.CutLevel}");
SetCellValue(sheet, "E8", $"{row8.SymLevel}");
var row9 = getSelectData("PAV_DEPTH");
SetCellValue(sheet, "A9", $"{GetName("PAV_DEPTH")}(%)");
SetCellValue(sheet, "B9", $"{row9.Avg}");
SetCellValue(sheet, "C9", $"({row9.Min}~{row9.Max})");
SetCellValue(sheet, "D9", $"{row9.CutLevel}");
SetCellValue(sheet, "E9", $"{row9.SymLevel}");
//row 10
//Row 11
SetCellValue(sheet, "A11", $"{MultilingualHelper.getString("CuttingGrade")}");
SetCellValue(sheet, "B11", $"{CutLevelTotal}");
//Row 12
SetCellValue(sheet, "A12", $"{MultilingualHelper.getString("SymmetryLevel")}");
SetCellValue(sheet, "B12", $"{SymLevelTotal}");
SetCellValue(sheet, "C12", $"{MultilingualHelper.getString("DateOfIssue")}: {DateTime.Now:yyyy/M/d}");
// 生成临时文件路径
string tempFile = Path.Combine(
Path.GetTempPath(),
$"DiamondReport_{DateTime.Now:yyyyMMddHHmmss}.xlsx");
using (FileStream fs = new FileStream(tempFile, FileMode.Create))
{
workbook.Write(fs);
}
return tempFile;
}
}
[Log]
private void SetCellValue(ISheet sheet, string cellAddress, object value)
{
var cellRef = new CellReference(cellAddress);
IRow row = sheet.GetRow(cellRef.Row) ?? sheet.CreateRow(cellRef.Row);
ICell cell = row.GetCell(cellRef.Col) ?? row.CreateCell(cellRef.Col);
cell.SetCellValue(value?.ToString() ?? "");
}
[Log] [Log]
private void PrintPageHandler(object sender, PrintPageEventArgs e) private void PrintPageHandler(object sender, PrintPageEventArgs e)
{ {

unable to load file from head commit
Loading…
Cancel
Save