领胜LDS 键盘AOI检测项目
wells.liu
2020-07-10 0ec7f2e32c8c7ef62ab71c0a2f5bd015aef7d7fe
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 Newtonsoft.Json;
@@ -59,8 +61,8 @@
        private void InitialSetting()
        {
            ////数据库迁移检查
            //DatabaseInitialize.Initialize();
            //数据库迁移检查
            DatabaseInitialize.Initialize();
            MotionCardSettingCheck();
@@ -364,19 +366,26 @@
                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
                if (Config.IsEnableMESUpload)
                {
                }
                //Excel报表输出 todo
                //数据库保存 todo
                //Excel报表输出 (单个产品的excel导出)
                ExportProductionExcel(measurementUnitResultAndKeyUnitDataSet);
                //数据库保存
                SaveProductionData(measurementUnitResultAndKeyUnitDataSet);
                SaveWholeImage(pMeasure);
@@ -385,6 +394,155 @@
            }
        }
        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.Spec.ActualValue.ToString();
                    measurementUnitResult.MeasurementResult = MeasurementUnitResult.Spec.MeasureResult.Value ? "OK" : "NG";
                    measurementUnitResults.Add(measurementUnitResult);
                    foreach (var keyUnit in MeasurementUnitResult.KeyUnitCollection)//获取单个键的测量结果
                    {
                        foreach (var keyValue in keyUnit.MeasureValueDict)//获取单个键的单个测量item 结果
                        {
                            bool isExist = keyUnitDatas.Any(u => u.Key == keyUnit.Key && u.MeasurementItem == keyValue.Key);
                            if (!isExist)//已存在 不重复添加原始数据
                            {
                                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)
        {
            if (!Config.IsCSVOutputEnabled)
                return;
            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.LogPath, 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)
        {