From 6caa156ba8be9728b4cb67c7c7be326b0316f773 Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期四, 09 七月 2020 17:22:44 +0800
Subject: [PATCH] 板卡+数据库保存+excel导出

---
 src/Bro.Device.GTSCard/GTSCardDriver.cs                |   22 +-
 src/Bro.M071.Process/M071Process.cs                    |  161 ++++++++++++++++++++++
 src/Bro.M071.Process/Bro.M071.Process.csproj           |    4 
 src/Bro.M071.DBManager/MeasurementUnitResultManager.cs |    6 
 src/Bro.M071.Process/M071Config.cs                     |    6 
 src/Bro.M071.Process/M071Models.cs                     |    1 
 src/Bro.M071.DBManager/ExcelExportHelper.cs            |  178 +++++++++++++-----------
 src/Bro.M071.Model/Model/MeasurementUnitResult.cs      |   38 +++++
 8 files changed, 312 insertions(+), 104 deletions(-)

diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index 240c375..2d3d26e 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/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)
diff --git a/src/Bro.M071.DBManager/ExcelExportHelper.cs b/src/Bro.M071.DBManager/ExcelExportHelper.cs
index b894e68..0ea0c16 100644
--- a/src/Bro.M071.DBManager/ExcelExportHelper.cs
+++ b/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">宸ヤ綔绨縒orksheet</param>
+        /// <param name="worksheet">宸ヤ綔绨縒orksheet</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);
+        //}
     }
 }
diff --git a/src/Bro.M071.DBManager/MeasurementUnitResultManager.cs b/src/Bro.M071.DBManager/MeasurementUnitResultManager.cs
index 346af64..be0bb9e 100644
--- a/src/Bro.M071.DBManager/MeasurementUnitResultManager.cs
+++ b/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;
             }
diff --git a/src/Bro.M071.Model/Model/MeasurementUnitResult.cs b/src/Bro.M071.Model/Model/MeasurementUnitResult.cs
index 3d39b4c..62898f4 100644
--- a/src/Bro.M071.Model/Model/MeasurementUnitResult.cs
+++ b/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>();
+        }
 
     }
 
diff --git a/src/Bro.M071.Process/Bro.M071.Process.csproj b/src/Bro.M071.Process/Bro.M071.Process.csproj
index eb681d3..e8c6f29 100644
--- a/src/Bro.M071.Process/Bro.M071.Process.csproj
+++ b/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>
diff --git a/src/Bro.M071.Process/M071Config.cs b/src/Bro.M071.Process/M071Config.cs
index 9f8559f..f2b54c1 100644
--- a/src/Bro.M071.Process/M071Config.cs
+++ b/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))]
diff --git a/src/Bro.M071.Process/M071Models.cs b/src/Bro.M071.Process/M071Models.cs
index bd98beb..f2c588f 100644
--- a/src/Bro.M071.Process/M071Models.cs
+++ b/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>();
 
diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs
index 8f08ba9..1dea3b9 100644
--- a/src/Bro.M071.Process/M071Process.cs
+++ b/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)
         {

--
Gitblit v1.8.0