From 86f899fa91e811415614dff1a699141144bfc802 Mon Sep 17 00:00:00 2001
From: quanzhou <quan.zhou@broconcentric.com>
Date: 星期五, 12 十二月 2025 13:25:37 +0800
Subject: [PATCH] S5上传mes逻辑修改及打印机逻辑修改和数据库存储数据增加

---
 src/Bro.M141.Process/M141Process_ImageCheck.cs |  356 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 354 insertions(+), 2 deletions(-)

diff --git a/src/Bro.M141.Process/M141Process_ImageCheck.cs b/src/Bro.M141.Process/M141Process_ImageCheck.cs
index f054fd9..4d1f940 100644
--- a/src/Bro.M141.Process/M141Process_ImageCheck.cs
+++ b/src/Bro.M141.Process/M141Process_ImageCheck.cs
@@ -5,6 +5,7 @@
 using Bro.DataBase.Model;
 using Bro.M135.Common;
 using Bro.M135.DBManager;
+using Bro.UI.Model.Winform;
 using HalconDotNet;
 using Microsoft.VisualBasic;
 using Newtonsoft.Json;
@@ -17,6 +18,7 @@
 using System.Data;
 using System.Data.SqlTypes;
 using System.Diagnostics;
+using System.Drawing.Imaging;
 using System.Net;
 using System.Text;
 using System.Text.Encodings.Web;
@@ -26,6 +28,7 @@
 using static System.Net.Mime.MediaTypeNames;
 using static System.Net.WebRequestMethods;
 using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab;
+using File = System.IO.File;
 
 namespace Bro.M141.Process
 {
@@ -700,11 +703,355 @@
                     imgSet.HImage?.Dispose();
                     imgSet.HImage = null;
 
+                    Bitmap originImage = new Bitmap(imageFileNames[i]);
+                    DetectResultSaveExcelAsync(detectResults, sn, originImage, DateTime.Now);
                 }
             });
         }
 
+        object _excelOpLock = new object();
+        int _columnWidth = 0;
+        int _columnWidth1 = 0;
 
