leiqunqing
2026-03-05 891207469b41c23d22805876a4e179d75832572f
´úÂë¹ÜÀí/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs
@@ -1,5 +1,6 @@
using Autofac.Core;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using Spire.Xls;
using System;
using System.Collections.Generic;
@@ -126,34 +127,42 @@
        /// <exception cref="Exception"></exception>
        public WebResponseContent GetSignalStates()
        {
            OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "主控PLC") as OtherDevice;
            if (device == null) throw new Exception("未找到主控PLC设备信息");
            if (!device.IsConnected) throw new Exception($"主控PLC设备通讯异常");
            //获取信号灯状态
            var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
            var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
            var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
            var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
            var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
            //获取启动暂停状态
            var IsStarted = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart);
            var IsPaused = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoPause);
            //返回对象
            var responseData = new
            try
            {
                // ä¿¡å·ç¯çŠ¶æ€æ•°ç»„ï¼ˆä¿æŒåŽŸæœ‰é¡ºåºï¼‰
                signalStates = new bool[] { Heart, EMG, AutoExecuting, OnlineExecuting, Error },
                // PLC启动/暂停状态对象
                plcStatus = new
                OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "主控PLC") as OtherDevice;
                if (device == null) throw new Exception("未找到主控PLC设备信息");
                if (!device.IsConnected) throw new Exception($"主控PLC设备通讯异常");
                //获取信号灯状态
                var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
                var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
                var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
                var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
                var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
                //获取启动暂停状态
                var IsStarted = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart);
                var IsPaused = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoPause);
                //返回对象
                var responseData = new
                {
                    isStarted = IsStarted,
                    isPaused = IsPaused
                }
            };
            return WebResponseContent.Instance.OK(data: responseData);
                    // ä¿¡å·ç¯çŠ¶æ€æ•°ç»„ï¼ˆä¿æŒåŽŸæœ‰é¡ºåºï¼‰
                    signalStates = new bool[] { Heart, EMG, AutoExecuting, OnlineExecuting, Error },
                    // PLC启动/暂停状态对象
                    plcStatus = new
                    {
                        isStarted = IsStarted,
                        isPaused = IsPaused
                    }
                };
                return WebResponseContent.Instance.OK(data: responseData);
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
@@ -176,13 +185,16 @@
                }
                List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id);
                // æ–°å¢žleftPartSupplierCodes字段存储供方代码
                var responseData = new
                {
                    finishedProductId = dt_Formula.Id,
                    finishedProduct = dt_Formula.ProductCode,
                    leftPartCodes = new List<string>(),
                    leftPartIds = new List<int>(),
                    leftPartChecked = new List<int>()
                    leftPartChecked = new List<int>(),
                    // å­˜å‚¨æ¯ä¸ªé›¶ä»¶çš„供方代码
                    leftPartSupplierCodes = new List<string>()
                };
                foreach (var detail in dt_FormulaDetails.Take(10))
@@ -190,6 +202,8 @@
                    responseData.leftPartCodes.Add(detail.ComponentCode ?? "");
                    responseData.leftPartIds.Add(detail.Id);
                    responseData.leftPartChecked.Add(detail.IsScanned);
                    // æ·»åŠ ä¾›æ–¹ä»£ç ï¼Œä¸ºç©ºæ—¶è¿”å›žç©ºå­—ç¬¦ä¸²
                    responseData.leftPartSupplierCodes.Add(detail.SupplierCode ?? "");
                }
                int needFillCount = 10 - responseData.leftPartCodes.Count;
@@ -198,6 +212,8 @@
                    responseData.leftPartCodes.Add("");
                    responseData.leftPartIds.Add(0);
                    responseData.leftPartChecked.Add(0);
                    //补足10条数据,空的供方代码返回空字符串
                    responseData.leftPartSupplierCodes.Add("");
                }
                return WebResponseContent.Instance.OK("获取左侧初始数据成功", responseData);
            }
