| | |
| | | using Autofac.Core; |
| | | using OfficeOpenXml; |
| | | using OfficeOpenXml.Style; |
| | | using Spire.Xls; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseRepository; |
| | | using WIDESEAWCS_Core.BaseServices; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_DTO.BasicInfo; |
| | | using WIDESEAWCS_IBasicInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | |
| | |
| | | { |
| | | private readonly IFormulaService _formulaService; |
| | | private readonly IFormulaDetailService _formulaDetailService; |
| | | private readonly IProcessInfoService _processInfoService; |
| | | private readonly IProcessInfoDetailService _processInfoDetailService; |
| | | |
| | | public ScanStationService(IRepository<Dt_ScanStation> BaseDal, |
| | | |
| | | public ScanStationService(IRepository<Dt_ScanStation> BaseDal, |
| | | IFormulaService formulaService, |
| | | IFormulaDetailService formulaDetailService |
| | | IFormulaDetailService formulaDetailService, |
| | | IProcessInfoService processInfoService, |
| | | IProcessInfoDetailService processInfoDetailService |
| | | ) : base(BaseDal) |
| | | { |
| | | _formulaService = formulaService; |
| | | _formulaDetailService = formulaDetailService; |
| | | _processInfoService = processInfoService; |
| | | _processInfoDetailService = processInfoDetailService; |
| | | } |
| | | |
| | | public IRepository<Dt_ScanStation> Repository => BaseDal; |
| | |
| | | var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError); |
| | | |
| | | if (Heart && !EMG && OnlineExecuting && !Error) |
| | | { |
| | | { |
| | | device.SetValue(W_PLCDBName.wboolAutoStart, true); |
| | | //æåä¿¡å· |
| | | device.SetValue(W_PLCDBName.wboolAutoPause, false); |
| | |
| | | var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart); |
| | | var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG); |
| | | var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError); |
| | | if(!device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart)) |
| | | if (!device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart)) |
| | | { |
| | | return WebResponseContent.Instance.Error("è®¾å¤æªå¯å¨"); |
| | | } |
| | |
| | | /// <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> |
| | |
| | | } |
| | | 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)) |
| | |
| | | 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; |
| | |
| | | responseData.leftPartCodes.Add(""); |
| | | responseData.leftPartIds.Add(0); |
| | | responseData.leftPartChecked.Add(0); |
| | | //补足10æ¡æ°æ®ï¼ç©ºç便¹ä»£ç è¿å空å符串 |
| | | responseData.leftPartSupplierCodes.Add(""); |
| | | } |
| | | return WebResponseContent.Instance.OK("è·å左侧åå§æ°æ®æå", responseData); |
| | | } |
| | |
| | | } |
| | | return WebResponseContent.Instance.Error("æ´æ°é误"); |
| | | } |
| | | catch (Exception ex) |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error("è·åæ°æ®å¤±è´¥"); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// ä¸è½½æµç¨å¡ |
| | | /// </summary> |
| | | /// <param name="dt_ProcessInfo"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent ExportData() |
| | | { |
| | | try |
| | | { |
| | | Dt_ScanStation dt_ScanStation = BaseDal.QueryFirst(x => x.StationCode == "001"); |
| | | |
| | | 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); |
| | | |
| | | 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++) |
| | | { |
| | | dt_FormulaDetails.Add(new Dt_FormulaDetail()); |
| | | } |
| | | |
| | | |
| | | |
| | | 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 }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | // <summary> |
| | | /// èªå®ä¹Excelåå
æ ¼åå¹¶è§åå¤å¶æ¹æ³ï¼å
¼å®¹ä½çæ¬EPPlusï¼ |
| | | /// </summary> |
| | | /// <param name="worksheet">Excelå·¥ä½è¡¨</param> |
| | | /// <param name="sourceRange">æºåå
æ ¼èå´</param> |
| | | /// <param name="targetRange">ç®æ åå
æ ¼èå´</param> |
| | | public void CopyCellMerge(ExcelWorksheet worksheet, ExcelRange sourceRange, ExcelRange targetRange) |
| | | { |
| | | if (sourceRange == null || targetRange == null) return; |
| | | if (sourceRange.Worksheet != worksheet || targetRange.Worksheet != worksheet) return; |
| | | |
| | | // 1. å
å°æºèå´å
çåå¹¶åºåæåå°ä¸´æ¶åè¡¨ä¸ |
| | | var sourceMergeList = new List<string>(); |
| | | foreach (var merge in worksheet.MergedCells) |
| | | { |
| | | var mergeRange = worksheet.Cells[merge]; |
| | | if (mergeRange.Start.Row >= sourceRange.Start.Row && mergeRange.End.Row <= sourceRange.End.Row |
| | | && mergeRange.Start.Column >= sourceRange.Start.Column && mergeRange.End.Column <= sourceRange.End.Column) |
| | | { |
| | | sourceMergeList.Add(merge); |
| | | } |
| | | } |
| | | |
| | | // 2. éå临æ¶å表ï¼å®å
¨å°åå»ºç®æ åå¹¶åºå |
| | | foreach (var merge in sourceMergeList) |
| | | { |
| | | var mergeRange = worksheet.Cells[merge]; |
| | | int rowOffset = targetRange.Start.Row - sourceRange.Start.Row; |
| | | int colOffset = targetRange.Start.Column - sourceRange.Start.Column; |
| | | var targetMergeRange = worksheet.Cells[ |
| | | mergeRange.Start.Row + rowOffset, |
| | | mergeRange.Start.Column + colOffset, |
| | | mergeRange.End.Row + rowOffset, |
| | | mergeRange.End.Column + colOffset |
| | | ]; |
| | | targetMergeRange.Merge = true; |
| | | } |
| | | } |
| | | } |
| | | } |