+        int _exportNum = 0;
+
+        public async void DetectResultSaveExcelAsync(List<DetectResult> detectResults, string sn, Bitmap originImage, DateTime dt)
+        {
+            await Task.Run(() =>
+            {
+                if (detectResults.All(u => u.ResultState == EnumHelper.ResultState.OK))
+                    return;
+
+                try
+                {
+                    string excel_Path = Path.Combine(CSVHelper.BaseDirectory, $"{DateTime.Now.ToString("yyyyMMdd")}");
+                    if (!Directory.Exists(excel_Path))//濡傛灉涓嶅瓨鍦ㄥ氨鍒涘缓file鏂囦欢澶�
+                    {
+                        Directory.CreateDirectory(excel_Path);//鍒涘缓璇ユ枃浠跺す
+                    }
+                    excel_Path = Path.Combine(excel_Path, $"OfflineRecord_{DateTime.Now.ToString("yyyyMMdd")}.xlsx");
+                    List<string> datas = new List<string>() { "妫�娴嬫椂闂�", "SN", "缂洪櫡鍚嶇О", "浣嶇疆", "缂洪櫡闈㈢Н", "瀹為檯闈㈢Н", "缂洪櫡鎴浘1", "缂洪櫡鎴浘2" };
+
+                    NPOI.SS.UserModel.IRow irow;
+                    NPOI.SS.UserModel.ICell icell;
+
+                    Interlocked.Increment(ref _exportNum);
+                    lock (_excelOpLock)
+                    {
+                        if (!File.Exists(excel_Path))
+                        {
+                            XSSFWorkbook wb = new XSSFWorkbook();
+                            ISheet sheet = wb.CreateSheet("DefectDetail");
+                            irow = sheet.CreateRow(0);
+                            for (int i = 0; i < datas.Count; i++)
+                            {
+                                icell = irow.CreateCell(i);
+                                icell.SetCellValue(datas[i]);
+                            }
+                            FileStream fs = new FileStream(excel_Path, FileMode.OpenOrCreate, FileAccess.Write);
+                            wb.Write(fs); fs.Close();
+                            fs.Dispose();
+                        }
+
+                        using (FileStream newfs = new FileStream(excel_Path, FileMode.Open, FileAccess.ReadWrite))
+                        {
+                            //鍒涘缓宸ヤ綔绨垮璞�
+                            XSSFWorkbook newwb = new XSSFWorkbook(newfs);
+                            //鏍规嵁宸ヤ綔琛ㄥ悕鑾峰彇宸ヤ綔绨垮璞★紝涔熷彲閫氳繃绱㈠紩鑾峰彇宸ヤ綔琛╳b.GetSheetAt(int index)
+                            ISheet newsheet = newwb.GetSheet("DefectDetail");
+                            int countrow = newsheet.LastRowNum + 1;
+
+                            //ICellStyle hlink_style = newwb.CreateCellStyle();
+                            //IFont hlink_font = newwb.CreateFont();
+                            //hlink_font.Underline = FontUnderlineType.Single;
+                            //hlink_font.Color = HSSFColor.Blue.Index;
+                            //hlink_style.SetFont(hlink_font);
+
+                            XSSFDrawing patriarchDefectImageFile = (XSSFDrawing)newsheet.CreateDrawingPatriarch();
+
+                            var details = detectResults.SelectMany(u => u.NetResults).SelectMany(u => u.DetectDetails).Where(u => u.FinalResult != EnumHelper.ResultState.OK).ToList();
+
+                            details.ForEach(d =>
+                            {
+                                //"妫�娴嬫椂闂�", "SN", "缂洪櫡鍚嶇О", "浣嶇疆", "缂洪櫡闈㈢Н", "瀹為檯闈㈢Н", "缂洪櫡鎴浘1", "缂洪櫡鎴浘2"
+                                List<string> data = new List<string>() { dt.ToString("HH:mm:ss.fff").ToString(), sn, d.ClassName, (d.Tag ?? "").ToString(), d.Area.ToString(), d.AreaInActual.ToString("f3") };
+
+                                irow = newsheet.CreateRow(countrow);
+
+                                for (int i = 0; i < datas.Count; i++)
+                                {
+                                    icell = irow.CreateCell(i);
+
+                                    switch (i)
+                                    {
+                                        case 6:
+                                            {
+                                                byte[] bytesDefectImageFile = CaptureImage(originImage, (int)d.Rect.Width, (int)d.Rect.Height, (int)d.Rect.X, (int)d.Rect.Y, out int actWidth, out int actHeight);
+                                                int pictureIdxDefectImageFile = newwb.AddPicture(bytesDefectImageFile, NPOI.SS.UserModel.PictureType.JPEG);
+
+                                                // 鎻掑浘鐗囩殑浣嶇疆  HSSFClientAnchor锛坉x1,dy1,dx2,dy2,col1,row1,col2,row2) 鍚庨潰鍐嶄綔瑙i噴
+                                                XSSFClientAnchor anchorDefectImageFile = new XSSFClientAnchor(1, 1, 1, 1, i, countrow, i + 1, countrow + 1);
+                                                //鎶婂浘鐗囨彃鍒扮浉搴旂殑浣嶇疆
+                                                XSSFPicture pictDefectImageFile = (XSSFPicture)patriarchDefectImageFile.CreatePicture(anchorDefectImageFile, pictureIdxDefectImageFile);
+
+                                                ////int colWidth = actWidth * 32;
+                                                ////if (colWidth > _columnWidth)
+                                                ////{
+                                                ////    _columnWidth = colWidth;
+                                                ////    newsheet.SetColumnWidth(i, _columnWidth);
+                                                ////}
+
+                                                irow.Height = (short)(actHeight * 16);
+                                                //pictDefectImageFile.Resize();
+                                            }
+                                            break;
+                                        case 7:
+                                            {
+                                                byte[] bytesDefectImageFile = CaptureImage(originImage, (int)d.Rect.Width, (int)d.Rect.Height, (int)d.Rect.X, (int)d.Rect.Y, out int actWidth, out int actHeight, d);
+                                                int pictureIdxDefectImageFile = newwb.AddPicture(bytesDefectImageFile, NPOI.SS.UserModel.PictureType.JPEG);
+
+                                                XSSFClientAnchor anchorDefectImageFile = new XSSFClientAnchor(1, 1, 1, 1, i, countrow, i + 5, countrow + 1);
+                                                //鎶婂浘鐗囨彃鍒扮浉搴旂殑浣嶇疆
+                                                XSSFPicture pictDefectImageFile = (XSSFPicture)patriarchDefectImageFile.CreatePicture(anchorDefectImageFile, pictureIdxDefectImageFile);
+
+                                                //int colWidth = actWidth * 32;
+                                                //if (colWidth > _columnWidth1)
+                                                //{
+                                                //    _columnWidth1 = colWidth;
+                                                //    newsheet.SetColumnWidth(i, _columnWidth1);
+                                                //}
+                                                //pictDefectImageFile.Resize();
+                                            }
+                                            break;
+                                        default:
+                                            string strvalue = data[i];
+                                            icell.SetCellValue(strvalue);
+                                            break;
+                                    }
+                                }
+                                countrow++;
+
+                            });
+
+                            using (var temp = File.OpenWrite(excel_Path))
+                            {
+                                newwb.Write(temp);//鍚戞墦寮�鐨勮繖涓獂ls鏂囦欢涓啓鍏ユ暟鎹� 
+                            }
+                            newfs.Close();
+                            newfs.Dispose();
+                        }
+                    }
+                    Interlocked.Decrement(ref _exportNum);
+                    LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"{detectResults[0].PID}Excel杈撳嚭瀹屾垚锛岃繕鏈墈_exportNum}鏉¤褰�");
+                }
+                catch (Exception ex)
+                {
+                    LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"{detectResults[0].PID}缂洪櫡鎻掑叆Excel鎶ラ敊锛歿ex.Message.ToString()}");
+                }
+                finally
+                {
+                    originImage.Dispose();
+                    originImage = null;
+                }
+            });
+        }
+
+        int _spaceRemain = 60;
+        //public byte[] CaptureImage(Bitmap originImage, int width, int height, int spaceX, int spaceY, out int actWidth, out int actHeight, DefectDetail defect = null)
+        //{
+        //    spaceX -= _spaceRemain;
+        //    spaceY -= _spaceRemain;
+
+        //    width += _spaceRemain * 2;
+        //    height += _spaceRemain * 2;
+
+        //    if (spaceX < 0)
+        //    {
+        //        spaceX = 0;
+        //    }
+
+        //    if (spaceY < 0)
+        //    {
+        //        spaceY = 0;
+        //    }
+
+        //    if (spaceX + width > originImage.Width)
+        //    {
+        //        width = originImage.Width - spaceX;
+        //    }
+
+        //    if (spaceY + height > originImage.Height)
+        //    {
+        //        height = originImage.Height - spaceY;
+        //    }
+
+        //    actHeight = height;
+        //    actWidth = width;
+
+        //    Bitmap imageBack = originImage;
+
+        //    if (defect != null)
+        //    {
+        //        PolygonResultDisplay display = new PolygonResultDisplay(defect, defect.ClassName, Color.Red, false, (int)(width * GlobalVar.WIDTH_RATIO));
+
+        //        imageBack = new Bitmap(originImage.Width, originImage.Height, PixelFormat.Format24bppRgb);
+        //        using (Graphics g = Graphics.FromImage(imageBack))
+        //        {
+        //            g.DrawImage(originImage, 0, 0);
+        //            display.Draw(g);
+        //        }
+        //    }
+
+        //    //鍒涘缓鏂板浘浣嶅浘   
+        //    Bitmap bitmap = new Bitmap(width, height, imageBack.PixelFormat);
+        //    //鍒涘缓浣滃浘鍖哄煙   
+        //    using (Graphics graphic = Graphics.FromImage(bitmap))
+        //    {
+        //        //鎴彇鍘熷浘鐩稿簲鍖哄煙鍐欏叆浣滃浘鍖�   
+        //        graphic.DrawImage(imageBack, 0, 0, new Rectangle(spaceX, spaceY, width, height), GraphicsUnit.Pixel);
+        //    }
+
+        //    byte[] bt = null;
+        //    using (MemoryStream mostream = new MemoryStream())
+        //    {
+        //        bitmap.Save(mostream, System.Drawing.Imaging.ImageFormat.Bmp);//灏嗗浘鍍忎互鎸囧畾鐨勬牸寮忓瓨鍏ョ紦瀛樺唴瀛樻祦
+        //        bt = new byte[mostream.Length];
+        //        mostream.Position = 0;//璁剧疆鐣欑殑鍒濆浣嶇疆
+        //        mostream.Read(bt, 0, Convert.ToInt32(bt.Length));
+        //    }
+
+        //    bitmap.Dispose();
+        //    return bt;
+        //}
+
+        public byte[] CaptureImage(Bitmap originImage, int width, int height, int spaceX, int spaceY,
+    out int actWidth, out int actHeight, DefectDetail defect = null)
+        {
+            spaceX -= _spaceRemain;
+            spaceY -= _spaceRemain;
+
+            width += _spaceRemain * 2;
+            height += _spaceRemain * 2;
+
+            if (spaceX < 0)
+            {
+                spaceX = 0;
+            }
+
+            if (spaceY < 0)
+            {
+                spaceY = 0;
+            }
+
+            if (spaceX + width > originImage.Width)
+            {
+                width = originImage.Width - spaceX;
+            }
+
+            if (spaceY + height > originImage.Height)
+            {
+                height = originImage.Height - spaceY;
+            }
+
+            actHeight = height;
+            actWidth = width;
+
+            Bitmap imageBack = originImage;
+            bool needDisposeImageBack = false; // 鏂板锛氭爣璁版槸鍚﹂渶瑕侀噴鏀緄mageBack
+
+            if (defect != null)
+            {
+                PolygonResultDisplay display = new PolygonResultDisplay(defect, defect.ClassName, Color.Red, false, (int)(width * GlobalVar.WIDTH_RATIO));
+
+                // 淇敼鐐�1锛氱‘淇濆垱寤虹殑Bitmap鏀寔Graphics
+                // 浣跨敤Format24bppRgb鎴朏ormat32bppArgb
+                imageBack = new Bitmap(originImage.Width, originImage.Height, PixelFormat.Format24bppRgb);
+                needDisposeImageBack = true; // 鏍囪涓洪渶瑕侀噴鏀�
+
+                // 淇敼鐐�2锛氭鏌ュ師濮嬪浘鍍忔牸寮忥紝濡傛灉鏄储寮曟牸寮忛渶瑕佺壒娈婂鐞�
+                if (IsIndexedPixelFormat(originImage.PixelFormat))
+                {
+                    // 鍒涘缓鏀寔Graphics鐨勬牸寮�
+                    using (Bitmap tempImage = new Bitmap(originImage.Width, originImage.Height, PixelFormat.Format24bppRgb))
+                    using (Graphics tempG = Graphics.FromImage(tempImage))
+                    {
+                        tempG.DrawImage(originImage, 0, 0);
+
+                        using (Graphics g = Graphics.FromImage(imageBack))
+                        {
+                            g.DrawImage(tempImage, 0, 0);
+                            display.Draw(g);
+                        }
+                    }
+                }
+                else
+                {
+                    // 鍘熷浠g爜閫昏緫
+                    using (Graphics g = Graphics.FromImage(imageBack))
+                    {
+                        g.DrawImage(originImage, 0, 0);
+                        display.Draw(g);
+                    }
+                }
+            }
+            else if (IsIndexedPixelFormat(originImage.PixelFormat))
+            {
+                // 淇敼鐐�3锛氬嵆浣挎病鏈塪efect锛屽鏋滄槸绱㈠紩鏍煎紡涔熼渶瑕佽浆鎹�
+                imageBack = new Bitmap(originImage.Width, originImage.Height, PixelFormat.Format24bppRgb);
+                needDisposeImageBack = true;
+
+                using (Graphics g = Graphics.FromImage(imageBack))
+                {
+                    g.DrawImage(originImage, 0, 0);
+                }
+            }
+
+            // 淇敼鐐�4锛氱‘淇漛itmap鐨勫儚绱犳牸寮忔敮鎸丟raphics
+            PixelFormat bitmapFormat = imageBack.PixelFormat;
+            if (IsIndexedPixelFormat(bitmapFormat))
+            {
+                // 濡傛灉imageBack浠嶇劧鏄储寮曟牸寮忥紙鐞嗚涓婁笉搴旇锛夛紝杞崲涓烘敮鎸佹牸寮�
+                bitmapFormat = PixelFormat.Format24bppRgb;
+            }
+
+            //鍒涘缓鏂板浘浣嶅浘   
+            Bitmap bitmap = new Bitmap(width, height, bitmapFormat);
+
+            //鍒涘缓浣滃浘鍖哄煙   
+            using (Graphics graphic = Graphics.FromImage(bitmap))
+            {
+                //鎴彇鍘熷浘鐩稿簲鍖哄煙鍐欏叆浣滃浘鍖�   
+                graphic.DrawImage(imageBack, 0, 0, new Rectangle(spaceX, spaceY, width, height), GraphicsUnit.Pixel);
+            }
+
+            byte[] bt = null;
+            using (MemoryStream mostream = new MemoryStream())
+            {
+                bitmap.Save(mostream, System.Drawing.Imaging.ImageFormat.Bmp);//灏嗗浘鍍忎互鎸囧畾鐨勬牸寮忓瓨鍏ョ紦瀛樺唴瀛樻祦
+                bt = new byte[mostream.Length];
+                mostream.Position = 0;//璁剧疆鐣欑殑鍒濆浣嶇疆
+                mostream.Read(bt, 0, Convert.ToInt32(bt.Length));
+            }
+
+            bitmap.Dispose();
+
+            // 淇敼鐐�5锛氶噴鏀句复鏃跺垱寤虹殑imageBack
+            if (needDisposeImageBack && imageBack != originImage)
+            {
+                imageBack.Dispose();
+            }
+
+            return bt;
+        }
+
+        // 鏂板杈呭姪鏂规硶锛氭鏌ユ槸鍚︿负绱㈠紩鍍忕礌鏍煎紡
+        private bool IsIndexedPixelFormat(PixelFormat format)
+        {
+            return format == PixelFormat.Format1bppIndexed ||
+                   format == PixelFormat.Format4bppIndexed ||
+                   format == PixelFormat.Format8bppIndexed ||
+                   format == PixelFormat.Indexed;
+        }
 
         [ProcessMethod("printer", "printer", "鎵撳嵃鏈烘墦鍗�", InvokeType.TestInvoke)]
         public ResponseMessage Printer(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
@@ -712,8 +1059,13 @@
             ResponseMessage msg = new ResponseMessage();
 
             Plc2 = invokeDevice as PLCBase;
-            string message = "nothing";
-            StartPrint(message);
+            //string message = "nothing";
+            if (M141Config.MES_codes.Count >= 1)
+            {
+                string message = M141Config.MES_codes[0].Printers_code;
+                StartPrint(message, "Honeywell PX240S(300 dpi)1");
+                M141Config.MES_codes.RemoveAt(0);
+            }                               
             return msg;
         }
 

--
Gitblit v1.8.0