From ed8768b43baecf8bfb74ed8a949fdc541b5d326d Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Thu, 6 Mar 2025 13:48:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?csv=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ViewModel/Grading/GradingResultVM.cs | 35 +++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/ViewModel/Grading/GradingResultVM.cs b/ViewModel/Grading/GradingResultVM.cs index afac558..a0aff48 100644 --- a/ViewModel/Grading/GradingResultVM.cs +++ b/ViewModel/Grading/GradingResultVM.cs @@ -34,6 +34,7 @@ using Brushes = System.Drawing.Brushes; using SparkClient.Model.Attributes; using SparkClient.Model.Common; using PaperSize = System.Drawing.Printing.PaperSize; +using SharpDX.Direct2D1.Effects; namespace SparkClient.ViewModel.Grading; /// @@ -284,7 +285,10 @@ public class GradingResultVM : BaseViewModel using (var writer = new StreamWriter(filePath,true)) { 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.M3)}(mm)," + $"{FormatDouble_P(info.TABLE)}%," + @@ -302,6 +306,35 @@ public class GradingResultVM : BaseViewModel 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) From 9b5e0950a09f318156af5cd80727a246adfc33da Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Thu, 6 Mar 2025 14:01:07 +0800 Subject: [PATCH 2/4] csv --- SparkClient.csproj | 8 ++++---- csv/histroy.csv | 0 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 csv/histroy.csv diff --git a/SparkClient.csproj b/SparkClient.csproj index d323125..3691a2e 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -44,7 +44,6 @@ - @@ -73,9 +72,6 @@ - - Always - Always @@ -280,4 +276,8 @@ + + + + diff --git a/csv/histroy.csv b/csv/histroy.csv deleted file mode 100644 index e69de29..0000000 From 762247a350db6427951d9c3fdfb1057e0754b9e5 Mon Sep 17 00:00:00 2001 From: Tongg Date: Thu, 6 Mar 2025 17:09:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E6=89=93=E5=8D=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resource/ResultReport.xlsx | Bin 0 -> 10269 bytes SparkClient.csproj | 7 + ViewModel/Grading/GradingResultVM.cs | 295 ++++++++++++++++++++------- 3 files changed, 227 insertions(+), 75 deletions(-) create mode 100644 Resource/ResultReport.xlsx diff --git a/Resource/ResultReport.xlsx b/Resource/ResultReport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e4771978380d3dc16cf3d94a82bc915f77f4e6ce GIT binary patch literal 10269 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�C*#=V05O=)DzZk>6^LuyK!EHPefjURjSRdyQ*)WF|4 z3uKN+_Pen9+v|(AE+308y%b~Fy)4M;#t$t@Dep9d)DGBT$Xzr?KB%0Zk$iX1ilNt^ zaZWaUd}U>Yan;tDfm{LEx%yOU^su%PS=vB_uYTv{H2DJ`_9SpmO68npUHF`u6ApTg zQg?;0F+@{2+5ca8*zuT3G#^;B350#|{){?S#?Izus;g|20c^y9*{rA9opg`}q38#L-=5Y0Bt#E;N5U?N7GrPXgl)`s+81@r(QliSLT)X2*Mc4!o80^iKX9 ziY}=Np>9;)0GeFRAhbHHt%^e}P7wJvD;w#>KKLV= zbiAy@#{Sq4xt2|#?tppSS2I{ZSVjAGH_n$r$f2NPROWarM3z6nNF-l|f8g=nae#^V zj>lQHtuF}Sjs1t=lQYzR%MuSOQc|yAZ@vqw0n`660#2}ray55WHFtIWIb&@1+8nGV z)(+0bGUfxu17=D_PR57E?Z6+P8O5|?A7d5OU776Up39mj7*G-)Qk)U)4DrR z%w8cS#h_Cr1yZF@rFFfaim+0RR7I(c45 zTE!sDFu=KCg=}`(pA~(uLWv3MJj8?>k@VtH)glTkL;&{i8^OV`_UC@FfPe7@U81u( z4eo;p^2fVCfW{X@v8lizcC3I2O5QReG!zT?)cE)B-_yPyRO3e^Wx6FRT(ppe?-JiX;ohvea)}LL~fZl>-JS(Z_RyHWw-Zp8>hCd9&2iwxmLf^55{&o2T|3 zw1C1Yyr)*n^^;p0{qx^$yiP80)rg7@bdZgjsx`ZwXb;d$CqB7xWxZ_0hrmabLP!nSi^QVu5~zo_LT;latsg z@X_gHhjF1FlET6p>uA35`46oVCz%k_`i>IUj{zq`88I=^jIy0FnM^ew298!w&!9=3 zcyxqwBm)B^LbDrVIaTR3JbY@)$zsMnPvm-^OBAQls&&W1+rg`7X`-SR>#FGD$#v(w zu*4^NEoj{=Z5(RkJkYR{ogmdG8+-@N(4E~rp^tVWM{sdhn%0pGG?u&7khN@MVfU&_ z$|WWbVlK)I7IJwoEoAPRR^5b0@+L5iP{P~jdqroQSnZpU5a;X~Bzg>)TGpd&(@OhP zFhxkXhQbq)l@xX&vpRc@EfaljS09%jC+Ab=I}{y67@lQrE0u0UrTQZKBoc>XeWbUJ znwjqmD@6V0vJ8c8A~j6Ocv^jzLP8}lZuL2EL3gWzqvOd6In(b_s1xNw`3Y@`??OuKb?Pi11OUF@pQNk$>#^oJPQnX{QDNC|IGA% z&i}IENeTLQ1%Kas@gKpT=eIC-`pZ^~`-1li(!WJNz?j5)<>~vvf3L;;76kx64}J;% ze=2kL_1rJe{MICn{{J50ALW|+TJF=IzqK%8|0@}KU%~yQ=x+sIU}QgREPgLc?~C5Y zlfOmP$o>$$k1p?PxR3FEYk()eKL-Db`0gvb51D=|M0og1;XT0guK?=4(!b+~-zotB rDVS~l16AA?|9g!8tM~@hU&Q~6_)1Vjm<<8|=&%nR%#2sSKU@C?I@y?< literal 0 HcmV?d00001 diff --git a/SparkClient.csproj b/SparkClient.csproj index 3691a2e..1319731 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -35,6 +35,7 @@ + @@ -220,6 +221,9 @@ + + Always + @@ -271,6 +275,9 @@ + + C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\OFFICE.DLL + bin\Debug\net8.0-windows\SparkDotNetCore.dll diff --git a/ViewModel/Grading/GradingResultVM.cs b/ViewModel/Grading/GradingResultVM.cs index a0aff48..5d15a45 100644 --- a/ViewModel/Grading/GradingResultVM.cs +++ b/ViewModel/Grading/GradingResultVM.cs @@ -29,6 +29,8 @@ using FontFamily = System.Drawing.FontFamily; using FontStyle = System.Drawing.FontStyle; using NPOI.SS.Formula.Functions; using System.Windows.Media; +using HandyControl.Tools.Extension; +using NPOI.SS.Util; using Brush = System.Drawing.Brush; using Brushes = System.Drawing.Brushes; using SparkClient.Model.Attributes; @@ -36,6 +38,7 @@ using SparkClient.Model.Common; using PaperSize = System.Drawing.Printing.PaperSize; using SharpDX.Direct2D1.Effects; + namespace SparkClient.ViewModel.Grading; /// /// 检测结果画面VM @@ -1972,90 +1975,139 @@ public class GradingResultVM : BaseViewModel // 执行热敏打印的方法 [Log] private void ExecuteThermalPrint(object parameter) - { - try + { + MessageBox messageBox = new MessageBox(); + MessageBoxResult boxResult = messageBox.ShowAsk(MultilingualHelper.getString("YesOrNo")); + if (boxResult != MessageBoxResult.OK) { - // 创建打印文档 - 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); + return; + } - 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) { - Logger.Error($"热敏打印发生错误: {ex.Message}"); - Growl.Error(MultilingualHelper.getString("DiamodResultPrintError")); + new MessageBox().Show($"打印失败: {ex.Message}"); } finally { - // 关闭串口 - // if (_serialPort.IsOpen) - // { - // _serialPort.Close(); - // } + // 步骤4:清理资源 + if (excelApp != null) + { + 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(); + // // } + // } } // 自定义打印预览窗体类 @@ -2271,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] private void PrintPageHandler(object sender, PrintPageEventArgs e) { From 728f63f8fbc27ea8883b57d993222eecb725432e Mon Sep 17 00:00:00 2001 From: sunhonglei Date: Thu, 6 Mar 2025 18:02:03 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=AF=B9=E7=A7=B0=E6=80=A7=EF=BC=9A?= =?UTF-8?q?=E6=89=AD=E6=9B=B2=E5=BA=A6=E9=99=A4=E5=A4=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ViewModel/Grading/GradingResultVM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ViewModel/Grading/GradingResultVM.cs b/ViewModel/Grading/GradingResultVM.cs index a0aff48..aeeb71a 100644 --- a/ViewModel/Grading/GradingResultVM.cs +++ b/ViewModel/Grading/GradingResultVM.cs @@ -1619,7 +1619,7 @@ public class GradingResultVM : BaseViewModel [Log] 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) { totalSymGrade = order.Value;