@@ -237,109 +253,144 @@
        /// </summary>
        /// <param name="dt_ProcessInfo"></param>
        /// <returns></returns>
        public WebResponseContent ExportData(Dt_ScanStation dt_ScanStation)
        public WebResponseContent ExportData()
        {
            string fileName = $"{DateTime.Now.ToString("yyyyMMddHHssmm")}.xlsx";
            string templatePath = $"{AppDomain.CurrentDomain.BaseDirectory}ExprotTemplate\\发电机弹性支撑信息化流程卡.xlsx";//模板路径
            string savePath = $"{AppDomain.CurrentDomain.BaseDirectory}Download\\{fileName}";//保存文件路径
            using Stream templateStream = new FileStream(templatePath, FileMode.Open);
            using Stream saveStream = new FileStream(savePath, FileMode.Create);
            using ExcelPackage package = new ExcelPackage(saveStream, templateStream);
            ExcelWorksheet worksheet = package.Workbook.Worksheets["流程卡"];
            Dt_Formula formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_ScanStation.StationEndProduct);
            List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == formula.Id && x.IsScanned == 1).ToList();
            for (int i = dt_FormulaDetails.Count; i < 10; i++)
            try
            {
                dt_FormulaDetails.Add(new Dt_FormulaDetail());
            }
                Dt_ScanStation dt_ScanStation = BaseDal.QueryFirst(x => x.StationCode == "001");
            worksheet.Cells[3, 5].Value = dt_ScanStation.StationEndProduct;//成品编号
            worksheet.Cells[3, 17].Value = dt_ScanStation.LastProductSn.ObjToInt() - dt_ScanStation.FirstProductSn.ObjToInt() + 1;//数量;
            worksheet.Cells[3, 29].Value = dt_ScanStation.FirstProductSn + "-" + dt_ScanStation.LastProductSn;//流水号
            worksheet.Cells[4, 5].Value = DateTime.Now.ToString("yyyy/MM/dd");//组装日期
            worksheet.Cells[4, 17].Value = dt_ScanStation.AssembleUser;//组装人员
                string fileName = $"{DateTime.Now.ToString("yyyyMMddHHssmm")}" + $"{dt_ScanStation.StationEndProduct}.xlsx";
                string templatePath = $"{AppDomain.CurrentDomain.BaseDirectory}ExprotTemplate\\发电机弹性支撑信息化流程卡.xlsx";//模板路径
                                                                                                                   // èŽ·å–ç³»ç»Ÿæ¡Œé¢è·¯å¾„
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\流程卡";
                //string desktopPath = "C:\\Users\\Administrator\\Desktop";
                string savePath = Path.Combine(desktopPath, fileName);
            int row = 7;
            for (int j = 0; j < 5; j++)
            {
                worksheet.Cells[row, 1].Value = dt_FormulaDetails[j].ComponentName;
                worksheet.Cells[row, 5].Value = dt_FormulaDetails[j].ComponentCode;
                worksheet.Cells[row, 12].Value = dt_FormulaDetails[j].SupplierCode;
                worksheet.Cells[row, 19].Value = dt_FormulaDetails[j + 5].ComponentName;
                worksheet.Cells[row, 23].Value = dt_FormulaDetails[j + 5].ComponentCode;
                worksheet.Cells[row, 30].Value = dt_FormulaDetails[j + 5].SupplierCode;
                row++;
            }
            row = 13;
            for (int j = 0; j < 4; j++)
            {
                worksheet.Cells[row + j, 12].Value = "☑ æ˜¯     â–¡ å¦";
                worksheet.Cells[row + j, 30].Value = "☑ æ˜¯     â–¡ å¦";
            }
            worksheet.Cells[17, 12].Value = "☑ æ˜¯     â–¡ å¦";
            worksheet.Cells[23, 5].Value = "☑ æ˜¯     â–¡ å¦";
            List<Dt_ProcessInfoDetail> dt_ProcessInfoDetails = _processInfoDetailService.Repository
                .QueryData(x => x.ProductCode == dt_ScanStation.StationEndProduct
                && x.ProductSn.CompareTo(dt_ScanStation.LastProductSn) >= 0
                && x.ProductSn.CompareTo(dt_ScanStation.LastProductSn) <= 0)
                .OrderBy(x => x.CreateDate)
                .ToList();
            row = 27;
            ExcelRange baseStyleRow = worksheet.Cells[$"{row}:{row}"];
            foreach (var item in dt_ProcessInfoDetails)
            {
                if (row > 61)
                using Stream templateStream = new FileStream(templatePath, FileMode.Open);
                using Stream saveStream = new FileStream(savePath, FileMode.Create);
                using ExcelPackage package = new ExcelPackage(saveStream, templateStream);
                ExcelWorksheet worksheet = package.Workbook.Worksheets["流程卡"];
                Dt_Formula formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_ScanStation.StationEndProduct);
                List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == formula.Id && x.IsScanned == 1).ToList();
                for (int i = dt_FormulaDetails.Count; i < 10; i++)
                {
                    var sourceRange = worksheet.Cells[row - 1, 1, row - 1, 36];
                    var targetRange = worksheet.Cells[row, 1, row, 36];
                    // 1. å¤åˆ¶åˆå¹¶è§„则(原有逻辑保留)
                    this.CopyCellMerge(worksheet, sourceRange, targetRange);
                    // 2. å¤åˆ¶æ ·å¼ï¼ˆå…¼å®¹æ‰€æœ‰EPPlus版本)
                    targetRange.StyleID = sourceRange.StyleID;
                    // 3. åŒæ­¥è¡Œé«˜
                    worksheet.Row(row).Height = worksheet.Row(row - 1).Height;
                    dt_FormulaDetails.Add(new Dt_FormulaDetail());
                }
                worksheet.Cells[row, 1].Value = item.ProductSn;
                worksheet.Cells[row, 7].Value = item.Height2;
                worksheet.Cells[row, 13].Value = item.Height1;
                worksheet.Cells[row, 19].Value = item.PressPressure;
                worksheet.Cells[row, 25].Value = item.ScrewTorque;
                if (item.PressTightenUnfinished == 1)
                {
                    worksheet.Cells[row, 31].Value = "压装拧紧异常";
                }
                else if (item.CheckUnfinished == 1)
                {
                    worksheet.Cells[row, 31].Value = "检测异常";
                }
                else
                {
                    worksheet.Cells[row, 31].Value = "正常";
                }
                row++;
                worksheet.Cells[3, 5].Value = dt_ScanStation.StationEndProduct;//成品编号
                worksheet.Cells[3, 17].Value = dt_ScanStation.LastProductSn.ObjToInt() - dt_ScanStation.FirstProductSn.ObjToInt() + 1;//数量;
                worksheet.Cells[3, 29].Value = dt_ScanStation.FirstProductSn + "-" + dt_ScanStation.LastProductSn;//流水号
                worksheet.Cells[4, 5].Value = DateTime.Now.ToString("yyyy/MM/dd");//组装日期
                worksheet.Cells[4, 17].Value = dt_ScanStation.AssembleUser;//组装人员
                int row = 7;
                for (int j = 0; j < 5; j++)
                {
                    worksheet.Cells[row, 1].Value = dt_FormulaDetails[j].ComponentName;
                    worksheet.Cells[row, 5].Value = dt_FormulaDetails[j].ComponentCode;
                    worksheet.Cells[row, 12].Value = dt_FormulaDetails[j].SupplierCode;
                    worksheet.Cells[row, 19].Value = dt_FormulaDetails[j + 5].ComponentName;
                    worksheet.Cells[row, 23].Value = dt_FormulaDetails[j + 5].ComponentCode;
                    worksheet.Cells[row, 30].Value = dt_FormulaDetails[j + 5].SupplierCode;
                    row++;
                }
                row = 13;
                for (int j = 0; j < 4; j++)
                {
                    worksheet.Cells[row + j, 12].Value = "☑ æ˜¯     â–¡ å¦";
                    worksheet.Cells[row + j, 30].Value = "☑ æ˜¯     â–¡ å¦";
                }
                worksheet.Cells[17, 12].Value = "☑ æ˜¯     â–¡ å¦";
                worksheet.Cells[23, 5].Value = "☑ æ˜¯     â–¡ å¦";
                worksheet.Cells[26, 7].Value = formula.ProductHeight;
                worksheet.Cells[26, 13].Value = formula.ScrewTorqueOutput;
                worksheet.Cells[26, 19].Value = formula.ScrewDownsetDistance;
                worksheet.Cells[26, 25].Value = formula.PressFastenTorque;
                List<Dt_ProcessInfoDetail> dt_ProcessInfoDetails = _processInfoDetailService.Repository
                    .QueryData(x => x.ProductCode == dt_ScanStation.StationEndProduct
                    && x.ProductSn.CompareTo(dt_ScanStation.FirstProductSn) >= 0
                    && x.ProductSn.CompareTo(dt_ScanStation.LastProductSn) <= 0)
                    .OrderBy(x => x.CreateDate)
                    .ToList();
                row = 27;
                ExcelRange baseStyleRow = worksheet.Cells[$"{row}:{row}"];
                foreach (var item in dt_ProcessInfoDetails)
                {
                    if (row > 61)
                    {
                        var sourceRange = worksheet.Cells[row - 1, 1, row - 1, 36];
                        var targetRange = worksheet.Cells[row, 1, row, 36];
                        // 1. å¤åˆ¶åˆå¹¶è§„则(原有逻辑保留)
                        CopyCellMerge(worksheet, sourceRange, targetRange);
                        // 2. å¤åˆ¶æ ·å¼ï¼ˆå…¼å®¹æ‰€æœ‰EPPlus版本)
                        targetRange.StyleID = sourceRange.StyleID;
                        // 3. åŒæ­¥è¡Œé«˜
                        worksheet.Row(row).Height = worksheet.Row(row - 1).Height;
                    }
                    worksheet.Cells[row, 1].Value = item.ProductSn;
                    worksheet.Cells[row, 7].Value = item.ProductCheckHeight;
                    worksheet.Cells[row, 7].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    worksheet.Cells[row, 7].Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.Yellow);
                    worksheet.Cells[row, 13].Value = item.ThreadPositionHeight;
                    worksheet.Cells[row, 13].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    worksheet.Cells[row, 13].Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.Yellow);
                    worksheet.Cells[row, 19].Value = item.PressPressure;
                    worksheet.Cells[row, 19].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    worksheet.Cells[row, 19].Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.Yellow);
                    worksheet.Cells[row, 25].Value = item.ScrewTorque;
                    worksheet.Cells[row, 25].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    worksheet.Cells[row, 25].Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.Yellow);
                    worksheet.Cells[row, 31].Value = item.ProductStatus == 0 ? "不合格" : item.ProductStatus == 1 ? "合格" : "人工确认合格";
                    //if (item.PressTightenUnfinished == 1)
                    //{
                    //    worksheet.Cells[row, 31].Value = "压装拧紧异常";
                    //}
                    //else
                    //{
                    //    worksheet.Cells[row, 31].Value = "正常";
                    //}
                    row++;
                }
                //worksheet.DeleteRow(row, worksheet.Dimension.End.Row - row + 1);
                package.Save();
                string pdfFileName = $"{DateTime.Now.ToString("yyyyMMddHHssmm")}" + $"{dt_ScanStation.StationEndProduct}.pdf";
                //string pdfPath = $"{AppDomain.CurrentDomain.BaseDirectory}Download\\{pdfFileName}";
                string pdfPath = Path.Combine(desktopPath, pdfFileName);
                Workbook workbook = new Workbook();
                workbook.LoadFromFile(savePath);
                // è®¾ç½®è½¬æ¢é€‰é¡¹ï¼ŒåŒ…含所有工作表
                workbook.ConverterSetting.SheetFitToPage = true;
                // ä¿å­˜æ‰€æœ‰å·¥ä½œè¡¨åˆ°åŒä¸€ä¸ªPDF文件
                workbook.SaveToFile(pdfPath, FileFormat.PDF);
                //// è½¬æ¢ç¬¬ä¸€ä¸ªå·¥ä½œè¡¨åˆ°PDF
                //workbook.SaveToFile(pdfPath, FileFormat.PDF);
                return WebResponseContent.Instance.OK(data: new { path = pdfPath, fileName = pdfFileName });
            }
            //worksheet.DeleteRow(row, worksheet.Dimension.End.Row - row + 1);
            package.Save();
            string pdfFileName = $"{DateTime.Now.ToString("yyyyMMddHHssmm")}.pdf";
            string pdfPath = $"{AppDomain.CurrentDomain.BaseDirectory}Download\\{pdfFileName}";
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(savePath);
            // è½¬æ¢ç¬¬ä¸€ä¸ªå·¥ä½œè¡¨åˆ°PDF
            workbook.SaveToFile(pdfPath, FileFormat.PDF);
            return WebResponseContent.Instance.OK(data: new { path = pdfPath, fileName = pdfFileName });
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }