src/Bro.Device.GTSCard/GTSCardDriver.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.DBManager/ExcelExportHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.DBManager/MeasurementUnitResultManager.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.Model/Model/MeasurementUnitResult.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.Process/Bro.M071.Process.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.Process/M071Config.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.Process/M071Models.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/Bro.M071.Process/M071Process.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -386,7 +386,7 @@ public override async Task<bool> SingleAxisMoving(MovingOption optionPara) { return await Task.Run(() => { { axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne(); bool isSuccessAndStop = false; try @@ -458,7 +458,8 @@ { throw new Exception("轴" + axisNum + "获取规划位置异常,错误码:" + ret); } position = prfpos / IConfig.AxisVelocityRatio; var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum).AxisRatio; position = prfpos / AxisRatio; return position; } @@ -478,7 +479,8 @@ { throw new Exception("轴" + axisNum + "获取目标位置异常,错误码:" + ret); } position = pPos / IConfig.AxisVelocityRatio; var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == axisNum).AxisRatio; position = pPos / AxisRatio; return position; } } @@ -487,7 +489,7 @@ /// 获取规划速度 /// </summary> /// <param name="axisNum">Axis number</param> /// <returns></returns> /// <returns>速度脉冲</returns> public double GetPrfVelocity(int axisNum) { double prfVel = 0; @@ -497,7 +499,6 @@ { throw new Exception("轴" + axisNum + "获取规划速度异常,错误码:" + ret); } prfVel = prfVel / IConfig.AxisVelocityRatio; return prfVel; } @@ -505,7 +506,7 @@ /// 获取当前速度 /// </summary> /// <param name="axisNum">Axis number</param> /// <returns></returns> /// <returns>速度脉冲</returns> public double GetVelocity(int axisNum) { double vel = 0; @@ -514,7 +515,6 @@ { throw new Exception("轴" + axisNum + "获取当前速度异常,错误码:" + ret); } vel = vel / IConfig.AxisVelocityRatio; return vel; } @@ -599,11 +599,12 @@ int currentPosition = (int)GetPosition(optionPara.AxisIndex); int dPosition = optionPara.Destination + currentPosition; int timeout = optionPara.MovingTimeout; var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex).AxisRatio; while (CurrentState == DeviceState.DSOpen) { //设置 运动参数 isSuccessSetAxisParam = SetAxisParam(optionPara); ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(dPosition * IConfig.AxisVelocityRatio));// 设置规划位置 ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(dPosition * AxisRatio));// 设置规划位置 ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//更新运动 if (ret != (short)GTSRetCode.GRCRunOK) @@ -674,11 +675,12 @@ short ret = 0; bool isSuccessSetAxisParam = false; int timeout = optionPara.MovingTimeout; while (CurrentState == DeviceState.DSOpen&&!_isPause) var AxisRatio = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex) == null ? 1 : IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == optionPara.AxisIndex).AxisRatio; while (CurrentState == DeviceState.DSOpen && !_isPause) { //设置 运动参数 isSuccessSetAxisParam = SetAxisParam(optionPara); ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(optionPara.Destination * IConfig.AxisVelocityRatio));// 设置规划位置 ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(optionPara.Destination * AxisRatio));// 设置规划位置 ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//更新运动 if (ret != (short)GTSRetCode.GRCRunOK) src/Bro.M071.DBManager/ExcelExportHelper.cs
@@ -8,6 +8,19 @@ namespace Bro.M071.DBManager { public class ExcelExportSet { public List<string> Worksheets { get; set; } /// <summary> /// Key: Worksheet的名称 Value:Worksheet对应的列名集合(key 为要导出的列名 value 为导出后显示的列名) /// </summary> public Dictionary<string, Dictionary<string, string>> WorksheetColumns { get; set; } public Dictionary<string, DataTable> WorksheetDataTable { get; set; } } /// <summary> /// Excel导出帮助类 /// </summary> @@ -20,21 +33,27 @@ /// <typeparam name="T"></typeparam> /// <param name="data"></param> /// <returns></returns> public static DataTable ListToDataTable<T>(List<T> data) public static DataTable ListToDataTable<T>(List<T> data, Dictionary<string, string> worksheetColumns) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); DataTable dataTable = new DataTable(); for (int i = 0; i < properties.Count; i++) Dictionary<string, string> tempColumns = new Dictionary<string, string>(); foreach (var column in worksheetColumns) { PropertyDescriptor property = properties[i]; dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType); PropertyDescriptor property = properties.Find(column.Key, true); if (property != null) { dataTable.Columns.Add(column.Value, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType); tempColumns[column.Key] = column.Value; } } object[] values = new object[properties.Count]; object[] values = new object[tempColumns.Count]; foreach (T item in data) { for (int i = 0; i < values.Length; i++) for (int i = 0; i < tempColumns.Count; i++) { values[i] = properties[i].GetValue(item); PropertyDescriptor property = properties.Find(tempColumns.ElementAt(i).Key, true); values[i] = property.GetValue(item); } dataTable.Rows.Add(values); } @@ -45,99 +64,94 @@ /// 导出Excel /// </summary> /// <param name="dataTable">数据源</param> /// <param name="heading">工作簿Worksheet</param> /// <param name="worksheet">工作簿Worksheet</param> /// <param name="showSrNo">//是否显示行编号</param> /// <param name="columnsToTake">要导出的列</param> /// <returns></returns> public static byte[] ExportExcel(DataTable dataTable, string heading = "", bool showSrNo = false, params string[] columnsToTake) public static byte[] ExportExcel(ExcelExportSet excelExportDto, bool showSrNo = false) { byte[] result; byte[] result = null; using (ExcelPackage package = new ExcelPackage()) { ExcelWorksheet workSheet = package.Workbook.Worksheets.Add($"{heading}Data"); int startRowFrom = string.IsNullOrEmpty(heading) ? 1 : 3; //开始的行 //是否显示行编号 if (showSrNo) foreach (var worksheet in excelExportDto.Worksheets) { DataColumn dataColumn = dataTable.Columns.Add("#", typeof(int)); dataColumn.SetOrdinal(0); int index = 1; foreach (DataRow item in dataTable.Rows) var dataTable = excelExportDto.WorksheetDataTable[worksheet]; ExcelWorksheet workSheet = package.Workbook.Worksheets.Add($"{worksheet}"); int startRowFrom = string.IsNullOrEmpty(worksheet) ? 1 : 3; //开始的行 //是否显示行编号 if (showSrNo) { item[0] = index; index++; DataColumn dataColumn = dataTable.Columns.Add("#", typeof(int)); dataColumn.SetOrdinal(0); int index = 1; foreach (DataRow item in dataTable.Rows) { item[0] = index; index++; } } } //Add Content Into the Excel File workSheet.Cells["A" + startRowFrom].LoadFromDataTable(dataTable, true); // autofit width of cells with small content int columnIndex = 1; foreach (DataColumn item in dataTable.Columns) { ExcelRange columnCells = workSheet.Cells[workSheet.Dimension.Start.Row, columnIndex, workSheet.Dimension.End.Row, columnIndex]; int maxLength = columnCells.Max(cell => cell.Value.ToString().Count()); if (maxLength < 150) //Add Content Into the Excel File workSheet.Cells["A" + startRowFrom].LoadFromDataTable(dataTable, true); // autofit width of cells with small content int columnIndex = 1; foreach (DataColumn item in dataTable.Columns) { workSheet.Column(columnIndex).AutoFit(); ExcelRange columnCells = workSheet.Cells[workSheet.Dimension.Start.Row, columnIndex, workSheet.Dimension.End.Row, columnIndex]; int maxLength = columnCells.Max(cell => cell.Value.ToString().Count()); if (maxLength < 150) { workSheet.Column(columnIndex).AutoFit(); } columnIndex++; } columnIndex++; } // format header - bold, yellow on black using (ExcelRange r = workSheet.Cells[startRowFrom, 1, startRowFrom, dataTable.Columns.Count]) { r.Style.Font.Color.SetColor(System.Drawing.Color.White); r.Style.Font.Bold = true; r.Style.Fill.PatternType = ExcelFillStyle.Solid; r.Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml("#1fb5ad")); } // format cells - add borders using (ExcelRange r = workSheet.Cells[startRowFrom + 1, 1, startRowFrom + dataTable.Rows.Count, dataTable.Columns.Count]) { r.Style.Border.Top.Style = ExcelBorderStyle.Thin; r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; r.Style.Border.Left.Style = ExcelBorderStyle.Thin; r.Style.Border.Right.Style = ExcelBorderStyle.Thin; r.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black); r.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black); r.Style.Border.Left.Color.SetColor(System.Drawing.Color.Black); r.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black); } // removed ignored columns for (int i = dataTable.Columns.Count - 1; i >= 0; i--) { if (i == 0 && showSrNo) // format header - bold, yellow on black using (ExcelRange r = workSheet.Cells[startRowFrom, 1, startRowFrom, dataTable.Columns.Count]) { continue; r.Style.Font.Color.SetColor(System.Drawing.Color.White); r.Style.Font.Bold = true; r.Style.Fill.PatternType = ExcelFillStyle.Solid; r.Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml("#1fb5ad")); } if (!columnsToTake.Contains(dataTable.Columns[i].ColumnName)) // format cells - add borders using (ExcelRange r = workSheet.Cells[startRowFrom + 1, 1, startRowFrom + dataTable.Rows.Count, dataTable.Columns.Count]) { workSheet.DeleteColumn(i + 1); r.Style.Border.Top.Style = ExcelBorderStyle.Thin; r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; r.Style.Border.Left.Style = ExcelBorderStyle.Thin; r.Style.Border.Right.Style = ExcelBorderStyle.Thin; r.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black); r.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black); r.Style.Border.Left.Color.SetColor(System.Drawing.Color.Black); r.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black); } if (!string.IsNullOrEmpty(worksheet)) { workSheet.Cells["A1"].Value = worksheet; workSheet.Cells["A1"].Style.Font.Size = 20; workSheet.InsertColumn(1, 1); workSheet.InsertRow(1, 1); workSheet.Column(1).Width = 5; } result = package.GetAsByteArray(); } if (!string.IsNullOrEmpty(heading)) { workSheet.Cells["A1"].Value = heading; workSheet.Cells["A1"].Style.Font.Size = 20; workSheet.InsertColumn(1, 1); workSheet.InsertRow(1, 1); workSheet.Column(1).Width = 5; } result = package.GetAsByteArray(); } return result; } /// <summary> /// 导出Excel /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data"></param> /// <param name="heading"></param> /// <param name="isShowSlNo"></param> /// <param name="columnsToTake"></param> /// <returns></returns> public static byte[] ExportExcel<T>(List<T> data, string heading = "", bool isShowSlNo = false, params string[] columnsToTake) { return ExportExcel(ListToDataTable(data), heading, isShowSlNo, columnsToTake); } ///// <summary> ///// 导出Excel ///// </summary> ///// <typeparam name="T"></typeparam> ///// <param name="data"></param> ///// <param name="heading"></param> ///// <param name="isShowSlNo"></param> ///// <param name="columnsToTake"></param> ///// <returns></returns> //public static byte[] ExportExcel<T>(List<T> data, string heading = "", bool isShowSlNo = false, params string[] columnsToTake) //{ // ExcelExportSet excelExport = new ExcelExportSet(); // excelExport. // return ExportExcel(ListToDataTable(data), heading, isShowSlNo, columnsToTake); //} } } src/Bro.M071.DBManager/MeasurementUnitResultManager.cs
@@ -72,11 +72,11 @@ //into pmList select new MeasurementUnitResult_DTO { ProductionMeasurementRecord= productionMeasurementRecords, MeasurementUnitResult= measurementUnitResult ProductionCode = productionMeasurementRecords.ProductionCode, ProductionBarcode = productionMeasurementRecords.ProductionBarcode }; var pageList = query.OrderBy(u => u.ProductionMeasurementRecord.OperationStartTime).ToPagedList(request); var pageList = query.OrderBy(u => u.CREATE_TIME).ToPagedList(request); request.TotalNum = mList.Count(); return pageList; } src/Bro.M071.Model/Model/MeasurementUnitResult.cs
@@ -1,5 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace Bro.M071.Model.Model @@ -68,17 +69,48 @@ public string MeasurementResult { get; set; } } public class MeasurementUnitResult_DTO public class MeasurementUnitResult_DTO : MeasurementUnitResult { //产品相关 /// <summary> /// 产品记录 /// 产品编码 /// </summary> public string ProductionCode { get; set; } /// <summary> /// 产品条码 /// </summary> public string ProductionBarcode { get; set; } } public class ProductionMeasurementUnitResultAndKeyUnitDataSet { public ProductionMeasurementRecords ProductionMeasurementRecord { get; set; } /// <summary> /// 关系数据 /// </summary> public List<MeasurementAndKeyDataRelation> MeasurementAndKeyDataRelationList{ get; set; } /// <summary> /// 检测结果 /// </summary> public MeasurementUnitResult MeasurementUnitResult { get; set; } public List<MeasurementUnitResult> MeasurementUnitResultList { get; set; } /// <summary> /// 原始数据 /// </summary> public List<KeyUnitData> KeyUnitDataList { get; set; } public ProductionMeasurementUnitResultAndKeyUnitDataSet() { ProductionMeasurementRecord = new ProductionMeasurementRecords(); MeasurementUnitResultList = new List<MeasurementUnitResult>(); KeyUnitDataList = new List<KeyUnitData>(); } } src/Bro.M071.Process/Bro.M071.Process.csproj
@@ -179,6 +179,10 @@ <Project>{1A3CBFE7-3F78-42C3-95C5-10360450DBEA}</Project> <Name>Bro.Common.Model</Name> </ProjectReference> <ProjectReference Include="..\Bro.M071.DBManager\Bro.M071.DBManager.csproj"> <Project>{230B0FFF-F6AF-45FE-AAF7-B4B66250DD58}</Project> <Name>Bro.M071.DBManager</Name> </ProjectReference> <ProjectReference Include="..\Bro.M071.Model\Bro.M071.Model.csproj"> <Project>{AD645C48-5811-4B1E-B81F-D35D5E6B577F}</Project> <Name>Bro.M071.Model</Name> src/Bro.M071.Process/M071Config.cs
@@ -67,6 +67,12 @@ [Editor(typeof(ComplexCollectionEditor<MeasurementUnit>), typeof(UITypeEditor))] public List<MeasurementUnit> MeasurementUnitCollection { get; set; } = new List<MeasurementUnit>(); [Category("检测设置")] [DisplayName("结果数据保存路径")] [Description("检测结果数据保存路径")] [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))] public string ResultDataSaveFolder { get; set; } = ""; [Category("图片保存配置")] [Description("单键图片保存配置")] [TypeConverter(typeof(ComplexObjectConvert))] src/Bro.M071.Process/M071Models.cs
@@ -204,6 +204,7 @@ public class ProductionMeasurement : INotifyPropertyChanged, IDisposable { public string Barcode; public string PResult; public List<MeasurementUnit> Measurements = new List<MeasurementUnit>(); src/Bro.M071.Process/M071Process.cs
@@ -2,7 +2,9 @@ using Bro.Common.Helper; using Bro.Common.Interface; using Bro.Common.Model; using Bro.M071.DBManager; using Bro.M071.Model; using Bro.M071.Model.Model; using Bro.Process; using HalconDotNet; using System; @@ -58,8 +60,8 @@ private void InitialSetting() { ////数据库迁移检查 //DatabaseInitialize.Initialize(); //数据库迁移检查 DatabaseInitialize.Initialize(); MotionCardSettingCheck(); @@ -364,19 +366,23 @@ pMeasure.EndTime = DateTime.Now; bool pResult = pMeasure.Measurements.All(u => u.Spec.MeasureResult == true); pMeasure.PResult = pResult ? "OK" : "NG"; OnUpdateResult?.Invoke(DateTime.Now, pResult ? 1 : 0); OnUpdateCT?.Invoke((float)(pMeasure.EndTime.Value - pMeasure.StartTime.Value).TotalSeconds); LogAsync(DateTime.Now, $"{pMeasure.Barcode} 检测完成,结果 {(pResult ? "OK" : "NG")}", ""); LogAsync(DateTime.Now, $"{pMeasure.Barcode} 检测完成,结果 {pMeasure.PResult}", ""); if (MachineState == MachineState.Running) MachineState = MachineState.Ready; var measurementUnitResultAndKeyUnitDataSet = GetMeasurementUnitResultAndKeyUnitData(pMeasure); //MES输出 todo //Excel报表输出 todo //数据库保存 todo //Excel报表输出 (单个产品的excel导出) ExportProductionExcel(measurementUnitResultAndKeyUnitDataSet); //数据库保存 SaveProductionData(measurementUnitResultAndKeyUnitDataSet); SaveWholeImage(pMeasure); @@ -385,6 +391,149 @@ } } KeyUnitDataManager keyUnitDataManager = new KeyUnitDataManager(); MeasurementUnitResultManager measurementUnitResultManager = new MeasurementUnitResultManager(); MeasurementAndKeyDataRelationManager measurementAndKeyDataRelationManager = new MeasurementAndKeyDataRelationManager(); ProductionMeasurementRecordsManager productionMeasurementRecordsManager = new ProductionMeasurementRecordsManager(); static object dataSaveLock = new object(); private async void SaveProductionData(ProductionMeasurementUnitResultAndKeyUnitDataSet measurementUnitResultAndKeyUnitDataSet) { await Task.Run(() => { try { lock (dataSaveLock) { // 获取 产品数据 并保存 var productionMeasurementRecords = measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord; productionMeasurementRecordsManager.CreateModel(productionMeasurementRecords); // 获取 原始数据 并保存 var keyUnitDatas = measurementUnitResultAndKeyUnitDataSet.KeyUnitDataList; keyUnitDataManager.BatchAddKeyUnitData(keyUnitDatas); // 获取 检测结果数据 并保存 var measurementUnitResults = measurementUnitResultAndKeyUnitDataSet.MeasurementUnitResultList; measurementUnitResultManager.BatchAddMeasurementUnitResult(measurementUnitResults); // 获取 关系数据并保存 var measurementAndKeyDataRelationList = measurementUnitResultAndKeyUnitDataSet.MeasurementAndKeyDataRelationList; measurementAndKeyDataRelationManager.BatchAddMeasurementAndKeyDataRelation(measurementAndKeyDataRelationList); } } catch (Exception ex) { LogAsync(DateTime.Now, "数据保存异常", ex.GetExceptionMessage()); } }); } private ProductionMeasurementUnitResultAndKeyUnitDataSet GetMeasurementUnitResultAndKeyUnitData(ProductionMeasurement pData) { ProductionMeasurementUnitResultAndKeyUnitDataSet measurementUnitResultAndKeyUnitDataSet = new ProductionMeasurementUnitResultAndKeyUnitDataSet(); try { //产品数据 ProductionMeasurementRecords productionMeasurementRecords = new ProductionMeasurementRecords(); //关系数据 List<MeasurementAndKeyDataRelation> measurementAndKeyDataRelationList = new List<MeasurementAndKeyDataRelation>(); //原始数据 List<KeyUnitData> keyUnitDatas = new List<KeyUnitData>(); // 单个产品的测量汇总 List<MeasurementUnitResult> measurementUnitResults = new List<MeasurementUnitResult>(); productionMeasurementRecords.ProductionBarcode = pData.Barcode; productionMeasurementRecords.ProductionCode = ProductionCode; productionMeasurementRecords.ProductionResult = pData.PResult; productionMeasurementRecords.OperationStartTime = pData.StartTime.GetValueOrDefault(); productionMeasurementRecords.OperationEndTime = pData.EndTime.GetValueOrDefault(); measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord = productionMeasurementRecords; foreach (var MeasurementUnitResult in pData.Measurements)//获取到单个测量项结果 { MeasurementUnitResult measurementUnitResult = new MeasurementUnitResult(); measurementUnitResult.ProductionMeasurementRecordsId = productionMeasurementRecords.ID; measurementUnitResult.MeasurementName = MeasurementUnitResult.Name; measurementUnitResult.MeasurementType = MeasurementUnitResult.MeasureType; measurementUnitResult.MeasurementValue = ""; measurementUnitResult.MeasurementResult = MeasurementUnitResult.Spec.MeasureResult.Value ? "OK" : "NG"; measurementUnitResults.Add(measurementUnitResult); foreach (var keyUnit in MeasurementUnitResult.KeyUnitCollection)//获取单个键的测量结果 { foreach (var keyValue in keyUnit.MeasureValueDict)//获取单个键的单个测量item 结果 { KeyUnitData keyUnitData = new KeyUnitData(); keyUnitData.Key = keyUnit.Key; keyUnitData.MeasurementItem = keyValue.Key; keyUnitData.ItemValue = keyValue.Value.ToString(); keyUnitDatas.Add(keyUnitData); MeasurementAndKeyDataRelation measurementAndKeyDataRelation = new MeasurementAndKeyDataRelation(); measurementAndKeyDataRelation.MeasurementUnitResultId = measurementUnitResult.ID; measurementAndKeyDataRelation.KeyUnitDataId = keyUnitData.ID; measurementAndKeyDataRelationList.Add(measurementAndKeyDataRelation); } } } measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord = productionMeasurementRecords; measurementUnitResultAndKeyUnitDataSet.MeasurementAndKeyDataRelationList = measurementAndKeyDataRelationList; measurementUnitResultAndKeyUnitDataSet.KeyUnitDataList = keyUnitDatas; measurementUnitResultAndKeyUnitDataSet.MeasurementUnitResultList = measurementUnitResults; } catch (Exception ex) { LogAsync(DateTime.Now, "数据获取异常", ex.GetExceptionMessage()); } return measurementUnitResultAndKeyUnitDataSet; } private async void ExportProductionExcel(ProductionMeasurementUnitResultAndKeyUnitDataSet measurementUnitResultAndKeyUnitDataSet) { await Task.Run(() => { ExcelExportSet excelExportDto = new ExcelExportSet(); excelExportDto.Worksheets = new List<string>() { "原始数据", "检测结果" }; var keyUnitColumns = new Dictionary<string, string>() { {"Key", "键"}, {"MeasurementItem", "检测项"}, {"ItemValue", "检测值"} }; var measurementUnitResultColumns = new Dictionary<string, string>() { {"MeasurementName", "检测名称"}, {"MeasurementType", "检测类型"}, {"MeasurementValue", "检测值"}, {"MeasurementResult", "检测结果"}, }; excelExportDto.WorksheetColumns[excelExportDto.Worksheets[0]] = keyUnitColumns; excelExportDto.WorksheetColumns[excelExportDto.Worksheets[1]] = measurementUnitResultColumns; excelExportDto.WorksheetDataTable[excelExportDto.Worksheets[0]] = ExcelExportHelper.ListToDataTable(measurementUnitResultAndKeyUnitDataSet.KeyUnitDataList, keyUnitColumns); excelExportDto.WorksheetDataTable[excelExportDto.Worksheets[1]] = ExcelExportHelper.ListToDataTable(measurementUnitResultAndKeyUnitDataSet.MeasurementUnitResultList, measurementUnitResultColumns); ; byte[] filecontent = ExcelExportHelper.ExportExcel(excelExportDto, false); string dir = Path.Combine(Config.ImageSaveFolder, DateTime.Now.ToString("yyyyMMdd")); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } FileStream fs = new FileStream(Path.Combine(dir, $"{measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord.ProductionBarcode}_{DateTime.Now.ToString("HHmmss")}.xlsx"), FileMode.Create, FileAccess.Write); fs.Write(filecontent, 0, filecontent.Length); fs.Flush(); fs.Close(); }); } #region 图像保存 private void SaveWholeImage(ProductionMeasurement pMeasure) {